目录
概述
一、创建文件和目录
1.1 创建需要挂载的文件和目录
1.2 同步操作
二、随机从节点模式
2.1 创建master节点的redis容器
2.2 在同一台机器上创建另外2个节点
2.3 其他2台机器同步操作
2.4 配置主从集群
2.4.1 进入任意一个 Redis 实例
2.4.2 配置集群
2.4.3 查看集群节点信息
三、自定义从节点模式
3.1 删除所有Redis容器
3.2 删除data目录下的文件
3.3 创建Redis容器
3.4 创建三个主节点
3.4.1 进入容器
3.4.2 创建集群
3.5 添加从节点
3.6 查看集群信息
3.6.1 进入容器连接redis
3.6.2 查看集群信息
概述
本篇文章介绍一下通过Docker安装部署Redis集群。
基于CentOS8、yum源安装,集群采用3主6从的模式。从节点我们介绍两种方式,一种是随机的从节点,一种是指定从节点的方式。
如果是3主6从的模式的集群,也就是在3台服务器上,分别部署1个主节点和2个从节点。如果我们是指定从节点的话,我们的一个集群中的从节点不能和主节点在一台服务器上,这样可以避免一台主机宕机导致的集群整体宕掉后数据丢失问题。虽然可以重启机器,Redis集群做持久化进行回复,但是还是会导致短暂的不可用的情况。因为创建好Redis集群之后,每个Redis的key的对应的哈希槽其实是已经固定到每一个主节点上了,如果这个集群的主节点和从节点在一台机器上,那就会导致,这一部分哈希槽所对应的整个集群不可用。
所以,我们要将这类部署方式的从节点放置到另外2台机器上。
我们这里有三个主机,我们称之为redis01、redis02、redis03。
redis01放一个主节点,2个从节点分别放到redis02、redis03。
redis02放一个主节点,2个从节点分别放到redis03、redis01。
redis03放一个主节点,2个从节点分别放到redis01、redis02。
这样的话,即使一台主机宕掉,最终影响的也只是3个集群中对应的一个节点,因为我们每个集群是1主2从,那么如果宕掉的是从节点,不影响原来集群;如果是主节点,那么它还有2个从节点,从节点进行选举会有一个从节点晋升为主节点。
我们最后将要创建9台Redis实例,自定义Redis集群实例的要求如下:
主节点 | 从节点 | |
第一个集群 | 192.168.222.100:6380 | 192.168.222.103:6381 |
192.168.222.104:6382 | ||
第二个集群 | 192.168.222.103:6380 | 192.168.222.104:6381 |
192.168.222.100:6382 | ||
第三个集群 | 192.168.222.104:6380 | 192.168.222.100:6381 |
192.168.222.103:6382 |
一、创建文件和目录
创建单个Redis可以参考我的另外一篇文章:
Docker以标准方式安装部署Redis
1.1 创建需要挂载的文件和目录
在redis01主机上我们创建需要的文件和目录
mkdir -p /usr/local/redis-cluster/master-6380/{data,conf}
vim /usr/local/redis-cluster/master-6380/conf/redis.conf
在redis.conf文件中输入内容:
appendonly yes
appendfilename "appendonly.aof"
master-6380这个节点操作完毕,我们还需要在 slave-6381和slave-6382节点上创建:
mkdir -p /usr/local/redis-cluster/slave-6381/{data,conf}
vim /usr/local/redis-clusterslave-6381/conf/redis.conf
mkdir -p /usr/local/redis-cluster/slave-6382/{data,conf}
vim /usr/local/redis-clusterslave-6382/conf/redis.conf
1.2 同步操作
我们可以重复1.1的操作,也可以通过scp命令方式将目录和文件上传到另外的两台主机。关于scp命令,可以参考我的另一篇文章:
Linux命令:scp
scp -r /usr/local/redis-cluster/master-6380 /root@k8s-master01:/usr/local/redis-cluster/master-6380/
注意:
我这里的主机名并非是redis01、redis02、redis03,请注意。
然后接着将整个目录下的data和conf目录都复制到其他2个主机的对应节点上:
scp -r /usr/local/redis-cluster/master-6380 /root@k8s-master01:/usr/local/redis-cluster/slave-6381/
scp -r /usr/local/redis-cluster/master-6380 /root@k8s-master01:/usr/local/redis-cluster/slave-6382/
复制到另一个节点上要执行三个操作:
scp -r /usr/local/redis-cluster/master-6380 /root@k8s-node01:/usr/local/redis-cluster/master-6380/
scp -r /usr/local/redis-cluster/master-6380 /root@k8s-node01:/usr/local/redis-cluster/slave-6381/
scp -r /usr/local/redis-cluster/master-6380 /root@k8s-node01:/usr/local/redis-cluster/slave-6382/
注意:
每输入一个命令都要输入对应的远程主机的密码。
二、随机从节点模式
2.1 创建master节点的redis容器
docker run --name redis-6380 -d --net host --restart=always --privileged=true \
-v /usr/local/redis-cluster/master-6380/conf/redis.conf:/etc/redis/redis.conf \
-v /usr/local/redis-cluster/master-6380/data:/data \
redis:latest --cluster-enabled yes --cluster-config-file redis-6380.conf --port 6380
2.2 在同一台机器上创建另外2个节点
docker run --name redis-6381 -d --net host --restart=always --privileged=true \
-v /usr/local/redis-cluster/slave-6381/conf/redis.conf:/etc/redis/redis.conf \
-v /usr/local/redis-cluster/slave-6381/data:/data \
redis:latest --cluster-enabled yes --cluster-config-file redis-6381.conf --port 6381
docker run --name redis-6382 -d --net host --restart=always --privileged=true \
-v /usr/local/redis-cluster/slave-6382/conf/redis.conf:/etc/redis/redis.conf \
-v /usr/local/redis-cluster/slave-6382/data:/data \
redis:latest --cluster-enabled yes --cluster-config-file redis-6382.conf --port 6382
最终的集群节点配置文件:redis-6382.conf会在对应的data目录下生成,不管是宿主机还是容器内都有。
2.3 其他2台机器同步操作
在另外2台机器上分别执行上面的命令。
# master节点
docker run --name redis-6380 -d --net host --restart=always --privileged=true \
-v /usr/local/redis-cluster/master-6380/conf/redis.conf:/etc/redis/redis.conf \
-v /usr/local/redis-cluster/master-6380/data:/data \
redis:latest --cluster-enabled yes --cluster-config-file redis-6380.conf --port 6380
# slave节点
docker run --name redis-6381 -d --net host --restart=always --privileged=true \
-v /usr/local/redis-cluster/slave-6381/conf/redis.conf:/etc/redis/redis.conf \
-v /usr/local/redis-cluster/slave-6381/data:/data \
redis:latest --cluster-enabled yes --cluster-config-file redis-6381.conf --port 6381
# slave节点
docker run --name redis-6382 -d --net host --restart=always --privileged=true \
-v /usr/local/redis-cluster/slave-6382/conf/redis.conf:/etc/redis/redis.conf \
-v /usr/local/redis-cluster/slave-6382/data:/data \
redis:latest --cluster-enabled yes --cluster-config-file redis-6382.conf --port 6382
这个时候我们虽然说有master节点和slave节点,但是实际上它们都还不是,这只是我们最终要的结果而已。因为我们还没有进行集群的主从配置。
2.4 配置主从集群
2.4.1 进入任意一个 Redis 实例
docker exec -it redis-6380 bash
我们这里选择了redis01的redis-6380节点。
2.4.2 配置集群
redis-cli --cluster create 192.168.222.100:6380 192.168.222.103:6380 192.168.222.104:6380 192.168.222.100:6381 192.168.222.103:6381 192.168.222.104:6381 192.168.222.100:6382 192.168.222.103:6382 192.168.222.104:6382 --cluster-replicas 2
中间会弹出一句话:
Can I set the above configuration? (type 'yes' to accept):
这句话的意思是:是否可以设置以上的配置,我们输入yes即可。
至此,集群已经搭建好了。
2.4.3 查看集群节点信息
我们输入一下命令进行连接:
redis-cli -h 192.168.222.100 -p 6380
查看集群节点信息:
cluster nodes
从上图可以看到,我们直接使用redis-cli命令是无法连接的。因为我们没有配置redis的ip绑定。那么我们可以指定具体的redis实例的ip和端口进行连接。
集群信息中也看到了3主3从的集群信息。
由此我们可以得出结论:
redis-cli --cluster create创建的Redis集群前面几个ip:端口,必然是主节点的;
后面的从节点隶属于哪个主节点是随机分配的。
创建集群的命令中的参数:
--cluster-replicas 2
- 代表着1个主节点对应2个从节点(3个主节点,3*2=6个从节点)
- 如果是1:1的关系,此时就应该是1
- 如果没有从节点(从节点后面再添加),此时就是0。
上面我们连接Redis实例的时候,并未使用集群模式,导致我们设置key的时候会报错的:
那这该怎么办呢?
我们只需要在连接Redis实例的时候采用集群模式即可,即加上-c参数即可:
redis-cli -c -h 192.168.222.100 -p 6380
三、自定义从节点模式
上面我们也看到了,从节点是随机分配的。可是如果我们想让从节点按照我们的要求进行分配,又该如何操作呢?
3.1 删除所有Redis容器
docker stop redis-6380 redis-6381 redis-6382
docker rm redis-6380 redis-6381 redis-6382
三个集群的机器都执行以上命令。
3.2 删除data目录下的文件
rm -rf /usr/local/redis-cluster/master-6380/data/*
rm -rf /usr/local/redis-cluster/slave-6381/data/*
rm -rf /usr/local/redis-cluster/slave-6382/data/*
三个集群的机器都执行以上命令。
3.3 创建Redis容器
# master节点
docker run --name redis-6380 -d --net host --restart=always --privileged=true \
-v /usr/local/redis-cluster/master-6380/conf/redis.conf:/etc/redis/redis.conf \
-v /usr/local/redis-cluster/master-6380/data:/data \
redis:latest --cluster-enabled yes --cluster-config-file redis-6380.conf --port 6380
# slave节点
docker run --name redis-6381 -d --net host --restart=always --privileged=true \
-v /usr/local/redis-cluster/slave-6381/conf/redis.conf:/etc/redis/redis.conf \
-v /usr/local/redis-cluster/slave-6381/data:/data \
redis:latest --cluster-enabled yes --cluster-config-file redis-6381.conf --port 6381
# slave节点
docker run --name redis-6382 -d --net host --restart=always --privileged=true \
-v /usr/local/redis-cluster/slave-6382/conf/redis.conf:/etc/redis/redis.conf \
-v /usr/local/redis-cluster/slave-6382/data:/data \
redis:latest --cluster-enabled yes --cluster-config-file redis-6382.conf --port 6382
分别在三台机器上执行。
3.4 创建三个主节点
3.4.1 进入容器
找一个将要创建主节点的机器进入容器
docker exec -it redis-6380 bash
3.4.2 创建集群
创建三台都是主节点的集群
redis-cli --cluster create 192.168.222.100:6380 192.168.222.103:6380 192.168.222.104:6380 --cluster-replicas 0
如果报错:
[ERR] Node 192.168.222.100:6380 is not empty. Either the node already knows other nodes (check with CLUSTER NODES) or contains some key in database 0.
那就删除100:6380上所有Redis容器,同时删除data目录下的文件,重新创建三台Redis容器,然后再执行3.4.2的创建集群命令即可。
3.5 添加从节点
redis-cli --cluster add-node 192.168.222.103:6381 192.168.222.100:6380 --cluster-slave --cluster-master-id 8a80f0c04d4e64cc0b93442bbe3d9ea98cfc143f
redis-cli --cluster add-node 192.168.222.104:6382 192.168.222.100:6380 --cluster-slave --cluster-master-id 8a80f0c04d4e64cc0b93442bbe3d9ea98cfc143f
redis-cli --cluster add-node 192.168.222.104:6381 192.168.222.103:6380 --cluster-slave --cluster-master-id b207b38198cfdec7c39ea911cc979f6ad6da4921
redis-cli --cluster add-node 192.168.222.100:6382 192.168.222.103:6380 --cluster-slave --cluster-master-id b207b38198cfdec7c39ea911cc979f6ad6da4921
redis-cli --cluster add-node 192.168.222.100:6381 192.168.222.104:6380 --cluster-slave --cluster-master-id e97d76cab8f2bb064c7a8fbb05ea370e8da9a1a3
redis-cli --cluster add-node 192.168.222.103:6382 192.168.222.104:6380 --cluster-slave --cluster-master-id e97d76cab8f2bb064c7a8fbb05ea370e8da9a1a3
- 8a80f0c04d4e64cc0b93442bbe3d9ea98cfc143f是100:6380主节点的id
- b207b38198cfdec7c39ea911cc979f6ad6da4921是103:6380的主节点的id
- e97d76cab8f2bb064c7a8fbb05ea370e8da9a1a3是104:6380的主节点的id
上面的命令是将指定的Redis实例6381和6382指定给6380的集群主节点。
3.6 查看集群信息
3.6.1 进入容器连接redis
# 进入Redis容器
docker exec -it redis-6380 bash
# 连接Redis
redis-cli -c -h 192.168.222.100 -p 6380
3.6.2 查看集群信息
cluster nodes
e97d76cab8f2bb064c7a8fbb05ea370e8da9a1a3 192.168.222.104:6380@16380 master - 0 1670165527000 3 connected 10923-16383
1d30cce460a4003d993ebc4b07843326c6433726 192.168.222.104:6381@16381 slave b207b38198cfdec7c39ea911cc979f6ad6da4921 0 1670165529000 2 connected
94b84b5ec5b055a5352588b3837e00052aaaea81 192.168.222.104:6382@16382 slave e97d76cab8f2bb064c7a8fbb05ea370e8da9a1a3 0 1670165526000 3 connected
b207b38198cfdec7c39ea911cc979f6ad6da4921 192.168.222.103:6380@16380 master - 0 1670165527000 2 connected 5461-10922
8a80f0c04d4e64cc0b93442bbe3d9ea98cfc143f 192.168.222.100:6380@16380 myself,master - 0 1670165529000 1 connected 0-5460
8e2b5329688fec6ee8bac26458ef0f0c9b93ce2a 192.168.222.100:6381@16381 slave e97d76cab8f2bb064c7a8fbb05ea370e8da9a1a3 0 1670165529000 3 connected
7a68beb5ba8a7efaeff9894c9589486a0ba357cc 192.168.222.100:6382@16382 slave b207b38198cfdec7c39ea911cc979f6ad6da4921 0 1670165529525 2 connected
f29bd4b1ee68edb6904686f2af93d0a30cd894b8 192.168.222.103:6382@16382 slave e97d76cab8f2bb064c7a8fbb05ea370e8da9a1a3 0 1670165530535 3 connected
b26b32e21baf0582ab5f16cca7a93d2359bdd031 192.168.222.103:6381@16381 slave 8a80f0c04d4e64cc0b93442bbe3d9ea98cfc143f 0 1670165528000 1 connected
可以看到这个基本是符合我们指定的主从关系的,除了100:6380的从节点有错误。这个是因为我们再执行创建集群之前误操作了一个命令。其实我们的命令是成功的。
最终的关系如下:
主节点 | 从节点 | |
第一个集群 | 192.168.222.100:6380 | 192.168.222.103:6381 |
192.168.222.104:6382 | ||
第二个集群 | 192.168.222.103:6380 | 192.168.222.104:6381 |
192.168.222.100:6382 | ||
第三个集群 | 192.168.222.104:6380 | 192.168.222.100:6381 |
192.168.222.103:6382 |
至此,我们创建通过Docker创建Redis集群的两种模式已经都成功了。