写在前面的话

上一节的主从环境能够解决我们保证数据安全性的问题,但是却无法解决我们在主节点挂掉的时候服务继续使用的问题,同时也不能自动切换新的主。

我们运维的目的肯定是希望即使主库挂掉一个,服务依旧能够继续使用,也就是有一个库能够顶上去,充当主的位置,这也就是高可用 HA 的目的。

Redis 自带了高可用的方案,就是 Redis Sentinel。

Redis Sentinel

Redis Sentinel 是一个独立的进程,它能够监控多个 Master Slave 集群,所以它更新是剥离于 Redis 但是又能够管理 Redis 的一个服务。

它能够帮助集群在主挂掉时候选举出新的主以供业务继续使用。同时可以通过 API 接口向用户发送消息,达到告警的作用。

故障转移原理:

1. 发现主库宕机,将在设置的主从故障超时时间两倍的时间进行新主选举。

2. 将新选举的主升级为主服务器。

3. 通过发布订阅功能向其它的 Sentinel 发送配置更新。

4. 向其它从服务器发送主更新,执行新的 slaveof 执行新主。

搭建 Sentinel 集群

集群架构如下:

Redis 还是和上一节一样,采用的是一主两从的配置,同时我们也引入了三个哨兵来监控集群,避免单个哨兵机器正好故障,导致整个业务还是瘫痪的局面。

端口服务设计如下:

IP 地址 Redis 端口 Sentinel 端口
192.168.200.101 17000 18000
192.168.200.102 17000 18000
192.168.200.103 17000 18000

开始部署 Sentinel 环境:

1. 所有节点安装 Redis 和 Sentinel:

# 创建目录并上传包
mkdir -p /data/{backup,data,logs,packages,services}
cd /data/packages # 解压编译安装
tar -zxf redis-4.0.14.tar.gz
cd redis-4.0.14/
make
make PREFIX=/data/services/redis/redis-17000 install
make PREFIX=/data/services/redis/sentinel-18000 install
cd /data/services/redis/redis-17000
mkdir data logs conf
cd /data/services/redis/sentinel-18000
mkdir data logs conf

其实 Sentinel 就在 Redis 的服务中,但是依旧选择的两个目录,这样的目的是为了更清晰的管理。

2. 添加配置文件,三个节点执行添加配置:

cat > /data/services/redis/redis-17000/conf/redis-17000.conf << EOF
#################################################################################################
# Redis 配置文件
################################################################################################# #################################################################################################
# 基础配置
#################################################################################################
protected-mode yes
bind 0.0.0.0
port 17000
tcp-backlog 2048
timeout 0
tcp-keepalive 300
daemonize yes
supervised no
pidfile /data/services/redis/redis-17000/logs/redis-17000.pid
loglevel notice
logfile "/data/services/redis/redis-17000/logs/redis-17000.log"
databases 16
always-show-logo yes #################################################################################################
# RDB持久化配置
#################################################################################################
dbfilename dump-17000.rdb
dir "/data/services/redis/redis-17000/data"
save 900 1
save 300 10
save 60 10000
stop-writes-on-bgsave-error yes
rdbcompression yes
rdbchecksum yes #################################################################################################
# AOF持久化配置
#################################################################################################
appendonly yes
appendfilename "appendonly-17000.aof"
appendfsync everysec
no-appendfsync-on-rewrite yes
auto-aof-rewrite-percentage 100
auto-aof-rewrite-min-size 64mb
aof-load-truncated yes
aof-use-rdb-preamble no #################################################################################################
# 主从配置
#################################################################################################
# slaveof <masterip> <masterport>
# masterauth helloworld
slave-serve-stale-data yes
slave-read-only yes
repl-diskless-sync no
repl-diskless-sync-delay 5
repl-ping-slave-period 10
repl-timeout 60
repl-disable-tcp-nodelay no
repl-backlog-size 1mb
repl-backlog-ttl 3600
slave-priority 100
min-slaves-to-write 1
min-slaves-max-lag 10
# slave-announce-ip 5.5.5.5
# slave-announce-port 1234
EOF

3. 启动并构建主从:

