建筑导航网站,最新的即时比分,江门网站建设哪家好,网站项目建设流程图主要是以下几类系统: 生活信息系统, 内容:小, 属性:大,电商商品系统, 内容:大, 属性:大,风控征信系统, 内容:小, 属性:大,新闻系统, 内容:大, 属性:小,这些系统共同的特点, 都是在主体内容上会携带多个属性, 并且属性需要随时能调整, 并且要求能兼容旧属性, 还需要频繁的通过属…主要是以下几类系统: 生活信息系统, 内容:小, 属性:大,电商商品系统, 内容:大, 属性:大,风控征信系统, 内容:小, 属性:大,新闻系统, 内容:大, 属性:小,这些系统共同的特点, 都是在主体内容上会携带多个属性, 并且属性需要随时能调整, 并且要求能兼容旧属性, 还需要频繁的通过属性组合进行检索. 对于属性的管理, 可以参考58同城的这个解决方案 https://mp.weixin.qq.com/s?__bizMjM5ODYxMDA5OQmid2651959855idx1snf33abe8ec598c273f29cebb9365ece59 其方式, 就是通过JSON化的字段, 来避免使用纵表, 这样可以i减轻开发的工作量, 以及实际运行时的数据量. 在这个之上, 使用一些手段压缩了JSON字段的尺寸, 以及通过属性, 属性分组, 属性枚举等结构增加了数据的灵活性. 在搜索上, 58是使用自研的系统, 这个在普通应用中可以使用elastic search代替. 另外关于电商SKU的数据设计, 也可以采用上面的方式避免纵表带来的巨大记录数量. SKU一般是按 产品分类, 产品, 产品SKU, 属性分组, 属性, 属性枚举 这样的结构来实现业务数据管理的. 可以参考这篇里面的说明 http://www.cnblogs.com/winstonyan/archive/2012/01/07/b2c_research_product_sku_analyse_design2.html 携程在Elastic Search上的介绍 【携程旅行网 吴晓刚】 ElasticSearch目前在互联网公司主要用于两种应用场景其一是用于构建业务的搜索功能模块且多是垂直领域的搜索数据量级一般在千万至数十亿这个级别其二用于大规模数据的实时OLAP经典的如ELKStack数据规模可能达到千亿或更多。 这两种场景的数据索引和应用访问模式上差异较大在硬件选型和集群优化方面侧重点也会有所不同。一般来说后一种场景属于大数据范畴数据量级和集群规模更大在管理方面也更有挑战。 应Medcl大大的邀请为ES中文社区做今年的Advent开篇分享一下我在管理自家公司用于日志分析的ES集群方面的一点心得蜻蜓点水泛泛而谈希望大方向上能对大家提供一些帮助。 这里的自家即是携程旅行网。从2013年开始接触ES我们团队先后实践过0.9.x - 5.0.0中间各个版本从最初只用于运维内部IIS日志的分析到如今支持IT、呼叫中心、安全、测试、业务研发等多个部门超过200种日志型数据的实时检索与分析。 一路走来愉悦了大家也死磕了自己。 目前我们最大的日志单集群有120个data node运行于70台物理服务器上。数据规模如下:单日索引数据条数600亿新增索引文件25TB (含一个复制片则为50TB)业务高峰期峰值索引速率维持在百万条/秒历史数据保留时长根据业务需求制定从10天 - 90天不等集群共3441个索引、17000个分片、数据总量约9300亿, 磁盘总消耗1PBKibana用户600多人, 每日来自Kibana和第三方的API调用共63万次查询响应时间百分位 75%:0.160s 90%:1.640s 95%:6.691s 99%:14.0039s 运维这样大规模的ES集群有哪些值得注意的地方 一. 必不可少的工具工欲善其事必先利其器从一开始哪怕就只有几个node就应该使用分布式配置管理工具来做集群的部署。随着应用的成熟集群规模的逐步扩大效率的提升会凸显。 官方提供了ES Puppet Module和Chef Cookbook熟悉这两个工具的同学可以直接拿过来用。 我们自己则是采用的Ansible编写了一套Playbook来达到类似的效果。 用熟这类工具对于集群的初始部署配置批量更改集群版本升级重启故障结点都会快捷和安全许多。第二个必备利器就是sense插件。通过这个插件直接调用集群的restful API在做集群和索引的状态查看索引配置更改的时候非常方便。语法提示和自动补全功能更是实用减少了翻看文档的频率。在Kibana5里面sense已经成为一个内置的控制台无需额外安装。 二. 硬件配置我们采用的是32vcoreCPU 128GB RAM的服务器磁盘配置大部分服务器是12块4TB SATA机械磁盘做的Raid0少部分机器是刚上了不久的6块800GB SSD raid0主要目的是想做冷热数据分离后面谈到集群架构的时候再进一步解释一下如何利用硬件资源。 三. 集群的管理首先很有必要对ES的结点做角色划分和隔离。大家知道ES的data node除了放数据以外也可以兼任master和client的角色多数同学会将这些角色混入到data node。然而对于一个规模较大用户较多的集群master和client在一些极端使用情况下可能会有性能瓶颈甚至内存溢出从而使得共存的data node故障。data node的故障恢复涉及到数据的迁移对集群资源有一定消耗容易造成数据写入延迟或者查询减慢。如果将master和client独立出来一旦出现问题重启后几乎是瞬间就恢复的对用户几乎没有任何影响。另外将这些角色独立出来的以后也将对应的计算资源消耗从data node剥离出来更容易掌握data node资源消耗与写入量和查询量之间的联系便于做容量管理和规划。避免过高的并发包括控制shard数量和threadpool的数量。在写入量和查询性能能够满足的前提下为索引分配尽量少的分片。分片过多会带来诸多负面影响例如每次查询后需要汇总排序的数据更多过多的并发带来的线程切换造成过多的CPU损耗索引的删除和配置更新更慢Issue#18776; 过多的shard也带来更多小的segment而过多的小segment会带来非常显著的heap内存消耗特别是如果查询线程配置得很多的情况下。 配置过大的threadpool更是会产生很多诡异的性能问题Issue#18161里所描述的问题就是我们所经历过的。 默认的Theadpool大小一般来说工作得很不错了。冷热数据最好做分离。对于日志型应用来说一般是每天建立一个新索引当天的热索引在写入的同时也会有较多的查询。如果上面还存有比较长时间之前的冷数据那么当用户做大跨度的历史数据查询的时候过多的磁盘IO和CPU消耗很容易拖慢写入造成数据的延迟。所以我们用了一部分机器来做冷数据的存储利用ES可以给结点配置自定义属性的功能为冷结点加上boxtype:weak的标识每晚通过维护脚本更新冷数据的索引路由设置index.routing.allocation.{require|include|exclude}让数据自动向冷结点迁移。 冷数据的特性是不再写入用户查的频率较低但量级可能很大。比如我们有个索引每天2TB并且用户要求保持过去90天数据随时可查。保持这么大量的索引为open状态并非只消耗磁盘空间。ES为了快速访问磁盘上的索引文件需要在内存里驻留一些数据(索引文件的索引)也就是所谓的segment memory。稍微熟悉ES的同学知道JVM heap分配不能超过32GB对于我们128GB RAM, 48TB磁盘空间的机器而言如果只跑一个ES实例只能利用到32GB不到的heap当heap快用饱和的时候磁盘上保存的索引文件还不到10TB这样显然是不经济的。 因此我们决定在冷结点上跑3个ES实例每个分配31GB heap空间从而可以在一台物理服务器上存储30多TB的索引数据并保持open状态供用户随时搜索。 实际使用下来由于冷数据搜索频率不高也没有写入即时只剩余35GB内存给os做文件系统缓存查询性能还是可以满足需求的。不同数据量级的shard最好隔离到不同组别的结点。 大家知道ES会自己平衡shard在集群的分布这个自动平衡的逻辑主要考量三个因素。其一同一索引下的shard尽量分散到不同的结点;其二每个结点上的shard数量尽量接近;其三结点的磁盘有足够的剩余空间。这个策略只能保证shard数量分布均匀而并不能保证数据大小分布均匀。 实际应用中我们有200多种索引数据量级差别很大大的一天几个TB小的一个月才几个GB并且每种类型的数据保留时长又千差万别。抛出的问题就是如何能比较平衡并充分的利用所有节点的资源。 针对这个问题我们还是通过对结点添加属性标签来做分组结合index routing控制的方式来做一些精细化的控制。尽量让不同量级的数据使用不同组别的结点使得每个组内结点上的数据量比较容易自动平衡。定期做索引的force merge并且最好是每个shard merge成一个segment。前面提到过heap消耗与segment数量也有关系force merge可以显著降低这种消耗。 如果merge成一个segment还有一个好处就是对于terms aggregation搜索时无需构造Global Ordinals可以提升聚合速度。 四. 版本选择我们在2.4版本上稳定跑了很长时间比较保守的同学可以上2.4激进有精力折腾的可以考虑最新的5.0。 我们集群两周前从v2.4.0升级到了v5.0.0这个版本除了升级第一周遇到一个不稳定的问题以外感觉新版本带来的以下特性还是非常值得去升级的:结点启动的Bootstrap过程加入了很多关键系统参数设置的核验比如Max File Descriptors, Memory Lock, Virtual Memory设置等等如果设置不正确会拒绝启动并抛出异常。 与其带着错误的系统参数启动并在日后造成性能问题不如启动失败告知用户问题是个很好的设计索引性能提升。升级后在同样索引速率下我们看到cpu消耗下降非常明显除了对索引速率提升有帮助也会一定程度提升搜索速率。新的数值型数据结构存储空间更小Range和地理位置计算更快速Instant Aggregation对于类似now-7d to now这样的范围查询聚合能够做cache了实际使用下来效果明显用户在Kibana上跑个过去一周数据的聚合头2次刷新慢点之后有cache了几乎就瞬间刷出更多的保护措施保证集群的稳定比如对一次搜索hit的shard数量做了限制增强了circuit breaker的特性更好的防护集群资源被坏查询耗尽。 升级第一周我们的冷数据结点出现间歇性不响应问题从而刨出3个issue提交给官方:Issue#21595 Issue#21612 Issue#21611第一个问题确认为Bug将在5.0.2修复其他两个目前还不清楚根源看起来也只在我们的应用场景里遇到了。所幸问题都找到了了规避措施实施这些措施以后最近一周我们的集群重新回到以前2.4版本时期的稳定状态。 五. 监控不差钱没空折腾的建议还是买官方的xpack省心有精力折腾的利用ES各种丰富的stats api用自己熟悉的监控工具采集数据可视化出来就好了。 那么多监控指标最最关键的还是以下几类:各类Thread pool的使用情况active/queue/reject可视化出来。 判断集群是否有性能瓶颈了看看业务高峰期各类queue是不是很高reject是不是经常发生基本可以做到心里有数。JVM的heap used%以及old GC的频率如果old GC频率很高并且多次GC过后heap used%几乎下不来说明heap压力太大要考虑扩容了。也有可能是有问题的查询或者聚合造成的需要结合用户访问记录来判断)。Segment memory大小和Segment的数量。节点上存放的索引较多的时候这两个指标就值得关注要知道segment memory是常驻heap不会被GC回收的因此当heap压力太大的时候可以结合这个指标判断是否是因为节点上存放的数据过多需要扩容。Segement的数量也是比较关键的如果小的segment非常多比如有几千即使segment memory本身不多但是在搜索线程很多的情况下依然会吃掉相当多的heap原因是lucene为每个segment会在thread local里记录状态信息这块的heap内存开销和(segment数量* thread数量)相关。很有必要记录用户的访问记录。我们只开放了http api给用户前置了一个nginx做http代理将用户第三方api的访问记录通过access log全部记录下来。通过分析访问记录可以在集群出现性能问题时快速找到问题根源对于问题排查和性能优化都很有帮助。 最后就是多上手实践遇到问题多查官方资料多Google看是否有其他人遇到同类问题精力充足有编程背景的同学也可以多刨刨源码。