
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-lag2.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 > EOF3.启动:
[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、63824.开启主从:
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 OK5.查询主从状态
[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:06.解除从库身份
[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 ~]#