本文将利用docker开启3个redis实例,模拟主从集群(一个主节点,两个从节点),信息如下:
容器名 | IP | 宿主机的映射端口 | 角色 |
---|---|---|---|
redis-m | 172.21.0.21 | 7001 | master |
redis-s1 | 172.21.0.22 | 7002 | slave |
redis-s2 | 172.21.0.23 | 7003 | slave |
Windows上利用docker搭建redis主从集群(一主二从):
-
拉取最新的redis镜像
docker pull redis:latest
-
在本机上某位置新建文件夹
docker_redis/redis-m/conf
,docker_redis/redis-s1/conf
,docker_redis/redis-s2/conf
来存放三个redis节点的配置文件 -
拷贝一份redis配置文件
redis.conf
到刚刚创建的三个节点的conf
目录下redis.conf
可以在官方配置文件的基础上修改,主要改以下几处(以主节点redis-m
为例):port 6379 bind 0.0.0.0 # 开启RDB # save "" save 3600 1 save 300 100 save 60 10000 # 关闭AOF appendonly no # redis实例的声明 IP replica-announce-ip 172.21.0.21 # redis实例的声明 端口号 replica-announce-port 6379
对于两个从节点
redis-s1
和redis-s2
可以直接复制主节点的配置文件到对应目录,然后将cluster-announce-ip
改为172.21.0.22
和172.21.0.23
,并且增加额外一行配置它跟随的主节点:# slaveof <masterip> <masterport> slaveof 172.21.0.21 6379 # 或者 # replicaof <masterip> <masterport> # replicaof 172.21.0.21 6379
-
创建docker网络,记得设置子网,子网要与配置文件中redis节点的IP保持一致
关于docker的网络模式和容器间的网络通信可以看这篇文章
docker network create --subnet 172.21.0.0/16 redis
-
从redis镜像启动三个redis实例容器,并分别将本机的7001、7002、7003端口映射到每个容器的6379端口,来模拟三个不同的redis节点。
docker run -p 7001:6379 -p 17001:16379 --name redis-m -v D:\docker_redis\redis-m\conf:/etc/redis --net redis --ip 172.21.0.21 -d redis redis-server /etc/redis/redis.conf docker run -p 7002:6379 -p 17002:16379 --name redis-s1 -v D:\docker_redis\redis-s1\conf:/etc/redis --net redis --ip 172.21.0.22 -d redis redis-server /etc/redis/redis.conf docker run -p 7003:6379 -p 17003:16379 --name redis-s2 -v D:\docker_redis\redis-s2\conf:/etc/redis --net redis --ip 172.21.0.23 -d redis redis-server /etc/redis/redis.conf
注意:
-
每个容器的IP要与它们在宿主机上的配置文件中设置的IP相同
-
将宿主机上的
conf
文件夹挂载到容器内,防止容器关闭后配置丢失。注意这里不要直接挂载配置文件,否则可能导致没有写入配置文件的权限, 在日志中会报Could not create tmp config file (Permission denied)
,因此要采用直接挂载文件夹的形式 -
创建时不要挂载data文件夹,后续可能会出现
Failed trying to load the MASTER synchronization DB from disk
的错误,主从同步也会失败(暂不清楚原因)即取消
-v D:\docker_redis\redis-m\data:/data
的挂载,还要注释配置文件中dir ./
这一行
这样就创建好了带有主从关系的三个redis容器:
-
-
主从集群建立成功,可以执行如下命令查看主从关系
-
进入主节点的终端:
docker exec -it redis-m bash
连接redis:
redis-cli -c
查看主从信息:
info replication
可以看到那两个从节点已经连接上了
-
进入某个从节点的终端
docker exec -it redis-s1 bash
连接redis:
redis-cli
查看主从信息:
info replication
可以看到,从节点的master的IP和端口号均正确
-
-
测试
- 在主节点上可以读和写数据到redis,且主节点上写的数据会被自动同步到从节点
- 从节点可以读到主节点上写的数据,但是从节点不能写入数据