Redis哨兵模式搭建

Redis主从复制搭建

Redis虽然拥有非常高的性能,但是在实际的生产环境中,使用单机模式还是会产生不少问题的,比如说容易出现

单机故障,容量瓶颈,以及QPS瓶颈等问题。通常环境下,主从复制哨兵模式Redis Cluster是3种比较常见

的解决方案,本文将通过实例演示如何搭建Redis主从复制环境,并对其原理进行分析。

1、搭建主从复制

1、创建3个目录redis8000redis8001redis8002目录下。

将默认配置文件redis.conf拷贝到redis8000下,将redis8000指定为主机,修改以下参数:

bind 0.0.0.0
port 8000
pidfile /var/run/redis_8000.pid
logfile "redis8000.log"
dbfilename dump8000.rdb
dir /home/hydra/files/redis/slave/redis8000/
requirepass 123456
daemonize yes
masterauth 123456

2、将修改后的redis.conf文件拷贝到redis8001redis8002目录下,然后进行修改:

bind 0.0.0.0
port 8001
pidfile /var/run/redis_8001.pid
logfile "redis8001.log"
dbfilename dump8001.rdb
dir /home/hydra/files/redis/slave/redis8001/
# replicaof 127.0.0.1 8000
slaveof 127.0.0.1 8000
requirepass 123456
masterauth 123456
# 从机开启aof持久化
appendonly yes
daemonize yes
bind 0.0.0.0
port 8002
pidfile /var/run/redis_8002.pid
logfile "redis8002.log"
dbfilename dump8002.rdb
dir /home/hydra/files/redis/slave/redis8002/
# replicaof 127.0.0.1 8000
slaveof 127.0.0.1 8000
requirepass 123456
masterauth 123456
# 从机开启aof持久化
appendonly yes
daemonize yes

3、分别启动3个redis实例

./redis-5.0.4/src/redis-server  ./slave/redis8000/redis.conf
./redis-5.0.4/src/redis-server  ./slave/redis8001/redis.conf
./redis-5.0.4/src/redis-server  ./slave/redis8002/redis.conf

查看进程,启动成功:

在这里插入图片描述

4、通过redis客户端连接主机redis8000

./redis-5.0.4/src/redis-cli  -p 8000 -a 123456

登录成功后,使用指令查看主从架构:

info replication

在这里插入图片描述

可以看出,主机8000拥有两台从机,从机8001和8002连接成功。

5、通过redis客户端连接从机redis80001,同样通过指令查看主从状态:

在这里插入图片描述

可以看出8001的角色为slave从机,并且可以查看主机8001的相关信息。

6、此外,还可以通过指令的模式动态分配主从。复制一个redis8000的配置文件至redis8003下,修改端口为

8003,其他配置不做改动。

bind 0.0.0.0
port 8003
pidfile /var/run/redis_8003.pid
logfile "redis8003.log"
dbfilename dump8003.rdb
dir /home/hydra/files/redis/slave/redis8003/
requirepass 123456
daemonize yes

使用redis客户端登录8003后,输入指令指定主机:

slaveof 127.0.0.1 8000

动态指定主机后,如果主机设置了密码,还需要通过指令配置主机密码:

config set masterauth 123456

配置完成后,查看8003从机状态:

在这里插入图片描述

查看8000主机状态:

在这里插入图片描述

新添加的从机8003已经被添加到8000的从机当中。

需要注意的是,使用命令动态指定的主从状态,在从机重启后会失效。

首先使用kill命令杀死8003进程,然后查看主从状态:

在这里插入图片描述

可以发现,现在从机只剩下两台,为80018002

然后重启8003并再次查看状态:
在这里插入图片描述

仍然为80018002两台从机,证明了指令指定主从在重启后会失效。

7、进行读写测试,首先测试主机,读写均能正常:
在这里插入图片描述

测试从机,发现可以正常读数据,但是写数据失败:

在这里插入图片描述

