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

从节点:63816382

 

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

 

posted @ 2019-10-14 15:16  运维魔法师  阅读(153)  评论(0编辑  收藏  举报