redis主从同步及redis哨兵机制

1.主从和哨兵的作用:

角色

                           作用

主从

1.(提供)数据副本:多一份数据副本,保证redis高可用

2.  扩展(读)性能:如容量、QPS等

哨兵

1.监控: 监控redis主库及从库运行状态;

2.通知: 如果redis发生故障转移,可以通过邮件通知管员;

3.自动故障转移: 一旦发现主库宕机,则在从库中通过选举新的master进行故障转移。

2、部署redis主从及哨兵,解释其工作原理(结合日志分析);
redis主从同步:

master:     192.168.1.16
slave1:     192.168.1.17
slave2:     192.168.1.18

主库配置:
不设置密码,从库可以直接使用slaveof ip port连接主库。

#修改配置文件:  6379.conf
以守护进程在后台运行:
daemonize yes
bind 0.0.0.0

设置一个认证密码,从库需要指定master的密码才能完成同步,否则日志会有报错提示:

#修改配置文件                   redis.conf
#以守护进程在后台运行:
daemonize yes       
#可选设置认证密码:
requirepass "123456"         (294行设置)
bind 0.0.0.0    

从库配置:

#修改配置文件设置(重启服务器生效)需要关闭防火墙
bind 0.0.0.0
#指定隶属谁;
slaveof 192.168.1.16 6379
#或者
REPLICAOF 192.168.1.16 6379
#指定master的认证密码(如果远程服务器设置了密码,则需要认证密码)
masterauth "123456"              (294行设置)

#指定在命令行设置(直接生效,重启服务失效);
#指定谁是主库;
slaveof 192.168.1.16 6379
#或者
REPLICAOF 192.168.1.16 6379
#设置master的认证密码:
CONFIG set masterauth 123456
#取消主从关系,恢复master身份:
SLAVEOF no one

 

从库查看状态:
[root@localhost]# redis-cli
192.168.1.17:6379> info replication

 

 主库查看状态:

[root@localhost]# redis-cli
192.168.1.16:6379> info replication

日志分析:

tailf /usr/local/redis/6379.log

redis同步过程:

Connecting to MASTER 192.168.1.16:6379 
MASTER <-> REPLICA sync started 
# 开始非阻塞同步 
Non blocking connect for SYNC fired the event. 
Master replied to PING, replication can continue... 
Partial resynchronization not possible (no cached master) 
# 全量同步 
Full resync from master: 74fb29643971834fdf701beb1708ce9ddc23bdee:0 
# 接受数据 
MASTER <-> REPLICA sync: receiving 193 bytes from master 
# 清空以前缓存得数据 
MASTER <-> REPLICA sync: Flushing old data 
# 加载数据库到内存
MASTER <-> REPLICA sync: Loading DB in memory 
# 完成同步 
MASTER <-> REPLICA sync: Finished with success

主从复制相关参数解读: 
# 指定主库IP和端口: 
replicaof  192.168.75.136  6379 
# 指定主库得认证密码: 
masterauth 123456 
# 从库正在复制时,从库可以相应用户读请求,如果设置为no,则返回报错信息。 
replica-serve-stale-data yes 
# 设置从库为只读 
replica-read-only yes 
# 启动socket方式复制数据库,master生成rdb文件,不在是先保存到磁盘,然后发给从库,而是直接把 rdb发送给从库,减少了磁盘IO 
repl-diskless-sync yes 
# 配置延时时间,让更多slave加入传输队列,如果复制已经开始,则5秒内,不接受新的slave同步请求 
repl-diskless-sync-delay 5 
# 指定从库定期检查主库状态,默认10秒 
repl-ping-replica-period 10 
# 同步超时时间 
repl-timeout 60 
# 是否禁用tcp-nodelay,yes表示禁用,redis会在写缓存积累到一定量之后一起发送,节省带宽,但是 会导致master和slave数据延迟,no,表示启用,redis会立即发送数据包,即使是很小数据,数据同步会 比较快,但是消耗更多带宽 
repl-disable-tcp-nodelay no 
# 设置在同步过程中,写缓冲区得大小,需要考虑到同步的时间和数据的写入速度 
repl-backlog-size 1mb 
# 设置从库的优先级,在主库宕机后,根据优先级选择slave,值越小,则优先级越高,0,表示不参与竞选, 故永远不会被选中。 
replica-priority 100
同步策略:
全量同步:
Redis全量复制一般发生在Slave初始化阶段,这时Slave需要在Master上的所有数据都复制一份。具体步骤如下:

