Redis的主从复制原理

Redis中的主从复制

    • 一、引言
    • 二、集群在redis中的应用
    • 三、主从复制的概念
    • 四、主从复制到底能干啥?
    • 五、具体操作主从复制
    • 六、主从复制常用的三个方法
      • (1)一主二仆
      • (2)薪火相传
      • (3)反客为主
    • 七、复制原理
    • 八、哨兵模式!!!
      • (1)哨兵同学的自我介绍:
      • (2)哨兵的使用
      • (3)新主登基
      • (4)复制延时
      • (5)故障恢复
      • (6)在客户端使用主从复制

一、引言

当我们在学习分布式系统的过程中,可能会遇到很多类似集群的案例,例如在Hadoop生态圈中集群就是广泛应用的,因为可以对硬件的低要求。但是集群是什么呢?
Redis的主从复制原理_第1张图片

集群(cluster)就是一组计算机,他们作为一个整体向用户提供一组网络资源,这些单个的计算机系统就是集群的节点(node)。
(一) 可扩展性。集群的性能不限于单一的服务实体,新的服务实体可以动态的加入到集群,从而增强集群的性能。

(二) 高可用性。集群通过服务实体冗余使客户端免于轻易遭遇到“out of service”警告。当一台节点服务器发生故障的时候,这台服务器上所运行的应用程序将在另一节点服务器上被自动接管。消除单点故障对于增强数据可用性、可达性和可靠性是非常重要的。

(三) 负载均衡。负载均衡能把任务比较均匀的分布到集群环境下的计算和网络资源,以便提高数据吞吐量。

(四) 错误恢复。如果集群中的某一台服务器由于故障或者维护需要而无法使用,资源和应用程序将转移到可用的集群节点上。这种由于某个节点中的资源不能工作,另一个可用节点中的资源能够透明的接管并继续完成任务的过程叫做错误恢复。

二、集群在redis中的应用

Redis有三种集群模式,分别是:

* 主从模式

* Sentinel模式

* Cluster模式

三种模式各不相同,在Redis集群中,假设有上千万、上亿的用户来同时访问Redis(详情看博主的上一个博客解决Redis中的超时超卖问题)QPS达到了10万+。这些请求过来,单机Redis就直接挂掉了。所以早期秒杀系统的瓶颈就出现在Redis单机问题上。
Redis的主从复制原理_第2张图片

所以此时我们就可以通过主从复制来解决上述问题,实现系统的高并发。在Linux中可以使用ab工具来模拟系统的高并发环境并且进行测试。

三、主从复制的概念

主机数据更新后根据配置和策略, 自动同步到备机的master/slaver机制,Master以写为主,Slave以读为主。
主从复制:是指将一台Redis服务的数据,复制到其他Redis服务器上。前者称为主节点(master),后者称为从节点(slave)。数据的复制是单向的,只能从主节点到从节点。
默认情况下,每一台Redis服务都是主节点,一个主节点可以有多个从节点(也可以没有),但一个从节点只能有一个主节点。

四、主从复制到底能干啥?

1,数据冗余,实现数据的热备份,这也是持久化实现的另一种方式。
2,针对单机故障问题,一个节点故障,其他节点可以提供服务,不影响用户使用。实现了快速恢复故障,这也是服务冗余。
3,读写分离,master服务主要用来写,slave服务主要用来读数据。可以提高服务器的负载能力,可以根据需求的变化,添加从节点的数量。
4,负载均衡,同时配合读写分离,由主节点提供写服务,从节点提供读服务,分担服务器的负载。在写少读多的情况下,通过多个从节点分担读负载,能够大大提高Redis服务的并发量和负载。
5,高可用的基石,主从复制是哨兵和集群模式能够实施的基础。
Redis的主从复制原理_第3张图片

五、具体操作主从复制

