solrcloud document路由
2016-12-28 20:26
162 查看
摘要: solrcloud document路由
solrcloud的官方文档有对路由的简短介绍,但是不够详细和深入。solrcloud有两种路由策略,一种是implicit(个人称之为手动路由) ,一种是compositeId(个人称之为自动路由);在创建collection的时候,如果没有指定路由方式,指定了numShards个数,默认是自动路由,即compositeId路由;反之是implicit路由。在solrcloud的admin界面上,能通过collection的state.json看得到collection的路由策略
1、compositeId路由
使用compositeId路由,在创建collection的时候必须要指定
1.1、compositeId路由原理
在创建collection的时候,compositeId路由确定的分片数(
Shard3 : 0-1073741823
Shard4 : 1073741824-2147483647
Shard1 : 2147483648-3221225471
Shard2 : 3221225472-4294967295
在路由document的时候,compositeId路由会先计算document id的(例如document的unikey)murmurhash3 hash值,然后根据document id的hash值确定文档路由到那个分片上。例如
document id 值为:abc
通过murmurhash3 hash在32bit上的值为:1073741836
通过比较,1073741836落在Shard4范围内,即该文档写入到Shard4中
compositeId路由不仅限于通过document id计算murmurhash3 hash来确定分片;还可以通过正则表达式来确定分片,例如:
shard_key!document_id
!号前面是分片的key,这个key不一定非得是shard的名字,保证solr按照这个key计算一致就行;!号后面是文档id
取shard_key 16 bit hash,取document_id 16bit hash拼接成一个32bit hash,用于确定文档的路由。
例如,你需要为不同的用户分shard,你可能会使用用户的名字或者ID作为一个前缀。比如你的用户是“juanpi”,如果你有一个文档的ID是“12345”,把前缀插入到文档的id字段中变成:“juanpi!12345”,在这里感叹号是一个分割符号,这里的“juanpi”定义了这个文档会指向一个特定的shard。
1.2、compositeId路由查询
然后在查询的时候,需要把这个前缀包含到_route_参数里面(比如:q=solr&_route_=juanpi!)使查询指向指定的shard。在某些情况下;这样操作能提升查询的性能,因为它省掉了需要在所有shard上发起http查询请求。
2、implicit路由
2.1、implicit路由原理
该路由方式需要外部指定document具体落在路由到哪个Shard,这与compositeId路由方式索引可大致均匀分布在每个shard上不同;implicit路由是在外部控制,如果控制不好有可能分布不均匀。
在创建collection的时候,不指定shadNume,或者明确指出使用implicit路由,也可以指定使用某一个field(router.field)路由,这个参数定义了通过使用文档中的一个字段来确定文档是属于哪个shard的。但是,如果在一个文档中指定的字段没有值得话,这个文档Solr会拒绝处理。同时也可以使用_route_参数来指定一个特定的shard。
也可以使用solrj指定
利用solrJ新建索引时,需要在代码中指定索引具体落在哪个shard上,添加代码:
doc.addField("_route_","shard_x");
同时在schema.xml添加字段
<field name="_route_" type="string"/>
2.2、implicit路由查询
由于创建collection是例如如下方式
http://localhost:8983/solr/admin/collections?action=CREATE&name=testimplicit&router.name=implicit&shards=shard1,shard2,shard3
而添加document的时候,指定写入到shard1,shard2,shard3中的某一片,例如
doc.addField("_route_","shard3");
查询的时候到某个分片查询即可
3、扩展
3.1、compositeId路由方式扩展
compositeId路由,只能通过手动分裂某一片成两片,然后删除原来片的方式扩展
在分裂的过程中,原分片的数据会大致均匀分成2份,复制到新生成的两个分片中
例如,原分片1万数据,分裂成两片后,每片大致5千数据
然后再手动删除原来(1万数据)的那片
3.2、implicit路由方式扩张
由于implicit路由在写入的时候指定了分片,所以可以自由的增加分片
solrcloud的官方文档有对路由的简短介绍,但是不够详细和深入。solrcloud有两种路由策略,一种是implicit(个人称之为手动路由) ,一种是compositeId(个人称之为自动路由);在创建collection的时候,如果没有指定路由方式,指定了numShards个数,默认是自动路由,即compositeId路由;反之是implicit路由。在solrcloud的admin界面上,能通过collection的state.json看得到collection的路由策略
1、compositeId路由
使用compositeId路由,在创建collection的时候必须要指定
numShards(分片数)。compositeId是一种不可扩展的路由策略。
1.1、compositeId路由原理
在创建collection的时候,compositeId路由确定的分片数(
numShards),solr给每一片分配一个32bit hash范围。例如numShards=4,32位无符号范围是0-ffffffff(4294967295),那么每片的范围是
Shard3 : 0-1073741823
Shard4 : 1073741824-2147483647
Shard1 : 2147483648-3221225471
Shard2 : 3221225472-4294967295
在路由document的时候,compositeId路由会先计算document id的(例如document的unikey)murmurhash3 hash值,然后根据document id的hash值确定文档路由到那个分片上。例如
document id 值为:abc
通过murmurhash3 hash在32bit上的值为:1073741836
通过比较,1073741836落在Shard4范围内,即该文档写入到Shard4中
compositeId路由不仅限于通过document id计算murmurhash3 hash来确定分片;还可以通过正则表达式来确定分片,例如:
shard_key!document_id
!号前面是分片的key,这个key不一定非得是shard的名字,保证solr按照这个key计算一致就行;!号后面是文档id
取shard_key 16 bit hash,取document_id 16bit hash拼接成一个32bit hash,用于确定文档的路由。
例如,你需要为不同的用户分shard,你可能会使用用户的名字或者ID作为一个前缀。比如你的用户是“juanpi”,如果你有一个文档的ID是“12345”,把前缀插入到文档的id字段中变成:“juanpi!12345”,在这里感叹号是一个分割符号,这里的“juanpi”定义了这个文档会指向一个特定的shard。
1.2、compositeId路由查询
然后在查询的时候,需要把这个前缀包含到_route_参数里面(比如:q=solr&_route_=juanpi!)使查询指向指定的shard。在某些情况下;这样操作能提升查询的性能,因为它省掉了需要在所有shard上发起http查询请求。
2、implicit路由
2.1、implicit路由原理
该路由方式需要外部指定document具体落在路由到哪个Shard,这与compositeId路由方式索引可大致均匀分布在每个shard上不同;implicit路由是在外部控制,如果控制不好有可能分布不均匀。
在创建collection的时候,不指定shadNume,或者明确指出使用implicit路由,也可以指定使用某一个field(router.field)路由,这个参数定义了通过使用文档中的一个字段来确定文档是属于哪个shard的。但是,如果在一个文档中指定的字段没有值得话,这个文档Solr会拒绝处理。同时也可以使用_route_参数来指定一个特定的shard。
也可以使用solrj指定
利用solrJ新建索引时,需要在代码中指定索引具体落在哪个shard上,添加代码:
doc.addField("_route_","shard_x");
同时在schema.xml添加字段
<field name="_route_" type="string"/>
2.2、implicit路由查询
由于创建collection是例如如下方式
http://localhost:8983/solr/admin/collections?action=CREATE&name=testimplicit&router.name=implicit&shards=shard1,shard2,shard3
而添加document的时候,指定写入到shard1,shard2,shard3中的某一片,例如
doc.addField("_route_","shard3");
查询的时候到某个分片查询即可
3、扩展
3.1、compositeId路由方式扩展
compositeId路由,只能通过手动分裂某一片成两片,然后删除原来片的方式扩展
在分裂的过程中,原分片的数据会大致均匀分成2份,复制到新生成的两个分片中
例如,原分片1万数据,分裂成两片后,每片大致5千数据
然后再手动删除原来(1万数据)的那片
3.2、implicit路由方式扩张
由于implicit路由在写入的时候指定了分片,所以可以自由的增加分片
相关文章推荐
- SolrCloud之Sharding路由介绍
- solrcloud有路由的mapreduce索引程序
- SolrCloud 5.0 路由、Collection创建与数据迁移
- SolrCloud 5.0 路由、Collection创建与数据迁移,solrcloud文档路由
- SolrCloud中的document与Collection管理
- SolrCloud使用implict路由规则创建Shard
- SolrCloud 5.0 路由、Collection创建与数据迁移
- SolrCloud之Sharding路由介绍
- Hard commits, soft commits and transaction logs(solrcloud同步)
- 数一数SolrCloud5.5遇到的几个坑。。。
- Solr4.0(SolrCloud) & ElasticSearch(ES) 比较(一)
- SolrCloud阶段总结
- solrCloud搭建的方式方法
- 【Spring Cloud】Zuul 路由访问
- 部署基于tomcat 8 的solrCloud 5.5集群
- springcloud 入门 7 (zuul路由网关)
- solrcloud deploy for solr 4.8.0
- Spring Cloud微服务断路由Hystrix与服务网关学习笔记
- solr solrcloud 检索 搜索 zookeeper 分布式 部署
- Solr之SolrCloud高亮查询