zoukankan      html  css  js  c++  java
  • Redis高可用之Sentinel哨兵/

    一,单实例模式

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

    二,主从模式

    由于单台 redis 出现单点故障,就会导致整个系统不可用,所以想到的办法自然 就是备份。当一台 redis 出现问题了,另一台 redis 可以继续提供服务。

    三,自动故障转移机制

    •  虽然上面 redis 做了备份,看上去很完美。但由于 redis 目前只支持主从复制 备份(不支持主主复制),当主 redis 挂了,从 redis 只能提供读服务,无法 提供写服务。所以,还得想办法,当主redis挂了,让从redis升级成为主redis。
    •  这就需要自动故障转移,redissentinel 带有这个功能,当一个主 redis 不能 提供服务时,redissentinel 可以将一个从 redis 升级为主 redis,并对其他从 redis 进行配置,让他们使用新的主 redis 进行复制备份。
    • Redis-Sentinel 是 Redis 官方推荐的高可用性(HA)解决方案,当用 Redis 做 Master-slave 的高可用方案时,假如 master 宕机了,Redis 本身(包括 它的很多客户端)都没有实现自动进行主备切换,而 Redis-sentinel 本身也 是一个独立运行的进程,它能监控多个 master-slave 集群,发现 master 宕 机后能进行自动切换。它的主要功能有以下几点
    • 实时地监控 redis 是否按照预期良好地运行;
    •  如果发现某个 redis 节点运行出现状况,能够通知另外一个进程(例如它的 客户端);
    •  能够进行自动切换。当一个 master 节点不可用时,能够选举出 master 的多 个 slave(如果有超过一个 slave 的话)中的一个来作为新的 master,其他 的 slave 节点会将它所追随的 master 的地址改为被提升为 master 的 slave 的新地址。

     四,redis的主从复制部署

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

    redis-server 说明
    192.168.200.155:8000         redis-master
    192.168.200.153:8000 redis-slaveA
    192.168.200.154:8000 redis-slaveB

    4 .2redis-server端的部署

    #三台服务器上都进行如下编译安装
    [root@redis-master ~]# yum -y install gcc gcc-c++ make automake auto conf 
    [root@redis-master ~]# tar xf redis-4.0.10.tar.gz -C /usr/src/
    [root@redis-master redis-4.0.10]# make MALLOC=jemalloc
    [root@redis-master redis-4.0.10]# make PREFIX=/usr/local/redis inst all 
    [root@redis-master redis-4.0.10]# mkdir -p /usr/local/redis/conf 
    [root@redis-master redis-4.0.10]# cp redis.conf /usr/local/redis/conf/ [root@redis-master redis-4.0.10]# cp sentinel.conf /usr/local/redis/conf/

    4.3redis.conf配置文件修改

    • redis-master 配置文件修改:
    1. port 8000
    2. daemonize yes
    3. bind 0.0.0.0
    4. pidfile /var/run/redis-8000.pid
    5. logfile /var/log/redis/redis-8000
    • redis-slave配置文件修改
    1. port 8000
    2. daemonize yes
    3. bind 0.0.0.0
    4. pidfile /var/run/redis-8000.pid
    5. logfile /var/log/redis/redis-800.log
    6. slaveof 192.168.200.155 8000

    4 .4redis-server的启动

    #先启动redis-master再启动两个从 
    #在redis-master中
    [root@redis-master conf]# redis-server /usr/local/redis/conf/redis.conf [root@loredis-master redis]# netstat -antup | grep 8000 
    tcp 0 0 0.0.0.0:8000 0.0.0.0:* LISTEN
    #查看redis-slave的日志,同步是否成功
    [root@redis-slave conf]# cd /data/redis/
    [root@redis-slave redis]# ls
    dump.rdb  redis.log  redis.pid
    [root@redis-slave redis]# tail -f redis8000.log 
    1138:S 09 Jan 01:01:14.604 * Connecting to MASTER 192.168.200.155:8000
    1138:S 09 Jan 01:01:14.604 * MASTER <-> SLAVE sync started
    1138:S 09 Jan 01:01:14.605 * Non blocking connect for SYNC fired the event.
    1138:S 09 Jan 01:01:14.605 * Master replied to PING, replication can continue...
    1138:S 09 Jan 01:01:14.606 * Partial resynchronization not possible (no cached master)
    1138:S 09 Jan 01:01:14.607 * Full resync from master: 3e4ce8ce160d9ddfcb4caff6d1a345af8e8ed768:0
    1138:S 09 Jan 01:01:14.682 * MASTER <-> SLAVE sync: receiving 1081 bytes from master
    1138:S 09 Jan 01:01:14.683 * MASTER <-> SLAVE sync: Flushing old data
    1138:S 09 Jan 01:01:14.683 * MASTER <-> SLAVE sync: Loading DB in memory
    1138:S 09 Jan 01:01:14.703 * MASTER <-> SLAVE sync: Finished with success
    
    #通过命令查看主从复制情况,redis-master
    [root@redis-master ~]# redis-cli -p 8000 info replication
    # Replication
    role:master       #主机主机
    connected_slaves:2    #有两个从
    slave0:ip=192.168.200.153,port=8000,state=online,offset=252,
    lag=0slave1:ip=192.168.200.154,port=8000,state=online,offset=252,
    lag=1master_replid:3e4ce8ce160d9ddfcb4caff6d1a345af8e8ed768
    master_replid2:0000000000000000000000000000000000000000
    master_repl_offset:252
    second_repl_offset:-1
    repl_backlog_active:1
    repl_backlog_size:1048576
    repl_backlog_first_byte_offset:1
    repl_backlog_histlen:252

    4 .5进行redis同步测试

     #redis-master 上执行 
    [root@redis-master ~]# redis-cli -p 8000 set aaa 111
    OK
    [root@redis-master ~]# redis-cli -p 8000 get aaa
    "111"
    
     #redis-slave 上执行 
    [root@redis-slaveA redis]# redis-cli -p 8000 get aaa
    "111"
    [root@redis-slaveB redis]# redis-cli -p 8000 get aaa
    "111"

    五,redis的高可用部署(redis-sentinel)

     (1)修改sentinel.conf配置文件

    #修改配置文件以下行
    [root@redis-master ~]# cat -n /usr/local/redis/conf/sentinel.conf | sed -n '21p;69p;98p;106p;131p'
    
     #修改成如下内容
    21 port 6800 
    69 sentinel monitor master8000 192.168.155.170 8000 2 
    98 sentinel down-after-milliseconds master8000 5000 
    106 sentinel parallel-syncs master8000 1 
    131 sentinel failover-timeout master8000 15000
    
    
    #再在 sentinel.conf 的最后追加以下四句话 
    [root@localhost ~]# tail -4 /usr/local/redis/conf/sentinel.conf
    daemonize yes #守护进程模式  
    logfile "/data/redis/sentinel.log" 
    pidfile "/data/redis/sentinel.pid" 
    protected-mode no

    配置文件说明:

    • sentinelmonitor master8000192.168.200.132 8000 2

           master8000:监控的主节点名字(随便写)

           192.168.200.132 8000 :主节点的 IP 和端口 

           2:一共有两台 Sentinel 发现有问题就会发生故障转移

    • sentineldown-after-milliseconds master80005000(5 秒)

           当 master8000 节点宕机后多久进行检查

    • sentinelparallel-syncs master8000 1

          设定 sentinel 并发还是串行, 1 代表每次只能复制一个,可以减轻 master 压力

    •  sentinelfailover-timeout master8000 15000(15 秒)

          表示故障转移的超时时间

    (2)启动 redis-sentinel

     #三台都启动 
     [root@localhost ~]# redis-sentinel /usr/local/redis/conf/sentinel.conf & 
    
     #启动以后,查看 sentinel 信息 
    [root@redis-master conf]# redis-cli -p 6800 info sentinel
    # Sentinel
    sentinel_masters:1
    sentinel_tilt:0
    sentinel_running_scripts:0
    sentinel_scripts_queue_length:0
    sentinel_simulate_failure_flags:0
    master0:name=master8000,status=ok,address=192.168.200.155:80
    00,slaves=2,sentinels=3

    (3)进行 redis-master的宕机测试
    我们宕掉 redis-master 的 redis-server 服务,然后查看 sentinel 日志

    #停掉redis-master
    [root@redis-master conf]# redis-cli -p 8000 shutdown
    
    #查看redis-sentinel日志
    [root@redis-slaveA conf]# cat /data/redis/sentinel.log 
    1378:X 09 Jan 02:24:02.941 # oO0OoO0OoO0Oo Redis is starting oO0OoO0OoO0Oo
    1378:X 09 Jan 02:24:02.941 # Redis version=4.0.11, bits=64, commit=00000000, modified=0, pid=1378, just started
    1378:X 09 Jan 02:24:02.941 # Configuration loaded
    1379:X 09 Jan 02:24:03.101 * Increased maximum number of open files to 10032 (it was originally set to 1024).
    1379:X 09 Jan 02:24:03.118 * Running mode=sentinel, port=6800.
    1379:X 09 Jan 02:24:03.118 # WARNING: The TCP backlog setting of 511 cannot be enforced because /proc/sys/net/core/somaxconn is set to
     the lower value of 128.1379:X 09 Jan 02:24:03.126 # Sentinel ID is 22d1715f75800793aa36aac2be51a3d459b79d03
    1379:X 09 Jan 02:24:03.126 # +monitor master master8000 192.168.200.155 8000 quorum 2
    1379:X 09 Jan 02:24:03.127 * +slave slave 192.168.200.154:8000 192.168.200.154 8000 @ master8000 192.168.200.155 8000
    1379:X 09 Jan 02:24:03.130 * +slave slave 192.168.200.153:8000 192.168.200.153 8000 @ master8000 192.168.200.155 8000
    1379:X 09 Jan 02:24:03.867 * +sentinel sentinel 19e89e777d0b42b112b977b952e1af32a2be9e34 192.168.200.155 6800 @ master8000 192.168.200
    .155 80001379:X 09 Jan 02:24:04.207 * +sentinel sentinel f10eded807a9810fc2e43ff90704c80b0d08e796 192.168.200.154 6800 @ master8000 192.168.200
    .155 80001379:X 09 Jan 02:33:29.875 # +sdown master master8000 192.168.200.155 8000
    1379:X 09 Jan 02:33:30.003 # +new-epoch 1
    1379:X 09 Jan 02:33:30.005 # +vote-for-leader f10eded807a9810fc2e43ff90704c80b0d08e796 1
    1379:X 09 Jan 02:33:30.948 # +odown master master8000 192.168.200.155 8000 #quorum 3/2
    1379:X 09 Jan 02:33:30.948 # Next failover delay: I will not start a failover before Wed Jan  9 02:34:00 2019
    1379:X 09 Jan 02:33:31.107 # +config-update-from sentinel f10eded807a9810fc2e43ff90704c80b0d08e796 192.168.200.154 6800 @ master8000 1
    92.168.200.155 80001379:X 09 Jan 02:33:31.107 # +switch-master master8000 192.168.200.155 8000 192.168.200.153 8000
    1379:X 09 Jan 02:33:31.107 * +slave slave 192.168.200.154:8000 192.168.200.154 8000 @ master8000 192.168.200.153 8000
    1379:X 09 Jan 02:33:31.107 * +slave slave 192.168.200.155:8000 192.168.200.155 8000 @ master8000 192.168.200.153 8000
    1379:X 09 Jan 02:33:36.119 # +sdown slave 192.168.200.155:8000 192.168.200.155 8000 @ master8000 192.168.200.153 8000
    
    #查看sentinel信息
    [root@redis-master conf]# redis-cli -p 6800 info sentinel
    # Sentinel
    sentinel_masters:1
    sentinel_tilt:0
    sentinel_running_scripts:0
    sentinel_scripts_queue_length:0
    sentinel_simulate_failure_flags:0
    master0:name=master8000,status=ok,address=192.168.200.153:80  #切换192.168.200.153 为主了
    
    #启动 redis-master 然后再停掉 192.168.200.153 的 redis-server 
    [root@redis-slaveA ~]#  redis-cli -p 8000 shutdown
    
    #查看 sentinel 信息 
    [root@redis-master conf]# redis-cli -p 6800 info sentinel
    # Sentinel
    sentinel_masters:1
    sentinel_tilt:0
    sentinel_running_scripts:0
    sentinel_scripts_queue_length:0
    sentinel_simulate_failure_flags:0
    master0:name=master8000,status=ok,address=192.168.200.154:8000,slaves=2,sentinels=3  #恢复到192.168.200.154



  • 相关阅读:
    Echarts柱状图,颜色随机改变
    输入地名查询出经纬度
    简单的JS数组所有重复元素抽出到一个新数组
    zTree 树形中的搜索定位节点
    vue js 中简单的搜索功能
    百度地图,多边形覆盖物区域,加标签
    pyspider 介绍
    网站的免责声明应当如何撰写才能保护自己的权益
    sftp 设置默认权限
    【聚类算法】谱聚类(Spectral Clustering)
  • 原文地址:https://www.cnblogs.com/GokouRuri-zwq/p/10240781.html
Copyright © 2011-2022 走看看