Redis 搭建集群

So in practical terms, what you get with Redis Cluster?

  • The ability to automatically split your dataset among multiple nodes.
  • The ability to continue operations when a subset of the nodes are experiencing failures or are unable to communicate with the rest of the cluster.

如官方文檔所說,redis 集群解決的兩個核心問題就是:

  • 節(jié)點生而平等
  • 節(jié)點團結共生

1 安裝 Redis

請參考鏈接。


2 搭建集群

2.1 創(chuàng)建文件夾

生產環(huán)境中,我們不會把服務都集中到一臺機器上;所以接下來我們假設有兩臺機器,搭建集群。
每臺機器上 Redis 節(jié)點的端口號為 9001-9003 ,端口號即集群下各實例文件夾。數(shù)據(jù)存放在 端口號/data 文件夾中。

mkdir /usr/local/redis-cluster
cd redis-cluster/
mkdir -p 9001/data 9002/data 9003/data 
2.2 復制執(zhí)行腳本

在 /usr/local/redis-cluster 下創(chuàng)建 bin 文件夾,用來存放集群運行腳本,并把安裝好的 Redis 的 src 路徑下的運行腳本拷貝過來。

mkdir redis-cluster/bin
cd /usr/local/redis/src
cp mkreleasehdr.sh redis-benchmark redis-check-aof redis-check-dump 
redis-cli redis-server redis-trib.rb /usr/local/redis-cluster/bin
2.3 復制一個新 Redis 實例

我們現(xiàn)在從已安裝好的 Redis 中復制一個新的實例到 9001 文件夾,并修改 redis.conf 配置。

cp /usr/local/redis/* /usr/local/redis-cluster/9001

啟動每個節(jié)點時配置文件很重要,redis.conf 除了常規(guī)的配置外集群時需要注意:

port 9001(每個節(jié)點的端口號)
daemonize yes
bind 192.168.151.216(綁定當前機器 IP)
dir /usr/local/redis-cluster/9001/data/(數(shù)據(jù)文件存放位置)
pidfile /var/run/redis_9001.pid(pid 9001和port要對應)
cluster-enabled yes(啟動集群模式)
cluster-config-file nodes9001.conf(9001和port要對應)
cluster-node-timeout 15000
appendonly yes
2.4 再復制兩個新 Redis 實例

把 9001 實例 復制到另外兩個文件夾中

cp -rf /usr/local/redis-cluster/9001/* /usr/local/redis-cluster/9002
cp -rf /usr/local/redis-cluster/9001/* /usr/local/redis-cluster/9003
2.5 修改 9002/9003 的 redis.conf 文件

進入相應的節(jié)點文件夾,做全局替換。

vim redis.conf
:%s/9001/9002/g
2.6 安裝集群所需軟件
yum install ruby
yum install rubygems
gem install redis 
2.7 創(chuàng)建集群
/usr/local/redis-cluster/bin/redis-trib.rb create --replicas 1 192.168.151.216:9001 
192.168.151.216:9002 192.168.151.216:9003 
192.168.151.217:9001 192.168.151.217:9002 192.168.151.217:9003

簡單解釋一下這個命令:調用 ruby 命令來進行創(chuàng)建集群,--replicas 1 表示主從復制比例為 1:1,即一個主節(jié)點對應一個從節(jié)點;然后,默認給我們分配好了每個主節(jié)點和對應從節(jié)點服務,以及 solt 的大小,因為在 Redis 集群中有且僅有 16383 個 solt ,默認情況會給我們平均分配,當然你可以指定,后續(xù)的增減節(jié)點也可以重新分配。

當詢問是否同意集群配置時,輸入 yes 后,會開始集群創(chuàng)建。

2.8 測試集群

通過客戶端命令連接上,通過集群命令看一下狀態(tài)和節(jié)點信息等。

/usr/local/redis-cluster/bin/redis-cli -c -h 192.168.119.131 -p 9001
cluster info
cluster nodes
測試集群
2.9 Haproxy + Redis

關于Haproxy的配置可以參考鏈接,也可閱讀我上一篇文章。

在 haproxy.cfg 添加集群監(jiān)聽:

listen test1  0.0.0.0:6380 
        server s1 192.168.139.161:9001  check inter 2000 rise 2 fall 5 
        server s2 192.168.139.161:9002  check inter 2000 rise 2 fall 5 
        server s3 192.168.139.161:9003  check inter 2000 rise 2 fall 5 
        server s4 192.168.139.193:9001  check inter 2000 rise 2 fall 5 
        server s5 192.168.139.193:9002  check inter 2000 rise 2 fall 5 
        server s6 192.168.139.193:9003  check inter 2000 rise 2 fall 5 
2.10 簡易架構圖
架構圖

3 總結

redis cluster在設計的時候,就考慮到了去中心化,去中間件,也就是說,集群中的每個節(jié)點都是平等的關系,都是對等的,每個節(jié)點都保存各自的數(shù)據(jù)和整個集群的狀態(tài)。每個節(jié)點都和其他所有節(jié)點連接,而且這些連接保持活躍,這樣就保證了我們只需要連接集群中的任意一個節(jié)點,就可以獲取到其他節(jié)點的數(shù)據(jù)。

Redis 集群沒有并使用傳統(tǒng)的一致性哈希來分配數(shù)據(jù),而是采用另外一種叫做哈希槽 (hash slot)的方式來分配的。redis cluster 默認分配了 16384 個slot,當我們set一個key 時,會用CRC16算法來取模得到所屬的slot,然后將這個key 分到哈希槽區(qū)間的節(jié)點上,具體算法就是:CRC16(key) % 16384。

Redis 集群會把數(shù)據(jù)存在一個 master 節(jié)點,然后在這個 master 和其對應的salve 之間進行數(shù)據(jù)同步。當讀取數(shù)據(jù)時,也根據(jù)一致性哈希算法到對應的 master 節(jié)點獲取數(shù)據(jù)。只有當一個master 掛掉之后,才會啟動一個對應的 salve 節(jié)點,充當 master 。

需要注意的是:必須要3個或以上的主節(jié)點,否則在創(chuàng)建集群時會失??;并且當存活的主節(jié)點數(shù)小于總節(jié)點數(shù)的一半時,整個集群就無法提供服務了。

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
【社區(qū)內容提示】社區(qū)部分內容疑似由AI輔助生成,瀏覽時請結合常識與多方信息審慎甄別。
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發(fā)布,文章內容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

相關閱讀更多精彩內容

友情鏈接更多精彩內容