14、Redis_主从复制

news2024/11/26 18:26:52

文章目录

  • 14、Redis_主从复制
    • 14.1 是什么
    • 14.2. 能干嘛
    • 14.3 怎么玩:主从复制
      • 14.3.1 新建redis6379.conf,填写以下内容
      • 14.3.2 新建redis6380.conf,填写以下内容
      • 14.3.3 新建redis6381.conf,填写以下内容
      • 14.3.4 启动三台redis服务器
      • 14.3.5 查看系统进程,看看三台服务器是否启动
      • 14.3.6 查看三台主机运行情况
      • 14.3.7 配从(库)不配主(库)
    • 14.4 常用3招
      • 14.4.1 一主二仆
      • 14.4.2 薪火相传
      • 14.4.3 反客为主
    • 14.5 复制原理
    • 14.6 哨兵模式(sentinel)
      • 14.6.1 是什么
      • 14.6.2 怎么玩(使用步骤)
        • 14.6.2.1 调整为一主二仆模式,6379带着6380、6381
        • 14.6.2.2 自定义的/myredis目录下新建sentinel.conf文件,名字绝不能错
        • 14.6.2.3 配置哨兵,填写内容
        • 14.6.2.4 启动哨兵
        • 14.6.2.5 当主机挂掉,从机选举中产生新的主机
        • 14.6.2.6 复制延时
      • 14.6.3 故障恢复
      • 14.6.4 主从复制


Redis 6 入门到精通-讲师:王泽

世态炎凉,世界并不善良

14、Redis_主从复制

14.1 是什么

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

14.2. 能干嘛

  • 读写分离,性能扩展
  • 容灾快速恢复
    在这里插入图片描述

14.3 怎么玩:主从复制

  1. 创建/myredis文件夹
[root@centos7-101 /]# mkdir myredis
  1. 拷贝redis.conf文件到myredis文件夹中
[root@centos7-101 /]# cp /etc/redis.conf  /myredis/redis.conf
  1. 创建三个配置文件(因为在一个linux系统中搭建一主两从,使用三个不同端口号的redis服务器)
[root@centos7-101 myredis]# pwd
/myredis
[root@centos7-101 myredis]# touch redis6379.conf
[root@centos7-101 myredis]# touch redis6380.conf
[root@centos7-101 myredis]# touch redis6381.conf

  1. 在三个配置文件中写入配置
  • 引入redis.conf配置
  • Appendonly 关掉或者换名字
  • dump.rdb名字dbfilename
  • 开启daemonize yes
  • Pid文件名字pidfile
  • 指定端口port
  • Log文件名字
  1. 启动三台数据库,查看运行状态,在从机上执行slaveof 主机ip 主机端口号

14.3.1 新建redis6379.conf,填写以下内容

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

14.3.2 新建redis6380.conf,填写以下内容

include /myredis/redis.conf
pidfile /var/run/redis_6380.pid
port 6380
dbfilename dump6380.rdb

14.3.3 新建redis6381.conf,填写以下内容

include /myredis/redis.conf
pidfile /var/run/redis_6381.pid
port 6381
dbfilename dump6381.rdb

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

14.3.4 启动三台redis服务器

[root@centos7-101 myredis]# redis-server redis6379.conf 
[root@centos7-101 myredis]# redis-server redis6380.conf 
[root@centos7-101 myredis]# redis-server redis6381.conf

14.3.5 查看系统进程,看看三台服务器是否启动

[root@centos7-101 myredis]# ps -ef | grep redis
root     107054      1  0 23:34 ?        00:00:00 redis-server *:6379
root     107068      1  0 23:34 ?        00:00:00 redis-server *:6380
root     107074      1  0 23:34 ?        00:00:00 redis-server *:6381
root     107090  73361  0 23:35 pts/0    00:00:00 grep --color=auto redis

14.3.6 查看三台主机运行情况

info replication
打印主从复制的相关信息

6379

