Zookeeper,SolrCloud,Redis Cluster三種叢集(偽叢集)的搭建
1.什麼是叢集
- 1.叢集概念
-
叢集是一種計算機系統, 它通過一組鬆散整合的計算機軟體和/或硬體連線起來高度緊密地協作完成計算工作。在某種意義上,他們可以被看作是一臺計算機。集群系統中的單個計算機通常稱為節點,通常通過區域網連線,但也有其它的可能連線方式。叢集計算機通常用來改進單個計算機的計算速度和/或可靠性。一般情況下叢集計算機比單個計算機,比如工作站或超級計算機效能價格比要高得多。
- 2.叢集的特點
1.可擴充套件性:叢集的效能不限制於單一的服務實體,新的服務實體可以動態的新增到叢集,從而增強叢集的效能。
2.高可用性:叢集當其中一個節點發生故障時,這臺節點上面所執行的應用程式將在另一臺節點被自動接管,消除單點故障對於增強資料可用性、可達性和可靠性是非常重要的。- 3.叢集的兩大能力
1.負載均衡:負載均衡把任務比較均勻的分佈到叢集環境下的計算和網路資源,以提高資料吞吐量。
2.錯誤恢復:如果叢集中的某一臺伺服器由於故障或者維護需要無法使用,資源和應用程式將轉移到可用的叢集節點上。這種由於某個節點的資源不能工作,另一個可用節點中的資源能夠透明的接管並繼續完成任務的過程,叫做錯誤恢復。
負載均衡和錯誤恢復要求各服務實體中有執行同一任務的資源存在,而且對於同一任務的各個資源來說,執行任務所需的資訊檢視必須是相同的。- 3.叢集與分散式的區別
說到叢集,可能大家會立刻聯想到另一個和它很相近的一個詞—-“分散式”。那麼叢集和分散式是一回事嗎?有什麼聯絡和區別呢?
相同點:
分散式和叢集都是需要有很多節點伺服器通過網路協同工作完成整體的任務目標。
不同點:
分散式是指將業務系統進行拆分,即分散式的每一個節點都是實現不同的功能。而叢集每個節點做的是同一件事情。
如下圖,每個人都有不同的分工,一起協作幹一件事,叫做“分散式”
2. Zookeeper叢集
1. Zookeeper叢集簡介
- 1.1 為什麼搭建Zookeeper叢集
大部分分散式應用需要一個主控、協調器或者控制器來管理物理分佈的子程序。目前,大多數都要開發私有的協調程式,缺乏一個通用機制,協調程式的反覆編寫浪費,且難以形成通用、伸縮性好的協調器,zookeeper提供通用的分散式鎖服務,用以協調分散式應用。所以說zookeeper是分散式應用的協作服務。
zookeeper作為註冊中心,伺服器和客戶端都要訪問,如果有大量的併發,肯定會有等待。所以可以通過zookeeper叢集解決。
- 1.2 瞭解Leader選舉
Zookeeper的啟動過程中leader選舉是非常重要而且最複雜的一個環節。那麼什麼是leader選舉呢?zookeeper為什麼需要leader選舉呢?zookeeper的leader選舉的過程又是什麼樣子的?
首先我們來看看什麼是leader選舉。其實這個很好理解,leader選舉就像總統選舉一樣,每人一票,獲得多數票的人就當選為總統了。在zookeeper叢集中也是一樣,每個節點都會投票,如果某個節點獲得超過半數以上的節點的投票,則該節點就是leader節點了。
假設有五臺伺服器組成的zookeeper叢集,它們的id從1-5,同時它們都是最新啟動的,也就是沒有歷史資料,在存放資料量這一點上,都是一樣的.假設這些伺服器依序啟動,來看看會發生什麼 。
伺服器1啟動,此時只有它一臺伺服器啟動了,它發出去的報沒有任何響應,所以它的選舉狀態一直是LOOKING狀態
伺服器2啟動,它與最開始啟動的伺服器1進行通訊,互相交換自己的選舉結果,由於兩者都沒有歷史資料,所以id值較大的伺服器2勝出,但是由於沒有達到超過半數以上的伺服器都同意選舉它(這個例子中的半數以上是3),所以伺服器1,2還是繼續保持LOOKING狀態.
伺服器3啟動,根據前面的理論分析,伺服器3成為伺服器1,2,3中的老大,而與上面不同的是,此時有三臺伺服器選舉了它,所以它成為了這次選舉的leader.
伺服器4啟動,根據前面的分析,理論上伺服器4應該是伺服器1,2,3,4中最大的,但是由於前面已經有半數以上的伺服器選舉了伺服器3,所以它只能接收當小弟的命了.
伺服器5啟動,同4一樣,當小弟
2. 搭建Zookeeper叢集
我們這裡要求搭建一個三個節點的Zookeeper叢集(偽叢集)
- 2.1 準備工作
重新部署一臺虛擬機器作為我們搭建叢集的測試伺服器。
(1)安裝JDK 【此步驟省略】。
(2)Zookeeper壓縮包上傳到伺服器
(3)將Zookeeper解壓 ,建立data目錄 ,將 conf下zoo_sample.cfg 檔案改名為 zoo.cfg
(4)建立/usr/local/zookeeper-cluster目錄,將解壓後的Zookeeper複製到以下三個目錄
/usr/local/zookeeper-cluster/zookeeper-1
/usr/local/zookeeper-cluster/zookeeper-2
/usr/local/zookeeper-cluster/zookeeper-3
mkdir /usr/local/zookeeper-cluster
cp -r zookeeper-3.4.6 /usr/local/zookeeper-cluster/zookeeper-1
cp -r zookeeper-3.4.6 /usr/local/zookeeper-cluster/zookeeper-2
cp -r zookeeper-3.4.6 /usr/local/zookeeper-cluster/zookeeper-3
(5)配置每一個Zookeeper 的dataDir(zoo.cfg) clientPort 分別為2181 2182 2183
修改/usr/local/zookeeper-cluster/zookeeper-1/conf/zoo.cfg
clientPort=2181
dataDir=/usr/local/zookeeper-cluster/zookeeper-1/data
修改/usr/local/zookeeper-cluster/zookeeper-2/conf/zoo.cfg
clientPort=2182
dataDir=/usr/local/zookeeper-cluster/zookeeper-2/data
修改/usr/local/zookeeper-cluster/zookeeper-3/conf/zoo.cfg
clientPort=2183
dataDir=/usr/local/zookeeper-cluster/zookeeper-3/data
- 2.2 配置叢集
(1)在每個zookeeper的 data 目錄下建立一個 myid 檔案,內容分別是1、2、3 。這個檔案就是記錄每個伺服器的ID
(2)在每一個zookeeper 的 zoo.cfg配置客戶端訪問埠(clientPort)和叢集伺服器IP列表。
叢集伺服器IP列表如下
server.1=192.168.25.140:2881:3881
server.2=192.168.25.140:2882:3882
server.3=192.168.25.140:2883:3883
解釋:server.伺服器ID=伺服器IP地址:伺服器之間通訊埠:伺服器之間投票選舉埠
- 2.3 啟動叢集
啟動叢集就是分別啟動每個例項。
3. SolrCloud叢集
3.1 SolrCloud簡介
- 1.什麼是SolrCloud
SolrCloud(solr 雲)是 Solr 提供的分散式搜尋方案,當你需要大規模,容錯,分散式索引和檢索能力時使用 SolrCloud。當一個系統的索引資料量少的時候是不需要使用 SolrCloud的,當索引量很大,搜尋請求併發很高,這時需要使用 SolrCloud 來滿足這些需求。
SolrCloud 是基於 Solr 和Zookeeper的分散式搜尋方案,它的主要思想是使用 Zookeeper作為叢集的配置資訊中心。
它有幾個特色功能:
1)集中式的配置資訊
2)自動容錯
3)近實時搜尋
4)查詢時自動負載均衡
- 2. SolrCloud系統結構
- 【1】物理結構
-
三個 Solr 例項( 每個例項包括兩個 Core),組成一個 SolrCloud。
- 【2】邏輯結構
-
索引集合包括兩個 Shard(shard1 和 shard2),shard1 和 shard2 分別由三個 Core 組成,其中一個 Leader 兩個 Replication,Leader 是由 zookeeper 選舉產生,zookeeper 控制每個shard上三個 Core 的索引資料一致,解決高可用問題。使用者發起索引請求分別從 shard1 和 shard2 上獲取,解決高併發問題。
(1)Collection
Collection 在 SolrCloud 叢集中是一個邏輯意義上的完整的索引結構。它常常被劃分為一個或多個 Shard(分片),它們使用相同的配置資訊。
比如:針對商品資訊搜尋可以建立一個 collection。
collection=shard1+shard2+….+shardX
(2) Core
每個 Core 是 Solr 中一個獨立執行單位,提供 索引和搜尋服務。一個 shard 需要由一個Core 或多個 Core 組成。由於 collection 由多個 shard 組成所以 collection 一般由多個 core 組成。
(3)Master 或 Slave
Master 是 master-slave 結構中的主結點(通常說主伺服器),Slave 是 master-slave 結構中的從結點(通常說從伺服器或備伺服器)。同一個 Shard 下 master 和 slave 儲存的資料是一致的,這是為了達到高可用目的。
(4)Shard
Collection 的邏輯分片。每個 Shard 被化成一個或者多個 replication,通過選舉確定哪個是 Leader。
3.2 搭建SolrCloud
1. 搭建要求
Zookeeper 作為叢集的管理工具
1、叢集管理:容錯、負載均衡。
2、配置檔案的集中管理
3、叢集的入口
需要實現 zookeeper 高可用,需要搭建zookeeper叢集。建議是奇數節點。需要三個 zookeeper 伺服器。
搭建 solr 叢集需要 7 臺伺服器(搭建偽分散式,建議虛擬機器的記憶體 1G 以上):
需要三個 zookeeper 節點
需要四個 tomcat 節點。2. 準備工作
環境準備
CentOS-6.5-i386-bin-DVD1.iso
jdk-7u72-linux-i586.tar.gz
apache-tomcat-7.0.47.tar.gz
zookeeper-3.4.6.tar.gz
solr-4.10.3.tgz步驟:
(1)搭建Zookeeper叢集(我們在上一小節已經完成)
(2)將已經部署完solr 的tomcat的上傳到linux
(3)在linux中建立資料夾 /usr/local/solr-cloud 建立4個tomcat例項mkdir /usr/local/solr-cloud cp -r tomcat-solr /usr/local/solr-cloud/tomcat-1 cp -r tomcat-solr /usr/local/solr-cloud/tomcat-2 cp -r tomcat-solr /usr/local/solr-cloud/tomcat-3 cp -r tomcat-solr /usr/local/solr-cloud/tomcat-4
(4)將本地的solrhome上傳到linux
(5)在linux中建立資料夾 /usr/local/solrhomes ,將solrhome複製4份mkdir /usr/local/solrhomes cp -r solrhome /usr/local/solrhomes/solrhome-1 cp -r solrhome /usr/local/solrhomes/solrhome-2 cp -r solrhome /usr/local/solrhomes/solrhome-3 cp -r solrhome /usr/local/solrhomes/solrhome-4
(6)修改每個solr的 web.xml 檔案, 關聯solrhome
<env-entry> <env-entry-name>solr/home</env-entry-name> <env-entry-value>/usr/local/solrhomes/solrhome-1</env-entry-value> <env-entry-type>java.lang.String</env-entry-type> </env-entry>
(7)修改每個tomcat的原執行埠8085 8080 8009 ,分別為
8185 8180 8109 8285 8280 8209 8385 8380 8309 8485 8480 8409
- 提示:
-
8005埠是用來關閉TOMCAT服務的埠。
8080埠,負責建立HTTP連線。在通過瀏覽器訪問Tomcat伺服器的Web應用時,使用的就是這個聯結器。
8009埠,負責和其他的HTTP伺服器建立連線。在把Tomcat與其他HTTP伺服器整合時,就需要用到這個聯結器。- 3. 配置叢集
(1)修改每個 tomcat例項 bin 目錄下的 catalina.sh 檔案 ,把此配置新增到catalina.sh中( 第234行 ) :
JAVA_OPTS="-DzkHost=192.168.25.140:2181,192.168.25.140:2182,192.168.25.140:2183"
JAVA_OPTS ,顧名思義,是用來設定JVM相關執行引數的變數 . 此配置用於在tomcat啟動時找到 zookeeper叢集。
(2)配置 solrCloud 相關的配置。每個 solrhome 下都有一個 solr.xml,把其中的 ip 及埠號配置好(是對應的tomcat的IP和埠)。
solrhomes/solrhome-1/solr.xml
<solrcloud>
<str name="host">192.168.25.140</str>
<int name="hostPort">8180</int>
<str name="hostContext">${hostContext:solr}</str>
<int name="zkClientTimeout">${zkClientTimeout:30000}</int>
<bool name="genericCoreNodeNames">${genericCoreNodeNames:true}</bool>
</solrcloud>
solrhomes/solrhome-2/solr.xml
<solrcloud>
<str name="host">192.168.25.140</str>
<int name="hostPort">8280</int>
<str name="hostContext">${hostContext:solr}</str>
<int name="zkClientTimeout">${zkClientTimeout:30000}</int>
<bool name="genericCoreNodeNames">${genericCoreNodeNames:true}</bool>
</solrcloud>
solrhomes/solrhome-3/solr.xml
<solrcloud>
<str name="host">192.168.25.140</str>
<int name="hostPort">8380</int>
<str name="hostContext">${hostContext:solr}</str>
<int name="zkClientTimeout">${zkClientTimeout:30000}</int>
<bool name="genericCoreNodeNames">${genericCoreNodeNames:true}</bool>
</solrcloud>
solrhomes/solrhome-4/solr.xml
<solrcloud>
<str name="host">192.168.25.140</str>
<int name="hostPort">8480</int>
<str name="hostContext">${hostContext:solr}</str>
<int name="zkClientTimeout">${zkClientTimeout:30000}</int>
<bool name="genericCoreNodeNames">${genericCoreNodeNames:true}</bool>
</solrcloud>
(3)讓 zookeeper 統一管理配置檔案。需要把 solrhome下collection1/conf 目錄上傳到
zookeeper。上傳任意 solrhome 中的配置檔案即可。
我們需要使用solr給我們提供的工具上傳配置檔案:
solr-4.10.3/example/scripts/cloud-scripts/zkcli.sh
將solr-4.10.3壓縮包上傳到linux,解壓,然後進入solr-4.10.3/example/scripts/cloud-scripts目錄 ,執行下列命令
./zkcli.sh -zkhost 192.168.25.140:2181,192.168.25.140:2182,192.168.25.140:2183 -cmd upconfig
-confdir /usr/local/solrhomes/solrhome-1/collection1/conf -confname myconf
- 引數解釋
-
-zkhost :指定zookeeper地址列表
-cmd :指定命令。upconfig 為上傳配置的命令
-confdir : 配置檔案所在目錄
-confname : 配置名稱- 4. 啟動叢集
(1)啟動每個 tomcat 例項。要保證 zookeeper 叢集是啟動狀態。
如果你想讓某個資料夾下都可以執行,使用以下命令實現
chmod -R 777 solr-cloud
(2)訪問叢集
位址列輸入 http://192.168.25.140:8180/solr ,可以看到Solr叢集版的介面
4. Redis Cluster叢集
4. 1 Redis-Cluster簡介
- 1. 什麼是Redis-Cluster
為何要搭建Redis叢集。Redis是在記憶體中儲存資料的,而我們的電腦一般記憶體都不大,這也就意味著Redis不適合儲存大資料,適合儲存大資料的是Hadoop生態系統的Hbase或者是MogoDB。Redis更適合處理高併發,一臺裝置的儲存能力是很有限的,但是多臺裝置協同合作,就可以讓記憶體增大很多倍,這就需要用到叢集。
Redis叢集搭建的方式有多種,例如使用客戶端分片、Twemproxy、Codis等,但從redis 3.0之後版本支援redis-cluster叢集,它是Redis官方提出的解決方案,Redis-Cluster採用無中心結構,每個節點儲存資料和整個叢集狀態,每個節點都和其他所有節點連線。
客戶端與 redis 節點直連,不需要中間 proxy 層.客戶端不需要連線叢集所有節點連線叢集中任何一個可用節點即可。
所有的 redis 節點彼此互聯(PING-PONG 機制),內部使用二進位制協議優化傳輸速度和頻寬.
2. 分佈儲存機制-槽
(1)redis-cluster 把所有的物理節點對映到[0-16383]slot 上,cluster 負責維護
node<->slot<->value
(2)Redis 叢集中內建了 16384 個雜湊槽,當需要在 Redis 叢集中放置一個 key-value 時,redis 先對 key 使用 crc16 演算法算出一個結果,然後把結果對 16384 求餘數,這樣每個key 都會對應一個編號在 0-16383 之間的雜湊槽,redis 會根據節點數量大致均等的將雜湊槽對映到不同的節點。
例如三個節點:槽分佈的值如下:
SERVER1: 0-5460
SERVER2: 5461-10922
SERVER3: 10923-16383- 3. 容錯機制-投票
(1)選舉過程是叢集中所有master參與,如果半數以上master節點與故障節點通訊超過(cluster-node-timeout),認為該節點故障,自動觸發故障轉移操作. 故障節點對應的從節點自動升級為主節點
(2)什麼時候整個叢集不可用(cluster_state:fail)?
如果叢集任意master掛掉,且當前master沒有slave.叢集進入fail狀態,也可以理解成叢集的slot對映[0-16383]不完成時進入fail狀態.- 3. 容錯機制-投票
4.2 搭建Redis-Cluster
1. 搭建Redis-Cluster
需要 6 臺 redis 伺服器。搭建偽叢集。
需要 6 個 redis 例項。
需要執行在不同的埠 7001-70062. 準備工作
(1)安裝gcc 【此步省略】
Redis 是 c 語言開發的。安裝 redis 需要 c 語言的編譯環境。如果沒有 gcc 需要線上安裝。
yum install gcc-c++
(2)使用yum命令安裝 ruby (我們需要使用ruby指令碼來實現叢集搭建)【此步省略】
yum install ruby
yum install rubygems
(3)將redis原始碼包上傳到 linux 系統 ,解壓redis原始碼包
(4)編譯redis原始碼 ,進入redis原始碼資料夾
make
(5)建立目錄/usr/local/redis-cluster目錄, 安裝6個redis例項,分別安裝在以下目錄
/usr/local/redis-cluster/redis-1
/usr/local/redis-cluster/redis-2
/usr/local/redis-cluster/redis-3
/usr/local/redis-cluster/redis-4
/usr/local/redis-cluster/redis-5
以第一個redis例項為例,命令如下
make install PREFIX=/usr/local/redis-cluster/redis-1
按此方法安裝其餘5個redis例項
(6)複製配置檔案 將 /redis-3.0.0/redis.conf 複製到redis下的bin目錄下
cp redis.conf /usr/local/redis-cluster/redis-1/bin
cp redis.conf /usr/local/redis-cluster/redis-2/bin
cp redis.conf /usr/local/redis-cluster/redis-3/bin
cp redis.conf /usr/local/redis-cluster/redis-4/bin
cp redis.conf /usr/local/redis-cluster/redis-5/bin
cp redis.conf /usr/local/redis-cluster/redis-6/bin- 3. 配置叢集
(1)修改每個redis節點的配置檔案redis.conf
修改執行埠為7001 (7002 7003 …..)(在45行)
將cluster-enabled yes 前的註釋去掉(在632行) 4. 啟動redis叢集
1. 以第一個例項為例,命令如下
cd /usr/local/redis-cluster/redis-1/bin/ ./redis-server redis.conf
把其餘的5個也啟動起來,然後檢視一下是不是都啟動起來了
ps -ef | grep redis
2. 上傳redis-3.0.0.gem ,安裝 ruby用於搭建redis叢集的指令碼。
gem install redis-3.0.0.gem
3. 使用 ruby 指令碼搭建叢集。
進入redis原始碼目錄中的src目錄 執行下面的命令 ./redis-trib.rb create --replicas 1 192.168.25.140:7001 192.168.25.140:7002 192.168.25.140:7003 192.168.25.140:7004 192.168.25.140:7005 192.168.25.140:7006
4. Redis Cluster叢集配置完成了