solrcloud2
分片的原因
由于底层Lucene的限制,每个solr索引中包含的文档数不能超过231个,大约是21亿个。但是solr分片一般不是基于这个的原因,因为一般没有到这个峰值的之后,solr的各中性能问题就暴露出来了。分片一般是为了提高性能,提高吞吐量。
复制策略
solr的复制策略和大部分的NOSQL数据库的复制策略不同,不是通过事务日志进行同步的,而是每次写操作都有leader节点分发到每个replication上去。也就是说,solr更加注重一致性。但是这样牺牲了一定的可用性。
solr的分片策略
solr使用文档路由组件来确定文档应该被分配到那个分片上。solr支持两种文档路由组件:compositeID(默认)和隐式路由(个性化定制分配策略)。
我们只说默认的compositeID策略:
- 计算文档唯一ID字段的数值散列值。
- 将文档分配至hash值区间包含上述计算的散列值的分片。
solr计算散列值使用的是MurmurHash算法,与其它流行的哈希函数相比,对于规律性较强的key,MurmurHash的随机分布特征表现更良好。
ZooKeeper的作用
ZooKeeper在solr中主要负责:
- 集中化配置文件的存储和分发。
- 检测和提醒集群的状态改变。
- 确定分片大小。
每个solr实例将会在ZooKeeper下注册一个ZNode,每个ZNode使用ZooKeeper提供的接口与ZooKeeper通信,如果超过一定的时间(默认是15秒)没有接收到通信,那么ZooKeeper就认为这个节点故障了。节点故障之后ZooKeeper会通知其他solr实例(其实是其他solr实例注册成为了相关ZNode的watcher),这样solr就可以知道哪些节点故障了,如果是replication节点故障了,那么leader节点将不会再转发更新请求到它的身上,如果是leader节点故障了,ZooKeeper会选举一个新的leader节点,然后通知所有相关的solr实例。
solr中leader的作用
在查询操作中,leader和replication具有一样的作用。
对于更新操作来说,leader具有一些责任是replication没有的:
- 为整个分片接收更新请求
- 在更新后的文档上加上_version字段。
- 将文档写入更新日志。
- 以并行的方式将更新请求发送到当前分片的每个replication中,直到收到响应。
solr分布式索引(SolrCloud)的局限性:
- 计算相关度的时候,需要用到文档频次,但是分片之后,文档频次只能计算到所在节点的频次,不是真个集群的频次,所以一定程度上影响了相关度的计算,可能造成偏差。
- 除非使用隐式路由实现个性化配置,如果使用默认的compositionID路由的话,不能使用join和分组(我没有用到,类似于实现sql中的Group by)功能。
分片分割
为集群扩展replication非常简单,只要使用增加完solrcore之后使用命令就可以了。但是如果要增加分片,如原来有2个分片,要增加1个,就很麻烦了,因为分片的内容是根据hash区间确定的,如果我们重新分配Hash区间,那么区间中的数据就需要重新分配。而solr又不能像redis那样,缓存可以经得起丢失,所以solr使用的是分片分割的策略来扩展分片。
分片分割是将一个分片分割为两个的策略。这样不会丢失数据,又可以扩展这个分片。它的缺陷也很明显,如果不能直接扩展分片个数*2,那么就不能均衡的分配分片的hash区间。
这是solr当前的分片扩展策略,还不够成熟,新的版本可能会有更加完善的方案出来。
solrcloud2的更多相关文章
- docker-solr 使用host模式修改默认的8983端口号
1.使用root账号进入docker-solr docker exec -it 127627ab6247 -u root /bin/bash 2.安装vim apt-get update apt-ge ...
随机推荐
- SQL 查询建表SQL
1.新建一个查询语句,按执行按钮 2.结果页面会显示一条sql语句,复制该语句即可建表 3.建表测试
- vue加载优化方案
我们的项目随着组件的加入,首次加载的js文件越来越大,用户等待时间越来越长:之前想着使用webpack的splitCoding来解决,看了webpack的官方文档可以配置optimization的 m ...
- Qt全局坐标和相对坐标
QMouseEvent中两类坐标系统,一类是窗口坐标,一类是显示器坐标. QPoint QMouseEvent::pos() 返回相对这个widget(重载了QMouseEvent的widget)的位 ...
- 前端手势控制图片插件书写三(将transform变化应用在图片和canvas画布上)
注意:transform的scale为负数时,图片会垂直翻转 一.在使用transform将计算得到的变化应用到图片上后,需要考虑到我们每次计算的都是touchmove中本次的差量.在第一次移动过后. ...
- 配置了Ubuntu环境变量,系统启动不了
修改了etc/init.d/rcS文件后重启后Ubuntu起不来了, 开启按shift+e或者直接选择,进入恢复模式 进入root shell 执行这个命令 可以有写入权限,重新挂载 mount - ...
- jquery 实时监听输入框值变化的完美方案
只需要同时绑定 oninput 和 onpropertychange 两个事件,但是这并不完美 $('.input-form :input').bind('input propertychange', ...
- 洛谷P2178 [NOI2015]品酒大会 后缀数组+单调栈
P2178 [NOI2015]品酒大会 题目链接 https://www.luogu.org/problemnew/show/P2178 题目描述 一年一度的"幻影阁夏日品酒大会" ...
- X509证书在window server 2003/IIS 6环境部署
利用makecert.exe工具生成的X509证书在winform程序中运行正常,但是给部署在IIS中的应用程序用却获取不到证书信息,返回为空.原因是,iis没有权限读取位于证书存储区的X509证书, ...
- js重点——作用域——作用域分类(三)
一.作用域可以分为全局作用域,局部作用域(函数作用域)和块级作用域. 1.全局作用域 代码在程序中的任何位置都能被访问到,window对象的内置属性都拥有全局作用域. <script> v ...
- JS数组判断,方法
怎么判断一个对象是不是数组? 首先可以用 ES5 提供的 isArray 方法进行判断(注意:Array.isArray是ES 5.1推出的,不支持IE6~8,所以在使用的时候也应注意兼容问题. ) ...