1)从服务器连接主服务器,发送SYNC命令;

2)主服务器接收到SYNC命名后,开始执行BGSAVE命令生成RDB文件并使用缓冲区记录此后执行的所有写命 令;

3)主服务器BGSAVE执行完后,向所有从服务器发送快照文件,并在发送期间继续记录被执行的写命令;

4)从服务器收到快照文件后丢弃所有旧数据,载入收到的快照;

5)主服务器快照发送完毕后开始向从服务器发送缓冲区中的写命令;

6)从服务器完成对快照的载入,开始接收命令请求,并执行来自主服务器缓冲区的写命令;

完成上面几个步骤后就完成了从服务器数据初始化的所有操作,从服务器此时可以接受来自用户的读请求。

Redis主从同步策略:
Redis主从同步略:
主从刚刚连接的时候,进行全量同步;全同步结束后,进行增量同步。当然,如果有需要,slave 在任 何时候都可以发起全量同步。redis 策略是,无论如何,首先会尝试进行增量同步,如不成功,要求从 机进行全量同步。
注意点:
如果多个Slave重启或者master重启,会因为master_replid不一致导致全量同步,当多个同时出现的时 候,可能会导致Master IO剧增宕机。
哨兵模式:
redis主从虽然解决了单点导致的数据丢失问题,但是还是没有解决无缝的故障转移,也就是说在主库宕机后,从库无法自动切换为主库,需要手工去切换,在这一瞬间会对后端数据库造成极大的负载,可能直接导致后端数据宕机。
工作原理:
哨兵(sentinel)是一个分布式系统,你可以在一个架构中运行多个哨兵(sentinel)进程,这些进程使用流言协议(gossipprotocols)来接收关于Master是否下线的信息,并使用投票协议(agreement protocols) 来决定是否执行自动故障迁移,以及选择哪个Slave作为新的Master。 每个哨兵(sentinel) 会向其它哨兵(sentinel)、master、slave定时发送消息,以确认对方是否”活”着,如 果发现对方在指定时间(可配置)内未回应,则暂时认为对方宕机了,这就是所谓的”主观认为宕机” Subjective Down,简称sdown)。

若“哨兵群”中的多数sentinel,都报告某一master没响应,系统才认为该master真正宕机,即客观上认 为宕机,Objective Down,简称odown),通过一定的vote算法,从剩下的slave节点中,选一台提升为 master,然后自动修改相关配置。

哨兵模式配置:

master:     192.168.1.16
slave1:     192.168.1.17
slave2:     192.168.1.18

 首先得配置主从:(前边已经配置了,这里就不在配置)

#配置master,开启网卡监听,(可选设置密码 294行);
vim /usr/local/redis/6379/6379.conf
bind  0.0.0.0
#配置slave1,指定master:
bind  0.0.0.0
replicatof  192.168.1.16  6379

#配置slave2,指定master:
bind  0.0.0.0
replicaof  192.168.1.16  6379

查看主从状态:

# 在master执行以下指令,均可查看同步信息: 
127.0.0.1:6379> role 
1) "master" 
2) (integer) 322 
3) 1) 1) "192.168.1.17"      
      2) "6379"      
      3) "322"  
   2) 1) "192.168.1.18"      
      2) "6379"      
     3) "322"
