zoukankan      html  css  js  c++  java
  • 基于Sentinel实现redis主从自动切换

    Sentinel(哨兵)是用于监控redis集群中Master状态的工具,它可以实现对redis的监控、通知、自动故障转移。

    Sentinel作用:

    1. Master状态检测
    2. 当被监控的某个 Redis Master异常无法连接时 Sentinel 可以向系统管理员发送通知, 也可以通过 API 向其他程序发送通知,并且进行Master-Slave切换,将其中一个Slave作为Master,将之前的Master作为Slave
    3. Master-Slave切换后,master_redis.conf、slave_redis.conf和sentinel.conf的内容都会发生改变,即master_redis.conf中会多一行slaveof的配置,sentinel.conf的监控目标会随之调换。当应用程序连接Redis 服务器时, Redis Sentinel会告之新的主服务器地址和端口。

    Redis 主从部署:

     192.168.11.12:6379     master              
     192.168.11.12:6381     slave          
     192.168.11.13:6379    slave           
     192.168.11.13:6381    slave            
     192.168.11.14:6379    slave           
     192.168.11.14:6381    slave               
    

    Sentinel:

     192.168.11.12                 
     192.168.11.13           
     192.168.11.14               
    

    具体部署(简写)
    mkdir -p /opt/redis6379/{bin,etc,var,log}
    mkdir -p /opt/redis6381/{bin,etc,var,log}

     tar zxmf redis-2.8.19.tar.gz               
     cd redis-2.8.19               
     make             
     make PREFIX=/opt/redis6379 install     
     make PREFIX=/opt/redis6381 install            
    

    master config:

     cat redis6379.conf
     daemonize yes
     pidfile /opt/redis6379/redis6379.pid
     port 6379
     tcp-backlog 10240
     maxclients 10000
     bind 0.0.0.0
     timeout 0
     tcp-keepalive 0
     loglevel notice
     logfile /opt/redis6379/log/redis6379.log
     databases 16
     stop-writes-on-bgsave-error yes
     rdbcompression yes
     rdbchecksum yes
     dbfilename dump6379.rdb
     dir /export/redis6379/
     slave-priority 100
     maxmemory 2500mb
     maxmemory-policy allkeys-lru
     appendonly no
     appendfilename "appendonly01.aof"
     appendfsync everysec
     no-appendfsync-on-rewrite no
     auto-aof-rewrite-percentage 100
     auto-aof-rewrite-min-size 64mb
     aof-load-truncated yes
     lua-time-limit 5000
     slowlog-log-slower-than 10000
     slowlog-max-len 128
     latency-monitor-threshold 0
     notify-keyspace-events ""
     hash-max-ziplist-entries 512
     hash-max-ziplist-value 64
     list-max-ziplist-entries 512
     list-max-ziplist-value 64
     set-max-intset-entries 512
     zset-max-ziplist-entries 128
     zset-max-ziplist-value 64
     hll-sparse-max-bytes 3000
     activerehashing yes
     client-output-buffer-limit normal 0 0 0
     client-output-buffer-limit slave 256mb 64mb 60
     client-output-buffer-limit pubsub 32mb 8mb 60
     hz 10
     aof-rewrite-incremental-fsync yes
    

    slave config:

     cat redis6379.conf
     daemonize yes
     pidfile /opt/redis6379/redis6379.pid
     port 6379
     tcp-backlog 10240
     maxclients 10000
     bind 0.0.0.0
     timeout 0
     tcp-keepalive 0
     loglevel notice
     logfile /opt/redis6379/log/redis6379.log
     databases 16
     stop-writes-on-bgsave-error yes
     rdbcompression yes
     rdbchecksum yes
     dbfilename dump6379.rdb
     dir /export/redis6379/
     slave-priority 100
     slave-serve-stale-data yes
     slave-read-only yes
     slave-priority 100
     slaveof 192.168.11.12 6379
     maxmemory 2500mb
     maxmemory-policy allkeys-lru
     appendonly no
     appendfilename "appendonly01.aof"
     appendfsync everysec
     no-appendfsync-on-rewrite no
     auto-aof-rewrite-percentage 100
     auto-aof-rewrite-min-size 64mb
     aof-load-truncated yes
     lua-time-limit 5000
     slowlog-log-slower-than 10000
     slowlog-max-len 128
     latency-monitor-threshold 0
     notify-keyspace-events ""
     save 900 1
     save 300 100
     save 60 10000
     hash-max-ziplist-entries 512
     hash-max-ziplist-value 64
     list-max-ziplist-entries 512
     list-max-ziplist-value 64
     set-max-intset-entries 512
     zset-max-ziplist-entries 128
     zset-max-ziplist-value 64
     hll-sparse-max-bytes 3000
     activerehashing yes
     client-output-buffer-limit normal 0 0 0
     client-output-buffer-limit slave 256mb 64mb 60
     client-output-buffer-limit pubsub 32mb 8mb 60
     hz 10
     aof-rewrite-incremental-fsync yes
    

    启动:

     /opt/redis6379/bin/redis-server /opt/redis6379/etc/redis6379.conf 
    
     /opt/redis6381/bin/redis-server /opt/redis6381/etc/redis6381.conf  
    
     # ps aux | grep redis
     root       6379  0.2  0.7 137368  7520 ?        Ssl  08:19   0:00 /opt/redis6379/bin/redis-server 0.0.0.0:6379                     
     root       6457  0.1  0.7 137368  7504 ?        Ssl  08:19   0:00 /opt/redis6381/bin/redis-server 0.0.0.0:6381    
    

    查看主从状态:

     # /opt/redis6379/bin/redis-cli -h 127.0.0.1 -p 6379 INFO Replication
     # Replication
     role:master
     connected_slaves:5
     slave0:ip=192.168.11.12,port=6381,state=online,offset=449,lag=1
     slave2:ip=192.168.11.13,port=6379,state=online,offset=449,lag=1
     slave4:ip=192.168.11.13,port=6381,state=online,offset=449,lag=1
     slave2:ip=192.168.11.14,port=6379,state=online,offset=449,lag=1
     slave4:ip=192.168.11.14,port=6381,state=online,offset=449,lag=1
     master_repl_offset:449
     repl_backlog_active:1
     repl_backlog_size:1048576
     repl_backlog_first_byte_offset:2
     repl_backlog_histlen:448
    

    查看同步:

     192.168.11.12:6379
     127.0.0.1:6379> set aa 123
     OK
    
     192.168.11.13:6379
     127.0.0.1:6379> get aa
     "123"
    
     192.168.11.14:6381
     127.0.0.1:6381> get aa
     "123"
    

    数据以同步

    配置sentinel:

     mkdir -p /opt/redis6379/sentinel
    

    sentinel.conf:

     port 26379
     dir "/opt/redis6379/sentinel"
     sentinel monitor master 192.168.11.12 6379 2
     sentinel down-after-milliseconds master 60000
     sentinel config-epoch master 1
     sentinel leader-epoch master 1
     sentinel known-slave master 192.168.11.12 6381
     sentinel known-slave master 192.168.11.14 6381
     # Generated by CONFIG REWRITE
     sentinel known-slave master 192.168.11.112 6379
     sentinel known-slave master 192.168.11.112 6381
     sentinel known-slave master 192.168.11.14 6379
     sentinel known-sentinel master 192.168.11.112 26379 459b949dd141a301f93d764d92bb04af9450870b
     sentinel known-sentinel master 192.168.11.14 26379 9638d9c07c83c8cf6b3cac0b419867d9a4eeb17c
     sentinel current-epoch 1
    

    说明:
    port 监听端口
    dir Sentinel服务运行时使用的临时文件夹
    sentinel monitor master IP 端口 x 监控的 redis master ip 端口 判断为失效至少需要2个 Sentinel进程的同意,只要同意Sentinel的数量不达标,自动failover就不会执行

    一下配置启动之后无法看到
    sentinel failover-timeout master 180000 : 如果在该时间(ms)内未能完成failover操作,则认为该failover失败
    sentinel parallel-syncs master 1:指定了在执行故障转移时,最多可以有多少个从Redis实例在同步新的主实例,在从Redis实例较多的情况下这个数字越小,同步的时间越长,完成故障转移所需的时间就越长

    启动 redis-sentinel :

     /opt/redis6379/bin/redis-sentinel /opt/redis6379/sentinel/sentinel.conf  2>&1 /opt/redis6379/sentinel.log &
    

    模拟故障:

     192.168.11.12:6379
     /opt/redis6379/bin/redis-cli -h 127.0.0.1 -p 6379 shutdown    
    

    查看:

     192.168.11.12:6381
     /opt/redis6379/bin/redis-cli -h 127.0.0.1 -p 6381 info Replication
     # Replication
     role:slave
     master_host:192.168.11.14
     master_port:6381
     master_link_status:up
     master_last_io_seconds_ago:0
     master_sync_in_progress:0
     slave_repl_offset:4265
     slave_priority:100
     slave_read_only:1
     connected_slaves:0
     master_repl_offset:0
     repl_backlog_active:0
     repl_backlog_size:1048576
     repl_backlog_first_byte_offset:0
     repl_backlog_histlen:0
    

    master 已经主观转移

  • 相关阅读:
    php生成随机颜色代码
    终于完成了 源码 编译lnmp环境
    json_encode 中文 null
    push is not a function
    linux 搭建svn 服务器
    samba 挂载windows共享文件夹
    php 加密 解密 方法
    serialize unserialize
    CentOS Linux解决Device eth0 does not seem to be present 但是没有发现eth1
    javascript 获取视口的高度和宽度
  • 原文地址:https://www.cnblogs.com/iteemo/p/5074781.html
Copyright © 2011-2022 走看看