[root@centos7-101 myredis]# redis-cli -p 6379
127.0.0.1:6379> info replication
# Replication
role:master
connected_slaves:0
master_failover_state:no-failover
master_replid:ad7cb70bb899d3dfb813909c239ea827bbe840be
master_replid2:0000000000000000000000000000000000000000
master_repl_offset:0
second_repl_offset:-1
repl_backlog_active:0
repl_backlog_size:1048576
repl_backlog_first_byte_offset:0
repl_backlog_histlen:0
127.0.0.1:6379> 

6380

[root@centos7-101 ~]# redis-cli -p 6380
127.0.0.1:6380> info replication
# Replication
role:master
connected_slaves:0
master_failover_state:no-failover
master_replid:e801e60cb638bd98d37d210c127c00eec84f12d7
master_replid2:0000000000000000000000000000000000000000
master_repl_offset:0
second_repl_offset:-1
repl_backlog_active:0
repl_backlog_size:1048576
repl_backlog_first_byte_offset:0
repl_backlog_histlen:0
127.0.0.1:6380> 

6381

[root@centos7-101 ~]# redis-cli -p 6381
127.0.0.1:6381> info replication
# Replication
role:master
connected_slaves:0
master_failover_state:no-failover
master_replid:35831824ecb0bc9aacef9132542f43fc24c42d0b
master_replid2:0000000000000000000000000000000000000000
master_repl_offset:0
second_repl_offset:-1
repl_backlog_active:0
repl_backlog_size:1048576
repl_backlog_first_byte_offset:0
repl_backlog_histlen:0
127.0.0.1:6381> 

14.3.7 配从(库)不配主(库)

slaveof <ip><port>
成为某个实例的从服务器
1、在6380和6381上执行: slaveof 127.0.0.1 6379

6379

127.0.0.1:6379> info replication
# Replication
role:master
connected_slaves:2
slave0:ip=127.0.0.1,port=6380,state=online,offset=154,lag=0
slave1:ip=127.0.0.1,port=6381,state=online,offset=154,lag=1
master_failover_state:no-failover
master_replid:b98bf5d9dfe960932b8fa5465cbe3752ed5748e5
master_replid2:0000000000000000000000000000000000000000
master_repl_offset:154
second_repl_offset:-1
repl_backlog_active:1
repl_backlog_size:1048576
repl_backlog_first_byte_offset:1
repl_backlog_histlen:154
127.0.0.1:6379> 

6380

127.0.0.1:6380> slaveof 127.0.0.1 6379
OK
127.0.0.1:6380> info replication
# Replication
role:slave
master_host:127.0.0.1
master_port:6379
master_link_status:up
master_last_io_seconds_ago:4
master_sync_in_progress:0
slave_read_repl_offset:0
slave_repl_offset:0
slave_priority:100
slave_read_only:1
replica_announced:1
connected_slaves:0
master_failover_state:no-failover
master_replid:b98bf5d9dfe960932b8fa5465cbe3752ed5748e5
master_replid2:0000000000000000000000000000000000000000
master_repl_offset:0
second_repl_offset:-1
repl_backlog_active:1
repl_backlog_size:1048576
repl_backlog_first_byte_offset:1
repl_backlog_histlen:0
127.0.0.1:6380> 

6381

127.0.0.1:6381> slaveof 127.0.0.1 6379
OK
127.0.0.1:6381> info replication
# Replication
role:slave
master_host:127.0.0.1
master_port:6379
master_link_status:up
master_last_io_seconds_ago:3
master_sync_in_progress:0
slave_read_repl_offset:28
slave_repl_offset:28
slave_priority:100
slave_read_only:1
replica_announced:1
connected_slaves:0
master_failover_state:no-failover
master_replid:b98bf5d9dfe960932b8fa5465cbe3752ed5748e5
master_replid2:0000000000000000000000000000000000000000
master_repl_offset:28
second_repl_offset:-1
repl_backlog_active:1
repl_backlog_size:1048576
repl_backlog_first_byte_offset:29
repl_backlog_histlen:0
127.0.0.1:6381> 

