主从复制介绍
在分布式系统中为了解决单点问题,通常会把数据复制多个副本到其他机器,满足故障恢复和负载均衡等求.
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