IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 大数据 -> Redis入门(四)--- 主从复制,哨兵机制 -> 正文阅读

[大数据]Redis入门(四)--- 主从复制,哨兵机制

Redis笔记:

  1. Redis入门(一)— 五种基本数据类型
  2. Redis入门(二)— redis新增数据类型,jedis操作redis,springboot整合redis
  3. Redis入门(三)— 可视化工具,发布订阅,事务管理,持久化RDB,AOF基本概念

10、Redis主从复制

10.1 主从复制简介

10.1.1 是什么

主机数据更新后根据配置和策略, 自动同步到备机的master/slaver机制

Master以写为主,Slave以读为主

image-20211215231820117

10.1.2 能干啥

  • 读写分离,性能扩展

  • 容灾快速恢复

10.2 主从复制相关配置

10.2.1 配置文件修改

拷贝多个redis.conf文件include(写绝对路径)

开启daemonize yes

Pid文件名字pidfile

指定端口port

Log文件名字

dump.rdb名字dbfilename

Appendonly 关掉或者换名字

10.2.2 复制三个配置文件

redis6379.conf/redis6380.conf/redis6381.conf

include /myredis/redis.conf
pidfile /var/run/redis_6379.pid
port 6379
dbfilename dump6379.rdb

image-20211215234514613

image-20211215234523696

image-20211215234529333

slave-priority 10

设置从机的优先级,值越小,优先级越高,用于选举主机时使用。默认100

10.2.3 启动三台redis服务器

image-20211216093808497

image-20211216093818281

打开三个终端,分别连接上三个主机

reids-cli -p 6379
reids-cli -p 6380
reids-cli -p 6381

10.2.4 查看三台主机的运行情况

info replication打印主从复制关系

image-20211216093905579

可以发现,启动的三个主机默认为主机master,需要手动配置主从关系

10.2.5 配从不配主

slaveof <ip><port> #成为某个实例的从机
  • 在6380和6381上执行: slaveof 127.0.0.1 6379:

    image-20211216094415466

  • 主机上可以写可以读;从机上只能读,不能写

    在从机上写就会报错

    image-20211216094623714

  • 主机和从机挂掉怎么办?

    • 主机挂断:重启就行,一切如初
    • 从机挂掉:需要重新设置:slaveof 127.0.0.1 6379,或者可以直接加入到配置文件中永久生效

10.3 主从复制常用三招

10.3.1 一主两仆

image-20211216095209348

  • 当其中一个从机挂掉时,主机这时候写入数据,另一个从机能读取到新增的数据。这时候挂掉的从机恢复能否读到数据?

    • 能读到。从机会向主机发出同步信号,复制主机的内容,原理在后面细说
  • 当主机挂掉时:

    • 从机不会谋取篡位,还是作为主机的从机存在
    • 当主机再次连接上时,恢复原状态,从机能顺利进行复制

10.3.2 薪火相传

image-20211216100352174 image-20211216100539807

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

注意:

  • 中途变更转向:会清除之前的数据,重新建立拷贝最新的
  • 风险:一旦某个slave宕机,后面的slave都没法备份
  • 主机挂了,从机还是从机,无法写数据了

10.3.3 反客为主

使用命令slaveof no one升级为主机

当一个master宕机后,后面的slave可以立刻升为master,其后面的slave不用做任何修改。

image-20211216100659945

10.4 Redis主从复制原理

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

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

  3. 正常运行时,主机有写操作,从机进行增量同步

  4. 中途如果有shutdown的情况,重新连接上之后

    • 全量同步:
      master服务器会开启一个后台进程用于将redis中的数据生成一个rdb文件,与此同时,服务器会缓存所有接收到的来自客户端的写命令(包含增、删、改),当后台保存进程处理完后,会将该rdb文件传递给slave服务器,而slave服务器会将rdb文件保存在磁盘并通过读取该文件将数据加载到内存,在此之后master服务器会将在此期间缓存的命令通过redis传输协议发送给slave服务器,然后slave服务器将这些命令依次作用于自己本地的数据集上最终达到数据的一致性。

    • 部分同步:
      从redis 2.8版本以前,并不支持部分同步,当主从服务器之间的连接断掉之后,master服务器和slave服务器之间都是进行全量数据同步,但是从redis 2.8开始,即使主从连接中途断掉,也不需要进行全量同步,因为从这个版本开始融入了部分同步的概念。部分同步的实现依赖于在master服务器内存中给每个slave服务器维护了一份同步日志和同步标识,每个slave服务器在跟master服务器进行同步时都会携带自己的同步标识和上次同步的最后位置。当主从连接断掉之后,slave服务器隔断时间(默认1s)主动尝试和master服务器进行连接,如果从服务器携带的偏移量标识还在master服务器上的同步备份日志中,那么就从slave发送的偏移量开始继续上次的同步操作,**如果slave发送的偏移量已经不再master的同步备份日志中(可能由于主从之间断掉的时间比较长或者在断掉的短暂时间内master服务器接收到大量的写操作),则必须进行一次全量更新。**在部分同步过程中,master会将本地记录的同步备份日志中记录的指令依次发送给slave服务器从而达到数据一致

总结:

第一次连接的时候采用全量复制

正常运行时,主机有写操作,从机进行增量同步

之后中途断掉了,在2.8版本后,如果断掉短暂的时间就采用部分同步,复制偏移量和写操作;如果断掉时间太长,则采用全量复制

10.5 哨兵机制(sentinel)

哨兵机制:反客为主的自动版。能够检测主机是否故障,如果故障了根据投票数自动将从库转换为主库

image-20211216102022822

10.5.1 怎么玩

  1. 首先设置为一主二仆模式,6379==》6380、6381

    image-20211216111134579

  2. 在/myredis目录下新建sentinel.conf文件

  3. 配置哨兵sentinel monitor mymaster 127.0.0.1 6379 1

    • mymaster为监控对象起的服务器名称
    • 1 表示从机哨兵中只要有一个同意就进行主机切换
  4. 启动哨兵

    redis-sentinel /myredis/sentinel.conf

    可以看到哨兵也有一个端口26379

    image-20211216112951765

10.5.2 主机挂掉选举新主机

(大概10秒左右可以看到哨兵窗口日志,切换了新的主机)。哪个从机会被选举为主机呢?

根据优先级别:replica-priority num ,优先级num低的优先级高

原主机重启后会变为从机。

image-20211216113352715

10.5.3 复制延时

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

10.5.4 故障恢复

image-20211216113454690

  1. 优先级在redis.conf中默认:slave-priority 100,值越小优先级越高,相同则看偏移量
  2. 偏移量是指和主机同步率最高的有限选择,相同则看runid
  3. 每个redis实例启动后都会随机生成一个40位的runid,选择最小的

10.5.5 程序实现

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();
     	}
}
  大数据 最新文章
实现Kafka至少消费一次
亚马逊云科技:还在苦于ETL?Zero ETL的时代
初探MapReduce
【SpringBoot框架篇】32.基于注解+redis实现
Elasticsearch:如何减少 Elasticsearch 集
Go redis操作
Redis面试题
专题五 Redis高并发场景
基于GBase8s和Calcite的多数据源查询
Redis——底层数据结构原理
上一篇文章      下一篇文章      查看所有文章
加:2021-12-18 16:03:48  更:2021-12-18 16:06:06 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/24 12:46:39-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码