这是因为在主从复制的架构下,只有主机能够写数据,从机为只读模式,这是在配置文件中指定的。在Redis2.6版

本以后,默认从机为只读模式:

replica-read-only yes

需要注意这里不能将这个配置改为no,因为主机不会监听到从机的写数据事件,因而造成主从数据的不一致。

二、全量复制

用于初次复制或其它无法进行部分复制的情况,将主节点中的所有数据都发送给从节点。

当数据量过大的时候,会造成很大的网络开销,流程如下:
在这里插入图片描述

1、从机发送:

psync ? -1

这里的 “?” 是因为从机暂时不知道主机的runId, -1代表全量复制

2、主机发送指令,把自己的runid和offset传给从机:

fullresync{runid,offset}

可以通过命令查看这两个参数:

#可以查看runid
info server 
#可以查看offset
info replication

从机之后会上报自己的偏移量offset给主机,当主机的offset和从机的offset不一样时,说明数据不一致。

3、从机保存主机数据:

save master info

4、主机执行bgsave,全量复制会触发rdb持久化。

bgsave

主机在生成rdb文件时,可能会有新的数据写入。这时redis把新写入的数据写入一个缓冲区repl_back_buffer,默

认大小1M。可以通过repl-backlog-size设置缓冲区大小

5、主机发送rdb给从机:

send rdb

6、主机发送缓冲区数据给从机:

send buffer

7、从机把从机本身上的数据清空:

flush old data

8、从机加载主机发送过来的rdb和buffer数据:

load rdb&buffer

在全量复制中,消耗的时间包括:

  • 执行bgsave进行持久化的时间

  • rdb文件网络传输时间

  • 从节点请求请求数据时间

  • 从机加载rdb的时间

  • 如果从节点开启了aof持久化,可能进行aof重写的时间

三、部分复制

部分复制主要是Redis针对全量复制过高的开销进行的一种优化措施。Redis 希望能够在主机出现抖动或连接断开

的时候,可以通过部分复制机制将损失降低到最低。

在这里插入图片描述

具体流程如下:

1、出现网络抖动,连接断开 connection lost

2、主机继续写复制缓冲区repl_back_buffer

3、从机继续尝试连接主机

4、从机slave 会把自己当前 runid 和偏移量传输给主机 master,并且执行 pysnc 命令同步

5、如果 master 发现偏移量是在缓冲区的范围内,就会返回 continue 命令

6、同步了 offset 的部分数据,所以部分复制的基础就是偏移量 offset。

那么在正常的情况下,Redis是如何决定全量复制还是部分复制的呢?从机将自己的offset发送给主机后,主机

根据offset和缓冲区大小决定能否执行部分复制:

  • 如果offset偏移量之后的数据,仍然都在复制积压缓冲区里,则执行部分复制

  • 如果offset偏移量之后的数据已不在复制积压缓冲区中,则执行全量复制

四、主从复制架构缺点

1、由于所有的写操作都是先在主机上操作,然后同步更新到从机上,所以同步过程有一定的延迟,当系统很繁忙

的时候,延迟问题会更加严重。从机数量增加时,会使这个问题更加严重。

2、当主机宕机之后,将不能进行写操作,需要手动将从机升级为主机,从机需要重新指定主机。

手动在一台从机上执行下面命令,将它升级为主机:

slave of no one

再在其他从机上执行slave of指令,将自身变成新主机的从机:

slave of 192.168.0.1 port

可以看出这种情况下,当主机宕机后,后续的修复流程由人工操作,非常麻烦,因此在这种情况下Redis引入了哨

兵模式,来完成主机宕机后的自动故障转移。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/69754.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

React构建的JS优化思路

背景 之前个人博客搭建时,发现页面加载要5s才能完成并显示 问题 React生成的JS有1.4M,对于个人博客服务器的带宽来说,压力较大,因此耗费了5S的时间 优化思路 解决React生成的JS大小,因为我用的是react-router-dom…

git强推覆盖其他项目分支

