Redis 实战搭建高可用架构

前言:最近在看关于redis缓存方面的知识,今天就来个 Redis sentinel 高可用架构,实战开始之前,先看看sentinel的概念

什么是redis-sentinel

  Redis-Sentinel是Redis官方推荐的高可用性(HA)解决方案,当用Redis做Master-slave的高可用方案时,假如master宕机了,Redis本身(包括它的很多客户端)都没有实现自动进行主备切换,而Redis-sentinel本身也是一个独立运行的进程,它能监控多个master-slave集群,发现master宕机后能进行自动切换。

为什么使用sentinel服务

  redis的普通主从模式中,当主数据库遇到异常中断服务后,开发者可以通过手动的方式选择一个从数据库来升格为主数据库,以使得系统能够继续提供服务。然而整个过程相对麻烦且需要人工介入,难以实现自动化。 为此,Redis 2.8开始提供了哨兵工具来实现自动化的系统监控和故障恢复功能。 哨兵的作用就是监控redis主、从数据库是否正常运行,主出现故障自动将从数据库转换为主数据库。

一、首先实现主从复制(一主多从)

说明:如果这台服务器出现硬盘故障等问题,也会导致数据丢失。为了避免单点故障,通常的做法是将数据库复制多个副本以部署在不同的服务器上,这样即使有一台服务器出现故障,其他服务器依然可以继续提供服务。    为此, Redis 提供了复制(replication)功能,可以实现当一台数据库中的数据更新后,自动将更新的数据同步到其他数据库上。

这里,我们把redis.conf作为master,slave_1.conf和slave_2.conf为从

  1、找到redis.conf,复制出2份(我只有一个服务器,所以通过改变端口来实现)

  

  2、修改以下几项配置

1、端口号:
        slave_1.conf:6380
        slave_2.conf:6381

2、绑定
        slave_1.conf:slaveof 127.0.0.1 6379
        slave_2.conf:slaveof 127.0.0.1 6379

3、密码(最好跟master一致)
        slave_1.conf:requirepass 123456     slave_2.conf:requirepass 123456

4、验证密码(从机对主机验证时,所需的密码)     slave_1.conf:masterauth 123456      slave_2.conf:masterauth 123456

  

  

  

  

  3、启动主机和从机

  

  

  4、验证结果

  master:

  

  slave_1

  

  slave_2

   

  5、流程图

可以看到主机执行写命令,从机能同步主机的值,主从复制就实现了。

注意:默认情况下从库是只读的,不能进行修改,需要修改需要设置配置文件中的slave-read-only为no。在命令行里执行slaveof no one可以让一个从库变成主库。

问题:当主服务器挂了怎么办

二、引入sentinel(哨兵)模式

特点:
    1、不时地监控redis是否按照预期良好地运行;
    2、如果发现某个redis节点运行出现状况,能够通知另外一个进程(例如它的客户端);
    3、能够进行自动切换。当一个master节点不可用时,能够选举出master的多个slave(如果有超过一个slave的话)中的一个来作为新的master,    其它的slave节点会将它所追随的master的地址改为被提升为master的slave的新地址。

  单点sentinel示意图

  集群sentinel示意图(防止单点故障)

  

  1、找到sentinel.conf文件

1、找到sentinel.conf文件,默认在redis源码包里
2、复制sentinel.conf文件到redis.conf同级目录

  2、配置sentinel.conf

说明:我这里是单个sentinel,集群sentinel下面方法也通用1、port : 当前Sentinel服务运行的端口(注意:多个sentinel,记得修改端口号)

2、dir : Sentinel服务运行时使用的临时文件夹

3、sentinel monitor master001 192.168.110.101 6379 2:Sentinel去监视一个名为master001的主redis实例,这个主实例的IP地址为本机地址192.168.110.101,端口号为6379,                                而将这个主实例判断为失效至少需要2个 Sentinel进程的同意(注意:如果是单个sentinel,这里就是1),只要同意Sentinel的数量不达标,                                自动failover就不会执行
4、sentinel auth-pass mymaster 123456:设置连接master和slave时的密码,注意的是sentinel不能分别为master和slave设置不同的密码,因此master和slave的密码应该设置相同。
4、sentinel down-after-milliseconds master001 30000:指定了Sentinel认为Redis实例已经失效所需的毫秒数。当实例超过该时间没有返回PING,或者直接返回错误,那么Sentinel将这个实例标记为主观下线。                                只有一个 Sentinel进程将实例标记为主观下线并不一定会引起实例的自动故障迁移:只有在足够数量的Sentinel都将一个实例标记为主观下线之后,                                实例才会被标记为客观下线,这时自动故障迁移才会执行

5、sentinel parallel-syncs master001 1:指定了在执行故障转移时,最多可以有多少个从Redis实例在同步新的主实例,在从Redis实例较多的情况下这个数字越小,同步的时间越长,完成故障转移所需的时间就越长

6、sentinel failover-timeout master001 180000:如果在该时间(ms)内未能完成failover操作,则认为该failover失败

7、sentinel notification-script <master-name> <script-path>:指定sentinel检测到该监控的redis实例指向的实例异常时,调用的报警脚本。该配置项可选,但是很常用

  3、启动sentinel

