Redis主从复制原理_数据库主从复制的原理

Redis主从复制原理_数据库主从复制的原理十八岁男孩爆肝Redis极品文章,必须三连奥里给爆赞

大家好,又见面了,我是你们的朋友全栈君。如果您正在找激活码,请点击查看最新教程,关注关注公众号 “全栈程序员社区” 获取激活教程,可能之前旧版本教程已经失效.最新Idea2022.1教程亲测有效,一键激活。

Jetbrains全系列IDE使用 1年只要46元 售后保障 童叟无欺

一、引言

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

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

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

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

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

二、集群在redis中的应用

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

* 主从模式

* Sentinel模式

* Cluster模式

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

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

三、主从复制的概念

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

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

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

五、具体操作主从复制

博主的Redis安装在了Linux上,使用的是Ubuntu。不懂得小伙伴可以(关注之后)私聊博主。
在这里插入图片描述

  • 拷贝多个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服务器在这里插入图片描述

  • 查看系统进程,看看三台服务器是否启动
    在这里插入图片描述

  • 查看三台主机运行情况
    info replication
    打印主从复制的相关信息
    在这里插入图片描述

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

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

(1)一主二仆

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

(2)薪火相传

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

(3)反客为主

  • 反客为主指一个master服务器同时挂2个salve服务器。当master宕机后,在2个slave服务器的哪一台服务器中执行slaveof no one 命令,哪一台服务器就会升级为master服务器。
    在这里插入图片描述

七、复制原理

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

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

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

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

  • 但是只要是重新连接master,一次完全同步(全量复制)将被自动执行
    在这里插入图片描述

八、哨兵模式!!!

有请今天主从复制的主角哨兵登场!!!
在这里插入图片描述

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

大家好我是哨兵,首先做一下自我介绍吧。
我是Redis大哥用于监控redis集群中Master主服务器工作状态的一个小兵。
在这里插入图片描述

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的监控目标会随之调换。
在这里插入图片描述

(2)哨兵的使用

那么到底怎么才能拥有我呢?
在我的Linux家中,这样才能拥有我。
在这里插入图片描述

  • 自定义的/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 

在这里插入图片描述

(3)新主登基

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

(4)复制延时

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

(5)故障恢复

在这里插入图片描述
优先级在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中的主从复制博主也只能整理到这里拉,如果有什么建议或者批评可以饲料博主,动动你们发财的小手给博主三连一波。。。
在这里插入图片描述

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

发布者:全栈程序员-用户IM,转载请注明出处:https://javaforall.cn/170319.html原文链接:https://javaforall.cn

【正版授权,激活自己账号】: Jetbrains全家桶Ide使用,1年售后保障,每天仅需1毛

【官方授权 正版激活】: 官方授权 正版激活 支持Jetbrains家族下所有IDE 使用个人JB账号...

(0)
blank

相关推荐

  • MySQL 添加索引,删除索引及其用法[通俗易懂]

    MySQL 添加索引,删除索引及其用法[通俗易懂]原文:https://www.cnblogs.com/zz-tt/p/6609828.html一.索引的作用一般的应用系统,读写比例在10:1左右,而且插入操作和一般的更新操作很少出现性能问题,遇到最多的,也是最容易出问题的,还是一些复杂的查询操作,所以查询语句的优化显然是重中之重。在数据量和访问量不大的情况下,mysql访问是非常快的,是否加索引对访问影响…

  • XML格式化的一段代码

    XML格式化的一段代码起因没有找到android有相关的工具类,又不要为了格式化个xml导入一个jar包。于是自己写了个xml格式化的代码。代码如下:/***格式化xml**@return*/publicStringformat(Stringstr){StringBufferbuffer=…

  • hashmap线程安全吗 什么解决方案_hashtable为什么是线程安全

    hashmap线程安全吗 什么解决方案_hashtable为什么是线程安全前言该试题从互联网获得,真实性没有考究,加上本人学识浅薄,所以面试题参考为主,解析分享为主。若对解析有不同看法,还请评论指正。谢谢。HashMap为什么不是线程安全?以JDK1.8的HashMap为例,引用作者:一字马胡所写文章中的一张图:上图为…

  • 零基础学Java(2)数据类型与变量

    零基础学Java(2)数据类型与变量前言Java是一种强类型语言。这就意味着必须为每一个变量声明一种类型。在Java中,一共8种基本类型,其中有4种整型、2种浮点型、1种字符串类型char(用于表示Unicode编码的代码单元)和1种

  • 舍去法取整php,floor舍去法取整「建议收藏」

    舍去法取整php,floor舍去法取整「建议收藏」初识App安全性测试目前手机App测试还是以发现bug为主,主要测试流程就是服务器接口测试,客户端功能性覆盖,以及自动化配合的性能,适配,压测等,对于App安全性测试貌似没有系统全面统一的标准和流程,其实安全性bug也可…【ASP&period;NETIdentity系列教程(三)】Identity高级技术注:本文是[ASP.NETIdentity系列教程]的第三篇.本系列教程详…

  • oracle 导出12154,EXPDP导出时报错ORA-12154

    oracle 导出12154,EXPDP导出时报错ORA-12154一、问题描述做数据迁移时报错ORA-12154[[emailprotected]~]$expdpzrd/[emailprotected]directory=DATA_PUMP_DIRdumpfile=20180314TJJbak.dmplogfile=20180314TJJbak.logschemas=TJJExport:Release11.2.0.4.0-Product…

发表回复

您的电子邮箱地址不会被公开。

关注全栈程序员社区公众号