目录结构
先按照这个目录结构创建。
redis主从配置
redis-master主配置文件
#允许远程连接
bind 0.0.0.0
# 设置Redis实例的端口号
port 6379
# 设置Redis实例的密码
requirepass 123456
# 启用持久化
appendonly yes
redis-slave1从配置文件
#允许远程连接
bind 0.0.0.0
# 设置Redis实例的端口号
port 6380
# 设置Redis实例的密码
requirepass 123456
# 启用持久化
appendonly yes
# 配置master节点信息
replicaof 192.168.3.150 6379
# 设定连接主节点所使用的密码
masterauth 123456
redis-slave2从配置文件
#允许远程连接
bind 0.0.0.0
# 设置Redis实例的端口号
port 6381
# 设置Redis实例的密码
requirepass 123456
# 启用持久化
appendonly yes
# 配置master节点信息
replicaof 192.168.3.150 6379
# 设定连接主节点所使用的密码
masterauth 123456
注意
- 端口为docker 内部容器端口,并非对外开放端口,端口一致应该也是可以的,如果想要远程连接必须得映射端口。
- masterip所指定的redis-server-master是运行master节点的容器名; 在单体服务器下docker容器间可以使用容器名或者docker容器分配的ip代替,不同服务器用实际的IP地址来通信,想要一部到位就用公网ip。
可通过下方命令查看容器分配的ip
#docker inspect -f "{{range .NetworkSettings.Networks}}{{.IPAddress}}{{end}}" 容器名/容器id
哨兵sentinel配置
redis-sentinel-master #哨兵1 配置
# 设置哨兵的端口号
port 26379
# 配置哨兵的监控参数
# 格式:sentinel monitor <master-name> <ip> <redis-port> <quorum>
# master-name是为这个被监控的master起的名字
# ip是被监控的master的IP或主机名。因为Docker容器之间可以使用容器名访问,所以这里写master节点的容器名
# redis-port是被监控节点所监听的端口号
# quorom设定了当几个哨兵判定这个节点失效后,才认为这个节点真的失效了
# 配置哨兵的监控参数
sentinel monitor master 192.168.3.150 6379 2
# 设置 Sentinel 连接主服务器的密码,保持与主节点一致
sentinel auth-pass master 123456
#超过5秒主节点还没有连接上,则认为主节点已经停止
sentinel down-after-milliseconds master 5000
redis-sentinel-master #哨兵2 配置
# 设置哨兵的端口号
port 26379
# 配置哨兵的监控参数
# 格式:sentinel monitor <master-name> <ip> <redis-port> <quorum>
# master-name是为这个被监控的master起的名字
# ip是被监控的master的IP或主机名。因为Docker容器之间可以使用容器名访问,所以这里写master节点的容器名
# redis-port是被监控节点所监听的端口号
# quorom设定了当几个哨兵判定这个节点失效后,才认为这个节点真的失效了
# 配置哨兵的监控参数
sentinel monitor master 192.168.3.150 6379 2
# 设置 Sentinel 连接主服务器的密码,保持与主节点一致
sentinel auth-pass master 123456
#超过5秒主节点还没有连接上,则认为主节点已经停止
sentinel down-after-milliseconds master 5000
redis-sentinel-master #哨兵3 配置
# 设置哨兵的端口号
port 26379
# 配置哨兵的监控参数
# 格式:sentinel monitor <master-name> <master-ip> <redis-port> <quorum>
# master-name是为这个被监控的master起的名字
# ip是被监控的master的IP或主机名。因为Docker容器之间可以使用容器名访问,所以这里写master节点的容器名
# redis-port是被监控节点所监听的端口号
# quorom设定了当几个哨兵判定这个节点失效后,才认为这个节点真的失效了
# 配置哨兵的监控参数
sentinel monitor master 192.168.3.150 6379 2
# 设置 Sentinel 连接主服务器的密码,保持与主节点一致
sentinel auth-pass master 123456
#超过5秒主节点还没有连接上,则认为主节点已经停止
sentinel down-after-milliseconds master 5000
哨兵的配置是一样的,值得注意的是:
- 端口不需要强制设定,正如上诉,端口是容器内部端口,可以一致。
- master-name 可以是自定义,但必须前后一致。
- master-ip,在单体服务器下docker容器间可以使用容器名或者docker容器分配的ip代替,不同服务器用实际的IP地址来通信,想要一部到位就用公网ip。
docker一键部署配置
version: '3'
services:
redis-master:
image: redis
container_name: redis-redis-master
command: redis-server /usr/local/etc/redis/redis.conf
ports:
- "6379:6379"
volumes:
- ./redis-master/conf/redis.conf:/usr/local/etc/redis/redis.conf
redis-slave1:
image: redis
container_name: redis-redis-slave1
command: redis-server /usr/local/etc/redis/redis.conf
volumes:
- ./redis-slave1/conf/redis.conf:/usr/local/etc/redis/redis.conf
ports:
- "6380:6380"
depends_on:
- redis-master
redis-slave2:
image: redis
container_name: redis-redis-slave2
command: redis-server /usr/local/etc/redis/redis.conf
volumes:
- ./redis-slave2/conf/redis.conf:/usr/local/etc/redis/redis.conf
ports:
- "6381:6381"
depends_on:
- redis-master
redis-sentinel-master:
image: redis
container_name: redis-sentinel-master
command: redis-sentinel /usr/local/etc/redis/sentinel.conf
volumes:
- ./redis-sentinel-master/conf/sentinel.conf:/usr/local/etc/redis/sentinel.conf
ports:
- "26379:26379"
depends_on:
- redis-master
redis-sentinel-slave1:
image: redis
container_name: redis-sentinel-slave1
command: redis-sentinel /usr/local/etc/redis/sentinel.conf
ports:
- "26380:26379"
volumes:
- ./redis-sentinel-slave1/conf/sentinel.conf:/usr/local/etc/redis/sentinel.conf
depends_on:
- redis-slave1
redis-sentinel-slave2:
image: redis
container_name: redis-sentinel-slave2
command: redis-sentinel /usr/local/etc/redis/sentinel.conf
ports:
- "26381:26379"
volumes:
- ./redis-sentinel-slave2/conf/sentinel.conf:/usr/local/etc/redis/sentinel.conf
depends_on:
- redis-slave2
在redis文件夹下执行
docker-compose up -d
如图所示,表示启动成功。
运行查看主从情况:
主从切换
docker stop redis-redis-master
停掉主服务。
还剩一主一从,并且已经切换至redis-redis-slave2服务上了。
主从数据复制
进入主redis服务,也就是redis-redis-slave2
docker exec -it redis-redis-slave2 bash
redis-cli -h 127.0.0.1 -p 6381
AUTH 123456
使用redis命令。
添加数据成功,切换到从服务中查看数据。
注意从服务只可读不可写。
写在最后
在实际业务应用中,需要根据具体情况去做redis高可用,并非得一主二从三哨兵,这是可以灵活变动的。在双机热备的情况下,我感觉是可以用一主一从双热备的模式构建redis环境即可满足使用,只是多个节点多个保障罢了!