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模拟
谢谢关注!!!