Redis 单机模式很简单,相关测试水文看这里

Redis5 压力测试结果反馈报告

必须的,今天接着写水文,写一写现在redis 支持的三种集群,主从模式,哨兵模式,Cluster模式,今天先搞主从模式

主从模式

主从模式是最简单的集群模式,其实就是复制基本只能解决读写分离问题,主机服务器一旦宕机基本完蛋,不具备高可用

基本上redis的性能瓶劲主要在于网络IO和内存主频上面,单机版Redis在不考虑高可用的情况下基本满足80%的项目需要,因为单机版Redis可以实现10W/S的请求,除非缓存K-V值过大,通过读写分离缓存网卡的压力,否则这个并发处理能力可以应对大部分项目。

几乎所有的主从模式都是从服务器只提供只读不写的功能,否则会出现数据不一致的情况,现在无论那种数据库都不支持双向同步。

屁话少说,上配置代码,主服务器不需要配置,只需简单一句代码配置从服务器即可,声明主服务器是谁,余下的redis会自行交流。

slaveof 192.168.3.143 6379

一主多从

主服务器:192.168.3.143
从服务器:192.168.3.144
从服务器:192.168.3.145 从服务器 redis.conf 配置文件加入
slaveof 192.168.3.143 6379

  

一主多从(链式结构),所谓链式结构就是可以从服务器同步从服务器

主服务器:192.168.3.143
从服务器:192.168.3.144
从服务器:192.168.3.145 从服务器 redis.conf 配置文件加入
slaveof 192.168.3.143 6379
从服务器:192.168.3.147 
从服务器 redis.conf 配置文件加入
slaveof 192.168.3.144 6379

尝试一下程序上来实现读写分离,Net Core 使用StackExchange.Redis 进行访问Redis集群,其它组件自己研究吧

//声明服务器地址,StackExchange会自己认别那个是主从关系
ConfigurationOptions option = new ConfigurationOptions();
option.EndPoints.Add("192.168.3.143", 6379);
option.EndPoints.Add("192.168.3.144", 6379);
option.EndPoints.Add("192.168.3.145", 6379);
option.EndPoints.Add("192.168.3.147", 6379);
ConnectionMultiplexer redis = ConnectionMultiplexer.Connect(option); IDatabase db = redis.GetDatabase();
db.StringSet("test", "testvalue", flags: CommandFlags.DemandMaster);//CommandFlags.DemandMaster 标明主服务器写入
string value = db.StringGet("test", flags: CommandFlags.DemandReplica);//CommandFlags.DemandReplica 标明从服务器读取
Console.WriteLine(value);

代码行得通,己经分别从主/从服务器读取到数据,接下来将是要测试,主服务器倒下来了,会是怎么样?如图:成功报错,恭喜某程序猿喜提系统异常一次

 

接下三张图片将展示依次关闭从服务器:192.168.3.147,192.168.3.145 ,192.168.3.144  最后一张图将意味着己关闭所有从服务器,所有从服务器己关闭,程序运行成功报错

  

接着测试一下,StackExchange.Redis 框架问题,而对三个从服务器是否能分流从不同的从服务器取值,从而减轻从服务器的压力

  

从监控的图片来,三张从服务器的图标显示,StackExchange.Redis的确平均的分流的请求的流量。

哨兵模式

哨兵模式基本就是主从模式的升级版,主要解决高可用问题,实现自动容错和恢复

简单理解就是主从模式一旦主机服务器宕机需要人工处理,这样一来你或者运维,得有一个睡不着,Redis引进哨兵模式的作用就是监控Redis服务是否正常运作,主服务器出现故障将自动将从服务器转换为主服务器。

理想状态下的配置架构如下:哨兵监控主从服务器,哨兵之间相互监控,组成哨兵组推荐三个哨兵以上并且最好独立部署,唯一能节省成本的好消息就是他们可以监控多个主服务器。

工作原理:

  1. 每个哨兵都会监控主/从服务器及其它哨兵。
  2. 当有一个哨兵检查主服务器下线(没有规定时间回复ping请求),会将主服务器标识为主观下线
  3. 当主服务器被标为主观下线,其它哨兵会马上检查主服务在线状态。
  4. 当足够的哨兵(超过配置数量)将它标识为主观下线,主服务器会变成客观下线,如果数量不够则主观下线状态会除移。
  5. 主服务器客观下线之后哨兵会从“从服务器”中选中一台服务器当主服务器。
  6. 哨兵将修改其它从服务器以及被修复旧主服务器的配置,将统一修改为从服务器并且修改它们的主服务器地址。

注意:每个哨兵配置不一样,每个哨兵根据自己的配置超时时间来判断主服务器是否主观下线只有符合就标为主观下线,每个哨兵根据自己设定的“肯定数量”来判断主服务器是否客观下线,只要有一个哨兵的配置达到客观下线该哨兵就会执行故障迁移操作。

从服务器选举原理:

  1. 首先发现客观下线的哨兵会发起一个选举请求,根据Raft算法,一般会成为领头哨头。
  2. 根据与主服务器的断开的时间判断
  3. 根据从服务器配置文件的权重(slave-priority)选举为主服务器
  4. 复制偏移,从主节点收到更多的新数据的节点会被选择
  5. 在所有条件相同的情况,选择runid最小的为主服务器

