Redis 主从复制

Posted 三花

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Redis 主从复制相关的知识,希望对你有一定的参考价值。

主从复制介绍

在分布式系统中为了解决单点问题,通常会把数据复制多个副本到其他机器,满足故障恢复和负载均衡等求.
Redis 也是如此,提供了复制功能.
复制功能是高可用 Redis 的基础,后面的哨兵和集群都是在复制的基础上实现高可用的.
每个从节点只能有一个主节点,主节点可以有多个从节点.

11. Redis(主从)(Master-Replicaset 主,副本集)

11.1 主-副本集原理

副本库通过slaveof 192.168.0.51 6379命令,连接主库,并发送SYNC给主库。
主库收到SYNC后,会立即触发BGSAVE,后台保存RDB,发送给副本库。
副本库接收后会应用RDB快照。
主库会陆续将中间产生的新的操作,保存并发送给副本库。
到此,我们主复制集就正常工作了。
在此以后,主库只要发生新的操作,都会以命令转播的形式自动发送给副本库。
所有复制相关信息,从info信息中都可以查到,即使重启任何节点,他的主从关系依然都在。
如果发生主从关系断开时,从库数据没有任何损坏,在下次重连之后,从库发送PSYNC给主库。
主库只会将从库缺失部分的数据同步给从库用,达到快速恢复主从的目的。

11.2 主从数据一致性保证 (面试)

min-slaves-to-write 1   #最小的从库写入数量,意思是主库录入一条数据后,必须要保证有1台从库复制成功,才会返回OK,也就是主从复制成功。
min-slaves-max-lag 3  #单位为秒。如果从库的延时超过3秒,主库直接宣告数据同步失败。

11.3 主库是否要开启持久化 (面试)

如果不开,有可能在主库进行重启操作时,造成所有主从数据丢失。
提示:
如果主从环境中的主库没有开启持久化又发生宕机,千万不要立即启动主库,否则主库生成的空的RDB(快照)也会同步到从库。
导致数据被彻底清空。

配置复制的方式有三种

1.在配置文件中加入 slaveof {masterHost} {masterPort} 随 redis 启动生效.
2.在 redis-server 启动命令后加入—slaveof {masterHost} {masterPort}生效.
3.直接使用命令:slaveof {masterHost} {masterPort}生效.

12. Redis主从复制搭建

(1)环境准备
准备两台或以上的redis实例(当前环境为单机多实例)

[root@redis-01 ~]# mkdir /data/638{0..2}

配置文件示例:
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

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

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

启动:
redis-server /data/6380/redis.conf
redis-server /data/6381/redis.conf
redis-server /data/6382/redis.conf

查看进程:
[root@redis-01 ~]# ps -ef | grep redis | grep -v grep
root       6787      1  0 11:01 ?        00:00:00 redis-server *:6380
root       6791      1  0 11:01 ?        00:00:00 redis-server *:6381
root       6795      1  0 11:01 ?        00:00:00 redis-server *:6382

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

(2)开启主从(6381、6382上操作)
[root@redis-01 ~]# redis-cli -p 6381 -a 123 SLAVEOF 127.0.0.1 6380
OK
[root@redis-01 ~]# redis-cli -p 6382 -a 123 SLAVEOF 127.0.0.1 6380
OK

(3)查询主从状态
主状态查询:
[root@redis-01 ~]# 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=113,lag=1
slave1:ip=127.0.0.1,port=6382,state=online,offset=113,lag=0
master_repl_offset:113
repl_backlog_active:1
repl_backlog_size:1048576
repl_backlog_first_byte_offset:2
repl_backlog_histlen:112
redis-cli -p 6381 -a 123 info replication
redis-cli -p 6382 -a 123 info replication

从状态查询:
[root@redis-01 ~]# 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:10
master_sync_in_progress:0
slave_repl_offset:883
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@redis-01 ~]# 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:5
master_sync_in_progress:0
slave_repl_offset:953
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

以上是关于Redis 主从复制的主要内容,如果未能解决你的问题,请参考以下文章

Spring之redis主从复制(非哨兵模式)

redis实战_04_yucong_主从复制

详解Redis 主从复制及主从复制原理

redis主从复制最好采用哪种结构

redis高可用之主从复制,哨兵,集群

Redis(主从复制哨兵模式集群)概述及部署