这种配置方式虽然实现了集群,自动选举,但是存在问题:客户端无法获取对应的访问地址
环境:
1、只有一台Linux服务器
2、使用docker-compose进行部署(docker-compose的使用这里就不介绍了)
1、docker images
使用自己镜像中的redis
2、docker network ls
查看当前已有的网段(注意:必须要同网段,要不然会无法访问)
也可以创建新的网段:docker network create --subnet=172.19.0.0/16 mynetwork
3、redis的docker-compose.yml文件
这里使用自己的网段可以修改:network_mode: 自己的网段名称
---
version: '3'
services:
# 主节点的容器
redis-server-master:
image: redis
container_name: redis-server-master
restart: always
network_mode: redis_server_default
# 指定时区,保证容器内时间正确
environment:
TZ: "Asia/Shanghai"
volumes:
# 映射配置文件和数据目录
- /opt/sentinel/redis_server/redis6379.conf:/etc/redis/redis.conf
- /opt/sentinel/redis_server/data6379:/data
ports:
- 8379:6379
command: redis-server /etc/redis/redis.conf
# 从节点1的容器
redis-server-slave-1:
image: redis
container_name: redis-server-slave-1
restart: always
network_mode: redis_server_default
depends_on:
- redis-server-master
environment:
TZ: "Asia/Shanghai"
volumes:
- /opt/sentinel/redis_server/redis6380.conf:/etc/redis/redis.conf
- /opt/sentinel/redis_server/data6380:/data
ports:
- 9380:6379
command: redis-server /etc/redis/redis.conf
# 从节点2的容器
redis-server-slave-2:
image: redis
container_name: redis-server-slave-2
restart: always
network_mode: redis_server_default
depends_on:
- redis-server-master
environment:
TZ: "Asia/Shanghai"
volumes:
- /opt/sentinel/redis_server/redis6381.conf:/etc/redis/redis.conf
- /opt/sentinel/redis_server/data6381:/data
ports:
- 9381:6379
command: redis-server /etc/redis/redis.conf
4、到对应的目录下,创建redis配置文件
修改对应的配置文件redis6380.conf和redis6381.conf
slaveof 172.18.0.2 6379 其中的172.18.0.2 为主redis服务的ip地址(redis服务启动后,可通过docker inspect redis-server-master 查看到)
也可以在yml文件中配置:command后面加--slaveof 172.18.0.2 6379
protected-mode no 允许远程访问
requirepass 自己的密码(主从的密码保持一致)
masterauth 主服务密码(主从的密码保持一致)
执行命令:docker-compose up -d
成功后执行命令:docker ps -a 可以看到已经成功启动了
执行命令查看是否主从同步成功:可以看到有2个从redis服务
查看从服务器的情况:状态为up
到这里redis的主从部署完毕。
5、哨兵docker-compose.yml配置文件
---
version: '3'
services:
redis-sentinel-1:
image: redis
container_name: redis-sentinel-1
restart: always
volumes:
- /opt/sentinel/sentinel_server/sentinel26379.conf:/etc/redis/sentinel.conf
network_mode: redis_server_default
ports:
- 26379:26379
# 指定时区,保证容器内时间正确
environment:
TZ: "Asia/Shanghai"
command: redis-sentinel /etc/redis/sentinel.conf
redis-sentinel-2:
image: redis
container_name: redis-sentinel-2
restart: always
volumes:
- /opt/sentinel/sentinel_server/sentinel26380.conf:/etc/redis/sentinel.conf
network_mode: redis_server_default
ports:
- 26380:26379
environment:
TZ: "Asia/Shanghai"
command: redis-sentinel /etc/redis/sentinel.conf
redis-sentinel-3:
image: redis
container_name: redis-sentinel-3
restart: always
volumes:
- /opt/sentinel/sentinel_server/sentinel26381.conf:/etc/redis/sentinel.conf
network_mode: redis_server_default
ports:
- 26381:26379
environment:
TZ: "Asia/Shanghai"
command: redis-sentinel /etc/redis/sentinel.conf
6、到对应的目录下,
配置文件sentinel26379.conf,sentinel26380.conf,sentinel26381.conf
注意:3个sentinel配置文件的myid不能相同,可以把配置文件中的myid删除,启动会重新生成,3个配置文件可以完成相同,配置如下:
port 26379
dir "/tmp"
sentinel deny-scripts-reconfig yes
sentinel monitor mymaster 172.18.0.2 6379 2
sentinel auth-pass mymaster redis服务密码
执行命令启动:docker-compose up -d
成功后可以查看配置文件变成:可以看到当前主redis服务为172.18.0.2(redis-server-master)
7、测试是否可以正常选举新的主redis服务
执行命令: docker ps -a 当前服务都是启动状态
当前主redis服务为172.18.0.2(redis-server-master)
执行命令: docker stop redis-server-master
查看:docker ps -a
查看哨兵配置文件,已经变了,主服务变成了172.18.0.3
再查看之前的从服务器的主从情况:
到这里哨兵集群就结束了。