Redis主从复制+哨兵机制
主从复制
将主机的数据复制到多个从机上,避免单主机挂掉后服务无法正常提供使用,同时可以分担主机读的压力
从机的redis.conf配置
slaveof master_ip master_port --指定主机的ip 和 端口,需要保证主机的bing为0.0.0.0 masterauth passord --主机连接的密码 slave-read-only yes -- 从机只允许读
当配置完后,连接redis,使用info replication
查看主从信息
# Replication role:slave --当前角色 slave:从 master:主 master_host:192.168.169.250 --主机的ip master_port:6379 --主机端口 master_link_status:up --主机状态 up:在线 down:不在线 master_last_io_seconds_ago:6 master_sync_in_progress:0 slave_repl_offset:337 slave_priority:100 ....
主从复制特点:
1.只有主机可以写,从机只可以读
2.从机复制主机的全部数据
3.主机宕机后,从机待命,等待主机恢复运行
4.从机宕机后,需要重连主机
5.复制原理:先全量复制,再增量复制
全量复制:发生在slave初始连接master时,slave会将master所有的数据全部复制过来
全量复制流程:
1.slave连接master,向master发送SYNC命令
2.master接收命令,开始执行bgsave生产RDB文件并使用缓冲区记录此后的所有命令
3.masterRDB文件生成完毕后,向slave发送文件,并且发送期间记录执行的写命令
4.slave接收到文件后,丢弃旧数据,恢复新的数据
5.RDB发送完毕后,master再次向slave发送缓冲区中的命令
6.从机接收命令并执行
增量复制:全量复制后,就是slave初始化完毕后,master每执行一个写命令就会向slave发送相同的命令,slave接收后就执行命令,保证数据的同步
哨兵机制
监控Redis的运行状态,主要作用就是监控master和slave是否正常运行,master出现故障自动将slave转为master,因为slave只可以读不可以写,这样当程序写的时候就会出错
主要有以下功能:
1.集群监控:Sentinel会不断的检查 主服务器 和 从服务器是否正常运行。
2.消息通知:如果监控的服务器出现问题,会发送消息给管理员
2.故障转移:如果 master 挂掉了,会自动转移到 slave 上
3.配置中心:如果故障转移发生了,通知 client 客户端新的 master 地址
在master和slave的sentinel.conf配置
protected-node no --不启动保护模式,即其他的机器也可以访问 port 26379 --端口 daemonize yes|no --后台运行 logfile "" --日志文件 dir ./tmp --工作目录 sentinel monitor master-name 127.0.0.1 6379 2 --核心配置:监控的master,2表示master挂掉后,slave进行投票选举新的master sentinel auth-pass <master-name> <password> --master的密码,name和上方一致 sentinel down-after-milliseconds mymaster 30000 --主机30秒内无法访问,就设为Down状态 sentinel parallel-syncs mymaster 1 --master挂掉后,会进行同步,这是给slave并行同步的数量
master和slave都启动sentinel:
src/.redis-sentinel ../sentinel.conf
选举master:sentinel monitor master-name 2,主机挂掉后 salve 投票看让谁接替成为主机,得票数多的成为主机
主从切换的日志过程:
1.maset挂掉
2.slave投票多的升级为新的master
3.其余的slave修改master为新的master
4.原先挂掉的master再次启动成为slave,等待新的master挂掉再次竞选升为master
注意点:
1.哨兵最小配置是一主一从
2.哨兵 + redis 主从的部署架构,是不保证数据零丢失的,只能保证 redis 集群的高可用性。
哨兵原理:
1.每个哨兵以每秒钟一次的频率向它所知的服务器以及其他哨兵发送一个PING
命令
2.如果一个实例最后一次回复PING
命令超过了sentinel.conf
配置的down-after-milliseconds
指定的值 ,那就会被哨兵标记为主观下线
3.如果一个服务器被标记为下线,那么正在监视这个服务器的所有哨兵,以每秒一次的频率进行确认
4.如果一个 主服务器 被标记为 主观下线,并且有 足够数量 的 Sentinel
(至少要达到 配置文件 指定的数量)在指定的 时间范围 内同意这一判断,那么这个 主服务器 被标记为 客观下线。
5.Sentinel
和其他 Sentinel
协商 主节点 的状态,如果 主节点 处于 SDOWN
状态,则投票自动选出新的 主节点。将剩余的 从节点 指向 新的主节点 进行 数据复制。
6.当没有足够数量的 Sentinel
同意 主服务器 下线时, 主服务器 的 客观下线状态 就会被移除。当 主服务器 重新向 Sentinel
的 PING
命令返回 有效回复 时,主服务器 的 主观下线状态 就会被移除。
SpringBoot集成哨兵:
spring: datasource: url: jdbc:mysql://112.126.82.110:3306/my-shop?characterEncoding=UTF-8&useSSL=false&useUnicode=true&serverTimezone=UTC password: 123456 redis: password: redis database: 1 sentinel: master: imooc-master #主机name,与sentinel.conf保持一致 nodes: 192.168.169.250:26379,192.168.169.251:26379 #哨兵所有节点