天天看點

redis 叢集

Redis集           

基于六個redis實列部署redis cluster叢集,并實作節點的擴充與删減;

Redis-Cluster采用無中心結構,每個節點儲存資料和整個叢集狀态,每個節點都和其他所有節點連接配接

其結構特點:

1、所有的redis節點彼此互聯(PING-PONG機制),内部使用二進制協定優化傳輸速度和帶寬。

2、節點的fail是通過叢集中超過半數的節點檢測失效時才生效。

3、用戶端與redis節點直連,不需要中間proxy層.用戶端不需要連接配接叢集所有節點,連接配接叢集中任何一個可用節點即可。

4、redis-cluster把所有的實體節點映射到[0-16383]slot上(不一定是平均配置設定),cluster 負責維護node<->slot<->value。

5、Redis叢集預分好16384個桶,當需要在 Redis 叢集中放置一個 key-value 時,根據 CRC16(key) mod 16384的值,決定将一個key放到哪個桶中。

redis cluster節點配置設定

現在我們是三個主節點分别是:A, B, C 三個節點,它們可以是一台機器上的三個端口,也可以是三台不同的伺服器。那麼,采用哈希槽 (hash slot)的方式來配置設定16384個slot 的話,它們三個節點分别承擔的slot 區間是:

• 節點A覆寫0-5460;

• 節點B覆寫5461-10922;

• 節點C覆寫10923-16383.

擷取資料:

如果存入一個值,按照redis cluster哈希槽的算法: CRC16('key')384 = 6782。 那麼就會把這個key 的存儲配置設定到 B 上了。同樣,當我連接配接(A,B,C)任何一個節點想擷取'key'這個key時,也會這樣的算法,然後内部跳轉到B節點上擷取資料

Redis Cluster主從模式

redis cluster 為了保證資料的高可用性,加入了主從模式,一個主節點對應一個或多個從節點,主節點提供資料存取,從節點則是從主節點拉取資料備份,當這個主節點挂掉後,就會有這個從節點選取一個來充當主節點,進而保證叢集不會挂掉

上面那個例子裡, 叢集有ABC三個主節點, 如果這3個節點都沒有加入從節點,如果B挂掉了,我們就無法通路整個叢集了。A和C的slot也無法通路。

是以我們在叢集建立的時候,一定要為每個主節點都添加了從節點, 比如像這樣, 叢集包含主節點A、B、C, 以及從節點A1、B1、C1, 那麼即使B挂掉系統也可以繼續正确工作。

B1節點替代了B節點,是以Redis叢集将會選擇B1節點作為新的主節點,叢集将會繼續正确地提供服務。 當B重新開啟後,它就會變成B1的從節點。

不過需要注意,如果節點B和B1同時挂了,Redis叢集就無法繼續正确地提供服務了。

1.1上傳redis解壓

Redis的作用是緩存網站的壓力 在大量讀寫進行資料的轉移

分擔壓力

tar xf redis-5.0.5.tar.gz

cd redis-5.0.5

1.2編譯安裝

make PREFIX=/usr/local/redis install

cp redis.conf /usr/local/redis/

1.3啟動後出現的警告

/usr/local/redis/bin/redis-server /usr/local/redis/redis.conf

Backlog主要控制的是三次握手的時候,server端收到确認号後的隊列長度,

echo "vm.overcommit_memory=1" >>/etc/sysctl.conf

0表示 核心會檢查有沒有多的記憶體給進城使用

echo "net.core.somaxconn=512">>/etc/sysctl.conf

第三個報錯是開啟了大頁記憶體動态配置設定,設定關閉,讓redis負責記憶體管理

echo never > /sys/kernel/mm/transparent_hugepage/enabled

sysctl -p

最後執行一下指令,重新開機redis就不會提示警告錯誤資訊了

1.4開啟守護程序

sed -i 's/^daemonize no$/daemonize yes/g' redis.conf

執行初始化的腳本

1.5配置主庫的配置

bind 0.0.0.0

1.6從庫的配置為

REPLICAOF 192.168.217.136 6379 指定主庫是誰

重新開機下

[root@localhost redis]# /etc/init.d/redis_6379 restart

建立redis-cluster目錄

root@localhost redis]# mkdir redis-cluster

[root@localhost redis]# cd redis-cluster/

1.7建立6個執行個體目錄

[root@localhost redis-cluster]# mkdir 7000 7001 7002 7003 7004 7005

複制可執行檔案

[root@localhost redis-5.0.5]# find . -name redis-server

./src/redis-server

[root@localhost redis-5.0.5]# cp ./src/redis-server /usr/local/redis/redis-cluster/

[root@localhost redis-5.0.5]# ./utils/install_server.sh 初始化6個

mkdir 7006

[root@localhost redis-cluster]# cd /usr/local/src/redis-5.0.5

[root@localhost redis-5.0.5]# ./utils/install_server.sh