127.0.0.1:6379> info replication 
# Replication 
role:master 
connected_slaves:2 
slave0:ip=192.168.1.17,port=6379,state=online,offset=784,lag=1 
slave1:ip=192.168.1.18,port=6379,state=online,offset=784,lag=1 

配置哨兵:

master配置sentinel:
#复制哨兵的配置文件:
[root@localhost ~]# cp /usr/src/redis-stable/sentinel.conf  /usr/local/redis/
#修改配置文件:
vim /usr/local/redis/sentinel.conf

#绑定监听IP
bind 0.0.0.0
#监听端口
port 26379
#后台运行
daemonize yes
pidfile /var/run/redis-sentinel.pid
#哨兵的日志文件
logfile "sentinel.log"
#日志文件存放路径
dir /usr/local/redis/
#设置初始化master以及法定认为下线人数:
sentinel monitor mymaster 192.168.1.16 6379
#master主观下线时间,默认30秒,30秒内没有回复pong,则认为下线了
sentinel down-after-milliseconds mymaster 30000
#指定在故障转移期间,多少个slave向新的master同步数量,如果slave是提供查询服务,则应该设置小一点更好
sentinel parallel-syncs mymaster 1 
# 指定故障转移超时时间,默认为3分钟 
sentinel failover-timeout mymaster 180000 
# 设置通知脚本,发生故障转移可以向管理员发送通知(可选) 
sentinel notification-script mymaster /usr/local/redis/notify.sh 
# 禁止修改脚本,避免脚本重置 
sentinel deny-scripts-reconfig yes 
--------------

 

创建notify.sh脚本 

vim /usr/local/redis/notify.sh
#!/bin/bash 
# lutixia 
#####################
TO="1550684538@qq.com" 
SUBJECT="redis 发生故障转移" 
CONTEXT="redis 发生故障转移" 
echo -e "$CONTEXT"|mailx -s "$SUBJECT" "$TO"

#授予权限:
chmod +x /usr/local/redis/notofy.sh
#执行脚本
/usr/local/redis/notify.sh

启动哨兵模式:

[root@bogon ~]# /usr/local/redis/bin/redis-sentinel /usr/local/redis/sentinel.conf
[root@bogon ~]# netstat -nutlp

 复制哨兵配置文件及notify.sh脚本到slave服务器/并且在slave服务器启动哨兵:

#远程scp哨兵配置文件:
[root@localhost ~]# scp /usr/local/redis/sentinel.conf 192.168.1.17:/usr/local/redis/
root@192.168.1.17's password: 
sentinel.conf                                                        100% 9901     3.1MB/s   00:00    
[root@localhost ~]# scp /usr/local/redis/sentinel.conf 192.168.1.18:/usr/local/redis/
root@192.168.1.18's password: 
sentinel.conf 
#远程scp notify.sh脚本:                                                       100% 9901     2.6MB/s   00:00  
[root@localhost ~]# scp /usr/local/redis/sentinel.conf 192.168.1.17:/usr/local/redis/
root@192.168.1.17's password: 
notify.sh                                                            100%  186   131.8KB/s   00:00    
[root@localhost ~]# scp /usr/local/redis/notify.sh 192.168.1.18:/usr/local/redis/
root@192.168.1.18's password: 
notify.sh                                                            100%  186   111.4KB/s   00:00 

slave节点启动哨兵:

[root@bogon ~]# /usr/local/redis/bin/redis-sentinel /usr/local/redis/sentinel.conf 

master哨兵查看;

[root@bogon ~]# redis-cli -p 26379
127.0.0.1:26379> 
127.0.0.1:26379> info sentinel
# 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=192.168.1.16:6379,slaves=2,sentinels=3
以上配置哨兵完成:当哨兵发现master主库宕机时, 哨兵(sentinel)slave从库提升为主库 master,可通过stop关闭master模拟

谢谢关注!!!

原文地址:https://www.cnblogs.com/fengyuanfei/p/13830706.html