Redis-主从复制详解

尽管Redis服务器性能很好,但是对于一些热门网站(比如淘宝双十一的时候),就会有成千上万的用户进入主页,同时也伴随着大量的读操作到达Redis服务器,触发一系列操作,每当这个时候,单靠一台Redis服务器,显示是满足不了需求的。
为了分担读的压力,Redis支持主从复制,很好的解决了这个问题

1、概念

主从复制,主机数据更新后根据配置和策略,自动同步到备机的master/slaver机制,Master以写为主,Slave以读为主。数据的复制是单向的,只能由主服务器到从服务器。

互联网系统一般是以主从架构为基础的,所谓主从架构设计的思路大概是:

  • 在多台数据服务器中,只有一台主服务器,而主服务器只负责写入数据,不负责让外部程序读取数据。
  • 存在多台从服务器,从服务器不写入数据,只负责同步主服务器的数据,并让外部程序读取数据。
  • 主服务器在写入数据后,即刻将写入数据的命令发送给从服务器,从而使得主从数据同步。
  • 应用程序可以随机读取某一台从服务器的数据,这样就分摊了读数据的压力。
  • 当从服务器不能工作的时候,整个系统将不受影响;当主服务器不能工作的时候,可以方便地从从服务器中选举一台来当主服务器。

通过主从复制,我们就可以随机的从服务器上读数据,从而大大降低了主服务器的压力,提高系统的性能,当主服务器正常关闭的时候,从服务器也可以待机,要是主服务器非正常关闭的话,也可以切换为其中的一台从服务器代替原来的主服务器,(作为灾备)以保证系统继续正常稳定运行,所以也有利于系统运行的安全性。

2、(个人练习)配置从服务器:
从服务器配置文件:

1、include引入主配置文件 (include可以将公共的配置放入到一个公共的配置文件中,然后通过子配置文件引入父配置)
2、开启daemonize yes (主配置文件开启了 可以不用配置)
3、Pid文件名字pidfile (redis的进程文件)
4、指定从服务器Port
5、Log文件名字 (可以不用设置)
6、Dump.rdb名字dbfilename
7、Appendonly 关闭或者更换名字 (可以在主服务器配置文件中关闭或者更改,毕竟include都引入了主配文件)
(核心一步-8)
8、在从服务器的配置文件设置 slaveof < master-ip > < master-port > (这里也可以在登录redis-cli以后用 slaveof命令,不过命令是临时的,后文会提及)
.

配置完成以后如图(可不同):
在这里插入图片描述

2、命令:
1、info replication (获取 主/从 服务器的详细信息)

127.0.0.1:6379> info replication   //获取服务器的详细信息
# Replication
role:master    //当前角色 : 主服务器
connected_slaves:0  //连接的从服务器的个数
master_repl_offset:0  //是复制流中的一个偏移量,master处理完写入命令后,会把命令的字节长度做累加记录,统计在该字段。该字段也是实现部分复制的关键字段。
repl_backlog_active:0
repl_backlog_size:1048576
repl_backlog_first_byte_offset:0
repl_backlog_histlen:0

2、slaveof [ master-ip ] [ master-port ] 设置从服务器 (临时的,永久的必须通过 redis.conf 里面的 slaveof设置)

127.0.0.1:6380> slaveof 127.0.0.1 6379  //将此服务器设置成端口号为6379的从服务器

3、主从复制切入点问题:

1、不管什么时候给主服务器配置了一台从服务器,该从服务器都包含有主服务器的全部数据,包括从服务器shutdown以后重连都照样会有主服务器的全部数据

2、从机不能set ,只能read

3、主机shutdown以后,从机原地待命

4、主机shutdown以后,重连以后,主机新增记录,从机还能顺利复制

二、主从复制之薪火相传

1、概念

上一个Slave可以是下一个slave的Master,Slave同样可以接收其他slaves的连接和同步请求,那么该slave作为了链条中下一个的master,可以有效减轻master的写压力

