05: redis 主从复制
redis主从复制
原理:
1. 从服务器向主服务器发送 SYNC 命令。
2. 接到 SYNC 命令的主服务器会调用BGSAVE 命令,创建一个 RDB 文件,并使用缓冲区记录接下来执行的所有写命令。
3. 当主服务器执行完 BGSAVE 命令时,它会向从服务器发送 RDB 文件,而从服务器则会接收并载入这个文件。
4. 主服务器将缓冲区储存的所有写命令发送给从服务器执行。
详细的过程:
主从常见架构:
一个主服务器可以有多个从服务器。
从服务器也可以有自己的从服务器。
复制功能不会阻塞主服务器。
主从数据一致性保证:
min-slaves-to-write 1
min-slaves-max-lag
这个特性的运作原理:
从服务器以每秒一次的频率 PING 主服务器一次, 并报告复制流的处理情况。
主服务器会记录各个从服务器最后一次向它发送 PING 的时间。
用户可以通过配置, 指定网络延迟的最大值 min-slaves-max-lag ,
以及执行写操作所需的至少从服务器数量 min-slaves-to-write 。
如果至少有 min-slaves-to-write 个从服务器, 并且这些服务器的延迟值都少于 min-slaves-max-lag秒,
那么主服务器就会执行客户端请求的写操作。
你可以将这个特性看作 CAP 理论中的 C 的条件放宽版本: 尽管不能保证写操作的持久性,
但起码丢失数据的窗口会被严格限制在指定的秒数中。
另一方面, 如果条件达不到 min-slaves-to-write 和 min-slaves-max-lag 所指定的条件, 那么写操作就不会被执行
主服务器会向请求执行写操作的客户端返回一个错误。
---------------------
主库是否要开启持久化?
如果不开有可能,主库重启操作,造成所有主从数据丢失!
主从服务器数据全部丢失的例子:
1. 假设节点A为主服务器,并且关闭了持久化。 并且节点B和节点C从节点A复制数据
2. 节点A崩溃,然后由自动拉起服务重启了节点A. 由于节点A的持久化被关闭了,所以重启之后没有任何数据
3. 节点B和节点C将从节点A复制数据,但是A的数据是空的, 于是就把自身保存的数据副本删除。
在关闭主服务器上的持久化,并同时开启自动拉起进程的情况下,即便使用Sentinel来实现Redis的高可用性,也是非常危险的。 因为主服务器可能拉起得非常快,以至于Sentinel在配置的心跳时间间隔内没有检测到主服务器已被重启,然后还是会执行上面的数据丢失的流程。
无论何时,数据安全都是极其重要的,所以应该禁止主服务器关闭持久化的同时自动拉起。
---------------------
主从复制实现:
1、环境:
准备两个或两个以上redis实例
mkdir /nosql/638{0..2}
配置文件示例:
vim /nosql/6380/redis.conf
port 6380
daemonize yes
pidfile /nosql/6380/redis.pid
loglevel notice
logfile "/nosql/6380/redis.log"
dbfilename dump.rdb
dir /nosql/6380
protected-mode no
vim /nosql/6381/redis.conf
port 6381
daemonize yes
pidfile /nosql/6381/redis.pid
loglevel notice
logfile "/nosql/6381/redis.log"
dbfilename dump.rdb
dir /nosql/6381
protected-mode no
vim /nosql/6382/redis.conf
port 6382
daemonize yes
pidfile /nosql/6382/redis.pid
loglevel notice
logfile "/nosql/6382/redis.log"
dbfilename dump.rdb
dir /nosql/6382
protected-mode no
启动:
redis-server /nosql/6380/redis.conf
redis-server /nosql/6381/redis.conf
redis-server /nosql/6382/redis.conf
主节点:6380
从节点:6381、6382
2、开启主从:
6381/6382命令行:
redis-cli -p 6381
SLAVEOF 127.0.0.1 6380
redis-cli -p 6382
SLAVEOF 127.0.0.1 6380
3、查询主从状态
从库:
127.0.0.1:6382> info replication
主库:
127.0.0.1:6380> info replication
4、从库切为主库
模拟主库故障
redis-cli -p 6380
shutdown
redis-cli -p 6381
info replication
slaveof no one
6382连接到6381:
[root@db03 ~]# redis-cli -p 6382
127.0.0.1:6382> SLAVEOF no one
127.0.0.1:6382> SLAVEOF 127.0.0.1 6381