git强推分支,覆盖其他分支; 操作: 下载branch-1.3代码; $ git clone gitlabgitlab.zte.net:zte-dba-service/branch.git $ git remote add origin2 gitlabgitlab.zte.net:zte-service/branch.git $ git push origin2 master -f注…

华为网络篇 RIP路由手工汇总-27

难度2复杂度2 目录 一、实验原理 二、实验拓扑 三、实验步骤 四、实验过程 总结 一、实验原理 在网络规划过程中,我们避免不了使用VLSM技术,但是使用VLSM后会有一个问题,就是子网较多时会占用系统资源。我们可以使用路由汇总的方法&…

SystemVerilog中$timeformat的用法

在SystemVerilog中,输出信息显示时间时,经常会在输出信息格式中指定“%t”格式符,一般情况下“%t”输出的格式都是固定的,但是这样固定的输出显示的时间可能有时会让用户看起来感觉比较诧异,例如下面的示例。 【示例】…

@Param详解

文章目录 背景什么是ParamParam的使用方法使用方法:遇到的问题及因Param解决了什么问题使用与不使用对比 Param是如何进行映射的总结 背景 最近在开发过程中,在写mapper接口是在参数前加了Param注解,但是在运行的时候就会报错,说…

java.lang.NoClassDefFoundError: org/apache/tez/dag/api/TezConfiguration

错误: java.lang.NoClassDefFoundError: org/apache/tez/dag/api/TezConfigurationat org.apache.hadoop.hive.ql.exec.tez.TezSessionPoolSession$AbstractTriggerValidator.startTriggerValidator(TezSessionPoolSession.java:74)at org.apache.hadoop.hive.ql.e…

纷享销客位列“2023企业客户关系管理(CRM)服务TOP10”第一名

近日,《互联网周刊》&eNet研究院发布“2023企业客户关系管理(CRM)服务TOP10”榜单,纷享销客连接型CRM凭借出色的产品实力和服务实践,位居 CRM企业排名首位。 2023年,穿越周期,用数字化的力量重塑企业经营与增长的逻…

Steam 灵感的游戏卡悬停效果

先看效果&#xff1a; 再看代码&#xff08;查看更多&#xff09;&#xff1a; <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><title>Steam 灵感的游戏卡悬停效果</title><style>* {margin: …

使用Java服务器实现UDP消息的发送和接收(多线程)

目录 简介&#xff1a;1. 导入必要的库2. 创建服务器端代码3. 创建客户端代码4. 实现多线程处理5. 测试运行示例代码&#xff1a;函数说明服务器端代码说明&#xff1a;客户端代码说明&#xff1a; 总结&#xff1a; 简介&#xff1a; 在本篇博客中&#xff0c;我们将介绍如何…

【Apollo】阿波罗自动驾驶:塑造自动驾驶技术的未来

前言 Apollo (阿波罗)是一个开放的、完整的、安全的平台&#xff0c;将帮助汽车行业及自动驾驶领域的合作伙伴结合车辆和硬件系统&#xff0c;快速搭建一套属于自己的自动驾驶系统。 开放能力、共享资源、加速创新、持续共赢是 Apollo 开放平台的口号。百度把自己所拥有的强大、…

【网络编程·网络层】IP协议

目录 一、IP协议的概念 二、IP协议的报头 1、四位首部长度 2、16位总长度&#xff08;解包&#xff09; 3、8位协议&#xff08;分用&#xff09; 4、16位首部校验和 5、8位生存时间 6、32位源IP和32位目的IP 7、4位版本/8位服务类型 8、16位标识 9、3位标志 10、1…

excel 下载方法封装

1.首先需要拿到后端返回的URL下载地址 2.写个下载方法 // url 接口返回的下载地址。例如&#xff1a;https://cancer-research.oss-cn-beijing.aliyuncs.com/yuance-platform-permission/校内共享数据导入模板.xlsx // name 文件名称 例如&#xff1a; 校内共享数据导入模板 /…