主从复制
主从复制的作用:
- 数据冗余:主从复制实现了数据的热备份,是持久化之外的一种数据冗余
- 故障恢复:当主机发生故障的时候,从机仍然保存了主机的数据,这样从机还是能进行服务的提供,从而不会导致整个服务器失效,这其实是一种服务上面的冗余操作
- 负载均衡:使用主从复制的操作,可以实现将主机的部分服务剥离出来,主机可以是读写结合的,但是在高可读低写的情况下面,这样的操作就不是很适合了,使用主从复制,可以使从机获得主机的读权限,这样就会使主机的负载降低,使服务器开销降低,大大提升性能
- 高可用基石:主从复制是哨兵模式以及集群实现的基石,所以说主从复制是大数据高可用的基石
你是如何对主从复制进行操作理解的?
- 配置文件进行主从复制(永久性)
################################# REPLICATION #################################
# Master-Replica replication. Use replicaof to make a Redis instance a copy of
# another Redis server. A few things to understand ASAP about Redis replication.
#
# +------------------+ +---------------+
# | Master | ---> | Replica |
# | (receive writes) | | (exact copy) |
# +------------------+ +---------------+
#
# 1) Redis replication is asynchronous, but you can configure a master to
# stop accepting writes if it appears to be not connected with at least
# a given number of replicas.
# 2) Redis replicas are able to perform a partial resynchronization with the
# master if the replication link is lost for a relatively small amount of
# time. You may want to configure the replication backlog size (see the next
# sections of this file) with a sensible value depending on your needs.
# 3) Replication is automatic and does not need user intervention. After a
# network partition replicas automatically try to reconnect to masters
# and resynchronize with them.
#
# replicaof <masterip> <masterport>
这里设置主从机
# If the master is password protected (using the "requirepass" configuration
# directive below) it is possible to tell the replica to authenticate before
# starting the replication synchronization process, otherwise the master will
# refuse the replica request.
#
# masterauth <master-password>
#
这里设置主从密码
-
通过命令来进行主从复制(具有时效性,还是断电即失)
-
这里直接通过指令 SLAVEOF(注意,这里一定是大写理解)
-
当添加进入主机的端口之后就可以通过主机来查看其中的从机连接个数
127.0.0.1:6379> info replication # Replication role:master connected_slaves:1 slave0:ip=127.0.0.1,port=6380,state=online,offset=112,lag=0 master_failover_state:no-failover master_replid:f02e3196c79a6cd4d3bcdc46d5aef71dbd68d00a master_replid2:0000000000000000000000000000000000000000 master_repl_offset:112 second_repl_offset:-1 repl_backlog_active:1 repl_backlog_size:1048576 repl_backlog_first_byte_offset:1 repl_backlog_histlen:112
-
主从复制,这里的切入点是通过从机来对主机的相关信息进行理解操作,主机上面所有的信息对于从机来说都是可以完全进行继承的,但是主机和从机之间存在一部分权限差异
- 主机具有写以及读的权限
127.0.0.1:6379> keys *
1) "k3"
2) "k1"
3) "k4"
4) "k2"
127.0.0.1:6379> get k4
"ace"
127.0.0.1:6379> set k6 master
OK
127.0.0.1:6379>
- 从机只存在读的权限,并且如果你需要实现这里的操作的话,会爆出异常操作,告诉权限问题
127.0.0.1:6380> set k6 master
(error) READONLY You can't write against a read only replica.
127.0.0.1:6380>
还有就是关于从机继承主机的数据来说,分为两大类
- 全量复制(当一个从机连接到主机的时候,直接将主机的所有数据转移到从机上面)
127.0.0.1:6380> keys *
1) "k4"
2) "k2"
3) "k1"
4) "k3"
127.0.0.1:6380>
这里需要注意,全量复制的底层文件支持是进行的rdb文件复制的,直接将一种模式进行理解操作,为什么不用aof文件复制?那是因为文件可能会比较大,网络传输链路会比较慢,所以说整体的效率会比较低
- 增量复制(当主从机进行连接之后,主机添加数据,从机这时候进行添加立理解)
127.0.0.1:6379> set k6 master
OK
127.0.0.1:6379>
127.0.0.1:6380> get k6
"master"
127.0.0.1:6380>
-
如果每次网络中断了之后,都进行全量复制,那么这样的过程效率就显得非常的低了,所以说在redis2.8之后就进行了更新复制模式,增加了增量复制,这个模式是在主从机断开连接之后,首先会检查主机中循环缓冲区的数据,如果存在数据差异,就将数据传递到替换缓冲区中,这样就可以在从机中传输增加它所增加的数据了,当然这类也是短时间的复制,如断开时间过长,缓冲区进行了覆盖,还是会导致全量复制,所以说一般都会把其中的循环缓冲区的大小设置大一点,这样全量复制的概率就会小一点
-
还有就是数据丢失性问题,如果一个从机与主机发生连接中断,这里从从机角度出发,就是无法连接到主机,但是这个时候从机还是存在数据的,这个就是单机存在数据的问题,这个时候从机重新启动后,就不会收到曾经的主机影响了,这个时候从机就是一个主机
但是如果是主机进行中断,然后进行重连,这个时候从机还是对应的从机,连接之后对于数据还是会进行重新同步操作的
主-从-从
- 主从复制的另外一种模式操作理解
- 主-从-从(这种模式是类似于链表一样,一个接一个,但是最好理解为树形,只是索引结构是一致的)
这种模式我的理解,就是将主从部分耦合度继续进行解耦操作,主机读写进行一种资源的分配,写进行同步理解操作,减少了主机多个从机连接的形式,也是大大增加了效率,这里用树形结构来理解是比较简便的
127.0.0.1:6380> info replication
# Replication
role: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_read_repl_offset:56
slave_repl_offset:56
slave_priority:100
slave_read_only:1
replica_announced:1
connected_slaves:1
slave0:ip=127.0.0.1,port=6381,state=online,offset=56,lag=1
master_failover_state:no-failover
master_replid:c5189160d788bc11e8c1e260ac3652f69da28d1e
master_replid2:0000000000000000000000000000000000000000
master_repl_offset:56
second_repl_offset:-1
repl_backlog_active:1
repl_backlog_size:1048576
repl_backlog_first_byte_offset:15
repl_backlog_histlen:42
-
当主机宕机后,链接的从机设置为主机(手动配置)
- 指令:SLAVEOF NO ONE(将当前的从机设置为主机)
- 显然更换权限之后具备了主机的性质
127.0.0.1:6380> SLAVEOF no one OK 127.0.0.1:6380> info replication # Replication role:master connected_slaves:1 slave0:ip=127.0.0.1,port=6381,state=online,offset=1822,lag=0 master_failover_state:no-failover master_replid:d07c48c64be8c957192eaf437d3a9765b657ca46 master_replid2:c5189160d788bc11e8c1e260ac3652f69da28d1e master_repl_offset:1822 second_repl_offset:1823 repl_backlog_active:1 repl_backlog_size:1048576 repl_backlog_first_byte_offset:15 repl_backlog_histlen:1808 127.0.0.1:6380> keys * 1) "kaputo" 2) "k2" 3) "k3" 4) "k1" 5) "k4" 6) "k6" 127.0.0.1:6380> set tochange thebestguy OK
-
哨兵模式(自动设置)
资料来源 : https://pdai.tech/md/db/nosql-redis/db-redis-x-copy.html
我是一个爱生活的程序员,欢迎大家关注我的频道:)