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

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

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

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • lazarus研究–指针变量「建议收藏」

    lazarus研究–指针变量「建议收藏」指针变量定义:type st20=string[20];var vpi:^integer; //定义一个指向整型的指针变量vpst20:^st20;//定义一个指向自定义类型st20的指针变量 vp:POINTER;//定义一个指向POINTER类型(系统预定义的无类型指针)的指针变量。 v1,v2,v3:integer;指针变量的赋值:v1:=10;v2:=100;v3:=1000;st:st[20]=‘hello’;vp:=nil; //n.

    2025年6月2日
    0
  • 最短路径:Dijkstra算法(求单源最短路径)Floyd算法(求各顶点之间最短路径)[通俗易懂]

    最短路径:Dijkstra算法(求单源最短路径)Floyd算法(求各顶点之间最短路径)[通俗易懂]最短路径:在一个带权图中,顶点V0到图中任意一个顶点Vi的一条路径所经过边上的权值之和,定义为该路径的带权路径长度,把带权路径最短的那条路径称为最短路径。DiskStra算法:求单源最短路径,即求一个顶点到任意顶点的最短路径,其时间复杂度为O(V*V)如图所示:求顶点0到各顶点之间的最短路径代码实现:#include<stdio.h>#include&l…

    2022年6月22日
    30
  • linux下安装node&npm

    linux下安装node&npm#下载最新版nodewgethttps://nodejs.org/dist/v16.14.0/node-v16.14.0-linux-x64.tar.xz#解压tar-xvfnode-v16.14.0-linux-x64.tar.xz#配置软连接,使全局都可以使用node命令sudoln-s/opt/node-v16.14.0-linux-x64/bin/node/usr/bin/nodesudoln-s/opt/node-v16.14.0-linux-x64/bin/

    2022年8月30日
    2
  • idea git 合并分支到指定分支_idea合并分支到另一个分支

    idea git 合并分支到指定分支_idea合并分支到另一个分支ideagit的使用(四)git建立分支与合并分支作者:马育民 • 2017-11-1017:05 • 阅读:103571.为什么要建立分支git默认的主分支名字为master,一般团队开发时,都不会在master主分支上修改代码,而是建立新分支,测试完毕后,在将分支的代码合并到master主分支上。2.操作如下:2.1ideagit分支的操作ideagit的操作在右下角,如下图:说明…

    2022年9月1日
    4
  • VMware GSX Server 3.2.1 Build 19281免费下载

    VMware GSX Server 3.2.1 Build 19281免费下载

    2021年12月17日
    39
  • 开启1521端口监听_Oracle数据库常用命令、Linux监听配置、Oracle linux下开放1521端口…

    开启1521端口监听_Oracle数据库常用命令、Linux监听配置、Oracle linux下开放1521端口…一、Linux下Oracle数据库常用命令Oracle用户下执行:$sqlplussystem/manager@file.sql执行sql脚本文件$sqlplussystem/manager登录sqlplus,使用system用户$sqlplus/nolog以不连接数据库的方式启动sqlplus,启动数据时会用到$lsnrctlstatus/stop/startOrac…

    2022年6月7日
    43

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

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