博主的Redis安装在了Linux上,使用的是Ubuntu。不懂得小伙伴可以(关注之后)私聊博主。
Redis的主从复制原理_第4张图片

  • 拷贝多个Redis.conf文件include(写绝对路径)
    开启daemonize yes
    Pid文件名字pidfile
    指定端口port
    Log文件名字
    dump.rdb名字dbfilename
    Appendonly 关掉或者换名字

  • 新建redis6379.conf,填写以下内容
    include /myredis/redis.conf
    pidfile /var/run/redis_6379.pid
    port 6379
    dbfilename dump6379.rdb
    在这里插入图片描述

  • 新建redis6380.conf,填写以下内容
    在这里插入图片描述

  • 新建redis6381.conf,填写以下内容
    在这里插入图片描述
    slave-priority 10
    设置从机的优先级,值越小,优先级越高,用于选举主机时使用。默认100

  • 启动三台redis服务器在这里插入图片描述

  • 查看系统进程,看看三台服务器是否启动
    Redis的主从复制原理_第5张图片

  • 查看三台主机运行情况
    info replication
    打印主从复制的相关信息
    Redis的主从复制原理_第6张图片

  • 配从(库)不配主(库)
    slaveof
    成为某个实例的从服务器
    1、在6380和6381上执行: slaveof 127.0.0.1 6379
    Redis的主从复制原理_第7张图片
    2、在主机上写,在从机上可以读取数据
    在从机上写数据报错
    在这里插入图片描述
    3、主机挂掉,重启就行,一切如初
    4、从机重启需重设:slaveof 127.0.0.1 6379
    可以将配置增加到文件中。永久生效。
    Redis的主从复制原理_第8张图片

六、主从复制常用的三个方法

(1)一主二仆

  • 什么是一主二仆?
    在主机宕机后,从机将默认会继续等待主机上线;设置从机的主机时,可以在从机的配置文件中进行修改,也可以在从机启动的客户端进行修改,主机的配置文件不需做修改。
    以下用6379端口做主机,6380端口做从机并在配置文件中指定主机,6381端口做从机并在客户端指定主机。
    Redis的主从复制原理_第9张图片

(2)薪火相传

  • 薪火相传是指上一个slave(从服务器)可以是下一个slave的master(主服务器),slave同样可以接受其他的salve的连接和同步请求,那么该slave作为了链条中的下一个master,可以有效减轻master的写压力,去中心化减低风险。但是也产生了另一个风险:一旦某个slave出现意外停止运行后,以这台slave为主的其他slave都无法保存数据。
    Redis的主从复制原理_第10张图片
    Redis的主从复制原理_第11张图片

(3)反客为主

  • 反客为主指一个master服务器同时挂2个salve服务器。当master宕机后,在2个slave服务器的哪一台服务器中执行slaveof no one 命令,哪一台服务器就会升级为master服务器。
    Redis的主从复制原理_第12张图片

七、复制原理

  • Slave启动成功连接到master后会发送一个sync命令

  • Master接到命令启动后台的存盘进程,同时收集所有接收到的用于修改数据集命令,在后台进程执行完毕之后,master将传送整个数据文件到slave,以完成一次完全同步

  • 全量复制:而slave服务在接收到数据库文件数据后,将其存盘并加载到内存中。

  • 增量复制:Master继续将新的所有收集到的修改命令依次传给slave,完成同步

  • 但是只要是重新连接master,一次完全同步(全量复制)将被自动执行
    Redis的主从复制原理_第13张图片

八、哨兵模式!!!

有请今天主从复制的主角哨兵登场!!!
Redis的主从复制原理_第14张图片

(1)哨兵同学的自我介绍:

大家好我是哨兵,首先做一下自我介绍吧。
我是Redis大哥用于监控redis集群中Master主服务器工作状态的一个小兵。
Redis的主从复制原理_第15张图片

1.我在Master主服务器发生故障的时候,可以实现Master和Slave服务器的切换,保证系统的高可用(HA)其已经被集成在redis2.6+的版本中,我在Redis大哥2.8岁之后就稳定了下来。