一備用

1.8配置節點配置

[root@localhost redis-5.0.5]# vim /usr/local/redis/redis-cluster/7000/7000.conf

cluster-enabled yes 開啟叢集

cluster-config-file nodes-7000.conf 指定叢集配置檔案

cluster-node-timeout 5000 逾時時間5秒

appendonly yes 開啟aof

1.9開啟6redis個執行個體

for i in

seq 0 5

;do /etc/init.d/redis_700$i start;sleep 2;done

[root@localhost ~]# ss -ntl

圖中的箭頭一定對應起來才能去進行 不然會出錯

建立6各節點 自動配置設定 master 和slave

3個位master 3個位slave --cluster-replicas 1 指明叢集中的每個主節點建立一個從節點

[root@localhost redis-5.0.5]# /usr/local/redis/bin/redis-cli --cluster create 127.0.0.1:7000 127.0.0.1:7001 127.0.0.1:7002 \

127.0.0.1:7003 127.0.0.1:7004 127.0.0.1:7005 --cluster-replicas 1

2.0檢視節點的狀态

[root@localhost ~]# /usr/local/redis/bin/redis-cli -p 7000 cluster info

cluster_state:ok

cluster_slots_assigned:16384

cluster_slots_ok:16384

cluster_slots_pfail:0

cluster_slots_fail:0

cluster_known_nodes:6

cluster_size:3

cluster_current_epoch:6

cluster_my_epoch:1

cluster_stats_messages_ping_sent:809

cluster_stats_messages_pong_sent:807

cluster_stats_messages_sent:1616

cluster_stats_messages_ping_received:802

cluster_stats_messages_pong_received:809

cluster_stats_messages_meet_received:5

cluster_stats_messages_received:1616

/usr/local/redis/bin/redis-cli -p 7000 cluster nodes

主7000 ->從7003

主7001->從7004

主7002->從7005

設定鍵值對

/usr/local/redis/bin/redis-cli -p 7000

2.1設定name時候報錯 ,鍵的節點應該到7001中設定

/usr/local/redis/bin/redis-cli -p 7001

或者開啟叢集的模式 寫入資料

/usr/local/redis/bin/redis-cli -p 7000 -c

2.2檢查redis節點狀态

/usr/local/redis/bin/redis-cli -p 7000 --cluster check 127.0.0.1:7000

2.3關閉主節點7001 ,7004順利接管

沒有關閉7001時候鍵的狀态

2.4重新啟動7001 檢視狀态

/etc/init.d/redis_7001 start

2.5配置叢集中節點7006

egrep "cluster-enabled|cluster-config-file|cluster-node-timeout|^appendonly" /usr/local/redis/redis-cluster/7006/7006.conf

配置叢集開啟

sed -ir '/cluster-enabled/s/^# //g' /usr/local/redis/redis-cluster/7006/7006.conf

配置叢集節點

sed -ir '/cluster-config-file/s/^# //g;s/6379/7006/g' /usr/local/redis/redis-cluster/7006/7006.conf

配置逾時時間

sed -ir '/cluster-node-timeout/s/^# //g;s/15000/5000/g' /usr/local/redis/redis-cluster/7006/7006.conf

打開redis持久化

sed -i "/^appendonly/s/no/yes/g" /usr/local/redis/redis-cluster/7006/7006.conf

最後确認下

2.6重新啟動節點以確定能将節點加入叢集

seq 0 6

;do /etc/init.d/redis_700$i restart;sleep 2;done

将7006加入叢集

/usr/local/redis/bin/redis-cli -p 7000 --cluster add-node 127.0.0.1:7006 127.0.0.1:7000

2.7重新分片

/usr/local/redis/bin/redis-cli -p 7000 --cluster reshard 127.0.0.1:7000

2.8增加7006的從節點

/usr/local/redis/bin/redis-cli --cluster add-node --cluster-slave --cluster-master-id 0b3c2d803234a7bf8dcaf2

e34c252ed30b12d03e 127.0.0.1:7007 127.0.0.1:7006

2.9 删除從節點

/usr/local/redis/bin/redis-cli --cluster del-node 127.0.0.1:7007 a1c70b1949e8d6f273b3bce6c750354fdfe11d64

3.0删除主節點,需要删除分片,再删除主節點(任意節點登入)

/usr/local/redis/bin/redis-cli --cluster reshard 127.0.0.1:7002

新分完片的比較大

/usr/local/redis/bin/redis-cli -p 7000 --cluster check 127.0.0.1:7002

删除節點7006

/usr/local/redis/bin/redis-cli --cluster del-node 127.0.0.1:7006 0b3c2d803234a7bf8dcaf2e34c252ed30b12d03e

2.10重新配置設定 分片

/usr/local/redis/bin/redis-cli --cluster rebalance 127.0.0.1:7000

繼續閱讀