配置:只需要配置主数据库即可,哨兵会自动发现所有从数据库并进行监控,哨兵之间可以相互发现,只要确保端口放行就可以了,简单版配置简单到只有一句话

sentinel monitor <master-group-name> <ip> <port> <quorum>
sentinel monitor mymaster 127.0.0.1 6379 2 //示例
//监控一个叫做mymaster的主节点,地址是 127.0.0.1 端口号是6379,判断客观下线需要2个哨兵“肯定”
//当然还有一些其它较为重要的配置,可以手动设定
sentinel down-after-milliseconds mymaster 60000 //设定检查超时时间,超过这个时间将认定为主观下线,默认30秒

下面进一些场景测试以验证观点,虽然支持采用默认配置的方式来进行启动,我们还是使用配置文件的方式进行启动

//主服务器
bind 0.0.0.0
port 6379
daemonize yes //从服务器
bind 0.0.0.0
port 6379
daemonize yes
slaveof 192.168.3.40 6379

测试场景一:简单版测试,一主一从一哨兵,主服务器故障,能否自动将从服务器转换为主服务器

sentinel monitor mymaster 192.168.3.40 6379 1
sentinel down-after-milliseconds mymaster 5000//内网配置五秒就足够了
daemonize yes

成功运行

编写检查代码

    class Program
{
static void Main(string[] args)
{
//声明服务器地址,StackExchange会自己认别那个是主从关系
ConfigurationOptions option = new ConfigurationOptions();
option.EndPoints.Add("192.168.3.40", 6379);
option.EndPoints.Add("192.168.3.167", 6379);
ConnectionMultiplexer redis = ConnectionMultiplexer.Connect(option); IDatabase db = redis.GetDatabase();
db.StringSet("test", "testvalue");
DateTime exStartTime = DateTime.Now;
DateTime exEndTime;
bool isEX = false;
while (true)
{
try
{
var value = db.StringGet("test");
Console.WriteLine(value);
if (!value.HasValue && isEX!)
Console.WriteLine(value);
if (isEX && value.HasValue == true)
{
exEndTime = DateTime.Now;
Console.WriteLine($"连接成功,获取的值是:{value}");
break;
}
}
catch (Exception e)
{
if (isEX == false)
{
Console.WriteLine($"连接失败!{e.Message}");
exStartTime = DateTime.Now;
isEX = true;
}
}
}
Console.WriteLine($"连接异常时间{exStartTime},故障迁移成功时间{exEndTime},花费{(exEndTime - exStartTime).TotalSeconds}秒");
}
}

悄悄打开ESXI 把虚拟机的网线拔掉

果然成功报错,并且进行故障转移

这个时候,重新把网络设置回来,并且查看两个redis.conf的配置文件内容,发现配置己被改动,192.168.3.40 己由主服务器转变成从服务器,哨兵的配置也相应作了改变

  

测试场景二:一主三从一哨兵

//主服务器(192.168.3.40)
bind 0.0.0.0
port 6379
daemonize yes //从服务器(192.168.3.167)
bind 0.0.0.0
port 6379
daemonize yes
slaveof 192.168.3.40 6379 //从服务器(192.168.3.168)
bind 0.0.0.0
port 6379
daemonize yes
slaveof 192.168.3.40 6379 //从服务器(192.168.3.169)
bind 0.0.0.0
port 6379
daemonize yes
slaveof 192.168.3.40 6379

哨兵的配置依旧不变

//哨兵服务器(192.168.3.171)
sentinel monitor mymaster 192.168.3.40 6379 1
sentinel down-after-milliseconds mymaster 5000//内网配置五秒就足够了
daemonize yes

一顿操作猛如虎,断掉网络

成功切换,看看这四台服务器的配置都发现了什么变化吧

   

测试场景三:一主三从三哨兵

主从服务器的配置不变,哨兵的配置稍有变化,哨兵的服务器由一台增加到三台,分别是192.168.3.171,192.168.3.172,192.168.3.170,哨兵能相互发现和相互监控

sentinel monitor mymaster 192.168.3.40 6379 2 //裁仲服务器由1台变成2台
sentinel down-after-milliseconds mymaster 5000//内网配置五秒就足够了
daemonize yes

好了,准备就绪,故技重演,断网

查看一下四台Redis服务器配置发生什么变化

   

查看一下,三台哨兵的配置发生什么变化

  

就测到这里吧,下班了,明天大伙要是有兴趣,再捣鼓一下,Cluster模式,就是分布式集群,不知道有没有人看这些水文

