1.部署Redis集群
1.1创建属于redis的网卡
[root@localhost ~]# docker network create --driver bridge --subnet 192.169.10.0/24 --gateway 192.169.10.1 redis
5bcb076e56e1d452ce8f3e7bb7fa731a86ee488cbc462a5195efa2f1ed1a469a
1.2 下载Redis

下载6.2版本的
[root@localhost ~]# docker pull redis:6.2
6.2: Pulling from library/redis
33847f680f63: Downloading [=======> ] 4.172MB/27.15MB
26a746039521: Download complete
18d87da94363: Download complete
5e118a708802: Downloading [===============================> ] 6.433MB/10.12MB
ecf0dbe7c357: Download complete
46f280ba52da: Download complete
1.3 安装6部redis
1.3.1 挂载磁盘
我们先挂载好6部redis在主机上对应的磁盘
for port in $(seq 1 6);\
do \
mkdir -p /redis-data/data-${port}/conf
touch /redis-data/data-${port}/conf/redis.conf
cat << EOF >> /redis-data/data-${port}/conf/redis.conf
port 6379
bind 0.0.0.0
cluster-enabled yes
cluster-config-file nodes.conf
cluster-node-timeout 5000
cluster-announce-ip 192.169.10.1${port}
cluster-announce-port 6379
cluster-announce-bus-port 16379
appendonly yes
EOF
done
我们查看根目录下的文件:

1.3.2 创建redis容器
docker run -p 6371:6379 -p 16671:16379 --name redis-6371 -v /redis-data/data-1:/data -v /redis-data/data-1/conf/redis.conf:/etc/redis/redis.conf -d --net redis --ip 192.169.10.11 redis:6.2 redis-server /etc/redis/redis.conf
docker run -p 6372:6379 -p 16672:16379 --name redis-6372 -v /redis-data/data-2:/data -v /redis-data/data-2/conf/redis.conf:/etc/redis/redis.conf -d --net redis --ip 192.169.10.12 redis:6.2 redis-server /etc/redis/redis.conf
docker run -p 6373:6379 -p 16673:16379 --name redis-6373 -v /redis-data/data-3:/data -v /redis-data/data-3/conf/redis.conf:/etc/redis/redis.conf -d --net redis --ip 192.169.10.13 redis:6.2 redis-server /etc/redis/redis.conf
docker run -p 6374:6379 -p 16674:16379 --name redis-6374 -v /redis-data/data-4:/data -v /redis-data/data-4/conf/redis.conf:/etc/redis/redis.conf -d --net redis --ip 192.169.10.14 redis:6.2 redis-server /etc/redis/redis.conf
docker run -p 6375:6379 -p 16675:16379 --name redis-6375 -v /redis-data/data-5:/data -v /redis-data/data-5/conf/redis.conf:/etc/redis/redis.conf -d --net redis --ip 192.169.10.15 redis:6.2 redis-server /etc/redis/redis.conf
docker run -p 6376:6379 -p 16676:16379 --name redis-6376 -v /redis-data/data-6:/data -v /redis-data/data-6/conf/redis.conf:/etc/redis/redis.conf -d --net redis --ip 192.169.10.16 redis:6.2 redis-server /etc/redis/redis.conf
这里我就直接手写了,还可以通过for循环写下来,我们查看一下运行的容器:

2.创建Redis集群
然后我们随便进入一个redis
[root@localhost conf]# docker exec -it redis-6371 /bin/bash
配置主从复制的集群(都是一主一从的对应):
root@769b59ac36ac:/data# redis-cli --cluster create 192.169.10.11:6379 192.169.10.12:6379 192.169.10.13:6379 192.169.10.14:6379 192.169.10.15:6379 192.169.10.16:6379 --cluster-replicas 1
随后在弹出的选项中选择yes
root@769b59ac36ac:/data# redis-cli --cluster create 192.169.10.11:6379 192.169.10.12:6379 192.169.10.13:6379 192.169.10.14:6379 192.169.10.15:6379 192.169.10.16:6379 --cluster-replicas 1
>>> Performing hash slots allocation on 6 nodes...
Master[0] -> Slots 0 - 5460
Master[1] -> Slots 5461 - 10922
Master[2] -> Slots 10923 - 16383
Adding replica 192.169.10.15:6379 to 192.169.10.11:6379
Adding replica 192.169.10.16:6379 to 192.169.10.12:6379
Adding replica 192.169.10.14:6379 to 192.169.10.13:6379
M: defd31277b7c9bd979fa239222d2349f903c69be 192.169.10.11:6379
slots:[0-5460] (5461 slots) master
M: 6313b8a6a0d8cd76bcc569920b6be1903ddf260c 192.169.10.12:6379
slots:[5461-10922] (5462 slots) master
M: c0d0dd69c9356cf5258714437ee79c640b2c0869 192.169.10.13:6379
slots:[10923-16383] (5461 slots) master
S: 51a866ef8d369a476aa73d5a9be0568fd6b1044b 192.169.10.14:6379
replicates c0d0dd69c9356cf5258714437ee79c640b2c0869
S: 7542939547f9118cd891fa62daa16222c2d68a0b 192.169.10.15:6379
replicates defd31277b7c9bd979fa239222d2349f903c69be
S: fda819b80c2e62b51b85dfe1b12f229c56d0ff4a 192.169.10.16:6379
replicates 6313b8a6a0d8cd76bcc569920b6be1903ddf260c
Can I set the above configuration? (type 'yes' to accept): yesyes
>>> Nodes configuration updated
>>> Assign a different config epoch to each node
>>> Sending CLUSTER MEET messages to join the cluster
Waiting for the cluster to join
.
>>> Performing Cluster Check (using node 192.169.10.11:6379)
M: defd31277b7c9bd979fa239222d2349f903c69be 192.169.10.11:6379
slots:[0-5460] (5461 slots) master
1 additional replica(s)
S: 7542939547f9118cd891fa62daa16222c2d68a0b 192.169.10.15:6379
slots: (0 slots) slave
replicates defd31277b7c9bd979fa239222d2349f903c69be
M: 6313b8a6a0d8cd76bcc569920b6be1903ddf260c 192.169.10.12:6379
slots:[5461-10922] (5462 slots) master
1 additional replica(s)
S: fda819b80c2e62b51b85dfe1b12f229c56d0ff4a 192.169.10.16:6379
slots: (0 slots) slave
replicates 6313b8a6a0d8cd76bcc569920b6be1903ddf260c
S: 51a866ef8d369a476aa73d5a9be0568fd6b1044b 192.169.10.14:6379
slots: (0 slots) slave
replicates c0d0dd69c9356cf5258714437ee79c640b2c0869
M: c0d0dd69c9356cf5258714437ee79c640b2c0869 192.169.10.13:6379
slots:[10923-16383] (5461 slots) master
1 additional replica(s)
[OK] All nodes agree about slots configuration.
>>> Check for open slots...
>>> Check slots coverage...
[OK] All 16384 slots covered.
随后输入:
root@769b59ac36ac:/data# redis-cli -c
进入redis数据库,这里的 -c 表示已集群的形式进入
127.0.0.1:6379> set k1 v1
-> Redirected to slot [12706] located at 192.169.10.13:6379
OK
192.169.10.13:6379> set k2 v2
-> Redirected to slot [449] located at 192.169.10.11:6379
OK
192.169.10.11:6379>
我们发现的是:

