redis的主从搭建和哨兵-4
原理:
- redis 主从架构原理详解
主从复制,是指将一台Redis服务器的数据,复制到其他的Redis服务器。前者称为主节点(master),后者称为从节点(slave),数据的复制是单向的,只能由主节点到从节点。
默认情况下,每台Redis服务器都是主节点;且一个主节点可以有多个从节点(或没有从节点),但一个从节点只能有一个主节点。
(1) 读写分离
在redis主从架构中,Master节点负责处理写请求,Slave节点只处理读请求。对于写请求少,读请求多的场景,例如电商详情页,通过这种读写分离的操作可以大幅提高并发量,通过增加redis从节点的数量可以使得redis的QPS达到10W+。
(2) 主从同步
Master节点接收到写请求并处理后,需要告知Slave节点数据发生了改变,保持主从节点数据一致的行为称为主从同步,所有的Slave都和Master通信去同步数据也会加大Master节点的负担,实际上,除了主从同步,redis也可以从从同步,我们在这里统一描述为主从同步。
1. 主从同步的方法
1).增量同步
2).快照同步
3).无盘复制
2. redis 主从架构搭建
使用3个虚拟机搭建一主二从的redis主从架构集群。首先参考redis-4.0.12单节点安装在每台机器上安装redis,然后修改redis配置文件,其中一个master节点的配置如下(未列出的保持默认即可):
# basic
daemonize yes
port 6379
logfile /home/hadoop/logs/redis/6379/redis_6379.log
pidfile /home/hadoop/pid/redis/6379/redis_6379.pid
dir /home/hadoop/data/redis/6379
# aof
# 主节点打开AOF机制
appendonly yes
# master
# 绑定本台机器的IP,否则主从节点无法通信
bind 192.168.239.101
# 设置master的认证口令为redis
requirepass redis
# backlog大小
repl-backlog-size 1mb
# 快照同步的超时时间
repl-timeout 60
# 开启无盘复制
repl-diskless-sync yes
# 无盘复制的延迟默认为5s,是为了等待更多的slave连接
repl-diskless-sync-delay 5
# 触发快照同步的条件
# 如果增量同步的缓存大于256MB,或者超过60s大于64MB,则触发快照同步
client-output-buffer-limit slave 256mb 64mb 60
# 主从节点进行心跳的时间间隔
repl-ping-slave-period 10
两个slave节点的配置如下:
# basic
daemonize yes
port 6379
logfile /home/hadoop/logs/redis/6379/redis_6379.log
pidfile /home/hadoop/pid/redis/6379/redis_6379.pid
dir /home/hadoop/data/redis/6379
# slave
# 绑定本机的IP,另一个为192.168.239.103
bind 192.168.239.102
# 绑定master的ip和port
slaveof 192.168.239.101 6379
# 从节点只读
slave-read-only yes
# master的认证口令
masterauth redis
启动3个redis服务:
[hadoop@node01 ~]$ redis-server ~/apps/redis-4.0.12/redis_6379.conf
[hadoop@node01 ~]$ redis-server ~/apps/redis-4.0.12/redis_6379.conf
[hadoop@node01 ~]$ redis-server ~/apps/redis-4.0.12/redis_6379.conf
wait 命令(扩展,redis-3.0新增)
wait m t
wait 提供两个参数,第一个参数是从节点的数量 m,第二个参数是时间 t,以毫秒为单位。它表示等待 wait 指令之前的所有写操作同步到 n 个子节点 (也就是确保 m 个子节点的同步没有滞后),最多等待时间 t。如果时间 t=0,表示无限等待直到N 个从库同步完成达成一致。假设此时某个子节点与主节点网络断开,wait 指令第二个参数时间 t = 0,主从同步无法继续进行,wait 指令会永远阻塞,redis 服务器将丧失可用性
Redis Sentinel(哨兵)部署
Redis-sentinel是Redis实例的监控管理、通知和实例失效备援服务,是Redis集群的管理工具。在一般的分布式中心节点数据库中,Redis-sentinel的作用是中心节点的工作,监控各个其他节点的工作情况并且进行故障恢复,来提高集群的高可用性。
基于上面主从搭建的基础上配置sentinel
4、配置Sentinel.config
创建配置文件
创建一个sentinel目录,新建sentinel.conf文件(Redis提供了该文件的模版)。配置文件内容如下:
##sentinel实例之间的通讯端口
daemonize yes
port 27000
#redis-master
sentinel monitor redis-master 192.168.1.51 7000 2
sentinel down-after-milliseconds redis-master 5000
sentinel failover-timeout redis-master 900000
sentinel parallel-syncs redis-master 2
sentinel auth-pass redis-master 123456
logfile "/data/bd/redis/sentinel/sentinel.log"
配置项说明:
1)daemonize yes
- 以后台进程模式运行
2)port 27000
- 哨兵的端口号,该端口号默认为26379。
3)logfile"/data/bd/redis/sentinel/sentinel.log"
- log文件所在地
4)sentinel monitor redis-master 192.168.1.517000 2
-
redis-master是主数据的别名,考虑到故障恢复后主数据库的地址和端口号会发生变化,哨兵提供了命令可以通过别名获取主数据库的地址和端口号。
-
192.168.1.51 7000为初次配置时主数据库的地址和端口号,当主数据库发生变化时,哨兵会自动更新这个配置,不需要我们去关心。
2,该参数用来表示执行故障恢复操作前至少需要几个哨兵节点同意,一般设置为N/2+1(N为哨兵总数)。
5)sentinel down-after-milliseconds redis-master 1000
- 如果master在多少秒内无反应哨兵会开始进行master-slave间的切换,使用“选举”机制
6)sentinel failover-timeout redis-master 5000
- 如果在多少秒内没有把宕掉的那台master恢复,那哨兵认为这是一次真正的宕机,而排除该宕掉的master作为节点选取时可用的node然后等待一定的设定值的毫秒数后再来探测该节点是否恢复,如果恢复就把它作为一台slave加入哨兵监测节点群并在下一次切换时为他分配一个“选取号”。
客户端进行连接
import redis
from redis.sentinel import Sentinel
# 连接哨兵服务器(主机名也可以用域名)
# 10.0.0.101:26379
sentinel = Sentinel([('10.0.0.101', 26379),
('10.0.0.101', 26378),
('10.0.0.101', 26377)
],
socket_timeout=5)
print(sentinel)
# 获取主服务器地址
master = sentinel.discover_master('mymaster')
print(master)
# 获取从服务器地址
slave = sentinel.discover_slaves('mymaster')
print(slave)
##### 读写分离
# 获取主服务器进行写入
# master = sentinel.master_for('mymaster', socket_timeout=0.5)
# w_ret = master.set('foo', 'bar')
# slave = sentinel.slave_for('mymaster', socket_timeout=0.5)
# r_ret = slave.get('foo')
# print(r_ret)