好消息,好消息,江南最大皮革厂倒闭,老板黄鹤吃喝嫖赌欠下3.5个亿,携带小姨子跑了,我们没有办法,只能撬开仓库拿皮包顶工资。原价100元的,200元的,500元的,现价只卖50元。黄鹤,你不是人,你还我血汗钱,还我血汗钱。现在卖皮包的人真是不容易啊,天天骂人家姓黄的不是人。


上节我们讲述了Cassandra集群的搭建,这节我们当然要讲Solr 云的搭建,实现分布式搜索。Cassnadra集群有什么好处呢?动态扩展,集群可以最大限度的实现数据容错,试想,如果只有一台机器来存储数据,假如这台机器所在的机房停电了或者着火了,那么意味着应用程序将访问不到这些数据源或者辛辛苦苦经营的数据化为乌有,那么Cassandra的集群的工作原理是什么呢?


在上一节我们在配置集群的时候,配置了一个seeds节点在cassandra.yaml文件中。而且集群中的所有节点的seeds配置都是一样的,在Cassandra集群之间有一个协议叫Gossip协议,这是一个称之为端到端的八卦协议。每个Cassandra集群节点都靠这个协议互通信息,Gossip每秒都会向其他节点发送心跳探测,进行信息交换,确定彼此的状态。seeds节点是cassandra中一个比较重要的节点,他负责和集群中的其他节点通讯并获取信息。对于cassandra的写入和读取操作,都是通过seeds节点均衡的请求其它的节点。那么当集群中一个节点Down了,Gossip会探测到,就不会将数据写到这个down的节点上,但是还会继续向这个节点发送心跳探测,只要这个节点恢复正常,会立即加入集群进行工作,分担负载。


那么今天Solr云怎么搭建呢?其实也是很简单的,首先给大家介绍一个网站

http://wiki.apache.org/solr/SolrCloud#schema.xml

专门讲述Solr Cloud的,看懂了,搭建Solr云是比较轻松的。


进入正题,我们看一下CentOS中的Solr Cloud如何搭建

大数据实战之环境搭建(九)_solr Cloud

首先我们将example复制一份叫example2,如果你是用puty等linux客户端连接工具的话,进入solr目录使用cp -r example example2命令拷贝。

我们看一下example下的东东

大数据实战之环境搭建(九)_solr Cloud_02

有一个solr文件夹,内容如下

大数据实战之环境搭建(九)_solr Cloud_03

包含MyTest的一个实例,多个SolrCore可以组成Solr的一个collection。那么我们在此再创建一个实例,实现多实例,我们修改后的solr文件夹如下

大数据实战之环境搭建(九)_jetty solr_04

增加了一个MyTest1的实例,并且将solr.xml的文件内容修改如下

<cores adminPath="/admin/cores" defaultCoreName="Bruce" host="${host:}" hostPort="${jetty.port:8983}" hostContext="${hostContext:solr}" zkClientTimeout="${zkClientTimeout:15000}">
  <core name="MyTest.UserInfo" instanceDir="MyTest" />
   <core name="MyTest.BonusInfo" instanceDir="MyTest1" />
</cores>

OK,那么我们就实现了多实例的一个SolrCollection。OK,我们浏览一下

大数据实战之环境搭建(九)_jetty solr_05

看到了吧,这就是在一个IP地址一个端口下多实例的实现,那么在这里我模拟一个简单的业务,一个是用户信息,一个是资金信息,这两个共同组成一个用户的一个资金管理业务。但是这种部署方式是省事了,也很简单,占用的机器也少,但是如果说这个192.168.192.128的机器因自然灾害被毁,那么辛苦经营的数据岂不是付之东流。所以目前大多数的用户在使用Solr的时候,都是采用云部署,从而实现分布式搜索,通过简单的拓扑结构,就可以避免部分机器over,导致整个数据的不完整或者无法使用。那么下来我们就看一下传说中的Solr Cloud。