每次插入成功后,会跳转到插入成功的数据库中。
3.集群宕机测试
我们现在把

这个容器停止,形成宕机。
[root@localhost ~]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
5a7966dbb538 redis:6.2 "docker-entrypoint.s…" 40 minutes ago Up 40 minutes 0.0.0.0:6376->6379/tcp, :::6376->6379/tcp, 0.0.0.0:16676->16379/tcp, :::16676->16379/tcp redis-6376
b816f03d847d redis:6.2 "docker-entrypoint.s…" 41 minutes ago Up 41 minutes 0.0.0.0:6375->6379/tcp, :::6375->6379/tcp, 0.0.0.0:16675->16379/tcp, :::16675->16379/tcp redis-6375
f9f22f0ce0e2 redis:6.2 "docker-entrypoint.s…" 41 minutes ago Up 41 minutes 0.0.0.0:6374->6379/tcp, :::6374->6379/tcp, 0.0.0.0:16674->16379/tcp, :::16674->16379/tcp redis-6374
69c312275e80 redis:6.2 "docker-entrypoint.s…" 41 minutes ago Up 41 minutes 0.0.0.0:6373->6379/tcp, :::6373->6379/tcp, 0.0.0.0:16673->16379/tcp, :::16673->16379/tcp redis-6373
270f32700a87 redis:6.2 "docker-entrypoint.s…" 43 minutes ago Up 43 minutes 0.0.0.0:6372->6379/tcp, :::6372->6379/tcp, 0.0.0.0:16672->16379/tcp, :::16672->16379/tcp redis-6372
769b59ac36ac redis:6.2 "docker-entrypoint.s…" 44 minutes ago Up 44 minutes 0.0.0.0:6371->6379/tcp, :::6371->6379/tcp, 0.0.0.0:16671->16379/tcp, :::16671->16379/tcp redis-6371
[root@localhost ~]# docker stop redis-6371
redis-6371
[root@localhost ~]#
我们查看一下所有的主从节点信息
127.0.0.1:6379> CLUSTER nodes
c0d0dd69c9356cf5258714437ee79c640b2c0869 192.169.10.13:6379@16379 master - 0 1627893832000 3 connected 10923-16383
6313b8a6a0d8cd76bcc569920b6be1903ddf260c 192.169.10.12:6379@16379 myself,master - 0 1627893831000 2 connected 5461-10922
51a866ef8d369a476aa73d5a9be0568fd6b1044b 192.169.10.14:6379@16379 slave c0d0dd69c9356cf5258714437ee79c640b2c0869 0 1627893832864 3 connected
7542939547f9118cd891fa62daa16222c2d68a0b 192.169.10.15:6379@16379 master - 0 1627893831116 7 connected 0-5460
fda819b80c2e62b51b85dfe1b12f229c56d0ff4a 192.169.10.16:6379@16379 slave 6313b8a6a0d8cd76bcc569920b6be1903ddf260c 0 1627893832000 2 connected
defd31277b7c9bd979fa239222d2349f903c69be 192.169.10.11:6379@16379 master,fail - 1627893771513 1627893769000 1 connected
我们可以看到最后一个 defd31277b7c9bd979fa239222d2349f903c69be 192.169.10.11:6379@16379 master,fail - 1627893771513 1627893769000 1 connected 连接失败了,也就是刚刚被我们宕机的redis。
那么刚刚插入在这个redis里面的k2还能查得到吗?
127.0.0.1:6379> get k2
-> Redirected to slot [449] located at 192.169.10.15:6379
"v2"
我们可以看到,k2 从192.169.10.15:6379中拿取出来了,这就是我们的高可用
本文详细介绍了如何使用Docker部署Redis集群的过程,并演示了集群的高可用性特性,包括配置步骤、集群创建及宕机测试。
336

被折叠的 条评论
为什么被折叠?



