1. 程式人生 > >搭建Redis 集群,測試集群:對節點主機重新分片

搭建Redis 集群,測試集群:對節點主機重新分片

... 配置文件 lock open with amp 14. phpredis -s

搭建Redis 集群

準備6臺redis服務器,具體要求如下:

ip地址 端口 etho 日誌文件名

192.168.4.51 6051 都可以接收連接請求 redis51.log

192.168.4.52 6052 都可以接收連接請求 redis52.log

192.168.4.53 6053 都可以接收連接請求 redis53.log

192.168.4.54 6054 都可以接收連接請求 redis54.log

192.168.4.55 6055 都可以接收連接請求 redis55.log

192.168.4.56 6056 都可以接收連接請求 redis56.log

環境準備

1 在6臺redis服務器上運行服務,按照如下要求修改配置文件後,重啟redis服務,清。

生成密鑰與傳密鑰

[root@51 ~]# ssh-keygen

[root@51 ~]# for i in 192.168.4.{51..56}

do

ssh-copy-id $i

done

在每一臺主機上創建redis

[root@51 ~]# tar -xf redis/redis-4.0.8.tar.gz -C .

[root@51 ~]# cd redis-4.0.8/

[root@51 redis-4.0.8]# yum -y install gcc gcc-c++

[root@51 redis-4.0.8]# make && make install

[root@51 redis-4.0.8]# ./utils/install_server.sh

[root@51 redis-4.0.8]# ln -s /etc/init.d/redis_6379 /bin/

在這大家可以也寫個腳本批量安裝redis

1.1 清空數據(在51-56上做一樣的操作)

[root@51 phpredis-2.2.4]# redis-cli -h 192.168.4.51 -p 6051

192.168.4.51:6051> FLUSHALL

OK

192.168.4.51:6051> keys *

(empty list or set)

192.168.4.51:6051>

[root@51 phpredis-2.2.4]# vim /etc/redis/6379.conf

70 bind 192.168.4.51 //物理接口ip地址

93 port 6051 //端口

daemonize yes   //以守護方式運行

815 cluster-enabled yes //開啟集群

823 cluster-config-file nodes-6051.conf // 集群的配置文件不要使用默認的名稱

829 cluster-node-timeout 15000 // 請求超時 5 秒

[root@51 phpredis-2.2.4]# redis_6379 stop

[root@51 phpredis-2.2.4]# redis_6379 start

[root@51 ~]# ss -antulp | grep redis

tcp LISTEN 0 128 192.168.4.51:6051 : users:(("redis-server",pid=24771,fd=6))

tcp LISTEN 0 128 192.168.4.51:16051 : users:(("redis-server",pid=24771,fd=8))

裝包: 在執行創建集群命令的主機安裝ruby軟件包

安裝解釋ruby代碼的軟件包(在51上安裝)

[root@51 redis]# yum -y install ruby ruygems

[root@51 redis]# rpm -q rubygems ruby

rubygems-2.0.14.1-30.el7.noarch

ruby-2.0.0.648-30.el7.x86_64

[root@51 redis-cluster]#rpm -ivh --nodeps ruby-devel-2.0.0.648-30.el7.x86_64.rpm

安裝ruby連接redis 接口程序 gem

[root@51 redis-cluster]# gem install redis-3.2.1.gem

生成創建集群的腳本redis-trib.rb

[root@51 redis]# tar -xf redis-4.0.8.tar.gz

[root@51 redis]# cd redis-4.0.8/

[root@51 redis-4.0.8]# ln -s /root/redis/redis-4.0.8/src/redis-trib.rb /sbin/

創建集群:

[root@51 redis-4.0.8]# redis-trib.rb create --replicas 1 \

192.168.4.51:6051 \

192.168.4.52:6052 \

192.168.4.53:6053 \

192.168.4.54:6054 \

192.168.4.55:6055 \

192.168.4.56:6056

>> Creating cluster

>> Performing hash slots allocation on 6 nodes...

Using 3 masters:

192.168.4.51:6051

192.168.4.52:6052

192.168.4.53:6053

Adding replica 192.168.4.55:6055 to 192.168.4.51:6051

Adding replica 192.168.4.56:6056 to 192.168.4.52:6052

Adding replica 192.168.4.54:6054 to 192.168.4.53:6053

M: c5f725669ad74fbf48b907b06c3b0ff6ca5eeb01 192.168.4.51:6051