# 三个节点都启动
/data/services/redis/redis-17000/bin/redis-server /data/services/redis/redis-17000/conf/redis-17000.conf

值得注意的是,我之前设置的路径为 redis-sentinel-cluster/redis-17000,这样导致 redis 启动后自动启动为 sentinel 模式,类似这样:

导致后面无法添加主从,坑爹!

102 / 103 设置主库信息:

/data/services/redis/redis-17000/bin/redis-cli -p 17000 -a helloworld slaveof 192.168.200.101 17000

三个节点查看主从信息:

/data/services/redis/redis-17000/bin/redis-cli -p 17000 -a helloworld info replication

如图:

4. 三个节点配置哨兵配置文件:

cat > /data/services/redis/sentinel-18000/conf/sentinel-18000.conf << EOF
#################################################################################################
# Redis Sentinel 配置文件
#################################################################################################
# 绑定IP
bind 0.0.0.0 # 运行端口
port # 后台运行
daemonize yes # 日志文件路径
logfile "/data/services/redis/sentinel-18000/logs/sentinel-18000.log" # 配置Master/ip/port/需要多少个sentinel才能判断客观下线
sentinel monitor t1 192.168.200.101 17000 2 # 配置sentinel向master发出ping的最大响应时间,超过则认为主观下线
sentinel down-after-milliseconds t1 30000 # 配置故障转移时,运行多少个slave进行数据备份同步(越少速度越快)
sentinel parallel-syncs t1 1 # 当出现failover时下一个sentinel与上一个sentinel对同一个master监测的时间间隔
sentinel failover-timeout t1 180000
EOF

我这里是取消了 redis 主从的密码,如果需要密码,可以使用:

sentinel auth-pass t1 password

5. 启动哨兵:

/data/services/redis/sentinel-18000/bin/redis-sentinel /data/services/redis/sentinel-18000/conf/sentinel-18000.conf

查看进程:

6. 连接哨兵查看:

/data/services/redis/sentinel-18000/bin/redis-cli -p 18000

输入 info 查看:

可以通过这里看到所有节点,此时哨兵搭建完成!

7. 测试故障转移,此时直接关闭主节点来测试:

其他机器连接 sentinel 查看发现 master 已经发生了变更,只是后面的统计数量没变。

8. 此时重启 101 节点以后,重启 redis 和 Sentinel 查看:

查看 Sentinel:

查看 Redis:

查看 Master:

可以发现此时已经不需要我们手动将新节点加成从库,自动已经变成从库添加到集群了。

最后值得注意的是,在  Sentinel 环境中,如果存在多个 Sentinel,业务在连接的时候是直接连接 Sentinel 的,而且可以选择写多个配置的。

到此,哨兵模式配置完成!当然,这还不是我们最终最求的架构!

Redis for OPS 05:哨兵HA Sentinel的更多相关文章

  1. Redis高可用之哨兵模式Sentinel配置与启动(五)

    0.Redis目录结构 1)Redis介绍及部署在CentOS7上(一) 2)Redis指令与数据结构(二) 3)Redis客户端连接以及持久化数据(三) 4)Redis高可用之主从复制实践(四) 5 ...

  2. redis 4.x 安装哨兵模式 sentinel

    1.下载 http://download.redis.io/releases/redis-4.0.11.tar.gz 2.解压 tar zxvf redis-4.0.11.tar.gz 3.安装 cd ...

  3. Redis 之武林大会 - 哨兵(Sentinel)

    前言 Redis在出从复制的模式下,一旦主节点由于故障不能提供服务,需要人工降从节点晋升为主节点,同时还要通知应用方更新主节点的地址,在很多应用场景下,这样的故障处理方式是无法被接受的.不过幸运的是R ...

  4. redis 哨兵(sentinel)

    redis哨兵 哨兵自动故障转移 自动通知应用最新master信息 无需担心,master挂了,程序不需要修改IP啥的,由哨兵自动完成 修改sentinel.conf protected-mode n ...

  5. Redis(十五):哨兵Sentinel

    Redis哨兵 Redis 的 Sentinel 系统用于管理多个 Redis 服务器(instance), 该系统执行以下三个任务: 监控(Monitoring): Sentinel 会不断地检查你 ...

  6. Redis(九)哨兵:Redis Sentinel

    Redis的主从复制模式下,一旦主节点由于故障不能提供服务,需要人工将从节点晋升为主节点,同时还要通知应用方更新主节点地址,对于很多应用场景这种故障处理的方式是无法接受的. Redis从2.8开始正式 ...

  7. 【转】Redis哨兵(Sentinel)模式

    主从切换技术的方法是:当主服务器宕机后,需要手动把一台从服务器切换为主服务器,这就需要人工干预,费事费力,还会造成一段时间内服务不可用.这不是一种推荐的方式,更多时候,我们优先考虑哨兵模式. 一.哨兵 ...

  8. Redis哨兵(Sentinel)模式

    Redis哨兵(Sentinel)模式   主从切换技术的方法是:当主服务器宕机后,需要手动把一台从服务器切换为主服务器,这就需要人工干预,费事费力,还会造成一段时间内服务不可用.这不是一种推荐的方式 ...

  9. contos7下安装redis&redis的主从复制的配置&redis 哨兵(sentinel)

    一.centos7下安装redis 1.解压 redis-5.0.5.tar.gz 压缩文件 解压命令为: .tar.gz -C redis 解压后进入 redis 工作目录,进入 redis-5.0 ...