2、在主机上写,在从机上可以读取数据
在从机上写数据报错

127.0.0.1:6380> set k1 v1
(error) READONLY You can't write against a read only replica.

3、主机挂掉,重启就行,一切如初
4、从机重启需重设:

slaveof 127.0.0.1 6379
可以将配置增加到文件中,永久生效。

[root@centos7-101 ~]# redis-server redis6380.conf
[root@centos7-101 ~]# redis-cli -p 6380
127.0.0.1:6380> slaveof 127.0.0.1 6379
OK
127.0.0.1:6380> info replication
# Replication
role:slave
master_host:127.0.0.1
master_port:6379
master_link_status:up
master_last_io_seconds_ago:4
master_sync_in_progress:0
slave_read_repl_offset:630
slave_repl_offset:630
slave_priority:100
slave_read_only:1
replica_announced:1
connected_slaves:0
master_failover_state:no-failover
master_replid:b98bf5d9dfe960932b8fa5465cbe3752ed5748e5
master_replid2:0000000000000000000000000000000000000000
master_repl_offset:630
second_repl_offset:-1
repl_backlog_active:1
repl_backlog_size:1048576
repl_backlog_first_byte_offset:1
repl_backlog_histlen:630

14.4 常用3招

14.4.1 一主二仆

切入点问题?slave1、slave2是从头开始复制还是从切入点开始复制?
答:从机会从头开始复制,与主机保持一致。

比如从机加入进来,新添加k4键进来,那之前的k1,k2,k3是否也可以复制?
答:可以,无论从机何时添加,主机从机内容一致。

从机是否可以写?set可否?
答:不可。

主机shutdown后情况如何?
答:主机永远是主机,从机永远是从机,不会切换。

从机是上位还是原地待命?
答:原地待命。

主机又回来了后,主机新增记录,从机还能否顺利复制?
答:可以顺利复制。

其中一台从机down后情况如何?依照原有它能跟上大部队吗?
答:down后重新启动,重新链接主机(slaveof 127.0.0.1 6379),就可以

在这里插入图片描述

14.4.2 薪火相传

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

用 slaveof <ip><port>

中途变更转向:会清除之前的数据,重新建立拷贝最新的

风险是一旦某个slave宕机,后面的slave都没法备份

主机挂了,从机还是从机,无法写数据了

在这里插入图片描述
主机:6379
从机:6380
从机:6381
将6381作为6380的从机,这样6379的从机只有一台。

127.0.0.1:6381> slaveof 127.0.0.1 6380
OK
127.0.0.1:6381> info replication
# Replication
role:slave # 还是从机
master_host:127.0.0.1
master_port:6380 # 主机变成6380了
master_link_status:up
master_last_io_seconds_ago:9
master_sync_in_progress:0
slave_read_repl_offset:85120
slave_repl_offset:85120
slave_priority:100
slave_read_only:1
replica_announced:1
connected_slaves:0
master_failover_state:no-failover
master_replid:b98bf5d9dfe960932b8fa5465cbe3752ed5748e5
master_replid2:0000000000000000000000000000000000000000
master_repl_offset:85120
second_repl_offset:-1
repl_backlog_active:1
repl_backlog_size:1048576
repl_backlog_first_byte_offset:29
repl_backlog_histlen:85092
127.0.0.1:6379> info replication
# Replication
role:master
connected_slaves:1 # 从机只有一台,就是6380
slave0:ip=127.0.0.1,port=6380,state=online,offset=85456,lag=1
master_failover_state:no-failover
master_replid:b98bf5d9dfe960932b8fa5465cbe3752ed5748e5
master_replid2:0000000000000000000000000000000000000000
master_repl_offset:85456
second_repl_offset:-1
repl_backlog_active:1
repl_backlog_size:1048576
repl_backlog_first_byte_offset:1
repl_backlog_histlen:85456

