Redis主从实例
今天本想跟着教程开始自己集成Redis,后来发现application.peroperties中含有哨兵等配置,不太懂,转而又去补了redis集群部分。明天开始集成redis。下面是今日了解的内容。
具体操作没有实时截图,根据教程去实践好了。在附件的“第八章” Redis入门指南(第2版).pdf
一、Redis主从实例
1.启动redis
redis-server。
2.配置从数据库
redis-server --port 从数据库端口号 --slaveof -- 主数据库IP地址 主数据库端口号。
此时,主数据库的任何变化都会同步到从数据库中。
3. 使用 redis-cli -p 主/从端口号 命令,进入到command下,输入info replication查看当前数据库信息。
4. 从数据库只读,一般不做写。因为对主数据库的修改会同步到从数据库中,有可能会把从数据库中的某一键值修改,造成数据不一致。
5. 从数据库可以使用 slave no one 停止与其他数据库进行同步,从而成为主数据库。
二、主从同步原理
从数据库会使用SYNC命令向主数据库发起同步,主数据库收到命令后,会在后台开始保存快照,并把保存期间的收到的命令缓存起来。在Redis2.6以前,主数据库会将所有数据保存到快照中,不能实现增量复制。在其后的版本,从数据库使用PSYNC向主数据库发起同步。同步原理:通过主数据库的ID和偏移量,完成更新操作。当主数据库实例重启时,还是要遵循2.6以前版本的全复制。
三、哨兵(Sentinel)
1. 用途:监控数据库是否正常运行。在主数据故障时,将从数据库升级为主数据库。
2. 配置: 新建一个哨兵的配置文件:sentinel.conf 文件中输入如下命令(当然这里命令不只是这一种)
sentinel monitor 自定义的主数据库名 主数据库IP地址 主数据库端口号 故障恢复操作前,同意恢复故障的哨兵数目
例如:
sentinel monitor mymaster 127.0.0.1 6379 1
3. 一个哨兵可以监控多个主从系统,一个主从系统可以被多个哨兵监控。
4. 原理:哨兵启动后,和主数据库建立两条连接。分别是:
(1)一条用来监控主数据库的_sentinel_:hello频道来获取主数据库的信息和其他同样在监控此主数据库的哨兵信息。
(2)我们知道,处于订阅状态时,不能够执行除了订阅和发布相关的其他命令。此第二条连接就是用来进行执行其他命令使用的。
和主数据库建立连接后,哨兵会定时进行如下操作:
(1)每隔10秒,哨兵会向主、从数据库发送INFO命令。
(2)每隔2秒,哨兵会向主、从数据库的_sentinel_:hello发送自己的信息。
(3)每隔1秒,哨兵会向主、从数据库和其他哨兵发送PING命令。
在配置(sentinel.conf )中,配置: sentinel down_after_milliseconds 主数据库名 时间 ,指定哨兵ping主数据库无反应后的等待时间。超过此时间,主(或从)数据库仍没有回应,则哨兵认为此数据库下线,我们成为:“主观下线”。
当此数据库是主数据时,此哨兵会进一步判断是否要进行故障恢复,会询问其他监控此主数据库的哨兵节点的意见。如果达到指定数量时,改哨兵会认为此主数据库“客观下线”。此时,该哨兵会发起对主从系统的故障恢复并向其他节点发起选举。以判断是否要进行恢复(判断标准就是此前提到了的“ 故障恢复操作前,同意恢复故障的哨兵数目”)和是否选举自己是否成为哨兵中的领头羊(领头羊进行故障恢复)。
哨兵之间进行选举的算法,Rafe算法。(具体可以参考https://raft.github.io/)
哨兵开始恢复时,在所有从数据库中选举出一个主数据库。选举算法如下:
(1)在所有的在线从数据库中,选择优先级最高的从数据库,即slave_priority
(2)如果有多个高优先级的从数据库,则复制的命令偏移量越大(复制越完整)越优先。
(3)如果以上条件都一样,则选择运行ID(每个redis实例都有唯一的run id,通过SHA1-sized random number生成)最小的从数据库。