好消息,好消息,江南最大皮革廠倒閉,老板黃鶴吃喝嫖賭欠下3.5個億,攜帶小姨子跑了,我們沒有辦法,只能撬開倉庫拿皮包頂工資。原價100元的,200元的,500元的,現(xiàn)價只賣50元。黃鶴,你不是人,你還我血汗錢,還我血汗錢?,F(xiàn)在賣皮包的人真是不容易啊,天天罵人家姓黃的不是人。
上節(jié)我們講述了Cassandra集群的搭建,這節(jié)我們當然要講Solr 云的搭建,實現(xiàn)分布式搜索。Cassnadra集群有什么好處呢?動態(tài)擴展,集群可以最大限度的實現(xiàn)數(shù)據(jù)容錯,試想,如果只有一臺機器來存儲數(shù)據(jù),假如這臺機器所在的機房停電了或者著火了,那么意味著應(yīng)用程序?qū)⒃L問不到這些數(shù)據(jù)源或者辛辛苦苦經(jīng)營的數(shù)據(jù)化為烏有,那么Cassandra的集群的工作原理是什么呢?
在上一節(jié)我們在配置集群的時候,配置了一個seeds節(jié)點在cassandra.yaml文件中。而且集群中的所有節(jié)點的seeds配置都是一樣的,在Cassandra集群之間有一個協(xié)議叫Gossip協(xié)議,這是一個稱之為端到端的八卦協(xié)議。每個Cassandra集群節(jié)點都靠這個協(xié)議互通信息,Gossip每秒都會向其他節(jié)點發(fā)送心跳探測,進行信息交換,確定彼此的狀態(tài)。seeds節(jié)點是cassandra中一個比較重要的節(jié)點,他負責和集群中的其他節(jié)點通訊并獲取信息。對于cassandra的寫入和讀取操作,都是通過seeds節(jié)點均衡的請求其它的節(jié)點。那么當集群中一個節(jié)點Down了,Gossip會探測到,就不會將數(shù)據(jù)寫到這個down的節(jié)點上,但是還會繼續(xù)向這個節(jié)點發(fā)送心跳探測,只要這個節(jié)點恢復正常,會立即加入集群進行工作,分擔負載。
那么今天Solr云怎么搭建呢?其實也是很簡單的,首先給大家介紹一個網(wǎng)站
http://wiki.apache.org/solr/SolrCloud#schema.xml
專門講述Solr Cloud的,看懂了,搭建Solr云是比較輕松的。
進入正題,我們看一下CentOS中的Solr Cloud如何搭建
首先我們將example復制一份叫example2,如果你是用puty等linux客戶端連接工具的話,進入solr目錄使用cp -r example example2命令拷貝。
我們看一下example下的東東
有一個solr文件夾,內(nèi)容如下
包含MyTest的一個實例,多個SolrCore可以組成Solr的一個collection。那么我們在此再創(chuàng)建一個實例,實現(xiàn)多實例,我們修改后的solr文件夾如下
增加了一個MyTest1的實例,并且將solr.xml的文件內(nèi)容修改如下
1 2 3 4 | < 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,那么我們就實現(xiàn)了多實例的一個SolrCollection。OK,我們?yōu)g覽一下
看到了吧,這就是在一個IP地址一個端口下多實例的實現(xiàn),那么在這里我模擬一個簡單的業(yè)務(wù),一個是用戶信息,一個是資金信息,這兩個共同組成一個用戶的一個資金管理業(yè)務(wù)。但是這種部署方式是省事了,也很簡單,占用的機器也少,但是如果說這個192.168.192.128的機器因自然災(zāi)害被毀,那么辛苦經(jīng)營的數(shù)據(jù)豈不是付之東流。所以目前大多數(shù)的用戶在使用Solr的時候,都是采用云部署,從而實現(xiàn)分布式搜索,通過簡單的拓撲結(jié)構(gòu),就可以避免部分機器over,導致整個數(shù)據(jù)的不完整或者無法使用。那么下來我們就看一下傳說中的Solr Cloud。
首先,我們在上面提到的Solr-4.3.0目錄下有example和example2,兩個是完全一樣的復制品,首先我們要確保example/solr/MyTest/data下面是空的,沒有數(shù)據(jù)和索引文件。我么要實現(xiàn)的是下面的集群
接著進入到example命令,執(zhí)行如下的命令
1 | java -Djetty.port=8983 -Dbootstrap_confdir=. /solr/MyTest/conf -Dcollection.configName=myconf-DzkRun -DnumShards=2 -jar |
到這一步?jīng)]有錯誤算是啟動成功
在這里我們可以看到集群的一些信息。
那么上面的這個命令是什么意思呢?在此解釋一下
-Djetty.port=8983是設(shè)置jetty的啟動端口,jetty和Tomcat以及Jboss號稱三大web主流容器。
-DzkRun是觸發(fā)嵌入在SolrServer中的zookeeper運行
-Dbootstrap_confdir=./solr/MyTest/conf是將Solr的config上傳至zookeeper下,并且文件夾名稱為
myconf。我們看一下上傳到zookeeper的myconf文件夾及內(nèi)容
看到了吧,在這里已經(jīng)有了myconf文件夾,內(nèi)容就是從solr/conf下面上傳過來的。-DnumShareds=2意思是我們要將索引劃分為幾個邏輯分區(qū)。在這里設(shè)置為2,那么我們的shareds就有兩個
因為目前我只是啟動了一個機器,所以shared2還沒有映射的機器,等我再啟動一臺后,他會映射到shard2。好了我們再啟動一臺,看是否能映射到shared2。首先我們進入到example2目錄下,執(zhí)行
1 | java -Djetty.port= 7574 -DzkHost=localhost: 9983 -jar start.jar |
解釋一下這段命令
-Djetty的意思是告訴jetty servlet容器使用另外的端口,-DzHost是指出剛才我們運行的一個Solr Server中嵌入的zookeeper的地址,官網(wǎng)解釋是zookeeper的端口為solr的端口加上1000,所以在這里是9983。OK我們再看一下Solr云
看到了吧,出現(xiàn)了兩個分片,那么寫數(shù)據(jù)的時候可能有些數(shù)據(jù)寫在shared1上,有些寫在shared2上,但是我們在檢索數(shù)據(jù)的時候,會返回一個完整的結(jié)果,這就是一個簡單的云部署。
那么當我們再啟動幾臺機器會怎么樣呢?因為我們指定了只能有兩個邏輯分區(qū),那么當我們啟動第三臺機器的時候,他就作為shard1的復制品,如果再啟動一個機器,他就作為shard2的復制品。ok,我們現(xiàn)在來試一下,由于我只有一個虛擬機和一臺windows7機器,所以我打算在windows上啟動2個solr,那么他們會自動加入shard1和shard2。那到底是不是這樣呢?我用同樣的命令啟動了一個windows上的solr,報錯,錯誤原因至今沒找到,或者說壓根就是個錯誤的嘗試。那我們再復制兩個example,如下
OK,我們用如下的命令在啟動一個機器
1 | java -Djetty.port=7575 -DzkHost=localhost:9983 -jar start.jar |
我們再看一下solr cloud有沒有變化,輸入http://192.168.192.128:8983/solr/#/~cloud,我們發(fā)現(xiàn)shard1多了一個復制品
其拓撲圖如下
這個實驗驗證了我們所說的,第三臺機器會作為第一臺機器的一個復制品。
我們在啟動一臺機器,這個節(jié)點將作為第二臺機器的復制品
其拓撲結(jié)構(gòu)如下
上面的拓撲結(jié)構(gòu)就是我們實現(xiàn)的分區(qū)為2,復制品為1的solr 集群
OK,如果我們有機器資源的話,只需要在不同的機器上像這樣啟動,就可以搭建出一個solr cloud。由于本人機器有限,只能用同一個IP給大家做演示。