2.我到底是干嘛的呢??

监控(Monitoring):我会不断地检查你的Master和Slave是否运作正常。

提醒(Notification):当被监控的某个Redis节点出现问题时, 我可以通过 API 向管理员或者其他应用程序发送通知。

3.自动故障迁移(Automatic failover):当一个Master不能正常工作时,我会开始一次自动故障迁移操作。

我会将失效Master的其中一个Slave升级为新的Master, 并让失效Master的其他Slave改为复制新的Master;

当客户端试图连接失效的Master时,集群也会向客户端返回新Master的地址,使得集群可以使用现在的Master替换失效Master。

Master和Slave服务器切换后,Master的redis.conf、Slave的redis.conf和sentinel.conf的配置文件的内容都会发生相应的改变,即,Master主服务器的redis.conf配置文件中会多一行slaveof的配置,sentinel.conf的监控目标会随之调换。
Redis的主从复制原理_第16张图片

(2)哨兵的使用

那么到底怎么才能拥有我呢?
在我的Linux家中,这样才能拥有我。
Redis的主从复制原理_第17张图片

  • 自定义的/myredis目录下新建sentinel.conf文件,名字绝不能错
    配置哨兵,填写内容
sentinel monitor mymaster 127.0.0.1 6379 1
其中mymaster为监控对象起的服务器名称, 1 为至少有多少个哨兵同意迁移的数量。
  • 启动哨兵
/usr/local/bin
redis做压测可以用自带的redis-benchmark工具
执行redis-sentinel  /myredis/sentinel.conf 

Redis的主从复制原理_第18张图片

(3)新主登基

当主机挂掉,从机选举中产生新的主机
(大概10秒左右可以看到哨兵窗口日志,切换了新的主机)
哪个从机会被选举为主机呢?根据优先级别:slave-priority
原主机重启后会变为从机。
Redis的主从复制原理_第19张图片

(4)复制延时

由于所有的写操作都是先在Master上操作,然后同步更新到Slave上,所以从Master同步到Slave机器有一定的延迟,当系统很繁忙的时候,延迟问题会更加严重,Slave机器数量的增加也会使这个问题更加严重。

(5)故障恢复

Redis的主从复制原理_第20张图片
优先级在redis.conf中默认:slave-priority 100,值越小优先级越高
偏移量是指获得原主机数据最全的
每个redis实例启动后都会随机生成一个40位的runid。

(6)在客户端使用主从复制

private static JedisSentinelPool jedisSentinelPool=null;

public static  Jedis getJedisFromSentinel(){
			if(jedisSentinelPool==null){
            	Set<String> sentinelSet=new HashSet<>();
            	sentinelSet.add("192.168.11.103:26379");
            	JedisPoolConfig jedisPoolConfig =new JedisPoolConfig();
            	jedisPoolConfig.setMaxTotal(10); //最大可用连接数
				jedisPoolConfig.setMaxIdle(5); //最大闲置连接数
				jedisPoolConfig.setMinIdle(5); //最小闲置连接数
				jedisPoolConfig.setBlockWhenExhausted(true); //连接耗尽是否等待
				jedisPoolConfig.setMaxWaitMillis(2000); //等待时间
				jedisPoolConfig.setTestOnBorrow(true); //取连接的时候进行一下测试 ping pong
				
				jedisSentinelPool=new JedisSentinelPool("mymaster",sentinelSet,jedisPoolConfig);
				return jedisSentinelPool.getResource();
        }else{
			return jedisSentinelPool.getResource();
        }
}

最后关于Redis中的主从复制博主也只能整理到这里拉,如果有什么建议或者批评可以饲料博主,动动你们发财的小手给博主三连一波。。。
Redis的主从复制原理_第21张图片

你可能感兴趣的:(redis,java,数据库,springboot)