## 主从复制
### 阶段 - 连接建立阶段 - 保存主节点信息:从节点服务器内部维护了两个字段,即masterhost和masterport字段,用于存储主节点的IP地址和端口号 - 建立socket连接:从节点每秒调用复制定时函数replicationCron一次,如果发现有主节点可以连接,就会根据主节点的IP地址和端口号来建立socket连接。 - 发送ping命令:从节点成为主节点的客户端之后,发送ping命令进行首次请求,目的是检查socket连接是否可用,以及主节点当前是否能够处理请求。 - 身份验证:如果从节点中设置了masterauth(身份验证)选项,那么从节点需要向主节点进行身份验证;如果没有设置该选项,则不需要验证。 - 发送从节点端口信息:身份验证之后,从节点会向主节点发送其监听的端口号,主节点将该信息保存到该从节点对应的客户端的slave_listening_port字段中。 - 数据同步阶段 - 全量复制 - 部分复制 - 命令传播阶段 ## 哨兵架构 ### 组成 - 哨兵节点:哨兵系统由一个或多个哨兵节点组成,哨兵节点是特殊的Redis节点,不存储数据 - **监控**:哨兵节点不断检查用户的主从实例是否按照预期在工作 - **通知**:如果被监控的redis实例有问题,哨兵节点可以通过一个api来通知系统管理员或者其他应用程序 - **自动故障转移**:如果一个主节点没有按照预期工作,哨兵节点会启动故障转移过程,把一个从节点提升为主节点,重新配置其他的从节点并使用新的主节点,使用redis服务的应用程序在连接的时候也会被通知使用新的主节点地址 - **配置提供者**:哨兵节点为客户端提供服务来源,对于指定的服务,客户端连接到sentinel来寻找当前主节点的地址。当发生故障转移时,哨兵节点将报告新的主节点地址 - 数据节点:主节点和从节点都是数据节点 ### 搭建 #### 启动 - `redis-sentinel sentinel.conf` - `redis-server sentinel.conf --sentinel` #### 注意 - 必须使用**一个配置文件**来运行Sentinel,这个配置文件被系统用于存储当前状态 - 如果重启Sentinel,那么这些状态会被重新载入 - 如果没有配置文件或者配置文件的路径不对,Sentinel就会拒绝启动 - Sentinel监听TCP端口**26379** - 哨兵节点**最少三台并且必须为单数** - 三个Sentinel实例应该放在**独立**的物理机电脑或虚拟机中 - Sentinel+Redis分布式系统在失败期间并不能确保写入请求被保存,因为Redis使用异步复制 - 如果因为在开发环境或者生产环境中通过了测试而没有设置安全的高可用,那么就可能会因为一个错误的配置而导致主机宕机,以至不能继续提供正常的服务。 #### 配置sentinel.conf文件 ```shell sentinel monitor mymaster 127.0.0.1 6379 2 sentinel down-after-milliseconds mymaster 60000 sentinel failover-timeout mymaster 180000 sentinel parallel-syncs mymaster 1 sentinel monitor resque 192.168.1.3 6380 4 sentinel down-after-milliseconds resque 10000 sentinel failover-timeout resque 180000 sentinel parallel-syncs resque 5 ``` | 参数名 | 实例 | 解释 | | -------------------------------- | ------------------------------------------------------------ | ------------------------------------------------------------ | | sentinel monitor | sentinel monitor | quorum是指同意主节点不可用所需的Sentinel的数量
quorum在检测到失败后投票时使用。 | | sentinel down-after-milliseconds | sentinel down-after-milliseconds <master_name> <option_value> | 当一个Redis实例失去联系(要么不回复我们的请求,要么回复一个错误)超过了这个指定的时间(以毫秒为单位),就可以认为这个Redis实例挂掉了。 | | sentinel parallel-syncs | sentinel parallel-syncs <master_name> <option_value> | 设置从节点的数量,这些从节点在一次故障转移过后可以使用新的主节点进行重新配置。 | ### 命令 - PING:仅仅返回PONG。 - SENTINEL masters:展示监控的主节点和它们的状态列表。 - SENTINEL master:展示指定的主节点的信息。 - SENTINEL salves :展示指定主节点的从节点以及它们的状态。 - SENTINEL sentinels :展示指定主节点的sentinel实例以及它们的状态。 - SENTINEL get-master-addr-by-name :返回主节点的IP地址和端口号。如果这个主节点正在进行故障转移,就返回提升的从节点的IP地址和端口号。 - SENTINEL reset:该命令将会根据匹配的名称重置主节点,pattern参数是通配符(glob-style)类型,重置Sentinel进程清除主节点中之前的所有状态,并且移除主节点发现和关联的从节点与Sentinel。 - SENTINEL failover:如果主节点是不可达的,就强制开始故障转移,不需要其他的Sentinel同意。 - SENTINEL ckquorum:检查当前的Sentinel配置对于主节点的故障转移是否能达到仲裁人数(即同意票数),以便授权进行故障转移。这个命令应该在监控系统中使用以检查Sentinel的部署是否正常。 - SENTINEL flushconfig:强制Sentinel把它的配置和状态重新写入磁盘(即刷盘)。每次Sentinel状态有改变,Sentinel就会重写配置信息。有时候由于错误的操作、磁盘故障、程序包升级脚本或配置管理等原因会导致配置文件的丢失。在这种情况下,最容易的解决办法就是要强制Sentinel重写配置文件,即使之前的配置文件完全丢失了,这个命令也能很好地完成工作。