上篇文章剛剛介紹完redis的主從複製叢集,但主從複製叢集主要是為了解決redis叢集的單點故障問題,通過整合哨兵能實現叢集的高可用;但是卻無法解決資料容量以及單節點的壓力問題,所以本文繼續介紹redis的分片叢集;分片叢集即將不同的資料分發到不同的redis範例(或者主從叢集),每個redis範例沒有關聯,這樣當資料量過大時就做到了資料的分治,如果某個範例故障也不至於丟失所有的資料;下面我會首先解決分片叢集的常用實現方案,然後介紹如何搭建Twitter和predixy兩種代理實現的redis叢集,正常情況,按照我的步驟做完就能夠搭建一套可以的redis叢集了;下面開始
這裡我們不單一討論redis,我們從分片叢集的根本出發,分片即將資料分發到不同的後端服務上去,那麼顯然我們可以從使用者端和伺服器端這兩個方面下手;
這種結構很容易新增或者刪除節點. 比如如果我想新新增個節點D, 我需要從節點 A, B, C中得部分槽到D上. 如果我想移除節點A,需要將A中的槽移到B和C節點上,然後將沒有任何槽的A節點從叢集中移除即可. 由於從一個節點將雜湊槽移動到另一個節點並不會停止服務,所以無論新增刪除或者改變某個節點的雜湊槽的數量都不會造成叢集不可用的狀態.
twemproxy是由Twitter開源的一套代理分片服務,可以接受多個使用者端的存取然後根據設定的演演算法將資料分配到不同的redis節點,再按原路返回;不支援redis的watch、multi等命令
1、mkdir twemproxy 在/root目錄建立一個twemproxy用來存放twemproxy的原始碼
2、安裝git yum install git
3、克隆twemproxy的程式碼
4、進入原始碼目錄,cd twemproxy
5、安裝automake和libtool
6、安裝configure,執行autoreconf -fvi
7、執行 ./configure
8、執行make編譯原始碼,編譯完正常會有可執行程式出現
9、進入原始碼的/scripts目錄,將組態檔拷貝至/etc/init.d/twemproxy目錄
10、進入init.d檔案, 執行chmod +x twemproxy給twemproxy賦權
11、建立組態檔所在的目錄
12、進入原始碼安裝目錄的conf目錄,將conf目錄下的組態檔拷貝到11步建立的資料夾下
13、進入原始碼安裝目錄的src目錄,將編譯完的可執行程式複製到/usr/bin目錄下,這樣在系統任意位置都可以執行nutcracker
14、進入nutcracker目錄,修改組態檔
15、啟動兩個redis範例
16、啟動nutcracker
17、啟動redis使用者端連線nutcracker對外暴露的埠
我們通過22121埠的代理就可以直接存取redis叢集,可以設定資料,但是由於資料分治了,所以例如keys 、watch、multi等這種聚合的命令在代理裡是不支援的;至此,通過twemproxy 代理的方式搭建的redis叢集就完成了,使用者端只需連結22121埠,至於後續的分片操作由代理服務進行轉發
predixy也是一款redis的代理服務,其即支援redis sentinel又支援redis cluster,在group只有一個的情況下,其還支援watch、multi等指令
Sentinels{}裡填哨兵叢集的ip和埠
Group表示redis分組,shard001表示分組名稱;上圖設定表示一個哨兵叢集監控了兩套redis的主從叢集
注意:Group後面跟的名稱需要與哨兵組態檔裡的master名稱一致
6、根據5中的注意,所以我們現在需要去修改哨兵的組態檔,將其監控的master名稱由預設的mymaster改為shard001,又因為我們需要哨兵監控兩個主從叢集,所以需要再加一個shard002的master設定,命令如下:
vi 26379.conf 、 vi 26380.conf 、 vi 26381.conf
修改完的組態檔如下圖
注意:上圖只擷取了26379的設定,26380和81與79除了port外其餘設定均一致
7、啟動哨兵叢集
8、任意位置建立資料夾test,在裡面建立36379、80和46379、80的目錄
進入36379目錄執行 redis-server --port 36379
進入36380目錄執行 redis-server --port 36380 --replicaof 127.0.0.1 36379追隨36379
這樣一個主從叢集就搭建起來了,46379和80與上面一致,只需更改對應埠即可,我這裡就不再贅述了
至此,哨兵叢集與兩套redis主從複製叢集已啟動完畢
9、進入predixy安裝的bin目錄啟動predixy
10、用redis使用者端測試
雖然上面搭建廢了九牛二虎之力,但是對使用者端而言只需關注predixy對外暴露的服務連線即可:
連線成功後就可以操作redis了,predixy會自動分發到不同的redis叢集中去;設定如圖:
predixy只支援單group下的事務、watch等操作,我們這裡設定了兩個group所以不支援;但是如果只設定一個group的話那麼能寫的也只有一個master,就失去了分片叢集的意義了