首先,我们在上面提到的Solr-4.3.0目录下有example和example2,两个是完全一样的复制品,首先我们要确保example/solr/MyTest/data下面是空的,没有数据和索引文件。我么要实现的是下面的集群

大数据实战之环境搭建(九)_solr Cloud_06


接着进入到example命令,执行如下的命令

java -Djetty.port=8983 -Dbootstrap_confdir=./solr/MyTest/conf -Dcollection.configName=myconf-DzkRun -DnumShards=2 -jar

到这一步没有错误算是启动成功

大数据实战之环境搭建(九)_Solr云_07

在这里我们可以看到集群的一些信息。

那么上面的这个命令是什么意思呢?在此解释一下

-Djetty.port=8983是设置jetty的启动端口,jetty和Tomcat以及Jboss号称三大web主流容器。

-DzkRun是触发嵌入在SolrServer中的zookeeper运行

-Dbootstrap_confdir=./solr/MyTest/conf是将Solr的config上传至zookeeper下,并且文件夹名称为

myconf。我们看一下上传到zookeeper的myconf文件夹及内容

大数据实战之环境搭建(九)_jetty solr_08


看到了吧,在这里已经有了myconf文件夹,内容就是从solr/conf下面上传过来的。-DnumShareds=2意思是我们要将索引划分为几个逻辑分区。在这里设置为2,那么我们的shareds就有两个

大数据实战之环境搭建(九)_solr Cloud_09

因为目前我只是启动了一个机器,所以shared2还没有映射的机器,等我再启动一台后,他会映射到shard2。好了我们再启动一台,看是否能映射到shared2。首先我们进入到example2目录下,执行

java -Djetty.port=7574 -DzkHost=localhost:9983 -jar start.jar

解释一下这段命令

-Djetty的意思是告诉jetty servlet容器使用另外的端口,-DzHost是指出刚才我们运行的一个Solr Server中嵌入的zookeeper的地址,官网解释是zookeeper的端口为solr的端口加上1000,所以在这里是9983。OK我们再看一下Solr云

大数据实战之环境搭建(九)_Solr云_10

看到了吧,出现了两个分片,那么写数据的时候可能有些数据写在shared1上,有些写在shared2上,但是我们在检索数据的时候,会返回一个完整的结果,这就是一个简单的云部署。

大数据实战之环境搭建(九)_Solr云_11

那么当我们再启动几台机器会怎么样呢?因为我们指定了只能有两个逻辑分区,那么当我们启动第三台机器的时候,他就作为shard1的复制品,如果再启动一个机器,他就作为shard2的复制品。ok,我们现在来试一下,由于我只有一个虚拟机和一台windows7机器,所以我打算在windows上启动2个solr,那么他们会自动加入shard1和shard2。那到底是不是这样呢?我用同样的命令启动了一个windows上的solr,报错,错误原因至今没找到,或者说压根就是个错误的尝试。那我们再复制两个example,如下

大数据实战之环境搭建(九)_solr Cloud_12

OK,我们用如下的命令在启动一个机器

java -Djetty.port=7575 -DzkHost=localhost:9983 -jar start.jar

我们再看一下solr cloud有没有变化,输入http://192.168.192.128:8983/solr/#/~cloud,我们发现shard1多了一个复制品

大数据实战之环境搭建(九)_jetty solr_13

其拓扑图如下

大数据实战之环境搭建(九)_Solr云_14

这个实验验证了我们所说的,第三台机器会作为第一台机器的一个复制品。

我们在启动一台机器,这个节点将作为第二台机器的复制品

大数据实战之环境搭建(九)_Solr云_15

其拓扑结构如下

大数据实战之环境搭建(九)_jetty solr_16

上面的拓扑结构就是我们实现的分区为2,复制品为1的solr 集群

大数据实战之环境搭建(九)_jetty solr_17

OK,如果我们有机器资源的话,只需要在不同的机器上像这样启动,就可以搭建出一个solr cloud。由于本人机器有限,只能用同一个IP给大家做演示。