​ 基于Sentinel实现redis主从自动切换

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

Sentinel作用:

  1. Master状态检测

  2. 当被监控的某个 Redis Master异常无法连接时 Sentinel 可以向系统管理员发送通知, 也可以通过 API 向其他程序发送通知,并且进行Master-Slave切换,将其中一个Slave作为Master,将之前的Master作为Slave

  3. Master-Slave切换后,masterredis.conf、slaveredis.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 已经主观转移

本文进行简单的sentinel测试 
后面进行redis参数优化讲解以及测试线上master方案 
twemproxy 
codis 
redis cluster

原创文章,作者:可乐,如若转载,请注明出处:http://www.178linux.com/10499

(0)
可乐可乐
上一篇 2016-02-14
下一篇 2016-02-14

相关推荐

  • 搭建基于http的本地yum源服务器

    概述 yum相较于rpm,能够更好地解决安装软件时的依赖包问题,使用yum安装更简单更方便。搭建本地YUM源服务器,可以避免升级安装软件时占用公网带宽;有了本地YUM源服务器,可以解决无法连接Internet的其他YUM客户端的软件升级和安装。 本文主要介绍了以下内容: 通过编译Apache源码包安装httpd服务; 搭建基于HTTP的yum源服务器; 将I…

    Linux干货 2016-08-24
  • Python装饰器与面向切面编程

    新年好~ 那么,很久没有更新了,其实想想也没多少可以写的,因为Python的文档似乎很全面的说……能做的差不多只有翻译和整理了,英文过关的朋友不妨直接去doc.python.org这里查看相关资料 :) 转载请注明原作者和原文地址,多谢! 今天来讨论一下装饰器。装饰器是一个很著名的设计模式,经常被用于有切面需求的场景,较为经典的有插入日志、性能测试、事务处理…

    Linux干货 2015-03-12
  • linux命令格式,获取帮助及其目录结构简要理解

    我们都知道,一台计算机要是没通电,和一堆废铁没什么区别。那么,通电开机进入系统后,会进入交互界面,等待用户操作,人与计算机交互界面有两种: GUI:图形用户接口。如我们平时使用的Windows  ,linux的X window,有KDE和GOME.   CLI:命令行接口,使用的SHELL类型有bash ,csh,tcshell,zshell等。 …

    2017-09-14
  • CentOS7 Local yum的一次报错信息

    说明:今天在火车上测试一个CentOS7下的一个服务,要用到yum配置,但是本机没有联网,所以考虑到配置本地yum,按照之前CentOS6下的常规方法,居然发现有报错。 操作如下: 1)虚拟机下将CentOS7光盘加载到系统里面,然后挂载到本地的/localyum上 [root@localhost yum.repos.d]# mount&…

    Linux干货 2016-07-16
  • Mozart的剑(文本处理工具)——壹剑(文本查看cat、more、less)

    壹剑(文本查看cat、more、less) 博客之前突然想起两句话,很有意思的话,在此贴出上句,希望可以与大家分享,不可问度娘,有兴趣的可以试试。 上句:烟锁池塘柳    下句: 上句:因荷而得藕    下句: 1>cat命令是Linux系统下的一个文本输出命令,一般是用于观看某个文件的内容,特点:一次性显示整个…

    2017-07-29
  • quota AND raid

    1.磁盘配额 将home目录独立出来单独的分区,限制用户的使用。 (1)先创建分区,如下图的分区sda6 (2)命令同步系统的新增加分区:partx –a /dev/sda (3)命令格式化新分区:     (4)把创建的设备挂载到/mnt/home下    (5)迁移数据,移动之前要确保home分区没有使用。权限是保…

    Linux干货 2016-09-19

评论列表(1条)

  • stanley
    stanley 2016-02-14 10:23

    样式略乱,内容详尽