Redis 主从复制
主从复制的作用:
- 数据冗余:主从复制实现了数据的热备份,是持久化之外的一种数据冗余方式。
- 故障恢复:当主节点出现问题时,可以由从节点提供服务,实现快速的故障恢复;实际上是一种服务的冗余。
- 负载均衡:在主从复制的基础上,配合读写分离,可以由主节点提供写服务,由从节点提供读服务(即写Redis数据时应用连接主节点,读Redis数据时应用连接从节点),分担服务器负载;尤其是在写少读多的场景下,通过多个从节点分担读负载,可以大大提高Redis服务器的并发量。
- 高可用基石:除了上述作用以外,主从复制还是哨兵和集群能够实施的基础,因此说主从复制是Redis高可用的基础。
1. 搭建多台 redis
为便于实践测试,故只在单机 linux 上利用 docker 搭建三台虚拟机,此 Demo 只适合学习,生产环境下当然要多机。
- 创建目录,配置 redis.conf
mkdir /data/docker/redis
mkdir /data/docker/redis/data
配置文件下载地址:http://download.redis.io/redis-stable/redis.conf
- 修改配置文件
- protected-mode 修改为 no,默认为 yes 开启保护模式
- bind 127.0.0.1注释掉 或改为0.0.0.0 允许外部访问
- daemonize 改为no 关闭守护进程方式启动, 改为 yes 使用外部配置文件会启动失败
- 启动3个容器(1主,2从)
sudo docker run --name redis-node1 -p 6380:6379 -p 10000:26379 -v /data/docker/redis/conf/redis.conf:/etc/redis/redis.conf -v /data/docker/redis/data:/data -d redis redis-server /etc/redis/redis.conf
sudo docker run --name redis-node2 -p 6381:6379 -p 10001:26379 -v /data/docker/redis/conf/redis.conf:/etc/redis/redis.conf -v /data/docker/redis/data:/data -d redis redis-server /etc/redis/redis.conf
sudo docker run --name redis-node3 -p 6382:6379 -p 10002:26379 -v /data/docker/redis/conf/redis.conf:/etc/redis/redis.conf -v /data/docker/redis/data:/data -d redis redis-server /etc/redis/redis.conf
- 查看容器是否全都正常启动
分别查看容器的 IP 地址,为后面配置主从需要
docker inspect redis-node1
内网地址分别为:
redis-6380: 172.17.0.2 :6379 (主)
redis-6381: 172.17.0.3 :6379
redis-6382: 172.17.0.4 :6379
2. 配置主从关系
从节点开启主从复制,有3种方式:
(1)配置文件 redis重启后依然保持主从关系
在从服务器的配置文件中加入:slaveof
(2)启动命令
redis-server启动命令后加入 --slaveof
(3)客户端命令
Redis服务器启动后,直接通过客户端执行命令:slaveof
- 执行 slaveof 配置主从关系
docker exec -it redis-node2 /bin/bash // 进入 docker 容器
redis-cli // 进入 redis 环境
slaveof 172.17.0.2 6379 // 设置主 redis
- 断开主从关系
通过slaveof
3. 配置哨兵模式
哨兵的作用:
- 监控(Monitoring):哨兵会不断地检查主节点和从节点是否运作正常。
- 自动故障转移(Automatic failover):当主节点不能正常工作时,哨兵会开始自动故障转移操作,它会将失效主节点的其中一个从节点升级为新的主节点,并让其他从节点改为复制新的主节点。
- 配置提供者(Configuration provider):客户端在初始化时,通过连接哨兵来获得当前Redis服务的主节点地址。
- 通知(Notification):哨兵可以将故障转移的结果发送给客户端。
架构图:
- 哨兵节点:哨兵系统由一个或多个哨兵节点组成,哨兵节点是特殊的redis节点,不存储数据。
- 数据节点:主节点和从节点都是数据节点。
- 创建哨兵配置文件和日志
docker exec -it redis-node1 /bin/bash // 进入容器
// TODO 确认是否在 data 目录下 无误则创建文件
// 创建配置文件和日志
touch sentinel.conf && touch log.txt // 创建配置文件和日志
// sentinel monitor 主节点名称(任意) ip 端口 票数
echo ‘sentinel monitor mymaster 192.168.3.22 6380 1’ > sentinel.conf
echo ‘logfile “/data/log.txt”’ >> sentinel.conf // 日志文件存放地址
echo ‘daemonize yes’ >> sentinel.conf // 守护进程方式运行
注意:以上配置文件只需在其中任意一个容器执行一次即在全部容器中存在,但是启动哨兵需要每个容器都执行一次指令。
redis-sentinel sentinel.conf // 启动哨兵进程
- 测试故障转移是否生效
docker stop redis-node1 // 停止主节点
docker exec -it redis-node2 /bin/bash // 进入容器查看节点主从关系是否已经变化
redis-cli
info replication
引用:
https://www.cnblogs.com/kismetv/p/9236731.html
https://www.cnblogs.com/kismetv/p/9609938.html