redis哨兵集群搭建可以分两部分
- redis主从机集群搭建
- 哨兵集群的搭建
这里我们使用docker 来模拟redis集群
(首先安装docker compose)
redis 主从集群的搭建
为了好操作我们新建立一个单独目录docker/redis文件夹来实验
建立docker-cmpose.yml文件
里面配置了一个主节点,两个从节点,三个哨兵
(同时配置了固定ip,目的是哨兵是通过配置文件中的主节点的ip进行监控,docker容器启动以后的ip可能会变,导致哨兵监听不到)
version: '3'
services:
master:
image: redis:latest
container_name: redis-master
ports:
- 6379:6379
networks:
demo:
ipv4_address: 172.190.1.2
slave1:
image: redis:latest
container_name: redis-slave-1
ports:
- 6380:6379
command: redis-server --slaveof redis-master 6379
networks:
demo:
ipv4_address: 172.190.1.3
slave2:
image: redis:latest
container_name: redis-slave-2
ports:
- 6381:6379
command: redis-server --slaveof redis-master 6379
networks:
demo:
ipv4_address: 172.190.1.4
sentinel1:
image: redis:latest
container_name: redis-sentinel-1
ports:
- 26379:26379
command: redis-sentinel /usr/local/etc/redis/sentinel.conf
volumes:
- ./../sentinel/sentinel1.conf:/usr/local/etc/redis/sentinel.conf
networks:
demo:
ipv4_address: 172.190.1.5
sentinel2:
image: redis:latest
container_name: redis-sentinel-2
ports:
- 26380:26379
command: redis-sentinel /usr/local/etc/redis/sentinel.conf
volumes:
- ./../sentinel/sentinel2.conf:/usr/local/etc/redis/sentinel.conf
networks:
demo:
ipv4_address: 172.190.1.6
sentinel3:
image: redis:latest
container_name: redis-sentinel-3
ports:
- 26381:26379
command: redis-sentinel /usr/local/etc/redis/sentinel.conf
volumes:
- ./../sentinel/sentinel3.conf:/usr/local/etc/redis/sentinel.conf
networks:
demo:
ipv4_address: 172.190.1.7
networks:
demo:
driver: bridge
ipam:
driver: default
config:
- subnet: 172.190.1.0/24
# gateway: 172.19.1.1
新建文件夹sentinel 里面建立哨兵的配置文件 sentinel.conf 如下,复制3份分别是sentinel1.conf,sentinel2.conf,sentinel3.conf 与上面docker-compose中设置的挂载路径一致。
# Example sentinel.conf
# port <sentinel-port>
port 8001
# 守护进程模式
daemonize yes
# 指明日志文件名
logfile "./sentinel1.log"
# 工作路径,sentinel一般指定/tmp比较简单
dir ./
# 哨兵监控这个master,在至少quorum个哨兵实例都认为master down后把master标记为odown
# (objective down客观down;相对应的存在sdown,subjective down,主观down)状态。
# slaves是自动发现,所以你没必要明确指定slaves。
sentinel monitor MyMaster 127.0.0.1 7001 1
# master或slave多长时间(默认30秒)不能使用后标记为s_down状态。
sentinel down-after-milliseconds MyMaster 1500
# 若sentinel在该配置值内未能完成failover操作(即故障时master/slave自动切换),则认为本次failover失败。
sentinel failover-timeout TestMaster 10000
# 设置master和slaves验证密码
sentinel auth-pass TestMaster testmaster123
启动
在docker-compose路径下 dc up -d 启动容器。
可以竟如哨兵容器,连接26379端口,info 查看状态。可以看到集群的状态
# Sentinel
sentinel_masters:1
sentinel_tilt:0
sentinel_running_scripts:0
sentinel_scripts_queue_length:0
sentinel_simulate_failure_flags:0
master0:name=mymaster,status=ok,address=172.190.1.2:6379,slaves=2,sentinels=3
测试高可用
docker stop redis-master 停掉主节点。然后过一会儿,哨兵节点info 查看。master的ip就变成了另一个
# Sentinel
sentinel_masters:1
sentinel_tilt:0
sentinel_running_scripts:0
sentinel_scripts_queue_length:0
sentinel_simulate_failure_flags:0
master0:name=mymaster,status=ok,address=172.190.1.4:6379,slaves=2,sentinels=3
说明哨兵将从节点设置成为了主节点,然后登录该节点,使用info 命令可以看到当前的节点的role已经变成了master。并且可以进行写set 命令
# Replication
role:master
connected_slaves:1
slave0:ip=172.190.1.3,port=6379,state=online,offset=1489154,lag=1
master_replid:c865c39f238b0b97c86cc7ec830b00a64f7a6553
master_replid2:2f1f05989500cf3592982bedb727436c9a9c5a34
master_repl_offset:1489154
second_repl_offset:1474101
repl_backlog_active:1
repl_backlog_size:1048576
repl_backlog_first_byte_offset:440579
repl_backlog_histlen:1048576
恢复之前的主节点
docker start redis-master , 然后可以进入节点,可以看到。先前的主节点已经变成了从节点,masterhost 变成了172.190.1.4
# Replication
role:slave
master_host:172.190.1.4
master_port:6379
master_link_status:up
master_last_io_seconds_ago:1
master_sync_in_progress:0
slave_repl_offset:1520774
slave_priority:100
slave_read_only:1
connected_slaves:0
master_replid:c865c39f238b0b97c86cc7ec830b00a64f7a6553
master_replid2:0000000000000000000000000000000000000000
master_repl_offset:1520774
second_repl_offset:-1
repl_backlog_active:1
repl_backlog_size:1048576
repl_backlog_first_byte_offset:1518683
repl_backlog_histlen:2092
注意点
不同的docker-compose 管理的容器群 的网段是不同的。不同网段是不通的。如果你用两个docker-compose 分别管理redis主从集群和哨兵集群的话,有可能会出现哨兵发现不了主机的情况,使用ping看看网络是否通畅。 确保哨兵集群和redis集群在同一网段下。可以通过docker-compose设置容器网络ip固定,直接将redis集群和哨兵集群写在一个docker-compose里面,也是可以的
,,,也可以修改docker,配置文件,,使得创建的容器都在同一个网段,修改docker配置以后需要重启。
安装ping 和ifconfig
- apt-get install inetutils-ping
- apt-get install net-tools