zoukankan      html  css  js  c++  java
  • Redis for OPS 05:哨兵HA Sentinel

    写在前面的话

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

    我们运维的目的肯定是希望即使主库挂掉一个,服务依旧能够继续使用,也就是有一个库能够顶上去,充当主的位置,这也就是高可用 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 18000
    
    # 后台运行
    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 的,而且可以选择写多个配置的。

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

  • 相关阅读:
    ————————————————————————动态规划——————————————————————1003——————————
    -------------初识----------动态规划。--------------------------------------------
    lsof,fuser,xargs,print0,cut,paste,cat,tac,rev,exec,{},双引号,单引号,‘(字符串中执行命令)
    bash characters
    SNORT--install ---dependency-resolve
    Linux SA--HugePage,HPET
    linux UIO
    java generic super, extend
    linux dpdk DDOS清洗和流量行为分析
    虚拟网卡 TUN/TAP 驱动程序设计原理
  • 原文地址:https://www.cnblogs.com/Dy1an/p/11813746.html
Copyright © 2011-2022 走看看