使用docker搭建redis集群&redis集群常用配置命令
- 拉取redis镜像
#这里使用的是6.0.8的版本
docker pull redis:6.0.8
- 前置准备工作,创建redis集群,这里我使用三主三从的模式。三个主机,每个主机配一个从机,一共6个节点。(扩展知识:redis的集群使用到了哈希槽,本质属于一致性哈希算法的一种实现,具体可参考文章一致性哈希算法)
先在主机上面创建6个文件夹,后面将把每个节点的数据挂载到这6个文件夹:
mkdir -p /home/docker/redis/redis-node-1
mkdir -p /home/docker/redis/redis-node-2
mkdir -p /home/docker/redis/redis-node-3
mkdir -p /home/docker/redis/redis-node-4
mkdir -p /home/docker/redis/redis-node-5
mkdir -p /home/docker/redis/redis-node-6
- 临时关闭防火墙,方式外部无法访问到,或者把对应端口放行
systemctl stop firewalld
- 新建6个redis容器,分别命名为redis-node-1到redis-node-6,端口分别为6381-6386
docker run -d --name redis-node-1 --net host --privileged=true -v /home/docker/redis/redis-node-1:/data redis:6.0.8 --cluster-enabled yes --appendonly yes --port 6381
docker run -d --name redis-node-2 --net host --privileged=true -v /home/docker/redis/redis-node-2:/data redis:6.0.8 --cluster-enabled yes --appendonly yes --port 6382
docker run -d --name redis-node-3 --net host --privileged=true -v /home/docker/redis/redis-node-3:/data redis:6.0.8 --cluster-enabled yes --appendonly yes --port 6383
docker run -d --name redis-node-4 --net host --privileged=true -v /home/docker/redis/redis-node-4:/data redis:6.0.8 --cluster-enabled yes --appendonly yes --port 6384
docker run -d --name redis-node-5 --net host --privileged=true -v /home/docker/redis/redis-node-5:/data redis:6.0.8 --cluster-enabled yes --appendonly yes --port 6385
docker run -d --name redis-node-6 --net host --privileged=true -v /home/docker/redis/redis-node-6:/data redis:6.0.8 --cluster-enabled yes --appendonly yes --port 6386
- 进入第一个容器 redis-node-1并配置redis集群
docker宿主机的IP为 172.19.128.124
docker exec -it redis-node-1 /bin/bash
#构建三主三从的集群,ip地址替换成自己机器的实际IP,以下命令执行过程中 交互部分需要输入yes并按下回车键
redis-cli --cluster create 172.19.128.124:6381 172.19.128.124:6382 172.19.128.124:6383 172.19.128.124:6384 172.19.128.124:6385 172.19.128.124:6386 --cluster-replicas 1
构建完成之后在第一个容器里面执行如下命令检查当前集群状态
redis-cli --cluster check 172.19.128.124:6381
连接到redis里面并检查集群信息:
#注意连接时增加一个-c参数,否则默认连接到单机同时添加key时无法通过一致性哈希转储到其他节点
redis-cli -c -p 6381
由上图信息可知三主三从的结构如下:
主节点 | 从节点 |
---|---|
172.19.128.124:6381 | 172.19.128.124:6384 |
172.19.128.124:6382 | 172.19.128.124:6385 |
172.19.128.124:6383 | 172.19.128.124:6386 |
- 随便进入任意一个master容器节点并添加几个数据测试效果
docker exec -it redis-node-1 /bin/bash
进入容器后登录redis
redis-cli -c -p 6381
执行set命令 分别添加 test1 111 ,test2 222,test3 333,test4 444观察命令执行情况
set test1 111
set test2 222
set test3 333
set test4 444
证明集群节点创建和存储都没问题。
同样的根据key取值也是一样道理,会通过hash确定哈希槽并定位到存储节点获取值
get test1
get test2
get test3
get test4
- 容错切换测试
根据上面设置的key test1 test2 test test4可知 test4在第一个节点redis-node-1(6381)里面 这里测试容错时我们把redis-node-1这个容器停掉,此时redis会选举出对应的从节点redis-node-4(6384)作为新的主节点
docker stop redis-node-1
然后随便登录一个其他的主节点,这里我登录第二个 redis-node-2 去查询test4这个key对应的值
docker exec -it redis-node-2 /bin/bash
redis-cli -c -p 6382
get test4
因为根据上面的图片我们可知test4存储在redis-node-1这个节点里面,而这个节点已经被我们停掉了,但是我们依然获取到了test4对应的值444,返回这个值的是原来主节点1对应的从节点4,从节点4升级成了主节点。
为了看下目前的节点信息,我们使用cluster nodes
查看情况:
原来的节点挂掉之后从节点自动升级为主节点。数据不会丢失,依然可以从从节点获取。这里我把test4的值修改为44555。后面用来验证。
set test4 44555
最后我们恢复到初始状态,先把节点1启动,然后停止节点4,等几秒再启动节点4,登录进去获取test4的值并使用cluster nodes
查看状态
我们发现节点1重新成为了主节点,同时获取test4时 是节点1返回的结果而且是我上面设置的最新结果44555,节点1关闭之前存储的是444,先在节点1重新启动成为主节点之后显然已经和节点4做了数据同步。
- 主从扩容
未完待续 - 主从缩容
未完待续