Redis (一)
Redis (二)
十、主从复制
10.1 概念
根据配置和策略更新主机数据, 自动同步到备机 master/slaver 机制。
Master 以写为主,Slave 以阅读为主,节点间数据复制为主。

10.2 主从步骤
- 启动主机Master
- 启动从机Slave
- 从机上执行slaveof host port 绑定主从关系
127.0.0.1:6379> slaveof 127.0.0.1 6380
Master查看主从关系:
127.0.0.1:6380> info replication # Replication role:master connected_slaves:2 slave0:ip=127.0.0.1,port=6381,state=online,offset=193283,lag=0 slave1:ip=127.0.0.1,port=6379,state=online,offset=193283,lag=0 master_failover_state:no-failover master_replid:ef1cef04653e6e7e36e329f687892ac9107f1fa1 master_replid2:439a4f1c1d3c6a60068376a11ffcecc4bbc2d48b master_repl_offset:193283 second_repl_offset:48028 repl_backlog_active:1 repl_backlog_size:1048576 repl_backlog_first_byte_offset:979 repl_backlog_histlen:192305
Slave检查主从关系:
127.0.0.1:6379> info replication # Replication role:slave master_host:127.0.0.1 master_port:6380 master_link_status:up master_last_io_seconds_ago:0 master_sync_in_progress:0 slave_read_repl_offset:191512 slave_repl_offset:191512 slave_priority:100 slave_read_only:1 replica_announced:1 connected_slaves:0 master_failover_state:no-failover master_replid:ef1cef04653e6e7e36e329f687892ac9107f1fa1 master_replid2:0000000000000000000000000000000000000000 master_repl_offset:191512 second_repl_offset:-1 repl_backlog_active:1 repl_backlog_size:1048576 repl_backlog_first_byte_offset:189866 repl_backlog_histlen:1647
- 主机离线后,从机仍然可用,但不会产生新的主机
- 主机恢复后,主从关系不变
- 离线后,主从关系被移除,但不影响主机与其他主从关系
- 从机重启后,需要手动执行slaveof,重新绑定主从关系
允许主从关系传递,即服务器可以用作从机或其他从机主机。
降低真实主机的同步压力。
但同步时延会更长。
在非哨兵模式下,当Master离线后,不会自动产生新的Master。
若要用新的Master,以下操作需要手动执行:
- 选择一个Slave,执行slaveof no one,使其成为Master
- 在其他的Slave中,执行slaveof [master] [port],绑定新的主从关系。
示例:
10.3 从复制原理出发
- Slave 成功启动连接 master 以后会发送一个 sync 命令;
- Master 收到命令启动后台存盘过程,同时收集所有收到的修改数据集命令,后台过程执行后,master 将整个数据文件传输到 slave,完成完全同步。
- 全量复制:slave 接收到数据库文件数据后,服务器将其存盘并加载到内存中。
- 增量复制:Master 继续依次传递所有新收集的修改命令 slave,完成同步。
- 但只要是重新连接 master,完全同步(全复制) 自动执行。
10.4 哨兵模式 (sentinel)
哨兵模式是以反客为主的自动版,可以在后台监控主机是否出现故障。如果出现故障,将根据投票数自动从库转换为主库。
当主机挂断时,根据以下三个条件选择新的主机:
- 优先级:在 redis.conf 中默认 slave-priority 值越小,优先级越高。
- 偏移:指获取原主机数据最完整的概率。
- runid:每个 redis 实例启动后,将随机生成 40 位的 runid。
原主机重启后会变成从机。
- 与上述步骤相同
- 需要新的哨兵节点
vi sentinel.conf sentinel monitor mymaster 127.0.0.1 6379 1
redis-sentinel sentinel.conf
10.4 复制延时
因为所有的写作操作都是先做的 Master 上操作,同步更新 Slave 上,所以从 Master 同步到 Slave 机器有一定的延迟。
当系统非常繁忙时,延迟问题会更严重,Slave 机器数量的增加也会使这个问题更加严重。
- 当主节点与节点第一次连接时,将生成RDB将文件全部复制到节点。
- 在此期间,主节点可能会收到修改数据,如写作命令。此时,主节点将使用缓冲区记录这些写作命令,然后等待RDB发送文件后,将缓冲区的写作命令发送到节点。
- 若有多个节点,则可从节点复制到节点,以减轻主节点的压力。
- 若主从同步时,网络断开,则可根据偏移量进行增量复制,以保证主从数据的一致性。
不保证强一致性,但保证最终一致性,增加吞吐量。
十一、集群
11.1 概念
Redis 集群(包括许多小集群)是正确的 Redis 水平扩容,即启动 N 个 redis 节点在这里存储整个数据库 N 在每个节点中,每个节点存储总数据 1/N,即小集群存储 1/N 每个小集群维护自己的数据 1/N 的数据。
Redis 集群通过分区(partition)提供一定程度的可用性(availability): 即使集群中的一些节点失效或无法通信, 集群还可以继续处理命令请求。
该模式的 redis 集群特特点是分治、分片。
11.2 搭建及启停
11.2.1 搭建集群
确保过程端口不冲突。
port 6379 pidfile "/var/run/redis_6379.pid" dbfilename "dump_6379.rdb"
cluster-enabled yes cluster-config-file nodes-6379.conf cluster-node-timeout 15000
redis-server redis_6379.conf