缺点:

  • 中途变更转向:会清除之前的数据,重新建立拷贝最新的

  • 风险是一旦slave发生宕机,重新建立拷贝最新的

声明:

  • slaveof < new m-ip > < new m-host > 从机可以使用此命令声明另一个从机为预备主机,主机一旦宕机,预备从机执行 slaveof no one 命令成为主机

反客为主

  • slaveof no one 使当前数据库停止与其他数据库的同步,转成主数据库

注意
1、主机存活时候,从机只可以读取数据不能写数据
2、主机宕机后,预备主机任然不能写数据,需要预备主机使用slaveof no one命令之后,才可以写数据

二、主从复制之哨兵模式

1、概念

反客为主的自动版,能够后台监控主机是否故障,如果故障了根据投票数自动将从库转换为主库

2、使用步骤(一般为,一主二从三哨兵模式)

1、自定义目录(这里为 /myRedis/)下新建sentinel.conf文件,名字绝不能错
.
2、配置哨兵,填写内容 sentinel monitor mymaster(被监控数据库名字(自己写) ) 127.0.0.1 6379 1(投票个数,0为无)
.
3、启动哨兵 redis-sentinel /myRedis/sentinel.conf

启动哨兵以后,可以手动的将master服务器关闭,哨兵模式作用下会在从服务器种重新选出新的master服务器

选择规则:

1、所有在线的slave中选择优先级最高的,优先级可以通过slave-priority配置。
.
2、如果有多个最高优先级的slave,则选取复制偏移量最大(即复制越完整)的当选。
.
3、如果以上条件都一样,选取runid最小的slave。

也可以手动指定从服务器作为的主服务器
步骤:
1、将主配置文件里面的 slave-priority 100 复制到想要设置的从服务器配置文件中去
在这里插入图片描述
2、将slave-priority 的值改小(靠前一点,高一点) 比如 slave-priority 1

总结:

哨兵模式启动后,主服务器关闭,将从主服务器的从服务器中选择一个从服务器当作新的主服务器,挑选出来以后,sentinel向原主服务器的 从服务器发送 slaveof 新主服务器的命令,复制新的master,当线下的原主服务器上线后,sentinel会向其发送slaveof让其成为新主服务器的从服务器

四、主从复制的作用

  1. 数据冗余:主从复制实现了数据的热备份,是持久化之外的一种数据冗余方式。

  2. 故障恢复:当主节点出现问题时,可以由从节点提供服务,实现快速的故障恢复;实际上是一种服务的冗余。

  3. 负载均衡:在主从复制的基础上,配合读写分离,可以由主节点提供写服务,由从节点提供读服务(即写 Redis 数据时应用连接主节点,读 Redis 数据时应用连接从节点),分担服务器负载;尤其是在写少读多的场景下,通过多个从节点分担读负载,可以大大提高 Redis 服务器的并发量。

  4. 读写分离:可以用于实现读写分离,主库写、从库读,读写分离不仅可以提高服务器的负载能力,同时可根据需求的变化,改变从库的数量;

  5. 高可用基石:除了上述作用以外,主从复制还是哨兵和集群能够实施的基础,

因此说主从复制是 Redis 高可用的基础。

五、主从复制原理浅析

  • 从服务器连接主服务器,发送SYNC命令;
  • 主服务器接收到SYNC命名后,开始执行BGSAVE命令生成RDB文件并使用缓冲区记录此后执行的所有写命令;
  • 主服务器BGSAVE执行完后,向所有从服务器发送RDB(快照)文件,并在发送期间继续记录被执行的写命令;
  • 从服务器收到快照文件后丢弃所有旧数据,载入收到的快照;
  • 主服务器快照发送完毕后开始向从服务器发送缓冲区中的写命令;
  • 从服务器完成对快照的载入,开始接收命令请求,并执行来自主服务器缓冲区的写命令;
Logo

为开发者提供学习成长、分享交流、生态实践、资源工具等服务,帮助开发者快速成长。

更多推荐