随机推荐

  1. web攻击与防御技术--SQL注入

    sql注入是WEB安全中比较重要而复杂的一个东西.而且危害性比较大. 一般来讲SQL注入的话首先要识别注入点.一个是看能不能注入另外一个是看是什么类型的注入比如说字符,数字,搜索(?)等等 GET.P ...

  2. java之递归

    什么是递归 递归:指在当前方法内调用自己的这种现象. 递归的分类: 递归分为两种,直接递归和间接递归. 直接递归称为方法自身调用自己. 间接递归可以A方法调用B方法,B方法调用C方法,C方法调用A方法 ...

  3. HashMap、HashTable 和 ConcurrentHashMap 线程安全问题

    一.HashMap HashMap 是线程不安全的. JDK 1.7 HashMap 采用数组 + 链表的数据结构,多线程背景下,在数组扩容的时候,存在 Entry 链死循环和数据丢失问题. JDK ...

  4. ReactNative: 使用滚动视图ScrollView组件

    一.简介 当页面内容的非常多时,即使换行后仍然无法充分显示,此时最好的解决办法就是让页面可以滚动显示.在React-Native中,提供了可供滚动的视图组件ScrollView组件.它的属性和方法以及 ...

  5. Java之ssh框架spring配置文件配置定时任务

    最近做了一个数据同步功能,要求晚上0点去定时同步数据,这是个老项目框架用的ssh,定时任务基于quartz,废话不多说,下面详细说说相关配置. 在spring的配置文件中: <!-- 0点定时任 ...

  6. 备用APC队列

     Windows内核分析索引目录:https://www.cnblogs.com/onetrainee/p/11675224.html 备用APC队列 占坑:这一节跟进程挂靠相关联,我们先把进程挂靠给 ...

  7. 资深程序员对于Python各个方向的面试经验分享,非常给力!

    之前早有前辈们说过,"裸辞一时爽,一直裸辞一直爽",这话一点不假,裸辞你要面临没有收入来源,但是每天眼睁睁看着各种花销不断支出的煎熬,我主要是觉得一边在上家公司工作一边去下家面试可 ...

  8. Netty服务端Channel注册Selector及绑定服务器端口

    当服务端Channel 创建并且初始化完成之后,会将其注册到 selector,通过语句config().group().register(channel)进行注册工作,该方法最终调用 Abstrac ...

  9. socket之线程来提高吞吐量

    线程demo: 线程: package com.company.s5; import java.io.InputStream; import java.io.InputStreamReader; im ...

  10. 【实习第一天】odoo开发基础(一)

    管理权限 在项目中,有个security文件夹,其中的ir.model.access文件后面带4个参数.分别代表着读,写,创建,删除的操作 想要开启权限需要将其参数调成为1,反之为0.倘若不调整参数, ...