命令记不住

登陆

Redis 主复制集

Redis主复制集

master-replicaset(主复制集)

1.原理

从服务器向主服务器发送 SYNC 命令。
接到 SYNC 命令的主服务器会调用BGSAVE 命令,创建一个 RDB 文件,并使用缓冲区记录接下来执行的所有写命令。
当主服务器执行完 BGSAVE 命令时,它会向从服务器发送 RDB 文件,而从服务器则会接收并载入这个文件。
主服务器将缓冲区储存的所有写命令(广播形式)发送给从服务器执行。

注:

  • 1、在开启主从复制的时候,使用的是RDB方式的,同步主从数据的
  • 2、同步开始之后,通过主库命令传播的方式,主动的复制方式实现
  • 3、2.8以后实现PSYNC的机制,实现断线重连

2.主从数据一致性保证

min-slaves-to-write 1
min-slaves-max-lag

2.1这个特性的运作原理:
从服务器以每秒一次的频率 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 所指定的条件, 那么写操作就不会被执行。主服务器会向请求执行写操作的客户端返回一个错误。

2.2主库是否要开启持久化?
如果不开有可能,主库重启操作,造成所有主从数据丢失!

3.主从复制实现

1、环境:
准备两个或两个以上redis实例

[root@db01 ~]#ls /data/
mysql  mysql-5.7.20  mysql-boost-5.7.20.tar.gz  redis  redis-3.2.12.tar.gz
[root@db01 ~]#mkdir /data/638{0..2}
[root@db01 ~]#ls /data/
6380  6381  6382  mysql  mysql-5.7.20  mysql-boost-5.7.20.tar.gz  redis  redis-3.2.12.tar.gz
[root@db01 ~]#

2.配置文件示例:

[root@db01 ~]#cat >  /data/6380/redis.conf <<EOF
> port 6380
> daemonize yes
> pidfile /data/6380/redis.pid
> loglevel notice
> logfile "/data/6380/redis.log"
> dbfilename dump.rdb
> dir /data/6380
> requirepass 123
> masterauth 123
> EOF
[root@db01 ~]#cat >  /data/6381/redis.conf <<EOF
> port 6381
> daemonize yes
> pidfile /data/6381/redis.pid
> loglevel notice
> logfile "/data/6381/redis.log"
> dbfilename dump.rdb
> dir /data/6381
> requirepass 123
> masterauth 123
> EOF
[root@db01 ~]#cat >  /data/6382/redis.conf <<EOF
> port 6382
> daemonize yes
> pidfile /data/6382/redis.pid
> loglevel notice
> logfile "/data/6382/redis.log"
> dbfilename dump.rdb
> dir /data/6382
> requirepass 123
> masterauth 123
> EOF

3.启动:

[root@db01 ~]#redis-server /data/6380/redis.conf
[root@db01 ~]#redis-server /data/6381/redis.conf
[root@db01 ~]#redis-server /data/6382/redis.conf
[root@db01 ~]#netstat -tunlp|grep 638
tcp        0      0 0.0.0.0:6380            0.0.0.0:*               LISTEN      4599/redis-server * 
tcp        0      0 0.0.0.0:6381            0.0.0.0:*               LISTEN      4601/redis-server * 
tcp        0      0 0.0.0.0:6382            0.0.0.0:*               LISTEN      4607/redis-server * 
tcp6       0      0 :::6380                 :::*                    LISTEN      4599/redis-server * 
tcp6       0      0 :::6381                 :::*                    LISTEN      4601/redis-server * 
tcp6       0      0 :::6382                 :::*                    LISTEN      4607/redis-server * 
[root@db01 ~]#

主节点:6380
从节点:6381、6382

4.开启主从:
6381/6382命令行:

[root@db01 ~]#redis-cli -p 6381 -a 123 SLAVEOF 127.0.0.1 6380
OK
[root@db01 ~]#redis-cli -p 6382 -a 123 SLAVEOF 127.0.0.1 6380
OK

5.查询主从状态

[root@db01 ~]#redis-cli -p 6380 -a 123 info replication
# Replication
role:master
connected_slaves:2
slave0:ip=127.0.0.1,port=6381,state=online,offset=57,lag=0
slave1:ip=127.0.0.1,port=6382,state=online,offset=57,lag=1
master_repl_offset:57
repl_backlog_active:1
repl_backlog_size:1048576
repl_backlog_first_byte_offset:2
repl_backlog_histlen:56

[root@db01 ~]#redis-cli -p 6381 -a 123 info replication
# Replication
role:slave
master_host:127.0.0.1
master_port:6380
master_link_status:up
master_last_io_seconds_ago:9
master_sync_in_progress:0
slave_repl_offset:57
slave_priority:100
slave_read_only:1
connected_slaves:0
master_repl_offset:0
repl_backlog_active:0
repl_backlog_size:1048576
repl_backlog_first_byte_offset:0
repl_backlog_histlen:0

[root@db01 ~]#redis-cli -p 6382 -a 123 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_repl_offset:71
slave_priority:100
slave_read_only:1
connected_slaves:0
master_repl_offset:0
repl_backlog_active:0
repl_backlog_size:1048576
repl_backlog_first_byte_offset:0
repl_backlog_histlen:0

6.解除从库身份

[root@db01 ~]# redis-cli -p 6382 -a 123 slaveof no one
OK
# 查看状态
[root@db01 ~]#redis-cli -p 6380 -a 123 info replication
# Replication
role:master
connected_slaves:1
slave0:ip=127.0.0.1,port=6381,state=online,offset=141,lag=1
master_repl_offset:141
repl_backlog_active:1
repl_backlog_size:1048576
repl_backlog_first_byte_offset:2
repl_backlog_histlen:140
[root@db01 ~]#
推荐阅读