14.4.3 反客为主

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

用 slaveof no one 将从机变为主机。
在这里插入图片描述

14.5 复制原理

  • Slave启动成功连接到master后会发送一个sync命令(要进行数据同步)。
  • Master接到命令启动后台的存盘进程(主服务器数据进行持久化),同时收集所有接收到的用于修改数据集命令, 在后台进程执行完毕之后,master将传送整个数据文件(RDB文件)到slave,以完成一次完全同步。
  • 全量复制:而slave服务在接收到数据库文件数据后,将其存盘并加载到内存中。
  • 增量复制:Master继续将新的所有收集到的修改命令依次传给slave,完成同步。
  • 但是只要是重新连接master,一次完全同步(全量复制)将被自动执行。
    在这里插入图片描述

14.6 哨兵模式(sentinel)

14.6.1 是什么

反客为主的自动版,能够后台监控主机是否故障,如果故障了根据投票数自动将从库转换为主库
在这里插入图片描述

14.6.2 怎么玩(使用步骤)

14.6.2.1 调整为一主二仆模式,6379带着6380、6381

关闭redis,在重新启动,重新链接,调整为一主二仆模式。

在这里插入图片描述

14.6.2.2 自定义的/myredis目录下新建sentinel.conf文件,名字绝不能错

创建+编辑

[root@centos7-101 ~]# cd /myredis
[root@centos7-101 myredis]# touch sentinel.conf
[root@centos7-101 myredis]# vim sentinel.conf 

14.6.2.3 配置哨兵,填写内容

编辑内容

sentinel monitor mymaster 127.0.0.1 6379 1
# 哨兵		监控	主机	主机地址			1指主机挂了,需要至少有1个从机同意,才能提升主机。

其中mymaster为监控对象起的服务器名称, 1 为至少有多少个哨兵同意迁移的数量

14.6.2.4 启动哨兵

redis-benchmark所在位置/usr/local/bin
在这里插入图片描述
监控主机6379,主机有两个从机6380和6381

redis做压测可以用自带的redis-benchmark工具

执行redis-sentinel /myredis/sentinel.conf
在这里插入图片描述

14.6.2.5 当主机挂掉,从机选举中产生新的主机

(大概10秒左右可以看到哨兵窗口日志,切换了新的主机)

哪个从机会被选举为主机呢?
根据优先级别:slave-priority 。

原主机重启后会变为从机
在这里插入图片描述

14.6.2.6 复制延时

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

14.6.3 故障恢复

在这里插入图片描述

优先级在redis.conf中默认:replica-priority 100,值越小优先级越高。

偏移量是指获得原主机数据最全的。

每个redis实例启动后都会随机生成一个40位的runid。

14.6.4 主从复制

private static JedisSentinelPool jedisSentinelPool=null;