命令:redis-sentinel  sentinel.conf

说明:redis-sentinel  path (sentinel的配置文件路径) + filename (文件名)

多个sentinel也一样,只需修改filename就行

  

  启动后会在控制台看到如下信息

  

  4、测试sentinel自动切换功能

    1、停止主节点(端口为6379)

     

     2、查看slave节点(端口为6380,6381)

    

    

    可以看到,已经成功切换了

    3、恢复主节点(master)

    

    之前的主节点变成了slave

   5、启动中碰到的问题

1、redis启动警告问题:WARNING: The TCP backlog setting of 511 cannot be enforced because /proc/sys/net/core/somaxconn is set to the lower value of 128.
  原因:对一个高负载的环境来说tcp设置128这个值,太小了。
  解决:
      1、临时:执行  echo 511 > /proc/sys/net/core/somaxconn
      2、永久:打开ietc/sysctl.conf,在这里面添net.core.somaxconn= 1024 然后执行sysctl -p 就可以永久消除这个warning

2、在控制台info中没看到* +slave slave 127.0.0.1:6381 127.0.0.1 6381 @ mymaster 127.0.0.1 6379这类的信息,  而是这个sdown master mymaster 127.0.0.1 6379,Next failover delay: I will not start a failover之类的
  原因:没有设置master连接密码
  解决:在sentinel.conf上设置  sentinel auth-pass mymaster password(master密码)

3、启动sentinel出现:*** FATAL CONFIG FILE ERROR ***   Reading the configuration file, at line 104 ‘sentinel auth-pass mymaster redis‘  No such master with specified name.  原因:这是因为设置sentinel auth-pass的时候没有在sentinel monitor mymaster ...  的下面  解决:设置在sentinel monitor mymaster ...  的下面就行了

  说明:我上面的例子中,只用了单个sentinel,这会存在单点故障问题。这点需要注意

三、官方提供的集群高可用架构(redis-cluster)

前言:关于redis-cluster,这里就不实际操作了,有兴趣的小伙伴可以自己去试试。

  1、这里简单说说redis-cluster的作用   

  即使使用哨兵,redis每个实例也是全量存储,每个redis存储的内容都是完整的数据,浪费内存且有木桶效应。为了最大化利用内存,可以采用cluster群集,就是分布式存储。即每台redis存储不同的内容。
采用redis-cluster架构正是满足这种分布式存储要求的集群的一种体现。redis-cluster架构中,被设计成共有16384个hash slot。每个master分得一部分slot,其算法为:hash_slot = crc16(key) mod 16384 ,这就找到对应slot。采用hash slot的算法,实际上是解决了redis-cluster架构下,有多个master节点的时候,数据如何分布到这些节点上去。key是可用key,如果有{}则取{}内的作为可用key,否则整个可以是可用key。群集至少需要3主3从,且每个实例使用不同的配置文件。

  示意图

  

  2、redis-cluster架构说明

  在cluster架构下,默认的,一般redis-master用于接收读写,而redis-slave则用于备份,当有请求是在向slave发起时,会直接重定向到对应key所在的master来处理。但如果不介意读取的是redis-cluster中有可能过期的数据并且对写请求不感兴趣时,则亦可通过readonly命令,将slave设置成可读,然后通过slave获取相关的key,达到读写分离。

  3、注意事项

(1)redis-cluster最小配置为三主三从,当1个主故障,大家会给对应的从投票,把从立为主,若没有从数据库可以恢复则redis群集就down了。

(2)在这个redis cluster中,如果你要在slave读取数据,那么需要带上readonly指令。redis cluster的核心的理念,主要是用slave做高可用的,   每个master挂一两个slave,主要是做数据的热备,当master故障时的作为主备切换,实现高可用的。redis cluster默认是不支持slave节点读或者写的,   跟我们手动基于replication搭建的主从架构不一样的。slave node要设置readonly,然后再get,这个时候才能在slave node进行读取。对于redis -cluster主从架构,   若要进行读写分离,官方其实是不建议的,但也能做,只是会复杂一些。

(3)redis-cluster的架构下,实际上本身master就是可以任意扩展的,你如果要支撑更大的读吞吐量,或者写吞吐量,或者数据量,都可以直接对master进行横向扩展就可以了。   也扩容master,跟之前扩容slave进行读写分离,效果是一样的或者说更好。

(4)可以使用自带客户端连接:使用redis-cli -c -p cluster中任意一个端口,进行数据获取测试。

以上就是全部内容了,sentinel模式为本人实测

原文地址:https://www.cnblogs.com/chenhaoyu/p/10827054.html

时间: 2024-10-06 22:20:30

Redis 实战搭建高可用架构的相关文章

Redis Cluster搭建高可用Redis服务器集群

原文:Redis Cluster搭建高可用Redis服务器集群 一.Redis Cluster集群简介 Redis Cluster是Redis官方提供的分布式解决方案,在3.0版本后推出的,有效地解决了Redis分布式的需求,当一个节点挂了可以快速的切换到另一个节点,当遇到单机内存.并发等瓶颈时,可以采用分布式方案要解决问题. 二.集群原理 Redis Cluster架构图 Redis Cluster集群采用了P2P的模式,完全去中心化,Redis把所有的Key分成了16384个slot,每个R

