首页 文章 精选 留言 我的

精选列表

搜索[文档处理],共10000篇文章
优秀的个人博客,低调大师

万豪酒店因数据泄露被罚款近1.6亿元,这还是从轻处理的结果

英国信息专员办公室(UK Information Commissioner's Office,简称’ICO”)对美国酒店集团万豪(Marriott)进行了1840万英镑(约1.6亿元)的罚款,原因是该公司的数据泄露事件影响了全球数百万客户。 ICO的调查发现,万豪没有按照通用数据保护条例(GDPR)的要求,采取适当的技术或组织措施来保护其系统上的个人数据。 据悉,此次罚款金额其实比最初计划的要少,因为监管机构考虑了万豪的陈述、万豪为减轻事件影响所采取的措施,以及疫情对其业务的经济影响,然后才制定了最终的处罚。 此次数据泄露主要和喜达屋有关,万豪于2016年收购了喜达屋,但违规行为直到2018年11月才公布。 2016年,万豪国际斥资130亿美元收购了喜达屋环球酒店和度假村。该品牌包括圣里吉斯、喜来登酒店及度假村、W酒店、威斯汀酒店及度假村、雅高酒店、贡品组合、元素酒店、勒梅里登酒店及度假村、豪华精选等。 2018年11月,万豪宣布,疑似受2014年发生的安全漏洞影响,其旗下的喜达屋酒店多达5亿客人的数据遭到泄露风险。这是历史上最大的数据泄露事件之一,也是万豪酒店业遭受最严重的的一次。 据该公司称,2014年,黑客开始入侵喜达屋的客人预订系统,并对信息进行复制和加密。黑客访问了近3.27亿客人的个人信息,泄露的记录包括姓名、邮寄地址、电话号码、电子邮件地址、护照号码、出生日期、性别、到达和离开信息、预订日期。喜达屋数据泄露案的调查显示,被盗数据还包括财务数据、支付卡号和支付卡截止时间,即使是已经加密的信息也没逃过。 据信息专员办公室说,数据泄露影响了3000万名欧洲居民,其中包括700万名英国居民。 英国监管机构认为,万豪在2016年收购喜达屋时没有进行充分的尽职调查,也没有采取必要措施确保其系统安全。“个人信息很珍贵,企业必须加以照顾。企业之所以需要严格保护客户数据,除了面临罚款惩罚之外,他们有义务保护数据。” 这不是万豪首次因数据泄露而遭到添加罚款。2019年7月,英国数据隐私监管机构宣布,根据GDPR,万豪国际因2014年数据泄露将面临9900万英镑(1.23亿美元)的罚款。 参考来源: https://securityaffairs.co/wordpress/110297/data-breach/uk-ico-fines-marriott.html 【责任编辑: 赵宁宁 TEL:(010)68476606】

优秀的个人博客,低调大师

【最佳实践】ingest对异源数据结构化处理,并由Elastic Stack实现可观测性分析

数据集 在我们的实际数据采集中,数据可能来自不同的来源,并且以不同的形式展展现: 这些数据可以是一种很结构化的数据被摄入,比如数据库中的数据, 或者就是一组最原始的非结构化的数据,比如日志。对于一些非结构化的数据,我们该如何把它们结构化,并使用 Elasticsearch 进行分析呢? 结构化数据 就如上面的数据展示的那样。在很多的情况下,数据在摄入的时候是一种非结构化的形式来呈现的。这个数据通常有一个叫做 message 的字段。为了能达到结构化的目的,我们们需要 parse 及 transform 这个 message 字段,并把这个 message 变为我们所需要的字段,从而达到结构化的母的。让我们看一个例子。假如我们有如下的信息: { "message": "2019-09-29T00:39:02.9122 [Debug]

优秀的个人博客,低调大师

事务处理不当,线上接口又双叒内存泄漏了!(附图解问题全过程)

情景 项目上线了一个接口,先灰度一台机器观察调用情况; 接口不断的调用,过了一段时间,发现机器上的接口调用开始报OOM异常 ! 当天就是上线deadline了,刺激。。 发现问题 第一步,使用jps命令获取出问题jvm进程的进程ID 使用jps -l -m获取到当前jvm进程的pid,通过上述命令获取到了服务的进程号:427726 (此处假设为这个) jps命令 jps(JVM Process Status Tool):显示指定系统内所有的HotSpot虚拟机进程 jps -l -m : 参数-l列出机器上所有jvm进程,-m显示出JVM启动时传递给main()的参数 第二步,使用jstat观察jvm状态,发现问题 因为是OOM异常,所以我们首先重启机器观察了JVM的运行情况; 我们使用jstat -gc pid time命令观察GC,发现GC在YGC后,GC掉的内存并不多,每次YGC后都有一部分内存未回收,导致在多次YGC后回收不掉的内存被挪到堆的old区,old满了之后FGC发现也是回收不掉; 这里基本可以确定是内存泄漏的问题了,下面我们有简单看了下机器的cpu、内存、磁盘状态 jstat命令: jstat(JVM statistics Monitoring)是用于监视虚拟机运行时状态信息的命令,它可以显示出虚拟机进程中的类装载、内存、垃圾收集、JIT编译等运行数据。 jstat -gc pid time : -gc 监控jvm的gc信息,pid 监控的jvm进程id,time每个多少毫秒刷新一次 jstat -gccause pid time : -gccause 监控gc信息并显示上次gc原因,pid 监控的jvm进程id,time每个多少毫秒刷新一次 jstat -class pid time: -class 监控jvm的类加载信息,pid 监控的jvm进程id,time每个多少毫秒刷新一次 在这里先简单说一下,堆的GC: 在GC开始的时候,对象只会存在于Eden区和名为“From”的Survivor区,Survivor区“To”是空的。紧接着进行GC,Eden区中所有存活的对象都会被复制到“To”,而在“From”区中,仍存活的对象会根据他们的年龄值来决定去向。 年龄达到一定值(年龄阈值,可以通过-XX:MaxTenuringThreshold来设置)的对象会被移动到年老代中,没有达到阈值的对象会被复制到“To”区域。经过这次GC后,Eden区和From区已经被清空。这个时候,“From”和“To”会交换他们的角色,也就是新的“To”就是上次GC前的“From”,新的“From”就是上次GC前的“To”。不管怎样,都会保证名为To的Survivor区域是空的,minor GC会一直重复这样的过程。 第三步,观察机器状态,确认问题 使用top -p pid获取进程的cpu和内存使用率;查看RES 和 %CPU %MEM三个指标: 在这里先简单说一下,top命令展示的内容: VIRT:virtual memory usage 虚拟内存 1、进程“需要的”虚拟内存大小,包括进程使用的库、代码、数据等 2、假如进程申请100m的内存,但实际只使用了10m,那么它会增长100m,而不是实际的使用量 RES:resident memory usage 常驻内存 1、进程当前使用的内存大小,但不包括swap out 2、包含其他进程的共享 3、如果申请100m的内存,实际使用10m,它只增长10m,与VIRT相反 4、关于库占用内存的情况,它只统计加载的库文件所占内存大小 SHR:shared memory 共享内存 1、除了自身进程的共享内存,也包括其他进程的共享内存 2、虽然进程只使用了几个共享库的函数,但它包含了整个共享库的大小 3、计算某个进程所占的物理内存大小公式:RES – SHR 4、swap out后,它将会降下来 DATA 1、数据占用的内存。如果top没有显示,按f键可以显示出来。 2、真正的该程序要求的数据空间,是真正在运行中要使用的。 ps : 如果程序占用实存比较多,说明程序申请内存多,实际使用的空间也多。 如果程序占用虚存比较多,说明程序申请来很多空间,但是没有使用。 发现机器的自身状态不存在问题, so毋庸置疑,发现问题了,典型的内存泄漏。。 第四步,使用jmap获取jvm进程dump文件 我们使用jmap -dump:format=b,file=dump_file_name pid 命令,将当前机器的jvm的状态dump下来或缺的一份dump文件,用做下面的分析 jmap命令: jmap(JVM Memory Map)命令用于生成heap dump文件,还可以查询finalize执行队列、Java堆和永久代的详细信息,如当前使用率、当前使用的是哪种收集器等。 jmap -dump:format=b,file=dump_file_name pid : file=指定输出数据文件名, pid jvm进程号 接下来,回滚灰度的机器,开始解决问题=.= 解决问题 第一步,dump文件分析 在这里,我们分析dump文件,使用的Jprofiler软件,就是下面这个东东: 具体的使用方法,在这就不再赘述了,下面将dump文件导入到Jprofiler中: 选择Heap Walker 中的Current Object Set,这里面显示的是当前的类的占用资源,从占用空间从大到小排序; 从上图中,没有观察出什么问题,我们点击Biggest Objects,查看哪个对象的占用的内存高: 从上图中,我们发现org.janusgraph.graphdb.database.StandardJanusGraph这个对象居然占用了高达724M的内存! 看来内存泄漏八九不离十就是这个对象的问题了! 再点开看看 ,如下图,可以发现是一个openTransactions的类型为ConcurrentHashMap的数据结构: 第二步,源码查找定位代码 这到底是什么对象呢,去项目中查找一下,打开idea-打开项目-双击shift键-打开全局类查找-输入StandardJanusGraph,如下图: 发现是我们项目使用的图数据库janusgraph的一个类,找到对应的数据结构: 类型定义: private Set<StandardJanusGraphTx> openTransactions; 初始化为一个ConcurrentHashMap: openTransactions = Collections.newSetFromMap(new ConcurrentHashMap<StandardJanusGraphTx, Boolean>(100, 0.75f, 1)); 观察上述代码,我们可以看到,里面的存储的StandardJanusGraphTx从字面意义上理解是janusgraph框架中的事务对象,下面往上追一下代码,看看什么时候会往这个Map中赋值: // 找到执行openTransactions.add()的方法 public StandardJanusGraphTx newTransaction(final TransactionConfiguration configuration) { if (!isOpen) ExceptionFactory.graphShutdown(); try { StandardJanusGraphTx tx = new StandardJanusGraphTx(this, configuration); tx.setBackendTransaction(openBackendTransaction(tx)); openTransactions.add(tx); // 注意! 此处对上述的map对象进行了add return tx; } catch (BackendException e) { throw new JanusGraphException("Could not start new transaction", e); } } // 上述发现,是一个newTransaction,创建事务的一个方法,为确保起见,再往上跟找到调用上述方法的类: public JanusGraphTransaction start() { TransactionConfiguration immutable = new ImmutableTxCfg(isReadOnly, hasEnabledBatchLoading, assignIDsImmediately, preloadedData, forceIndexUsage, verifyExternalVertexExistence, verifyInternalVertexExistence, acquireLocks, verifyUniqueness, propertyPrefetching, singleThreaded, threadBound, getTimestampProvider(), userCommitTime, indexCacheWeight, getVertexCacheSize(), getDirtyVertexSize(), logIdentifier, restrictedPartitions, groupName, defaultSchemaMaker, customOptions); return graph.newTransaction(immutable); // 注意!此处调用了上述的newTransaction方法 } // 接着找上层调用,发现了最上层的方法 public JanusGraphTransaction newTransaction() { return buildTransaction().start(); // 此处调用了上述的start方法 } 在我们对图数据库中图数据操作的过程中,采用的是手动创建事务的方式,在每次查询图数据库之前,我们都会调用类似于dataDao.begin()代码, 其中就是调用的 public JanusGraphTransaction newTransaction()这个方法; 最后,我们简单的看下源码可以发现,从上述内存泄漏的map中去除数据的逻辑就是commit事务的接口,调用链如下: public void closeTransaction(StandardJanusGraphTx tx) { openTransactions.remove(tx); // 从map中删除StandardJanusGraphTx对象 } private void releaseTransaction() { isOpen = false; graph.closeTransaction(this); // 调用上述closeTransaction方法 vertexCache.close(); } public synchronized void commit() { Preconditions.checkArgument(isOpen(), "The transaction has already been closed"); boolean success = false; if (null != config.getGroupName()) { MetricManager.INSTANCE.getCounter(config.getGroupName(), "tx", "commit").inc(); } try { if (hasModifications()) { graph.commit(addedRelations.getAll(), deletedRelations.values(), this); } else { txHandle.commit(); // 这个commit方法中释放事务也是调用releaseTransaction } success = true; } catch (Exception e) { try { txHandle.rollback(); } catch (BackendException e1) { throw new JanusGraphException("Could not rollback after a failed commit", e); } throw new JanusGraphException("Could not commit transaction due to exception during persistence", e); } finally { releaseTransaction(); // // 调用releaseTransaction if (null != config.getGroupName() && !success) { MetricManager.INSTANCE.getCounter(config.getGroupName(), "tx", "commit.exceptions").inc(); } } } 终于,我们找到了内存泄漏的根源所在:项目代码中存在调用了事务begin但是没有commit的代码! 第三步,修复问题验证 解决问题: 找到内存泄漏接口的代码,并发现了没有commit()的位置,try-catch-finally中添加上了commit()代码; 提交-部署-发布-灰度一台机器后观察内存泄漏的现象消失,GC回收正常; 内存泄漏问题解决,项目如期上线~ 最后 大家,有没有遇到过内存泄漏的情况,欢迎在评论区说出你的故事=.= 写这篇文章耗费的时间超出了我的预料,预计2个小时写完,结果花了一下午的时间... 原创不易,如果大家有所收获,希望大家可以点赞评论支持一下~ 也欢迎大家关注我的oschina和微信搜索公众号[匠心Java]支持一下作者,作者定期分享工作中的所见所得~

优秀的个人博客,低调大师

一文读懂物联网硬件接入难点与破解(内含智慧养殖、水处理案例详解)|MVP时间

想了解国内物联网发展历史与现状? 物联网落地时遇到“接口多、协议多”“接入多、对接难”等困境,如何破解? 物联网能给传统行业带来哪些改变?未来的IOT会是什么样? 想要知道这些问题的答案,【MVP时间】刘洪峰为你讲述物联网落地的那些事。 读完本文你能收获什么: 1、物联网部署实战; 2、物联网实践技术; 3、物联网系列部署知识与实践经验。 【讲师介绍】 叶帆科技创始人兼CEO、阿里云MVP刘洪峰。 前微软(中国).NET MF开发团队成员,CSDN十大MVB。以微软.NET MF系统为核心,研发了物联网智能网关、YFIOs和YFHMI等物联网中间件软硬件平台。 【课程】视频课程链接:5节课助你破解物联网硬件接入难点 https://mvp.aliyun.com/topic/9 【课程讲义】 1.物联网现状及落地难点 https://yq.aliyun.

资源下载

更多资源
Mario

Mario

马里奥是站在游戏界顶峰的超人气多面角色。马里奥靠吃蘑菇成长,特征是大鼻子、头戴帽子、身穿背带裤,还留着胡子。与他的双胞胎兄弟路易基一起,长年担任任天堂的招牌角色。

腾讯云软件源

腾讯云软件源

为解决软件依赖安装时官方源访问速度慢的问题,腾讯云为一些软件搭建了缓存服务。您可以通过使用腾讯云软件源站来提升依赖包的安装速度。为了方便用户自由搭建服务架构,目前腾讯云软件源站支持公网访问和内网访问。

Rocky Linux

Rocky Linux

Rocky Linux(中文名:洛基)是由Gregory Kurtzer于2020年12月发起的企业级Linux发行版,作为CentOS稳定版停止维护后与RHEL(Red Hat Enterprise Linux)完全兼容的开源替代方案,由社区拥有并管理,支持x86_64、aarch64等架构。其通过重新编译RHEL源代码提供长期稳定性,采用模块化包装和SELinux安全架构,默认包含GNOME桌面环境及XFS文件系统,支持十年生命周期更新。

Sublime Text

Sublime Text

Sublime Text具有漂亮的用户界面和强大的功能,例如代码缩略图,Python的插件,代码段等。还可自定义键绑定,菜单和工具栏。Sublime Text 的主要功能包括:拼写检查,书签,完整的 Python API , Goto 功能,即时项目切换,多选择,多窗口等等。Sublime Text 是一个跨平台的编辑器,同时支持Windows、Linux、Mac OS X等操作系统。

用户登录
用户注册