Redis入门(四)--- 主从复制,哨兵机制

Redis入门(四)--- 主从复制,哨兵机制,第1张

Redis入门(四)--- 主从复制,哨兵机制

文章目录
  • 10、Redis主从复制
    • 10.1 主从复制简介
      • 10.1.1 是什么
      • 10.1.2 能干啥
    • 10.2 主从复制相关配置
      • 10.2.1 配置文件修改
      • 10.2.2 复制三个配置文件
      • 10.2.3 启动三台redis服务器
      • 10.2.4 查看三台主机的运行情况
      • 10.2.5 配从不配主
    • 10.3 主从复制常用三招
      • 10.3.1 一主两仆
      • 10.3.2 薪火相传
      • 10.3.3 反客为主
    • 10.4 Redis主从复制原理
      • 总结:
    • 10.5 哨兵机制(sentinel)
      • 10.5.1 怎么玩
      • 10.5.2 主机挂掉选举新主机
      • 10.5.3 复制延时
      • 10.5.4 故障恢复
      • 10.5.5 程序实现

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以读为主

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

slave-priority 10

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

10.2.3 启动三台redis服务器

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

reids-cli -p 6379
reids-cli -p 6380
reids-cli -p 6381
10.2.4 查看三台主机的运行情况

info replication打印主从复制关系

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

10.2.5 配从不配主
slaveof  #成为某个实例的从机
  • 在6380和6381上执行: slaveof 127.0.0.1 6379:

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

    在从机上写就会报错

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

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

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

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

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

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

注意:

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

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

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

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)

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

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

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

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

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

    redis-sentinel /myredis/sentinel.conf

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

10.5.2 主机挂掉选举新主机

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

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

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

10.5.3 复制延时

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

10.5.4 故障恢复

  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 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();
     	}
}

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/zaji/5672899.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-12-16
下一篇 2022-12-16

发表评论

登录后才能评论

评论列表(0条)

保存