slots:0-5560 (5561 slots) master

M: 2c9ee556add7e5187621efd64e4a9fc54bc99489 192.168.4.52:6052

slots:5561-10922 (5562 slots) master

M: bcb32a6d6b9e988789e654c32856c8c478ef253e 192.168.4.53:6053

slots:10923-16383 (5561 slots) master

S: 799f99bc22d8c4a9e0fcdc98166f6e6f5e348df0 192.168.4.54:6054

replicates bcb32a6d6b9e988789e654c32856c8c478ef253e

S: 18b86bca8fa9c9d36f3cad927a1c75c825bee9a4 192.168.4.55:6055

replicates c5f725669ad74fbf48b907b06c3b0ff6ca5eeb01

S: 6a7196a77555cdf14f1a665386ff493928b31d94 192.168.4.56:6056

replicates 2c9ee556add7e5187621efd64e4a9fc54bc99489

Can I set the above configuration? (type ‘yes‘ to accept): yes

>> Nodes configuration updated

>> Assign a different config epoch to each node

>> Sending CLUSTER MEET messages to join the cluster

Waiting for the cluster to join....

>> Performing Cluster Check (using node 192.168.4.51:6051)

M: c5f725669ad74fbf48b907b06c3b0ff6ca5eeb01 192.168.4.51:6051

slots:0-5560 (5561 slots) master

1 additional replica(s)

S: 6a7196a77555cdf14f1a665386ff493928b31d94 192.168.4.56:6056

slots: (0 slots) slave

replicates 2c9ee556add7e5187621efd64e4a9fc54bc99489

............................................

..............................................

replicates bcb32a6d6b9e988789e654c32856c8c478ef253e

[OK] All nodes agree about slots configuration.

>> Check for open slots...

>> Check slots coverage...

[OK] All 16384 slots covered.

[root@51 redis-4.0.8]# cat /var/lib/redis/6379/nodes-6051.conf #集群配置文件

6a7196a77555cdf14f1a665386ff493928b31d94 192.168.4.56:6056@16056 slave 2c9ee556add7e5187621efd64e4a9fc54bc99489 0 1530777397000 6 connected

。。。。。。。。。。。。。。。。。。。。。。

。。。。。。。。。。。。。。。。。。。。。。。。。

每臺 redis服務 在本機登錄 查看集群信息

[root@51 redis-4.0.8]# redis-cli -c -h 192.168.4.51 -p 6051

192.168.4.51:6051> 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:934

cluster_stats_messages_pong_sent:1137

cluster_stats_messages_sent:2071

cluster_stats_messages_ping_received:1132

cluster_stats_messages_pong_received:934

cluster_stats_messages_meet_received:5

cluster_stats_messages_received:2071

192.168.4.51:6051> CLUSTER NODES # 查看本機信息

6a7196a77555cdf14f1a665386ff493928b31d94 192.168.4.56:6056@16056 slave 2c9ee556add7e5187621efd64e4a9fc54bc99489 0 1530778521000 6 connected

bcb32a6d6b9e988789e654c32856c8c478ef253e 192.168.4.53:6053@16053 master - 0 1530778520185 3 connected 10923-16383

18b86bca8fa9c9d36f3cad927a1c75c825bee9a4 192.168.4.55:6055@16055 slave c5f725669ad74fbf48b907b06c3b0ff6ca5eeb01 0 1530778521000 5 connected

2c9ee556add7e5187621efd64e4a9fc54bc99489 192.168.4.52:6052@16052 master - 0 1530778521187 2 connected 5561-10922

799f99bc22d8c4a9e0fcdc98166f6e6f5e348df0 192.168.4.54:6054@16054 slave bcb32a6d6b9e988789e654c32856c8c478ef253e 0 1530778520000 4 connected

c5f725669ad74fbf48b907b06c3b0ff6ca5eeb01 192.168.4.51:6051@16051 myself,master - 0 1530778519000 1 connected 0-5560

測試集群:

連接master庫 存儲數據,對應的從庫 會自動同步數據

[root@51 ~]# redis-cli -c -h master庫ip地址 -p 對應的端口號

Master::

[root@51 redis-4.0.8]# redis-cli -c -h 192.168.4.51 -p 6051

192.168.4.51:6051> set age 10

192.168.4.51:6051> set name aa

192.168.4.52:6052> keys *

1) "name"

Slave:

