Redis 主从复制以及读写分离

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 相关信息

  • 博文不易,辛苦各位猿友点个关注和赞,感谢

猜你喜欢

转载自blog.csdn.net/qq_15769939/article/details/113822695