Redis5.0 主从模式和高可用 搭建和测试报告的更多相关文章

  1. Redis(二)冰叔带你了解Redis-哨兵模式和高可用集群解析

    前言    Redis 的 主从复制 模式下,一旦 主节点 由于故障不能提供服务,需要手动将 从节点 晋升为 主节点,同时还要通知 客户端 更新 主节点地址,这种故障处理方式从一定程度上是无法接受的. ...

  2. [转帖]【MySQL+keepalived】用keepalived实现MySQL主主模式的高可用

    [MySQL+keepalived]用keepalived实现MySQL主主模式的高可用 https://www.jianshu.com/p/8694d07595bc 一.实验说明 MySQL主主模式 ...

  3. hadoop+zookeeper集群高可用搭建

                                                                  hadoop+zookeeper集群高可用搭建 Senerity 发布于 2 ...

  4. hadoop 集群HA高可用搭建以及问题解决方案

    hadoop 集群HA高可用搭建 目录大纲 1. hadoop HA原理 2. hadoop HA特点 3. Zookeeper 配置 4. 安装Hadoop集群 5. Hadoop HA配置 搭建环 ...

  5. CYQ.Data 支持分布式数据库(主从备)高可用及负载调试

    前言: 继上一篇,介绍 CYQ.Data 在分布式缓存上支持高可用,详见:CYQ.Data 对于分布式缓存Redis.MemCache高可用的改进及性能测试 本篇介绍 CYQ.Data 在对数据库层面 ...

  6. (七) Docker 部署 MySql8.0 一主一从 高可用集群

    参考并感谢 官方文档 https://hub.docker.com/_/mysql y0ngb1n https://www.jianshu.com/p/0439206e1f28 vito0319 ht ...

  7. Redis5.0+哨兵模式+Keepalived实现高可用

    Redis主备配置 原理: 从服务器向主服务器发出SYNC指令,当主服务器接到此命令后,就会调用BGSAVE指令来创建一个子进程专门进行数据持久化工作,也就是将主服务器的数据写入RDB文件中.在数据持 ...

  8. CentOS6下OpenLDAP+PhpLdapAdmin基本安装及主从/主主高可用模式部署记录

    下面测试的部署机ip地址为:192.168.10.2051)yum安装OpenLDAP [root@openldap-server ~]# yum install openldap openldap- ...

  9. 通过keepalived搭建MySQL双主模式的高可用集群系统

    1. 配置MySQL双主模式 1.修改my.cnf配置文件 默认情况下,MySQL的配置文件是/etc/my.cnf,在配置文件的[mysqld]段添加如下内容: server-id=1 log-bi ...

随机推荐

  1. 牛逼哄哄的PageHelper分页插件到底是怎么实现的?网友:给我10分钟,给你写一个~

    Hi,各位读者们 PageHelper是一款好用的开源免费的Mybatis第三方物理分页插件,其实我并不想加上好用两个字,但是为了表扬插件作者开源免费的崇高精神,我毫不犹豫的加上了好用一词作为赞美. ...

  2. Pypi项目包发布

    前言 用过python的人肯定对pip安装不陌生,pip安装的包的来源都是在Pypi上.为了能随时能使用自己的包,所以尝试一下将自己的包发布到Pypi上. 步骤 一.准备项目 一.创建目录结构 二.准 ...

  3. Linux root目录空间过小,加大空间

    1. 查看还有多少空间可以使用: df -h 这里可以看出来home的空间还很大,可以分配给root 2. 扩容根目录的思路如下: 将/home文件夹备份,删除/home文件系统所在的逻辑卷,增大/文 ...

  4. cheat.sh在手,天下我有

    前言 作为程序员需要了解的东西有很多,日常编码和写脚本脱离不开各式语言与 Linux 命令.为了记住一些杂乱的或不被经常使用的知识点,我们迫切需要一个"小抄"/备忘录,小抄内容多了 ...

  5. 败家玩意儿!Redis 竟然浪费了这么多内存!

    作为内存数据库,内存空间大小对于 Redis 来说是至关重要的.内存越多,意味着存储的数据也会越多.但是不知道你有没有遇到过这样的情况,明明空间很大,但是内存的使用却不是很理想. 为什么会出现这样的情 ...

  6. 如何有效恢复误删的HDFS文件

    HDFS是大数据领域比较知名的分布式存储系统,作为大数据相关从业人员,每天处理HDFS上的文件数据是常规操作.这就容易带来一个问题,实际操作中对重要数据文件的误删,那么如何恢复这些文件,就显得尤为重要 ...

  7. apply 、call 以及 bind 的使用和区别

    一.被apply和call调用的函数中没有传递参数 (一)不传参数 结果: (二)传递 null 结果: 总结: 1.当使用 apply和 call去调用函数并且没有传递参数时,前提这个函数中也没有传 ...

  8. Django----View.py

    ·首先先下载安装包· pip install djangorestframework==3.11.1 pip install django-filter==2.3.0 # 过滤器 pip instal ...

  9. ActiveMQ Cannot send, channel has already failed: tcp:127.0.0.1:8161

    仅针对如下错误内容: Cannot send, channel has already failed: tcp://127.0.0.1:8161 一种尝试解决,修改连接端口为 61616: tcp:/ ...

  10. 雪花算法 Java 版

    雪花算法根据时间戳生成有序的 64 bit 的 Long 类型的唯一 ID 各 bit 含义: 1 bit: 符号位,0 是正数 1 是负数, ID 为正数,所以恒取 0 41 bit: 时间差,我们 ...