1 核心原理
当启动一个slave node
的时候,它会发送一个PSYNC
命令给master node
。
如果这是slave node
重新连接master node
,那么master node
仅仅会复制给slave部分缺少的数据
; 否则如果是slave node
第一次连接master node,那么会触发一次full resynchronization
。
开始full resynchronization
的时候,master
会启动一个后台线程
,开始生成一份RDB快照文件
,同时还会将从客户端收到的所有写命令缓存在内存中
。RDB文件生成完毕之后,master
会将这个RDB发送给slave
,slave会先写入本地磁盘
,然后再从本地磁盘加载到内存中
。然后master会将内存中缓存的写命令
发送给slave,slave也会同步这些数据。
slave node如果跟master node有网络故障,断开了连接,会自动重连。master如果发现有多个slave node都来重新连接,仅仅会启动一个rdb save操作,用一份数据服务所有slave node。
2 断点续传
从redis 2.8开始,就支持主从复制的断点续传
,如果主从复制过程中,网络连接断掉了,那么可以接着上次复制的地方
,继续复制下去,而不是从头开始复制一份。
master node会在内存中常见一个backlog
,master和slave都会保存一个replica offset
还有一个master id
,offset就是保存在backlog中的。如果master和slave网络连接断掉了,slave会让master从上次的replica offset开始继续复制
。
但是如果没有找到对应的offset,那么就会执行一次resynchronization
。
3 无磁盘化复制
master在内存中直接创建rdb,然后发送给slave,不会在自己本地落地磁盘了。
repl-diskless-sync
复制
repl-diskless-sync-delay
,等待一定时长再开始复制,因为要等更多slave重新连接过来。
4 读写分离
为满足读多写少的业务场景,最大化节约用户成本,Redis可以使用读写分离,为用户提供透明、高可用、高性能、高灵活的读写分离服务。
5 主从复制
5.1 资源信息
服务器 | IP地址 |
---|---|
master | 192.168.51.4 |
slave1 | 192.168.51.5 |
slave2 | 192.168.51.6 |
5.2 slave机器配置
三台机器都配置安装好redis,具体的安装信息可查看博文,Redis 安装和配置以及常用命令。
两台slave机器上的配置相同,master机器不需要做额外的配置。
5.2.1 修改配置文件
[root@localhost init.d]# cd /usr/local/redis
[root@localhost redis]# vi 6379.conf
# replicaof <masterip> <masterport>
replicaof 192.168.51.4 6379
# masterauth <master-password>
masterauth auskat
# administrative / dangerous commands.
replica-read-only yes
- replicaof 192.168.51.4 6379 配置master的IP和端口号
- masterauth auskat 配置master的密码
- replica-read-only yes 默认从节点是只读模式
5.2.2 重启服务
[root@localhost redis]# /etc/init.d/redis_init_script stop
[root@localhost redis]# /etc/init.d/redis_init_script start
5.3 功能测试
5.3.1 查看master
[root@localhost ~]# redis-cli -a auskat
Warning: Using a password with '-a' or '-u' option on the command line interface may not be safe.
127.0.0.1:6379> info replication
# Replication
role:master
connected_slaves:2
slave0:ip=192.168.51.5,port=6379,state=online,offset=1774,lag=1
slave1:ip=192.168.51.6,port=6379,state=online,offset=1774,lag=1
master_replid:89019a6d7bb98860f7d727d8361e778a6cad3e92
master_replid2:0000000000000000000000000000000000000000
master_repl_offset:1774
second_repl_offset:-1
repl_backlog_active:1
repl_backlog_size:1048576
repl_backlog_first_byte_offset:1
repl_backlog_histlen:1774
127.0.0.1:6379> set aaa aaa
5.3.2 查看slave1
[root@localhost redis]# redis-cli
127.0.0.1:6379> auth auskat
OK
127.0.0.1:6379> info replication
# Replication
role:slave
master_host:192.168.51.4
master_port:6379
master_link_status:up
master_last_io_seconds_ago:1
master_sync_in_progress:0
slave_repl_offset:42
slave_priority:100
slave_read_only:1
connected_slaves:0
master_replid:89019a6d7bb98860f7d727d8361e778a6cad3e92
master_replid2:0000000000000000000000000000000000000000
master_repl_offset:42
second_repl_offset:-1
repl_backlog_active:1
repl_backlog_size:1048576
repl_backlog_first_byte_offset:1
repl_backlog_histlen:42
127.0.0.1:6379> get aaa
"aaa"
127.0.0.1:6379> set abc 123
(error) READONLY You can't write against a read only replica.
5.3.3 查看slave2
[root@localhost redis]# redis-cli
127.0.0.1:6379> auth auskat
OK
127.0.0.1:6379> info replication
# Replication
role:slave
master_host:192.168.51.4
master_port:6379
master_link_status:up
master_last_io_seconds_ago:3
master_sync_in_progress:0
slave_repl_offset:1760
slave_priority:100
slave_read_only:1
connected_slaves:0
master_replid:89019a6d7bb98860f7d727d8361e778a6cad3e92
master_replid2:0000000000000000000000000000000000000000
master_repl_offset:1760
second_repl_offset:-1
repl_backlog_active:1
repl_backlog_size:1048576
repl_backlog_first_byte_offset:1663
repl_backlog_histlen:98
127.0.0.1:6379> get aaa
"aaa"
127.0.0.1:6379> set abc 123
(error) READONLY You can't write against a read only replica.
6 相关信息
- 博文不易,辛苦各位猿友点个关注和赞,感谢