主从复制(Replication):也叫主从同步
,它是将Redis主服务器的数据同步到任意数量的从服务器上,同步使用的是发布/订阅机制
。Redis的持久化功能
,只能保障在宕机等情况下恢复大部分数据 ,但在硬盘故障
、系统崩溃
等单点故障
情况下,仍可能引发灾难性后果。而主从复制可以更好的解决这一问题,达到故障转移
的目的。
Redis通过`持久化`、`主从复制`、`哨兵模式`、`集群`保证了数据是安全和服务的高可用性。
主从复制有两种实现方式:命令方式
和配置方式
(推荐), 示例拓扑图如下:
role | ip | port |
---|---|---|
Master | 127.0.0.1 | 6379 |
Slave1 | 127.0.0.1 | 6380 |
Slave2 | 127.0.0.1 | 6381 |
准备工作:
redis.conf
的Redis配置文件,以此为模板,新建三个Redis配置文件: 如redis_6379.conf
的内容如下: # 拷贝一份新配置
$ cat /etc/redis/redis.conf | grep -v "#"|grep -v "^$" > redis_6379.conf
# 修改redis_6379.conf配置内容如下:
# cat ./redis_6379.conf|grep -E "port|dbfilename|appendfilename|logfile|pidfile"
$ cat ./redis_6379.conf
cat ./redis_6379.conf|grep 6379
port 6379
pidfile "/var/run/redis_6379.pid"
logfile "redis_6379.log"
dbfilename "dump_6379.rdb"
appendfilename "dump_6379.aof"
redis_6380.conf
、redis_6381.conf
文件$ sed "s/6379/6380/g" redis_6379.conf > redis_6380.conf
$ cat ./redis_6380.conf|grep 6380
$ sed "s/6379/6381/g" redis_6379.conf > redis_6381.conf
$ cat ./redis_6381.conf|grep 6381
$ redis-server ./redis_6379.conf
$ redis-server ./redis_6380.conf
$ redis-server ./redis_6381.conf
命令方式实现主从复制: 这种方式简单方便,但重启服务后会断掉Replication状态
$ redis-cli -p 6380
127.0.0.1:6380> slaveof 127.0.0.1 6379 # 设置为从服务,将6379作为Master
OK
# 无需重启redis服务
配置文件方式实现主从复制: 推荐该方式,但需要重启Redis服务
redis_6380.conf
、redis_6381.conf
相关配置项,内容如下:# 检查复制相关的配置项
$ cat ./redis_6380.conf|grep -v "#"|grep replica
replicaof 127.0.0.1 6379 # 关键项,指向master
replica-serve-stale-data yes
replica-read-only yes # 关键项
replica-priority 100
replica-lazy-flush no
client-output-buffer-limit replica 256mb 64mb 60
$ redis-cli -p 6380 shutdown
$ redis-server ./redis_6380.conf
验证主从复制服务:
$ redis-cli -p 6380
127.0.0.1:6380> info replication
# Replication
role:slave # 角色Slave
master_host:127.0.0.1
master_port:6379
master_link_status:up
master_last_io_seconds_ago:7
master_sync_in_progress:0
slave_repl_offset:42
slave_priority:100
slave_read_only:1
connected_slaves:0
master_replid:6f0624789e4178643a526dfc707293344b4e20cf
master_replid2:0000000000000000000000000000000000000000
master_repl_offset:42
second_repl_offset:-1
repl_backlog_active:1
repl_backlog_size:1048576
repl_backlog_first_byte_offset:29
repl_backlog_histlen:14
$ redis-cli info replication
# Replication
role:master
connected_slaves:2 # 显示多个slave状态信息
slave0:ip=127.0.0.1,port=6380,state=online,offset=392,lag=0
slave1:ip=127.0.0.1,port=6381,state=online,offset=392,lag=0
master_replid:c9db0ed52f30faa0138914f5d9fc3c77c01a675b
master_replid2:0000000000000000000000000000000000000000
master_repl_offset:392
second_repl_offset:-1
repl_backlog_active:1
repl_backlog_size:1048576
repl_backlog_first_byte_offset:1
repl_backlog_histlen:392
$ redis-cli set test "hello world"
OK
$ redis-cli -p 6380 get test
"hello world"
$ redis-cli -p 6381 get test
"hello world"
关闭主从复制服务: 在从服务上操作,操作如下:
127.0.0.1:6380> slaveof no one
OK
$ redis-cli info server | grep run_id #查看服务ID
$ redis-cli info replication | grep offset #复制偏移量
1.1 复制过程: 在出现网络抖动
或服务重启
(服务ID改变)时,会引发全量复制。复制过程如下:
runid
为问号,偏移量为-1
);runid
和offset
判断要做全量复制,并向slave发送FullResync(runid,offset)
数据;buffer
;RDB
数据;send buffer
数据;RDB
;1.2 复制开销:
2.1 复制原理: Redis2.8+提供部分复制,即复制断开后会发送缓冲
(默认1M),如果偏移量大于1M
,则进行全量复制。
Replication除了数据备份(数据安全),另外一个重要的应用就是读写分离。读写分离可以提升系统性能,但也增加了系统的复杂性
懒惰删除
或定时任务
进行删除,难免出现读到过期数据。新版本(v3.2+)已经解决了该问题。rel_backlog_size
参数。复制拓扑
,如"master->slave->slave"
。高可用
。参考:
http://www.redis.com.cn/topics/replication
https://www.cnblogs.com/wdliu/p/9407179.html