[root@52 phpredis-2.2.4]# redis-cli -c -h 192.168.4.52 -p 6052

192.168.4.52:6052> keys *

1)"name"

選項 參數

– add-node 添加新節點(default master)

– check 對節點主機做檢查

– reshard 對節點主機重新分片

– add-node --slave 添加從節點主機

– del-node 刪除節點主機

集群選舉測試:停止某個主庫的redis服務 對應的從會自動升級主庫

[root@51 redis-4.0.8]# redis-trib.rb check 192.168.4.51:6051

M: bcb32a6d6b9e988789e654c32856c8c478ef253e 192.168.4.53:6053

slots:10923-16383 (5561 slots) master

1 additional replica(s)

S: 18b86bca8fa9c9d36f3cad927a1c75c825bee9a4 192.168.4.54:6054

slots: (0 slots) slave

replicates c5f725669ad74fbf48b907b06c3b0ff6ca5eeb01

......................

由此可以看出4.53是master ,4.55是slave,現在我們停止53

[root@53 ~]# redis-cli -c -h 192.168.4.53 -p 6053 shutdown

[root@51 redis-4.0.8]# redis-trib.rb check 192.168.4.51:6051

M: 799f99bc22d8c4a9e0fcdc98166f6e6f5e348df0 192.168.4.54:6054

slots:10923-16383 (5561 slots) master

對節點主機重新分片

[root@51 ~]# redis-trib.rb reshard 192.168.4.51:6051

How many slots do you want to move (from 1 to 16384)? 5196

What is the receiving node ID? c5f725669ad74fbf48b907b06c3b0ff6ca5eeb01

Please enter all the source node IDs.

Type ‘all‘ to use all the nodes as source nodes for the hash slots.

Type ‘done‘ once you entered all the source nodes IDs.

Source node #1:799f99bc22d8c4a9e0fcdc98166f6e6f5e348df0

添加主節點主機:

redis-trib.rb add-node 添加的節點:端口號 集群主節點:端口號

[root@51 ~]# redis-trib.rb add-node 192.168.4.48:6048 192.168.4.51:6051

添加從節點

redis-trib.rb add-node --slave 從節點 ip: 端口 192.168.4.51:6351

*如果不指定主節點的 id 的話,會把新節點 隨機添加為 從節點 最少的主的從

[root@51 ~]# redis-trib.rb add-node --slave 192.168.4.51:6051 192.168.4.51:6051

刪除節點主機

刪除從庫

[root@51 ~]# redis-trib.rb del-node 192.168.4.51:6051 676c81e55e491ea7d4f9eb9f53d5c72abc1b8513

>> Removing node 676c81e55e491ea7d4f9eb9f53d5c72abc1b8513 from cluster 192.168.4.51:6051

>> Sending CLUSTER FORGET messages to the cluster...

>> SHUTDOWN the node.

如果要想把刪除的數據節點重新加入集群需要還原數據庫

[root@51 ~]# redis-cli -h 192.168.4.51 -p 6051

192.168.4.51:6051> CLUSTER INFO

cluster_state:ok

cluster_slots_assigned:16384

cluster_slots_ok:16384

cluster_slots_pfail:0

cluster_slots_fail:0

cluster_known_nodes:9

cluster_size:3

。。。。。。。。

192.168.4.51:6051> CLUSTER RESET

OK

192.168.4.51:6051> CLUSTER INFO

cluster_state:fail

cluster_slots_assigned:0

cluster_slots_ok:0

cluster_slots_pfail:0

這樣才可以重新添加

刪除主機master

[root@51 ~]# redis-trib.rb reshard 192.168.4.51:6051

How many slots do you want to move (from 1 to 16384)? 2000 #增加的槽數

What is the receiving node ID? 18ad59ca4d756e61a5076ea2f6a93d567e521a5c #增加到哪個節點

Source node #1:6e8a84fdd95193fd53a9386f8b24c24c4e5122ff #重哪個節點上移出

Do you want to proceed with the proposed reshard plan (yes/no)?yes

[root@51 ~]# redis-trib.rb del-node 192.168.4.48 6e8a84fdd95193fd53a9386f8b24c24c4e5122ff

>> Removing node 6e8a84fdd95193fd53a9386f8b24c24c4e5122ff from cluster 192.168.4.48

Invalid IP or Port (given as 192.168.4.48) - use IP:Port format

搭建Redis 集群,測試集群:對節點主機重新分片