一,准redis源码包及环境

~]# ls /root/桌面/redis/
redis-3.2.1.gem redis.zip(redis源码压缩包) ruby-devel-2.0.0.648-30.el7.x86_64.rpm(redis集群管理功能软件包依赖ps:ruby rubygems)
zj~]# for i in {50..56}
\>do
\>scp -rp /root/桌面/redis/ 192.168.4.$i:/root/
\>done
搭建redis集群,拓扑规划
redis集群搭建_第1张图片
IP,端口规划
redis集群搭建_第2张图片

步骤
-1为6台主机安装并运行热第三服务

]#yum -y install gcc
]#cd redis/
]#unzip redis.zip
]#cd redis/
]#tar -xf redis-4.0.8.tar.gz
]#cd redis-4.0.8/
]#make && make install
]#./utils/install_server.sh

调整配置文件
]#vim /etc/redis/redis.conf
bind IP地址 //只写物理接口IP地址
daemonize yes //守护进程方式运行
port XXXX //端口号不要使用默认的6379
cluster-enabled yes //启用集群
cluster-config nodes-XXXX-.conf //指定集群信息文件
cluster-node-timeout 5000 //请求超时5秒
查看服务信息
]#netstat -anputl | grep redis-server
192.168.4.51:6351
192.168.4.51:16351[集群通信端口,默认服务端口+10000]
查看集群信息
]#redis-cli -h 192.168.4.51 -p 6351
192.168.4.51>cluster info
192.168.4.51>cluster nodes
创建集群
(在任意一台上执行创建集群的脚本都可以)这里在51上面执行
]# cd /root/redis
]# ls
redis-3.2.1.gem ruby-devel-2.0.0.648-30.el7.x86_64.rpm
]# yum -y install ruby rubygems
]#rpm -ivh –nodeps ruby-devel-2.0.0.648-30.el7.x86_64.rpm
]# which gem
/usr/bin/gem
生成创建集群的脚本
]# cd /root/redis/redis-4.0.8/src/
]# cp redis-trib.rb /usr/local/bin/
]# ll /usr/local/bin/redis-trib.rb
-rwxr-xr-x. 1 root root 65991 Sep 27 16:12 /usr/local/bin/redis-trib.rb
创建

[root@mysqlA ~]# 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
\>>> Creating cluster
\>>> Performing hash slots allocation on 6 nodes...
Using 3 masters:
3Master 3Slave
[OK] All nodes agree about slots configuration.
\>>> Check for open slots...
\>>> Check slots coverage...
[OK] All 16384 slots covered.

--replicas 1 ,自动为每一个master节点分配一个slave节点

查看集群信息,任意一台主机访问本机的redis服务查看即可
cluster info 查看集群信息
cluster nodes 查看集群节点信息
]# redis-cli -h 192.168.4.52 -p 6352
192.168.4.52:6352> CLUSTER INFO
cluster_state:ok //状态
cluster_slots_assigned:16384
192.168.4.52:6352> CLUSTER NODES //查看集群节点信息

测试集群
命令:
redis-cli -c -h ip地址 -p 端口

]# redis-cli -c -h 192.168.4.51 -p 6351
192.168.4.51:6351> set name jim
-> Redirected to slot [5798] located at 192.168.4.52:6352
OK
192.168.4.52:6352> get name
"jim"
192.168.4.52:6352> set class linux
OK
192.168.4.52:6352> get class
"linux"
192.168.4.52:6352> set pay 26800
-> Redirected to slot [4013] located at 192.168.4.51:6351
OK
192.168.4.51:6351> get pay
"26800"

集群不能用的情况:
有半数或者半数以上的主库机器挂掉,集群就不能用了
把一个从库升级成主,没有从库,集群不能用(前提是:有半数或者半数以上的主库机器挂掉)

一个主库挂掉,它的从库自动顶替为主库,正常使用(前提是:有半数或者半数以上的主库机器能用),挂掉的主库修复好后,会成为从库,不会抢占为主
6)集群节点选举策略(三主,三从)
停止某个主库的redis服务,对应的从库会自动升级为主库
先查看节点信息的主从情况

