1.创建集群
1.1 部署管理主机
- 也可以在任意一台redis服务器上
- 部署ruby脚本运行环境
- 创建管理集群脚本
[student@room9pc01 ~]$ scp /linux-soft/03/redis/redis-3.2.1.gem root@192.168.4.57:/root
[student@room9pc01 ~]$ scp /linux-soft/03/redis/redis-4.0.8.tar.gz root@192.168.4.57:/root
[root@mysql57 ~]# yum -y install rubygems
[root@mysql57 ~]# gem install redis-3.2.1.gem
[root@mysql57 ~]# echo $PATH
[root@mysql57 ~]# mkdir /root/bin
[root@mysql57 ~]# tar -xf redis-4.0.8.tar.gz
[root@mysql57 ~]# cd redis-4.0.8/src
[root@mysql57 src]# cp redis-trib.rb /root/bin/
[root@mysql57 src]# chmod +x /root/bin/redis-trib.rb
[root@mysql57 ~]# redis-trib.rb help
1.2 配置redis服务器
- redis集群存取数据工作原理。
当客户端存储数据到集群主机时,获取变量名与CRC16算法做hash计算,然后用计算结果与16384做取余运算,再根据余数值,把数据存储到对应的master 服务器。
[root@mysql51 ~]# vim /etc/redis/6379.conf
815 cluster-enabled yes #启用集群功能
823 cluster-config-file nodes-6379.conf #存储集群信息文件
829 cluster-node-timeout 5000 #连接超时时间单位毫秒
:wq
[root@mysql51 ~]# /etc/init.d/redis_6379 stop
[root@mysql51 ~]# rm -rf /var/lib/redis/6379/*
[root@mysql51 ~]# ls /var/lib/redis/6379/
[root@mysql51 ~]# /etc/init.d/redis_6379 start
[root@mysql51 ~]# netstat -ntlup | grep redis-server
tcp 0 0 192.168.4.51:16351 0.0.0.0:* LISTEN 2404/redis-server 1
#集群通信端口默认服务端口+10000
tcp 0 0 192.168.4.51:6351 0.0.0.0:* LISTEN 2404/redis-server 1
[root@mysql51 ~]# cat /var/lib/redis/6379/nodes-6379.conf
[root@mysql51 ~]# redis-cli -h 192.168.4.51 -p 6351
192.168.4.51:6351> CLUSTER INFO #查看集群信息
cluster_state:fail
cluster_known_nodes:1
192.168.4.51:6351> CLUSTER NODES #查看集群节点信息
a364e456d9479745e5f7b0250b22bd997168165e :6351@16351 myself,master - 0 0 0 connected
1.3 创建集群
[root@mysql57 ~]# redis-trib.rb create --replicas 1 192.168.4.51:6351 192.168.4.52:6352 192.168.4.53:6353 192.168.4.54:6354 192.168.4.55:6355 192.168.4.56:6356
#定义每台主库从库个数
[root@mysql51 ~]# redis-cli -h 192.168.4.51 -p 6351
192.168.4.51:6351> CLUSTER INFO
cluster_state:ok
cluster_known_nodes:6
1.4 查看集群
- 在管理主机查看
[root@mysql57 ~]# redis-trib.rb info 192.168.4.51:6351 #查看集群信息
[root@mysql57 ~]# redis-trib.rb check 192.168.4.51:6351 #检查集群主机角色
1.5 访问集群存取数据
命令格式: redis-cli -c -h IP地址 -p 端口 #-c集群模式
[root@mysql50 ~]# redis-cli -c -h 192.168.4.52 -p 6352
192.168.4.52:6352> set name iboy #存数据
192.168.4.52:6352> set age 19
-> Redirected to slot [741] located at 192.168.4.51:6351
OK
192.168.4.51:6351> set sex boy
OK
192.168.4.51:6351> set school EDG
-> Redirected to slot [8455] located at 192.168.4.52:6352
OK
192.168.4.52:6352> keys *
1) "name"
2) "school"
192.168.4.52:6352> get age #取数据
-> Redirected to slot [741] located at 192.168.4.51:6351
"19"
192.168.4.51:6351> keys *
1) "sex"
2) "age"
2.管理集群
2.1 向集群中添加新主机
2.1.1 添加master角色主机
要求:把Ip192.168.4.58 的redis服务器添加到集群里做主服务器 操作步骤:
1. 运行redis服务且支持集群功能
2.添加master角色的主机(192.168.4.57)
- 添加主机到集群
[root@mysql57 ~]# redis-trib.rb add-node 192.168.4.58:6358 192.168.4.52:6352
-
分配hash slots 槽
[root@mysql57 ~]# redis-trib.rb reshard 192.168.4.51:6351 #重新分片 How many slots do you want to move (from 1 to 16384)?4096 #拿出4096个hash 槽给主机192.168.4.58 What is the receiving node ID? c5e0da48f335c46a2ec199faa99b830f537dd8a0 #主机192.168.4.58的id值 Source node #1:all #从当前所有master服务器获取hash槽 Do you want to proceed with the proposed reshard plan (yes/no)?yes #同意以上配置
-
查看集群信息
[root@mysql57 ~]# redis-trib.rb info 192.168.4.58:6358 [root@mysql57 ~]# redis-trib.rb check 192.168.4.58:6358
-
访问集群存取数据
[root@mysql50 ~]# redis-cli -c -h 192.168.4.58 -p 6358
2.2.2 添加slave角色主机
要求:把Ip192.168.4.59 的redis服务器添加到集群里做主服务器 操作步骤:
1. 运行redis服务且支持集群功能
2.添加slave角色的主机(192.168.4.57)
命令格式: redis-trib.rb add-node --slave [–master-id id值] IP地址:端口 任意集群IP地址:端口
#如果不指定主节点的Ip的话,会把新节点随机添加为从节点最少的主库[root@mysql57 ~]# redis-trib.rb add-node --slave 192.168.4.59:6359 192.168.4.51:6351
2.2 把主机移除集群
2.2.1 移除slave角色主机(192.168.4.59)
- 从服务器没有hash槽,直接移除即可
- 移除时指定从服务器id值
命令格式:redis-trib.rb del-node 任意集群Ip地址:端口 要移除的id值
[root@mysql57 ~]# redis-trib.rb del-node 192.168.4.52:6352 40a05cae93074408aecb73fdbdec0654a326635d
>>> Removing node 40a05cae93074408aecb73fdbdec0654a326635d from cluster 192.168.4.52:6352
>>> Sending CLUSTER FORGET messages to the cluster...
>>> SHUTDOWN the node. #会停止移除主机的redis服务
2.2.2 移除master角色主机(192.168.4.58)
1. 释放占用的hash值
[root@mgm57 ~]# redis-trib.rb reshard 192.168.4.53:6353
How many slots do you want to move (from 1 to 16384)?4096
#移除4096个数槽
What is the receiving node ID? bc5c4e082a5a3391b634cf433a6486c867cfc44b
#要移动给谁的id即目标主机(这里可以随机写一个master的ID)
Source node #1: c5e0da48f335c46a2ec199faa99b830f537dd8a0
#从谁那移动即源主机(这里写4.58的ID)
Source node #2: done #设置完毕
...
Do you want to proceed with the proposed reshard plan (yes/no)?yes #提交
2.移除主机
[root@mysql57 ~]# redis-trib.rb del-node 192.168.4.53:6353 313684a861610a61ee97af40c920c4b890e45404
2.3 把移除的主机再次添加到集群里(master/slave)
[root@mysql58 ~]# /etc/init.d/redis_6379 start
[root@mysql58 ~]# redis-cli -h 192.168.4.58 -p 6358
192.168.4.58:6358> CLUSTER RESET #重置集群
192.168.4.58:6358> CLUSTER INFO
cluster_state:fail
192.168.4.58:6358> exit
[root@mysql57 ~]# redis-trib.rb add-node [--slave] 192.168.4.58:6358 192.168.4.55:6355
[root@mysql57 ~]# redis-trib.rb info 192.168.4.55:6355
2.4 让1台主服务有2个从服务(让192.168.4.59做192.168.4.55的从)
[root@mysql59 ~]# /etc/init.d/redis_6379 start
[root@mysql59 ~]# redis-cli -h 192.168.4.59 -p 6359
192.168.4.59:6359> CLUSTER RESET
192.168.4.59:6359> CLUSTER INFO
cluster_state:fail
192.168.4.59:6359> exit
[root@mysql57 ~]# redis-trib.rb add-node --slave --master-id fc6f39badd672c5b79869d813fe10d0858b52833 192.168.4.59:6359 192.168.4.51:6351
[root@mysql57 ~]# redis-trib.rb info 192.168.4.55:6355
192.168.4.55:6355 (fc6f39ba...) -> 2 keys | 4096 slots | 2 slaves.
2.5 测试
[root@mysql55 ~]# /etc/init.d/redis_6379 stop
[root@mysql57 ~]# redis-trib.rb info 192.168.4.51:6351
192.168.4.51:6351 (a364e456...) -> 2 keys | 4096 slots | 1 slaves.
-
还原
[root@mysql51 ~]# /etc/init.d/redis_6379 stop [root@mysql51 ~]# rm -rf /var/lib/redis/6379/* [root@mysql51 ~]# vim /etc/redis/6379.conf #cluster-enabled yes #cluster-config-file nodes-6379.conf #cluster-node-timeout 5000 [root@mysql51 ~]# /etc/init.d/redis_6379 start [root@mysql51 ~]# netstat -ntlup | grep redis tcp 0 0 192.168.4.51:6351 0.0.0.0:* LISTEN 2564/redis-server 1 [root@mysql51 ~]# redis-cli -h 192.168.4.51 -p 6351 192.168.4.51:6351> keys * (empty list or set) 192.168.4.51:6351> CLUSTER INFO ERR This instance has cluster support disabled 192.168.4.51:6351>exit