public static  Jedis getJedisFromSentinel(){
	if(jedisSentinelPool==null){
	    Set<String> sentinelSet=new HashSet<>();
	    sentinelSet.add("192.168.0.101: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://www.coloradmin.cn/o/88842.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

java项目_第173期ssm高校二手交易平台_计算机毕业设计

java项目_第173期ssm高校二手交易平台_计算机毕业设计 【源码请到下载专栏下载】 今天分享的项目是《ssm高校二手交易平台》 该项目分为2个角色&#xff0c;管理员和用户。 用户可以浏览前台商品&#xff0c;并且进行购买商品&#xff0c;并在 个人后台查看自己的订单、查看商品…

DPDK源码分析之DPDK技术简介

Cache和内存技术 1. Cache一致性 多核处理器同时访问同一段cacheline时&#xff0c;会出现写回冲突的情况&#xff0c;操作系统解决这个问题会消耗一部分性能&#xff0c;DPDK采用了两个技术来解决这个问题&#xff1a; 对于共享的数据&#xff0c;每个核都定义自己的备份lc…

区块链学习2-合约开发

概述 智能合约本质上是运行在某种环境&#xff08;例如虚拟机&#xff09;中的一段代码逻辑。 长安链的智能合约是运行在长安链上的一组“动态代码”&#xff0c;类似于Fabric的chaincode&#xff0c;Fabric的智能合约称为链码&#xff08;chaincode&#xff09;&#xff0c;…

对氯间二甲苯酚在活性污泥发酵过程中重塑ARGs的机制类别

2022年8月&#xff0c;凌恩生物客户河海大学罗景阳教授团队在《Science of the Total Environment》期刊上发表研究论文“Para-chloro-meta-xylenol reshaped the fates of antibiotic resistance genes during sludge fermentation: Insights of cell membrane permeability, …

ChatGPT技术解构

ChatGPT的训练主要分为三个步骤&#xff0c;如图所示&#xff1a; Step1&#xff1a; 使用有监督学习方式&#xff0c;基于GPT3.5微调训练一个初始模型&#xff1b;训练数据约为2w~3w量级&#xff08;根据InstructGPT的训练数据量级估算&#xff0c;参照https://arxiv.org/pdf…

【内网安全-防火墙】防火墙、协议、策略

目录 一、基础知识 1、防火墙五个域 2、协议模型 二、出入站策略 1、单个机器防火墙 2、域控的防火墙 3、安全策略 一、基础知识 1、防火墙五个域 1、Untrust(不信任域&#xff0c;低级安全区域): 用来定义Internet等不安全的网络&#xff0c;用于网络入口线的接入 ——…

沁恒 CH32V003J4M6 开发测试

一、概述 具体看图&#xff0c;SOP8价格在0.6R&#xff0c;TSSOP20价格在0.7R&#xff0c;优势太大了 二、开发准备 通过原厂可以拿到样片&#xff0c;目前我拿到这颗是SOP8&#xff0c;另外官方淘宝可以买到TSSOP20的测试板&#xff0c;也带样片购买WCHLINK&#xff0c;TB…

Mysql 进阶(面向面试篇)锁

全局锁、表级锁&#xff08;表锁、元数据锁、意向锁&#xff08;意向共享锁、意向排它锁&#xff09;&#xff09;、行级锁&#xff08;行锁&#xff08;共享锁、排它锁&#xff09;、间隙锁、临键锁&#xff09; 表级锁&#xff08;表锁&#xff08;表锁分为&#xff1a;表共…

仅差一步!如何缩短加入购物车与成单的距离?

不知不觉&#xff0c;2022年已接近尾声&#xff0c;经历了卡塔尔世界杯、黑色星期五等跨境电商狂欢节后&#xff0c;不少跨境电商卖家都在开展复盘行动&#xff0c;为接下来的圣诞节运营计划打下扎实基础。时常关注跨境电商行业的人都知道&#xff0c;衡量跨境电商广告效率的关…

Python函数、类和对象、流程控制语句if-else while的讲解及演示(图文解释 附源码)

一、函数 函数是完成某个功能的代码段&#xff0c;可被其他代码调用&#xff0c;调用的代码可以将数据传递给函数&#xff0c;函数可将对数据的处理结果返回给调用代码。 def mysubt( a, b 0 ): # 定义一个自己的减法函数&#xff0c;第二个参数为默认值为0的默认参数c a -…

2023年湖北报考施工员要多少钱?甘建二告诉您

2023年湖北报考施工员要多少钱&#xff1f;甘建二告诉您 2023年湖北报考施工员要多少钱&#xff0c;甘建二告诉您 2023年武汉报考施工员要多少钱&#xff0c;甘建二告诉您 2023年黄冈报考施工员要多少钱&#xff0c;甘建二告诉您 2023年黄石报考施工员要多少钱&#xff0c;甘…

HBase Java API 开发:批量操作 第3关:批量导入数据至HBase

每一次只添加一个数据显然不像是大数据开发&#xff0c;在开发项目的时候也肯定会涉及到大量的数据操作。 使用Java进行批量数据操作&#xff0c;其实就是循环的在Put对象中添加数据最后在通过Table对象提交。 如何进行批量操作呢&#xff0c;讲到批量操作&#xff0c;相信大…

秋招必备!阿里产出的高并发+JVM豪华套餐送给你,绝对硬核干货

**3、设计了方案&#xff0c;但细节掌握不透彻&#xff1a;**讲不出方案要关注的技术点和可能带来的消极影响。比如读性能有瓶颈会引入缓存&#xff0c;但是忽视了缓存命中率、数据一致性、热点key等问题。 面对马上就要到来的双十一的秒杀环节&#xff0c;你是否已经有备无患…

[附源码]Node.js计算机毕业设计高校第二课堂管理系统Express

项目运行 环境配置&#xff1a; Node.js最新版 Vscode Mysql5.7 HBuilderXNavicat11Vue。 项目技术&#xff1a; Express框架 Node.js Vue 等等组成&#xff0c;B/S模式 Vscode管理前后端分离等等。 环境需要 1.运行环境&#xff1a;最好是Nodejs最新版&#xff0c;我…

数据结构为何重要(《数据结构与算法图解》by 杰伊•温格罗)

本文内容借鉴一本我非常喜欢的书——《数据结构与算法图解》。学习之余&#xff0c;我决定把这本书精彩的部分摘录出来与大家分享。 基础数据结构&#xff1a;数组 数组是计算机科学中最基本的数据结构之一。如果你用过数组&#xff0c;那么应该知道它就是一个含有 数据的列表…

免费U盘文件恢复,你不知道的10款u盘恢复软件

U盘是我们在工作和生活中经常使用的移动存储设备。在操作U盘时&#xff0c;里面重要的文件可能会因为疏忽而被删除。通过电脑回收站、备份等方法都不能恢复U盘里面的数据&#xff0c;我们该怎么办&#xff1f;其实U盘删除的文件在删除后不会被完全删除&#xff0c;通过u盘恢复软…

以太网 STP、RSTP、MSTP基础配置、STP生成树安全保障操作命令介绍

2.13.0 以太网 STP、RSTP、MSTP配置、生成树安全保障操作 主要参考&#xff1a;华为S2750, S5700, S6700 V200R005(C00&C01&C02&C03) 产品文档 《命令手册》 MSTP快速生成树STP配置RSTP配置MSTP配置生成树的安全保障操作&#xff08;1&#xff09;根桥保护&#xf…

jdk1.8下载与安装教程(win11)

一、JDK下载 1.首先在Oracle官网上下载jdk1.8 打开官网&#xff1a;https://www.oracle.com/ 2.选择Developer Services的Java 3.选择Oracle JDK 4.选择Java8 Window点击&#xff1a; jdk-8u351-windows-x64.exe下载 5.接受Oracle Java SE的Oracle技术网络许可协议 …

Folate-PEG-DBCO,DBCO-PEG- FA,叶酸聚乙二醇环辛炔

●中文名&#xff1a;叶酸聚乙二醇环辛炔&#xff0c;叶酸聚乙二醇二苯基环辛炔&#xff0c;DBCO-PEG-叶酸 ●英文名&#xff1a;FA-PEG-DBCO &#xff0c; Folate-PEG-DBCO&#xff0c;DBCO-PEG- FA&#xff0c;DBCO-PEG-Folate&#xff0c;DBCO-PEG- Folic acid ●外观以及…

游戏合作伙伴专题:BreederDAO 与 SuperGaming 建立 SuperCharged 合作伙伴关系

BreederDAO 很高兴地宣布与 SuperGaming 建立合作伙伴关系&#xff0c;SuperGaming 是一家充满激情的游戏工作室&#xff0c;希望通过 Tower Conquest&#xff1a;Metaverse Edition 进军 Web 3 行业&#xff0c;这是一款基于 Polygon 区块链的免费多人塔防游戏。 征服新领域 S…