`

搭建一个redis高可用系统

阅读更多

一、单个实例

当系统中只有一台redis运行时,一旦该redis挂了,会导致整个系统无法运行。


单个实例

二、备份

由于单台redis出现单点故障,就会导致整个系统不可用,所以想到的办法自然就是备份(一般工业界认为比较安全的备份数应该是3份)。当一台redis出现问题了,另一台redis可以继续提供服务。


备份

三、自动故障转移

虽然上面redis做了备份,看上去很完美。但由于redis目前只支持主从复制备份(不支持主主复制),当主redis挂了,从redis只能提供读服务,无法提供写服务。所以,还得想办法,当主redis挂了,让从redis升级成为主redis。

这就需要自动故障转移,redis sentinel带有这个功能,当一个主redis不能提供服务时,redis sentinel可以将一个从redis升级为主redis,并对其他从redis进行配置,让它们使用新的主redis进行复制备份。


自动故障转移

四、动手实践

1.环境

这里使用三台服务器,每台服务器上开启一个redis-server和redis-sentinel服务,redis-server端口为8000,redis-sentinel的端口为6800,修改默认端口是安全的第一步^_^。

redis-server说明

  • 192.168.56.101:8000 主
  • 192.168.56.102:8000 从
  • 192.168.56.103:8000 从

redis-sentinel说明

  • 192.168.56.101:6800
  • 192.168.56.102:6800
  • 192.168.56.103:6800

2.搭建redis系统

首先下载安装redis

wget http://download.redis.io/releases/redis-3.2.8.tar.gz
tar zxvf redis-3.2.8.tar.gz
cd redis-3.2.8
make

cd src
#复制redis相关命令到/usr/sbin目录下,这样就可以直接执行这些命令,不用写全路径
sudo cp redis-cli  redis-server  redis-sentinel   /usr/sbin/

在redis目录下有redis.conf和sentinel.conf配置文件示例,使用sudo cp redis.conf sentinel.conf /etc/命令将两个配置文件复制到/etc目录下(当然也可以在/etc/目录新建配置文件),然后修改配置文件。

修改主redis-server配置文件内容如下:

port  8000           #修改端口是安全的第一步
daemonize  yes
bind  0.0.0.0
pidfile   /var/run/redis-8000.pid
logfile   /var/log/redis/redis-8000.log

修改从redis-server配置文件内容如下:

port  8000           #修改端口是安全的第一步
daemonize  yes
bind  0.0.0.0
pidfile   /var/run/redis-8000.pid
logfile   /var/log/redis/redis-8000.log
slaveof  192.168.56.101  8000    #从redis比主redis多这一行

启动redis-server。

sudo redis-server /etc/redis.conf

三个redis服务启动完毕后,进入命令行,执行info replication查看当前主从配置。


主节点上查看主从信息

发现并没有从节点信息。

3.主从间无法通信

这里的原因是防火墙屏蔽了8000端口,需要修改防火墙设置,开放8000端口(同理redis-sentinel的6800端口)。

# 打开防火墙配置文件,增加8000端口
sudo vim /etc/sysconfig/iptables

#修改完后,需要重启防火墙
sudo service iptables restart

增加8000端口和6800端口

然后重新进入主节点,查看主从信息,可以发现两个从节点信息,表明redis-server主从已经配置完毕。


主节点上查看主从信息

4.搭建redis-sentinel系统

redis-sentinel程序上面已经安装过了,这里只需要修改配置文件就可以了。修改/etc/sentinel.conf,如果没有创建即可。

修改sentinel.conf配置文件内容如下:

daemonize yes
port  6800
logfile  /var/log/redis/sentinel.log
pidfile  /var/run/sentinel.pid
sentinel monitor master8000 192.168.56.101 8000 2
#5秒内master6800没有响应,就认为SDOWN
sentinel down-after-milliseconds master8000 5000  
sentinel failover-timeout  master8000 15000

启动redis-sentinel。

redis-sentinel  /etc/sentinel.conf

三个redis-sentinel服务启动完毕后,连接任意sentinel服务可以获知当前主redis服务信息。


sentinel监控状态

五、测试

1.把住redis停掉

redis-cli -h 192.168.56.101 -p 8000 shutdown

2.查看redis-sentinel的监控状态


sentinel监控状态

发现102这台redis-server提升为主库。

至此,redis的高可用方案已经搭建完成。

六、客户端程序

客户端程序(如PHP程序)连接redis时需要ip和port,但redis-server进行故障转移时,主redis是变化的,所以ip地址也是变化的。客户端程序如何感知当前主redis的ip地址和端口呢?redis-sentinel提供了接口,请求任何一个sentinel,发送SENTINEL get-master-addr-by-name <master name>就能得到当前主redis的ip和port。


获取当前主redis的ip和port

客户端每次连接redis前,先向sentinel发送请求,获得主redis的ip和port,然后用返回的ip和port连接redis。

这种方法的缺点是显而易见的,每次操作redis至少需要发送两次连接请求,第一次请求sentinel,第二次请求redis。

php请求sentinel程序代码可参见:https://github.com/huyanping/redis-sentinel

更好的办法是使用VIP,当然这对配置的环境有一定的要求,比如redis搭建在阿里云服务器上,可能不支持VIP。

VIP方案是,redis系统对外始终是同一ip地址,当redis进行故障转移时,需要做的是将VIP从之前的redis服务器漂移到现在新的主redis服务器上。

比如:当前redis系统中主redis的ip地址是192.168.56.101,那么VIP(192.168.56.250)指向192.168.56.101,客户端程序用VIP(192.168.56.250)地址连接redis,实际上连接的就是当前主redis,这样就避免了向sentinel发送请求。

当主redis宕机,进行故障转移时,192.168.56.102这台服务器上的redis提升为主,这时VIP(192.168.56.250)指向192.168.56.102,这样客户端程序不需要修改任何代码,连接的是192.168.56.102这台主redis。


VIP指向192.168.56.101

故障转移后,VIP漂移指向192.168.56.102

七、漂移VIP

那么现在的问题是,如何在进行redis故障转移时,将VIP漂移到新的主redis服务器上。

这里可以使用redis sentinel的一个参数client-reconfig-script,这个参数配置执行脚本,sentinel在做failover的时候会执行这个脚本,并且传递6个参数<master-name>、 <role>、 <state>、 <from-ip>、 <from-port>、 <to-ip> 、<to-port>,其中<to-ip>是新主redis的IP地址,可以在这个脚本里做VIP漂移操作。

sentinel client-reconfig-script master8000   /opt/notify_master6800.sh

修改三个服务器的redis-sentinel配置文件/etc/sentinel.conf,增加上面一行。然后在/opt/目录下创建notify_master6800.sh脚本文件,这个脚本做VIP漂移操作,内容如下:

#notify_master6800.sh脚本内容
#!/bin/bash
MASTER_IP=$6  #第六个参数是新主redis的ip地址
LOCAL_IP='192.168.56.101'  #其他两个服务器上为192.168.56.102,192.168.56.103
VIP='192.168.56.250'
NETMASK='24'
INTERFACE='eth1'
if [ ${MASTER_IP} = ${LOCAL_IP} ];then   
    /sbin/ip  addr  add ${VIP}/${NETMASK}  dev ${INTERFACE}  #将VIP绑定到该服务器上
    /sbin/arping -q -c 3 -A ${VIP} -I ${INTERFACE}
    exit 0
else 
   /sbin/ip  addr del  ${VIP}/${NETMASK}  dev ${INTERFACE}   #将VIP从该服务器上删除
   exit 0
fi
exit 1  #如果返回1,sentinel会一直执行这个脚本

现在当前主redis是192.168.56.102,需要手动绑定VIP到该服务器上。

/sbin/ip  addr add 192.168.56.250/24 dev eth1
/sbin/arping -q   -c 3 -A 192.168.56.250 -I eth1

然后,去另一个服务器上通过VIP地址连接redis-server和redis-sentinel。


通过VIP连接redis


从上面也可以看出当前主redis是192.168.56.102。

下面关闭这台redis服务,看看VIP是否漂移到另一台服务器上。

redis-cli -h 192.168.56.102 -p 8000 shutdown


通过查询sentinel发现192.168.56.103提升为主。

通过访问VIP连接redis,发现VIP确实指向了192.168.56.103。

八、总结

通过上面的操作,使用redis主从 + 哨兵(sentinel)+ 漂移VIP的方案搭建了一个redis高可用系统,但这个系统保证的是单个redis实例的高可用,所以适合业务比较小的应用。如果业务比较大,并发量比较高,建议搭建redis集群,比如官方redis cluster,还有开源的codings集群。

另外,漂移VIP可以使用keepalived软件来实现,这里就不多介绍了。

分享到:
评论

相关推荐

    Redis高可用集群Redis Cluster搭建

    Redis高可用集群Redis Cluster搭建 Redis高可用集群Redis Cluster搭建是 Redis 官方推荐的高可用性解决方案,于 3.0 版本推出。Redis Cluster 的主要用途是实现数据分片(Data Sharding),同时也可以实现高可用...

    redis 高可用详细文档

    Redis是一个开源的内存中的数据结构存储系统,它可以用作数据库、缓存和消息中间件。自2009年发布以来,它已经成为一个非常流行的数据存储解决方案。Redis不仅可以存储简单的key-value对,还可以存储如字符串...

    Keepalived+redis高可用主从-Keepalived的配置

    Keepalived+redis高可用主从,本技术文档主要是Keepalived的配置,redis主从配置可以看我的文章https://blog.csdn.net/qq_41709494/article/details/116382183

    redis最新版5.0.2高可用集群搭建

    - **环境准备**:假设我们有三台机器,每台机器部署一个 Master 节点和一个 Slave 节点,共需搭建六个 Redis 实例。 - **目录结构**:在每台机器的 `/usr/local` 目录下创建 `redis-cluster` 文件夹,并在其下创建两...

    keepalived+redis 高可用方案 集群环境搭建

    keepalived+redis 高可用方案 集群环境搭建. 部分来自网上,部分自己的总结. 详细的记录了如何搭建keepalived+redis的环境

    Redis高可用管理后台系统

    在大型分布式系统中,为了保证服务的高可用性(High Availability,HA),通常需要搭建一个Redis高可用管理后台系统。这个系统结合Python开发,可以提供监控、故障转移、数据备份与恢复等功能,确保Redis服务在面临...

    搭建redis缓存高可用集群.md

    Redis 集群是一个可以在多个 Redis 节点之间进行数据共享的设施installation。 Redis 集群不支持那些需要同时处理多个键的 Redis 命令, 因为执行这些命令需要在多个 Redis 节点之间移动数据, 并且在高负载的情况...

    03-VIP-Redis缓存高可用集群(预习)1

    本文将探讨Redis的两种集群方案:哨兵模式和高可用集群模式,以及如何搭建Redis高可用集群。 1. **哨兵模式**:在Redis 3.0以前,哨兵(Sentinel)系统常用于实现高可用性。哨兵监控Master节点状态,一旦检测到...

    搭建Redis缓存高可用集群环境搭建

    ### 搭建Redis缓存高可用集群环境详解 #### 一、Redis集群方案比较 在探讨具体的搭建步骤之前,我们需要了解两种常见的Redis集群模式:哨兵模式与高可用集群模式。 ##### 1.1 哨兵模式 在Redis 3.0以前的版本中...

    redis高可用笔记,包括RedisCluster集群方式和完全纯手写Redis缓存框架

    5. **手动故障转移**:当主节点故障时,手动将一个从节点提升为主节点,并更新配置,保证服务连续性。 6. **客户端配置**:客户端需要适配这种模式,能够识别并连接到适当的Redis实例。 ### 高可用策略对比 Redis ...

    Redis高可用管理后台系统.zip

    1. **Redis集群搭建**:Redis提供了哨兵(Sentinel)系统和Cluster集群两种方式实现高可用。哨兵系统监控Redis主从节点状态,自动故障转移;Cluster通过数据分片实现负载均衡和容错。 2. **Python客户端库**:Python...

    Redis+keepalived搭建教程和高可用测试

    Redis是一个开源的、高性能的键值存储系统,常用于数据库、缓存和消息中间件等场景。其支持丰富的数据类型,如字符串、哈希、列表、集合、有序集合,以及原子操作,提供了高效的数据处理能力。 **Keepalived介绍** ...

    redis搭建sentinel高可用方法

    redis搭建sentinel高可用方法

    Redis高可用集群实现1

    在这个方案中,我们利用Sentinel、Twemproxy、Keepalive以及Redis自身来搭建一个高可用的环境。以下是各个组件的作用: 1. **Redis**: Redis是我们的主要缓存服务器,负责存储数据并提供高速访问。 2. **Sentinel*...

    windows环境下redis高可用之主从复制与哨兵监控.

    因此,本文将详细介绍如何在Windows环境下搭建基于主从复制和哨兵监控机制的Redis高可用集群。 #### 二、主从复制 **2.1 安装与配置** 首先,需要从官方GitHub仓库...

    搭建高可用Redis平台架构.docx

    搭建高可用Redis平台架构.docx

    redis集群搭建(一主一从一哨兵)

    在本教程中,我们将关注如何构建一个基础的 Redis 集群,其中包括一个主节点、一个从节点以及一个哨兵(Sentinel)系统,以实现高可用性。 1. **Redis 集群概念** Redis 集群是一种分布式解决方案,将数据分散存储...

    2018.4.27公开课文档轻松搭建Redis缓存高可用集群.pdf

    哨兵用于监控主节点(master)的健康状况,若主节点出现故障,则可将其中一个从节点(slave)提升为新的主节点。哨兵模式配置较为复杂,性能和高可用性表现一般,存在主从切换时的瞬断问题。 2. 高可用集群模式:从...

    docker 实现redis集群搭建

    "docker 实现redis集群搭建" ...使用 Docker 实现 Redis 集群搭建可以提供高可用性、高扩展性和高性能的 Redis 集群解决方案。使用 Docker 容器化技术,可以轻松地搭建和管理 Redis 集群,提高开发效率和系统稳定性。

    redis3.0.0集群搭建

    Redis 是一个高性能的键值对数据库,常用于缓存、计数、发布订阅等场景。在3.0.0版本中,它引入了集群功能,增强了可扩展性和高可用性。接下来,我们将深入探讨如何搭建Redis 3.0.0集群。 首先,你需要准备以下软件...

Global site tag (gtag.js) - Google Analytics