目的:提高并发访问、缓存数据备份、故障自动切换实现高可用
环境:系统:centos 7.6; Docker 18.03.1-ce
架构方案:3台哨兵一起监控1主2从,主节点负责写数据,从节点负责读数据,当master宕机时,由sentinel集群来自动切换某个从节点成为新的master,旧的master会成为新的从节点,应用端通过从sentinel获取主从redis节点信息,连接主从redis节点进行读写操作
实施构建
设计docker部署方案
容器名称 | 容器IP | 端口映射 | Redis服务模式 |
redis-sentinel1 | 172.16.0.101 | 22531-26379 | sentinel |
redis-sentinel2 | 172.16.0.102 | 22532-26379 | sentinel |
redis-sentinel3 | 172.16.0.103 | 22533-26379 | sentinel |
redis-master | 172.16.0.111 | 22631-6379 | master |
redis-slave1 | 172.16.0.112 | 22632-6379 | slave |
redis-slave2 | 172.16.0.113 | 22633-6379 | slave |
搭建环境
创建Docker的自定义网络
docker network create --subnet=172.16.0.0/16 sentinelnetwork
构建容器
Dockerfile内容
FROM centos:latest
RUN groupadd -r redis && useradd -r -g redis redis
RUN yum -y update && yum -y install epel-release && yum -y install redis && yum -y install net-tools
EXPOSE 6379
1.进入Dockerfile文件目录构建镜像
docker build -t redis-base-image .
2.构建6个运行redis服务的容器
docker run -itd --name redis-sentinel1 --net sentinelnetwork -p 22531:26379 --ip 172.16.0.101 redis-base-image
docker run -itd --name redis-sentinel2 --net sentinelnetwork -p 22532:26379 --ip 172.16.0.102 redis-base-image
docker run -itd --name redis-sentinel3 --net sentinelnetwork -p 22533:26379 --ip 172.16.0.103 redis-base-image
docker run -itd --name redis-master --net sentinelnetwork -p 22631:6379 --ip 172.16.0.111 redis-base-image
docker run -itd --name redis-slave1 --net sentinelnetwork -p 22632:6379 --ip 172.16.0.112 redis-base-image
docker run -itd --name redis-slave2 --net sentinelnetwork -p 22633:6379 --ip 172.16.0.113 redis-base-image
运行 docker ps -a 查看生成的容器
3.主从配置
使用 "docker exec -it 容器名称 bash " 命令进入容器
1). 为了方面测试,先将6个容器的redis.conf配置成bind 0.0.0.0 和 protected-mode no
2).配置主从关系:修改从节点的redis.conf文件的slaveof参数
slaveof 172.16.0.111 6379
3).将主从3个节点开启redis-server服务
redis-server /etc/redis.conf &
4)登录Master节点的redis-cli,用 info replication 查看到角色是master的信息
登录Slave节点的redis-cli,用 info replication 查看角色是slave的信息
5) 测试数据复制:
在master上写入一个数据 set name jo
然后在两个从节点查看到数据复制情况:
salve1节点
slave2节点
4.哨兵配置
1). 进入sentinel容器修改redis-sentinel.conf,将 “sentinel monitor mymaster 127.0.0.1 6379 2”这行配置改成监控master节点
sentinel monitor mymaster 172.16.0.111 6379 2
2).开启redis-sentinel服务
redis-sentinel /etc/redis-sentinel.conf &
3).查看sentinal监控日志
cat /var/log/redis/sentinel.log
测试故障自动切换
1.关停当前master节点的redis服务: kill 26
2.过一段时间,再进入从节点查看主从关系,发现172.16.0.112这台机器自动变成了新的Master
113这台从节点改成为112的从节点了
3.查看sentinel日志,可以看到哨兵集群检测发现111Master下线了,然后重新选择了112作为新的主节点并做了切换操作,sentinel改监控112了
4.重启111的redis-server后,发现它确实变成了从节点,而且redis.conf文件被自动修改了slaveof 配置
5.最后演变成的结构