Docker搭建Redis分片集群
Redis分片集群(Redis Cluster)是Redis官方提供的分布式解决方案,它允许数据自动分布在多个Redis节点上,提供高性能、高可用的Redis服务。
主从和哨兵可以解决高可用、高并发读的问题。但是依然有两个问题没有解决:
海量数据存储问题
高并发写的问题
使用分片集群可以解决上述问题,如图:
1.环境
目的:
搭建redis的分片集群(三主三从)
centos7、redis6.2.4、MobaXterm
IP | PORT | 角色 |
---|---|---|
192.168.206.180 | 7001 | master |
192.168.206.180 | 7002 | master |
192.168.206.180 | 7003 | master |
192.168.206.180 | 7004 | slave |
192.168.206.180 | 7005 | slave |
192.168.206.180 | 7006 | slave |
2.搭建步骤
1.创建挂载目录和添加配置文件
使用命令创建挂载目录:
mkdir -p redis-demo/cluster7001/conf redis-demo/cluster7001/data \
redis-demo/cluster7002/conf redis-demo/cluster7002/data \
redis-demo/cluster7003/conf redis-demo/cluster7003/data \
redis-demo/cluster7004/conf redis-demo/cluster7004/data \
redis-demo/cluster7005/conf redis-demo/cluster7005/data \
redis-demo/cluster7006/conf redis-demo/cluster7006/data
添加配置文件redis.conf
vi redis-demo/cluster7001/conf/redis.conf
port 7001
#redis 访问密码
#requirepass 123456
#redis 访问Master节点密码
#masterauth 123456
# 关闭保护模式
protected-mode no
# 开启集群
cluster-enabled yes
# 集群节点配置
cluster-config-file nodes.conf
# 超时
cluster-node-timeout 5000
# 绑定地址
bind 0.0.0.0
# 让redis后台运行
daemonize no
# 注册的实例ip
replica-announce-ip 192.168.206.180
# 保护模式
protected-mode no
# 数据库数量
databases 1
# 日志文件路径
logfile "/data/redis.log"
2.创建Redis容器
创建网络:
docker network create redis-cluster
创建容器:
其中:-p 17001:17001为Redis 集群总线端口(节点间通信用,通常是 服务端口 + 10000
)。必须添加,否则无法创建集群。
docker run -d \
--name cluster7001 \
--net redis-cluster \
-p 7001:7001 \
-p 17001:17001 \
--privileged=true \
-v /home/hl/redis-demo/cluster7001/conf/redis.conf:/etc/redis/redis.conf \
-v /home/hl/redis-demo/cluster7001/data:/data \
redis:6.2.4 redis-server /etc/redis/redis.conf
查看容器:
docker ps
创建成功以后每个节点的data目录下会自动生成nodes.conf文件:
3.配置集群(Redis5.0以后 )
使用下述命令进入随便一个节点中并执行集群配置命令:
docker exec -it cluster7001 /bin/bash
redis-cli --cluster create --cluster-replicas 1 192.168.206.180:7001 192.168.206.180:7002 192.168.206.180:7003 192.168.206.180:7004 192.168.206.180:7005 192.168.206.180:7006
命令说明:
redis-cli --cluster
或者./redis-trib.rb
:代表集群操作命令create
:代表是创建集群--replicas 1
或者--cluster-replicas 1
:指定集群中每个master的副本个数为1,此时节点总数 ÷ (replicas + 1)
得到的就是master的数量。因此节点列表中的前n个就是master,其它节点都是slave节点,随机分配到不同master
如下图:集群搭建成功,哈希槽也是16384个
3.测试
3.1 散列插槽
使用redis-cli -c -p 7001连接redis
如下图:
验证了数据是依据key的有效部分经过CRC16处理存储到哈希槽中,每个节点包含相应范围的哈希槽。
若想要相同的数据结构存储到同一节点上,可以设置{}相同的有效部分。
3.2 集群伸缩
1.新增节点
重新创建并启动一个容器,使用下述命令将7007加入到集群
redis-cli --cluster add-node 192.168.206.180:7007 192.168.206.180:7001
最后我们可以看到7007已经加入到了集群:
查看集群:
redis-cli -p 7001 cluster nodes
新加入的节点默认为master节点,且并没有自动分配插槽。
2.转移插槽
我们计划将7001的0-3000的插槽转移给7007:
建立连接:
redis-cli --cluster reshard 192.168.206.180:7001
询问要移动多少个插槽,我们计划是3000个:
哪个node来接收这些插槽?
插槽是从哪里移动过来的?
all:代表全部,也就是三个节点各转移一部分
具体的id:目标节点的id
done:没有了
确认要转移吗?输入yes:
下面就转移完成了,查看集群信息:
原来7001中的数据也随着插槽转移到了7007
3.3 故障转移
当集群中有一个master宕机
1.自动故障转移
自动故障转移类似于哨兵机制,当节点宕机,其他节点认为其客观下线后会重新选取一个slave为新的master,且恢复后会自动下降为slave:
停止容器,如下图7001确认下线,7006被提升为新的master:
重启容器,7001上线,自动下降为slave:
2.手动故障转移
利用cluster failover命令可以手动让集群中的某个master宕机,切换到执行cluster failover命令的这个slave节点,实现无感知的数据迁移。其流程如下:
这种failover命令可以指定三种模式:
缺省:默认的流程,如图1~6歩
force:省略了对offset的一致性校验
takeover:直接执行第5歩,忽略数据一致性、忽略master状态和其它master的意见
我们将在7001这个slave节点执行手动故障转移,使其重新成为master,7006下降为slave
步骤如下:
1)利用redis-cli连接7001这个节点
2)执行cluster failover命令