Redis之——搭建高可用及负载均衡的Redis

转载请注明出处:http://blog.csdn.net/l1028386804/article/details/52578080 之前,给大家介绍了一些关于Redis的文章,大家可以参见博文中有关Redis的文章.今天,我们就一起来学习如何搭建高可用及负载均衡的Redis,好了,不多说了,我们直接进入正题吧. 一.测试环境 1.机器 母机:centos6.5-64 虚拟机:centos6.5-64 单核 1G 独立ip 3个 虚拟机使用VMWare,centos为64位6.5.具体信息如下:

maxscale配合MHA搭建读写分离的高可用架构(基于GTID replication主从架构,mysql5.6)

基于GTID的主从replication并配合MHA搭建高可用架构,请参考之前的博客:http://linzhijian.blog.51cto.com/1047212/1906434.这里只叙述如何在此基础上增加maxscale中间件,实现读写分离的功能. MaxScale是maridb开发的一个MySQL数据中间件,其配置简单,能够实现读写分离,并且可以根据主从状态实现写库的自动切换.官方文档:https://mariadb.com/kb/en/mariadb-enterprise/about

如何搭建高可用redis架构?

1 题记 Redis 是一个开源的使用 ANSI C 语言编写.支持网络.可基于内存亦可持久化的日志型.Key-Value 数据库,并提供多种语言的 API. 如今,互联网业务的数据正以更快的速度在增长,数据类型越来越丰富,这对数据处理的速度和能力提出了更高要求.Redis 是一种开源的内存非关系型数据库,给开发人员带来的体验是颠覆性的.在自始至终的设计过程中,都充分考虑高性能,这使得 Redis 成为当今速度最快的 NoSQL 数据库. 考虑高性能的同时,高可用也是很重要的考虑因素.互联网 7

企业中MySQL主流高可用架构实战三部曲之MHA

老张最近两天有些忙,一些老铁一直问,啥时更新博文,我可能做不到天天更新啊,但保证以后一有空就写一些干货知识分享给大家. 我们如果想要做好技术这项工作,一定要做到理论与实践先结合.我一个曾经被数据库虐得体无完肤的过来人给大家一些建议:就是只看书,背理论真的行不通,到时遇到棘手的问题,你还是一样抓瞎.一定要在理论理清的基础上多做实验. 给自己定个目标,3个月做够100-500个实验.然后整理在做实验过程中的各种报错,认真解读分析报错原理,做好笔记.最后再拿起书,重新阅读之前有些可能理解不了的理论知识

Redis Sentinel高可用架构

Redis目前高可用的架构非常多,比如keepalived+redis,redis cluster,twemproxy,codis,这些架构各有优劣,今天暂且不说这些架构,今天主要说说redis sentinel高可用架构. 它的主要功能有以下几点 不时地监控redis是否按照预期良好地运行; 如果发现某个redis节点运行出现状况,能够通知另外一个进程(例如它的客户端); 能够进行自动切换.当一个master节点不可用时,能够选举出master的多个slave(如果有超过一个slave的话)中

java架构师课程、性能调优、高并发、tomcat负载均衡、大型电商项目实战、高可用、高可扩展、数据库架构设计、Solr集群与应用、分布式实战、主从复制、高可用集群、大数据

15套Java架构师详情 * { font-family: "Microsoft YaHei" !important } h1 { background-color: #006; color: #FF0 } 15套java架构师.集群.高可用.高可扩展.高性能.高并发.性能优化.Spring boot.Redis.ActiveMQ.Nginx.Mycat.Netty.Jvm大型分布式项目实战视频教程 视频课程包含: 高级Java架构师包含:Spring boot.Spring  clo

drbd+heartbeat+nfs高可用架构搭建

一.客户需求 1.需求描述 有些客户有自己的存储设备,但是并没有集群文件系统服务,所以如果我们多个节点(计算节点)如果想同时使用其中的一个块且要保证高可用的话,就需要我们自己来完成类似集群文件系统的服务组合,在此我们使用的服务组合是:iscsi共享+drbd+heartbeat+nfs. 2.服务说明 Iscsi共享:这里通过iscsi共享服务将存储设备上的存储块共享出去,提供节点(NC1+NC2)使用,此处我们将在iscsi服务短创建两个镜像充当块设备. Drbd   :服务器之间镜像块设备内

数据库高可用架构(MySQL、Oracle、MongoDB、Redis)

一.MySQL MySQL小型高可用架构 方案:MySQL双主.主从 + Keepalived主从自动切换 服务器资源:两台PC Server 优点:架构简单,节省资源 缺点:无法线性扩展,主从失败之后需要手动恢复主从架构 MySQL中型高可用架构 方案:MMM + MySQL双主 + 多从高可用方案 服务器资源: 1.至少五台PC Server,2台MySQL主库,2台MySQL从库,1台MMM Monitor: 2.1台MMM Monitor选择低配: 3.如果不采用F5作为从库的负载均衡器