Redis集群:非关系型数据库,以键值对的形式来存储数据,数据存储在内存中,支持数据的持久化,通过持久化文件RDB,AOF,也可以用作缓存服务器,从redis3版本开始支持cluster(集群)功能
Redis集群的特点
1)redis集群是去掉中心化,群集中每一个节点都可以接收客户端的连接请求,节点之间通过总线端口互相通信,总线端口与redis对客户端提供服务的端口之间有固定的偏移量10000,
例:redis监听的端口为7000,则总线端口为17000
2)redis集群中的节点通过哈希槽的槽点来分配要读取和写入的数据,槽点数量为16384个取值范围为0-16383,集群中的主节点平均分配着些槽点,当数据要写入或者读取时,会对数据的键进行CRC16算法的计算得到的值在对16384范围内进行提取数据,对最终结果进行和槽点的匹配,来判断该数据应该写入到哪个节点或者从哪个节点读取
3)Redis支持主从复制,每隔主节点可以有一个到多个从节点,主节点对外提供服务,从节点只是备份数据,当主节点故障时会从它的从节点中随机选一台作为新的主节点提供服务
4)Redis集群中节点直接可以互相投票,当超过半数以上的主机认为某个节点不可用,则该主节点不可用,如果主节点没有从节点,则整个集群不可用,redsi集群中主节点的个数为奇数个

安装依赖工具(节点A)
1 2
| yum -y install ruby rubygems gem install redis-3.3.0.gem
|
解压软件包(三台)
1 2 3 4
| tar zxf redis-4.0.6.tar.gz mv redis-4.0.6 /usr/local/redis cd /usr/local/redis/ make && make install
|
节点A创建群集目录
1
| mkdir -p /cluster/7000 /cluster/7001
|
节点B创建群集目录
1
| mkdir -p /cluster/7002 /cluster/7003
|
节点C创建群集目录
1
| mkdir -p /cluster/7004 /cluster/7005
|
节点A操作
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30
| #拷贝redis目录下的redis.conf配置文件到/cluster/7000和7001 cp /usr/local/redis/redis.conf /cluster/7000
#修改主从节点7000配置文件 vim /cluster/7000/redis.conf port 7000 //监听端口 bind 0.0.0.0 //监听IP daemonize yes //允许后台运行 cluster-enabled yes //开启主从节点 cluster-config-file nodes-7000.conf //从节点配置文件 cluster-node-timeout 5000 //从节点通信的超时时间,单位毫秒(5000毫秒=5s)
#将7000端口的配置文件拷贝到7001目录下,并修改7001的配置文件 cp /cluster/7000/redis.conf /cluster/7001 sed -i 's/7000/7001/g' /cluster/7001/redis.conf
#启动7000和7001端口的配置文件 redis-server /cluster/7000/redis.conf redis-server /cluster/7001/redis.conf
#放行防火墙 systemctl stop firewalld setenforce 0
#将7000端口的配置文件分别远程拷贝到BC两台redis服务节点的02.03.04.05中 cd /cluster/7000/ scp redis.conf root@172.16.1.13:/cluster/7002/ scp redis.conf root@172.16.1.13:/cluster/7003/ scp redis.conf root@172.16.1.14:/cluster/7004/ scp redis.conf root@172.16.1.14:/cluster/7005/
|
节点B操作
1 2 3 4 5 6 7 8 9 10
| sed -i 's/7000/7002/g' /cluster/7002/redis.conf sed -i 's/7000/7003/g' /cluster/7003/redis.conf
#启动7000和7001端口的配置文件 redis-server /cluster/7002/redis.conf redis-server /cluster/7003/redis.conf
#放行防火墙 systemctl stop firewalld setenforce 0
|
节点C操作
1 2 3 4 5 6 7 8 9 10
| sed -i 's/7000/7004/g' /cluster/7004/redis.conf sed -i 's/7000/7005/g' /cluster/7005/redis.conf
#启动7000和7001端口的配置文件 redis-server /cluster/7004/redis.conf redis-server /cluster/7005/redis.conf
#放行防火墙 systemctl stop firewalld setenforce 0
|
创建群集
1 2
| cd /usr/local/redis/src ./redis-trib.rb create --replicas 1 172.16.1.12:7000 172.16.1.12:7001 172.16.1.13:7002 172.16.1.13:7003 172.16.1.14:7004 172.16.1.14:7005
|
create:创建集群 –replicas给主节点指定从节点个数
reshard 槽点重新分配
info 集群信息
add-node:添加节点,默认为主节点
add-node –slave 添加从节点
–master-id:指定主节点
del-node:删除节点,如果是主节点,这里的槽点需要提前转移,然后删除
./redis-trib.rb check 172.16.1.12:7000
添加从节点
需要带着选项–slave
1 2 3 4 5 6 7 8 9 10
| # 准备从节点配置文件目录 [root@localhost ~]# mkdir /usr/local/cluster/7006 [root@localhost ~]# cp /usr/local/cluster/7000/redis.conf /usr/local/cluster/7006/ [root@localhost ~]# sed -i "s/7000/7006/g" /usr/local/cluster/7006/redis.conf # 启动从节点 [root@localhost ~]# redis-server /usr/local/cluster/7006/redis.conf [root@localhost ~]# /usr/local/redis/src/redis-trib.rb check 172.16.1.12:7000 # 粘贴任意一个主的uuid 2172d6d3bfcc487241903193d437ff9dc9a60995 redis-trib.rb add-node --slave {新节点IP+端口} {172.16.1.12:7000}
|
给指定的主节点添加从节点
需要指明主节点的节点ID
1
| redis-trib.rb add-node --slave --master-id 470d23e9cfeaf224c1227ca3773c1cb910931f81 {新节点IP+端口} {172.16.1.12:7000}
|
添加主节点
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17
| # 准备主节点配置文件目录 [root@localhost ~]# mkdir /usr/local/cluster/7007 [root@localhost ~]# cp /usr/local/cluster/7000/redis.conf /usr/local/cluster/7007/ [root@localhost ~]# sed -i "s/7000/7007/g" /usr/local/cluster/7007/redis.conf # 启动服务 [root@localhost ~]# redis-server /usr/local/cluster/7007/redis.conf 创建主节点 /usr/local/redis/src/redis-trib.rb add-node {新节点IP+端口} {172.16.1.12:7000}
[root@localhost ~]# /usr/local/redis/src/redis-trib.rb check 172.16.1.12:7000 # 因为没有槽点。复制刚添加的端口号的uuid,要进行重新分配槽点 90e63fe3e6c50fe596e761c2b652f5e10d65ff84 [root@localhost ~]# /usr/local/redis/src/redis-trib.rb reshard 172.16.1.12:7000 填写移动槽点 因为四台16384/4=4096 然后,填写uuid,输入all,yes就好了 [root@localhost ~]# /usr/local/redis/src/redis-trib.rb check 172.16.1.12:7000 # 再次查看7007有了槽点
|
槽点重分配指令
1
| redis-trib.rb reshard 172.16.1.12:7000 //对172.16.1.12:7000这个节点所在的集群进行槽点重分配
|
节点删除指令
1
| redis-trib.sh del-node 172.16.1.12:7000 node-id //要删除192.168.10.100:7000这个节点所在的集群中node-id所表示的这个节点
|
集群修复指令
1 2
| redis-trib.rb fix {要修复集群中的IP与端口}
|
查看集群节点信息
1
| redis-trib.rb info 172.16.1.12:7000
|