看谁是谁的从库,如:
看节点前后的编号id是否有相同的
如:8568fbd73cb296cad6915d524e34761b2114af47
发现52的从库为56
停止主库52

192.168.4.51:6351> CLUSTER NODES
...
8568fbd73cb296cad6915d524e34761b2114af47 192.168.4.52:6352@16352 master,fail - 1538041052349 1538041051000 2 disconnected //52的主库坏掉
28e06c5f24a2b6c6412f81369e09bc9653cc51ff 192.168.4.56:6356@16356 master - 0 1538041066000 7 connected 5461-10922 //56成为主库

开启52,发现52成为从库
92.168.4.51:6351> CLUSTER NODES
8568fbd73cb296cad6915d524e34761b2114af47 192.168.4.52:6352@16352 slave 28e06c5f24a2b6c6412f81369e09bc9653cc51ff 0 1538041254000 7 connected

管理redis集群
-添加主机
1)部署一台新redis服务器,ip为192.168.4.58,装包,初始化,启用集群配置,重启服务
2) 添加集群4.58(添加master节点)

格式:redis-trib.rb 选项 参数

##选项: add-nade 添加主机(不指定角色为主Master)

<由于之前是在51上面创建ruby脚本,所以只有51上面有redis-trib.rb命令,在51上面执行>

~]# redis-trib.rb add-node 192.168.4.58:6358 192.168.4.51:6351

3)检查集群主机的状态信息
选项:check 检查权限

~]# redis-trib.rb check 192.168.4.58:6358 //查看状态

4)手动对集群进行分片迁移
选项:reshard 重新分配hash槽

~]# redis-trib.rb reshard 192.168.4.58:6358
How many slots do you want to move (from 1 to 16384)?4096
//拿出多少个hash 槽给主机192.168.4.58
What is the receiving node ID? c5e0da48f335c46a2ec199faa99b830f537dd8a0
//主机192.168.4.58的id值
Source node #1:all //从当前所有的主里面获取hash槽
Do you want to proceed with the proposed reshard plan (yes/no)?yes
再次查看发现4.58有4096个hash slo
~]# redis-trib.rb check 192.168.4.58:6358

5)删除master角色的主机
先删除主机占用的hash槽

~]# redis-trib.rb reshard 192.168.4.58:6358
How many slots do you want to move (from 1 to 16384)?4096
//移除hash 槽的个数
What is the receiving node ID? bc5c4e082a5a3391b634cf433a6486c867cfc44b
//要移动给谁的id即目标主机(这里可以随机写一个master的ID)
Source node #1: c5e0da48f335c46a2ec199faa99b830f537dd8a0
//从谁那移动即源主机(这里写4.58的ID)
Source node #2:done //设置完毕
(yes/no)?yes //提交

删除集群主机4.58(删除之后redis服务自动关闭)
~]# redis-trib.rb del-node 192.168.4.58:6358 \
c5e0da48f335c46a2ec199faa99b830f537dd8a0 //删除谁+删除的id

6)添加从节点主机,随机添加(默认添加到从节点最少的Master) PS-通过[--master-id id 可指定为那个master的从节点 ]
格式:./redis-trib.rb add-node --slave [--master-id id值] ip地址:端口 192.168.4.51:6351

~]# redis-trib.rb add-node --slave \
192.168.4.57:6357 192.168.4.51:6351

7)移除从节点,从节点主机没有槽位范围,直接移除即可
命令格式:
redis-trib.rb del-node 192.168.4.57:6357 主机id值

~]# redis-trib.rb del-node 192.168.4.57:6357 \
f6649ea99b2f01faca26217691222c17a385438

redis-trib.rb具有以下功能:
1、create:创建集群
2、check:检查集群
3、info:查看集群信息
4、fix:修复集群
5、reshard:在线迁移slot
6、rebalance:平衡集群节点slot数量
7、add-node:将新节点加入集群
8、del-node:从集群中删除节点
9、set-timeout:设置集群节点间心跳连接的超时时间
10、call:在集群全部节点上执行命令
11、import:将外部redis数据导入集群