在Solr4.4之后,Solr提供了SolrCloud分布式集群的模式,它带来的主要好处是:

(1)大数据量下更高的性能 
(2)更好扩展性 
(3)更高的可靠性 
(4)更简单易用

什么时候应该使用SolrCloud(Shard)呢?

(1)更大的数据量 
(2)更大的索引体积 
(3)想并行索引和查询 
(4)想自定义数据分区

SolrCloud路由的分类

A:显式路由(Composite) => 创建时明确指定shard数目,后期不能添加或者删除shard,单个shard可以split

创建collection方式:首次创建推荐提前在linux上把conf相关配置上传到zk上,然后在solr的admin进行创建, 除此之外,也支持curl和java api动态创建

独有技能:支持shard的split,不支持shard的动态添加和删除

特点: 
(1)默认是基于通过hash(docid)来定位归属shard 
(2)也支持在主键上加入路由字段进行路由,最多支持2级,查询时加入_route_ 参数,设置路由策略,用例如下: 
一级路由例子: 
china!1   usa!2 
二级路由例子: 
china!beijing!1   usa!nework!2 
如果路由后,数据分布不均衡可对数据倾斜的路由,进行均衡,例子如下: 
china/3!1   按1/8的shard个数,均衡数据,如果shard总数是24个,那么将会有3个shard存储china路由的数据 
china!henan/2!1  按1/4的shard个数,均衡数据,如果shard总数是24个,那么将会有6个shard存储china!henan的数据目前固定只有1/8和1/4的比例分配,也就是只支持2,3这样的分配比例

B:隐式路由(Implict)=> 创建时明确指定shard数目,后期可以动态添加或者删除shard,但单个shard不能split

创建collection方式:首次创建推荐提前在linux上把conf相关配置上传到zk上,然后在solr的admin进行创建, 除此之外,也支持curl和java api动态创建。

独有技能:不支持shard的split,支持shard的动态添加和删除

特点: 
真正的100%的手工路由,可根据业务规则进行shard设置,除此之外,支持shard的动态添加和删除,路由控制随心所欲,不像MySQL还得依赖中间件才能搞定,查询时加入_route_ 参数,设置路由策略

总结: 
文章简单介绍了使用SolrCloud的好处,以及什么时候应该使用和其路由的种类与特点,路由话题在分布式系统中是一个高级技能,它与分而治之,按需所取的思想不谋而合sharding的功能并不是Solr,ElasticSearch独有,任何一个数据库存储系统都可以存在这个概念,在实际的开发应用场景中,需要根据业务一些特定的特点来合理划分维度和路由,使用得当,效率会大大提升,无论是写入还是查询,在考虑设计维度或者路由时,大部分可考虑时间,类别,等级,地区等一些字段,当然具体业务还需要具体分析,不能一概而论。

官网文档: 
(1)文档路由 
https://cwiki.apache.org/confluence/display/solr/Shards+and+Indexing+Data+in+SolrCloud#ShardsandIndexingDatainSolrCloud-DocumentRouting 
(2)Collection API 
https://cwiki.apache.org/confluence/display/solr/Collections+API 

solr的创建分片的方式的更多相关文章

  1. Solr入门之SolrServer实例化方式

    随着solr版本的不断升级, 差异越来越大, 从以前的 solr1.2 到现在的 solr4.3, 无论是类还是功能都有很大的变换, 为了能及时跟上新版本的步伐, 在此将新版本的使用做一个简单的入门说 ...

  2. Python学习之路:通过分片的方式修改列表的技巧(拓展知识)

    一.为列表添加值 用分片的方式可以在列表的头部和尾部添加值 1.在列表的头部添加值 x = [1, 2, 3] #创建列表x x[:0] = [0] #用分片的方式在列表头部添加值 print(x) ...

  3. MongoDB 副本集+分片 认证方式搭建

    MongoDB 副本集+分片 认证方式搭建 参考资料: https://www.cnblogs.com/ityouknow/p/7344005.htmlhttps://jorwen-fang.itey ...

  4. Java学习笔记-多线程-创建线程的方式

    创建线程 创建线程的方式: 继承java.lang.Thread 实现java.lang.Runnable接口 所有的线程对象都是Thead及其子类的实例 每个线程完成一定的任务,其实就是一段顺序执行 ...

  5. Wireshark工具创建过滤器的方式

    Wireshark工具创建过滤器的方式  [实例1-3]现在要抓取目的或来源地址为192.168.5.9的封包.在图1.5中添加如下所示的条件: tcp dst port 3128 添加后单击Star ...

  6. Java多线程学习总结--线程概述及创建线程的方式(1)

    在Java开发中,多线程是很常用的,用得好的话,可以提高程序的性能. 首先先来看一下线程和进程的区别: 1,一个应用程序就是一个进程,一个进程中有一个或多个线程.一个进程至少要有一个主线程.线程可以看 ...

  7. JS面向对象编程创建类的方式

    js创建类的方式有几种,大致如下: 1,构造函数方式: function Car(parameters) { this.name = "objectboy"; } var cat1 ...

  8. java中创建多线程的方式

    在java中比较常用的有三种创建多线程的方式. 方式一:继承Thread类,要重写run方法. 在MyThread类 public class MyThread extends Thread { @O ...

  9. Java进阶(四十二)Java中多线程使用匿名内部类的方式进行创建3种方式

    Java中多线程使用匿名内部类的方式进行创建3种方式 package cn.edu.ujn.demo; // 匿名内部类的格式: public class ThreadDemo { public st ...

随机推荐

  1. 【大数据】HBase启动

    zkServer.sh start start-dfs.sh start-yarn.sh start-hbase.sh hbase shell exit http://192.168.1.180:16 ...

  2. git更换仓库,保留分支,保留提交记录及开发权限

    别人推荐的方法都很复杂,这个步骤自己亲自尝试过,非常简单好用. 1.从原地址克隆一份裸版本库,比如原本托管于 GitHub. git clone --bare https://github....(原 ...

  3. CF379C-New Year Ratings Change

    https://www.luogu.org/problemnew/show/CF379C 一道水题,折腾了我好久! 解题: 先排序,从小到大挨个满足客户,把最终rating放进集合里,判断是否已经给出 ...

  4. selenium 2 设置浏览器安装路径

    selenium 2由于调用的是真实的浏览器,所以当你的浏览器不是安装在默认路径下,你就需要设定浏览器启动路径:若是默认路径,则程序中不需设定浏览器启动路径. 比如说用firefox进行测试 1. f ...

  5. [Algorithm] 46. Permutations

    Given a collection of distinct integers, return all possible permutations. Example: Input: [1,2,3] O ...

  6. Tasking

    Put your plan on the tick list, and set the completion time limit, daily repetition, etc. according ...

  7. GuGuFishtion HDU - 6390 (欧拉函数,容斥)

    GuGuFishtion \[ Time Limit: 1500 ms\quad Memory Limit: 65536 kB \] 题意 给出定义\(Gu(a, b) = \frac{\phi(ab ...

  8. 59: loj #10215

    $des$ https://loj.ac/problem/10215 $sol$ exgcd检查 $code$ #include <iostream> #include <cstdl ...

  9. GEE windows 环境配置

    参照GEE开发大神的一篇文章GEE学习笔记 三十五:windows下配置本地开发环境 - 无形的风的文章 - 知乎. 按他的顺序下来还是出了点问题,再整理一下自己遇到的问题. 1.安装Google的 ...

  10. qt5 qmake开发

    mkdir hello helloworld.cpp #include <QPushButton> #include <QApplication> int main(int a ...