三、Redis高可用(主从+sintinel+自定义脚本) - 简书

标签: | 发表时间:2018-09-24 08:58 | 作者:
出处:https://www.jianshu.com

一、 master 配置

      # 网络设置
port 6379
bind 0.0.0.0
protected-mode yes
tcp-backlog 511
unixsocket "/usr/local/redis-3.2.9/log/6379.sock"
unixsocketperm 700
timeout 100
tcp-keepalive 300

# 通用参数
daemonize yes
pidfile "/usr/local/redis-3.2.9/log/6379.pid"
loglevel notice
logfile "/usr/local/redis-3.2.9/log/6379.log"


# 持久化
save 900 1
save 300 10
save 60 10000
stop-writes-on-bgsave-error yes
rdbcompression yes
rdbchecksum yes
dbfilename "dump6379.rdb"
dir "/usr/local/redis-3.2.9/data"

# 复制
#slaveof
masterauth "yantao"
slave-serve-stale-data yes
slave-read-only no
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 3
min-slaves-max-lag 10


# 当该slave提升为master时,连接需要密码
requirepass "yantao"


# limit
maxclients 10000
maxmemory 100000
maxmemory-policy noeviction 
maxmemory-samples 5

appendonly yes
appendfilename "appendonly.aof"
appendfsync everysec
no-appendfsync-on-rewrite no
auto-aof-rewrite-percentage 100
auto-aof-rewrite-min-size 64mb
aof-load-truncated yes

二、slave 配置,两台相同

      # 网络设置
port 6379
bind 0.0.0.0
protected-mode yes
tcp-backlog 511
unixsocket "/usr/local/redis-3.2.9/log/6379.sock"
unixsocketperm 700
timeout 100
tcp-keepalive 300

# 通用参数
daemonize yes
pidfile "/usr/local/redis-3.2.9/log/6379.pid"
loglevel notice
logfile "/usr/local/redis-3.2.9/log/6379.log"


# 持久化
save 900 1
save 300 10
save 60 10000
stop-writes-on-bgsave-error yes
rdbcompression yes
rdbchecksum yes
dbfilename "dump6379.rdb"
dir "/usr/local/redis-3.2.9/data"

# 复制
slaveof 172.16.7.190 6379
masterauth "yantao"
slave-serve-stale-data yes
slave-read-only no
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 3
min-slaves-max-lag 10


# 当该slave提升为master时,连接需要密码
requirepass "yantao"


# limit
maxclients 10000
maxmemory 100000
maxmemory-policy noeviction 
maxmemory-samples 5

appendonly yes
appendfilename "appendonly.aof"
appendfsync everysec
no-appendfsync-on-rewrite no
auto-aof-rewrite-percentage 100
auto-aof-rewrite-min-size 64mb
aof-load-truncated yes

三、启动所有redis server,查看master复制信息

      [root@master conf]# redis-cli -a yantao info replication
# Replication
role:master
connected_slaves:2
min_slaves_good_slaves:2
slave0:ip=172.16.7.191,port=6379,state=online,offset=127,lag=0
slave1:ip=172.16.7.192,port=6379,state=online,offset=127,lag=1
master_repl_offset:127
repl_backlog_active:1
repl_backlog_size:1048576
repl_backlog_first_byte_offset:2
repl_backlog_histlen:126

四、sentinel 配置。三台配置相同

      protected-mode no

port 10000
dir "/usr/local/redis-3.2.9/conf"
daemonize yes
logfile "/usr/local/redis-3.2.9/log/sentinel.log"

sentinel monitor redis_master 172.16.7.190 6379 2
sentinel auth-pass redis_master yantao
sentinel down-after-milliseconds redis_master 30000
sentinel failover-timeout redis_master 180000
sentinel parallel-syncs redis_master 2

注意: sentinel 启动后,会重写 sentinel.conf。 主要是增加了slave信息

五、停掉redis master 进行测试

停掉master 后,查看日志信息。

      14584:X 28 Jun 16:11:14.628 # +sdown master redis_master 172.16.7.190 6379
14584:X 28 Jun 16:11:14.704 # +new-epoch 1
14584:X 28 Jun 16:11:14.707 # +vote-for-leader 9f0be631296015d8238f06e2a8cccb04e1a237c8 1
14584:X 28 Jun 16:11:15.345 # +config-update-from sentinel 9f0be631296015d8238f06e2a8cccb04e1a237c8 172.16.7.191 10000 @ redis_master 172.16.7.190 6379
14584:X 28 Jun 16:11:15.345 # +switch-master redis_master 172.16.7.190 6379 172.16.7.192 6379
14584:X 28 Jun 16:11:15.346 * +slave slave 172.16.7.191:6379 172.16.7.191 6379 @ redis_master 172.16.7.192 6379
14584:X 28 Jun 16:11:15.346 * +slave slave 172.16.7.190:6379 172.16.7.190 6379 @ redis_master 172.16.7.192 6379
14584:X 28 Jun 16:11:45.399 # +sdown slave 172.16.7.190:6379 172.16.7.190 6379 @ redis_master 172.16.7.192 6379

从日志中可以看到, redis master 由之前的 172.16.7.190 切换到了 172.16.7.192

  • 在slave2 上查看 复制信息
      [root@slave2 conf]# redis-cli -a yantao info replication
# Replication
role:master
connected_slaves:1
min_slaves_good_slaves:1
slave0:ip=172.16.7.191,port=6379,state=online,offset=28806,lag=1
master_repl_offset:28949
repl_backlog_active:1
repl_backlog_size:1048576
repl_backlog_first_byte_offset:2
repl_backlog_histlen:28948
  • 在slave2 上查看sentinel信息
      [root@slave2 conf]# redis-cli -p 10000 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=redis_master,status=ok,address=172.16.7.192:6379,slaves=2,sentinels=3
  • 启动190上的redis,然后在 slave2上查看复制信息, 发现 190 也成为了192的slave
      [root@slave2 conf]# redis-cli -a yantao info replication
# Replication
role:master
connected_slaves:2
min_slaves_good_slaves:2
slave0:ip=172.16.7.191,port=6379,state=online,offset=49561,lag=0
slave1:ip=172.16.7.190,port=6379,state=online,offset=49561,lag=1
master_repl_offset:49704
repl_backlog_active:1
repl_backlog_size:1048576
repl_backlog_first_byte_offset:2
repl_backlog_histlen:49703

查看每天服务的redis配置文件

      [root@master conf]# cat 6379.conf | grep slaveof
#slaveof ""
slaveof 172.16.7.192 6379

[root@slave1 conf]#  cat 6379.conf | grep slaveof
slaveof 172.16.7.192 6379

[root@slave2 conf]# cat 6379.conf | grep slaveof
[root@slave2 conf]#

可以看出。redis的配置文件中的slaveof 指令也发生了变化。同样的,sentinel 也有类似的变化。

六、 配置监控脚本

在sentinel.conf中加入脚本定义

      sentinel notification-script redis_master /usr/local/redis-3.2.9/bin/notify.sh
sentinel client-reconfig-script redis_master /usr/local/redis-3.2.9/bin/reconfig.sh

那么完整的sentinel配置就是:

      protected-mode no

port 10000
dir "/usr/local/redis-3.2.9/conf"
daemonize yes
logfile "/usr/local/redis-3.2.9/log/sentinel.log"

sentinel monitor redis_master 172.16.7.190 6379 2
sentinel auth-pass redis_master yantao
sentinel down-after-milliseconds redis_master 30000
sentinel failover-timeout redis_master 180000
sentinel parallel-syncs redis_master 2
sentinel notification-script redis_master /usr/local/redis-3.2.9/bin/notify.sh
sentinel client-reconfig-script redis_master /usr/local/redis-3.2.9/bin/reconfig.sh
  • notify.sh
      [root@slave1 conf]# cat ../bin/notify.sh 
#!/bin/bash

DIR="/usr/local/redis-3.2.9"
echo "master failovered at `date`" >> $DIR/log/redis_issues.log
  • reconfig.sh
      [root@slave1 conf]# cat ../bin/reconfig.sh 
#!/bin/bash

#redis parament
# <master-name> <role> <state> <from-ip> <from-port> <to-ip> <to-port>


DIR="/usr/local/redis-3.2.9"
mastername=$1
role=$2
state=$3
from_ip=$4
from_port=$5
to_ip=$6
to_port=$7

echo -e "`date`    mastername: $mastername    role: $role    state: $state    from_ip: $from_ip    from_port: $from_port    to_ip: $to_ip    to_port: $to_port" >> $DIR/log/redis_issues.log

建议先停掉sentinel,再进行配置,再重启。

现在停掉slave2上的redis master。然后会进行故障迁移。我们看看 我们定义的脚本打印出来的东西

      [root@slave2 log]# cat redis_issues.log 
master failovered at Wed Jun 28 17:03:09 CST 2017
master failovered at Wed Jun 28 17:04:40 CST 2017
master failovered at Wed Jun 28 17:04:40 CST 2017
master failovered at Wed Jun 28 17:04:40 CST 2017
master failovered at Wed Jun 28 17:04:40 CST 2017
master failovered at Wed Jun 28 17:04:40 CST 2017
Wed Jun 28 17:04:40 CST 2017    mastername: redis_master    role: observer    state: start    from_ip: 172.16.7.192    from_port: 6379    to_ip: 172.16.7.190    to_port: 6379
master failovered at Wed Jun 28 17:05:10 CST 2017

重点看下这句:

      Wed Jun 28 17:04:40 CST 2017    mastername: redis_master    role: observer    state: start    from_ip: 172.16.7.192    from_port: 6379    to_ip: 172.16.7.190    to_port: 6379

可以看到,在进行故障迁移时, sentinel 会给自定义的脚本传入相关参数的。
<master-name> 表示 master名字
<role> 表示的是 每个redis实力的角色,如leader、observer
<state> 表示状态
<from-ip> 原来的redis master
<from-port>
<to-ip> 故障迁移后的redis master
<to-port>

相关 [redis sintinel 定义] 推荐:

三、Redis高可用(主从+sintinel+自定义脚本) - 简书

- -
二、slave 配置,两台相同. 三、启动所有redis server,查看master复制信息. 注意: sentinel 启动后,会重写 sentinel.conf. 五、停掉redis master 进行测试. 停掉master 后,查看日志信息. 从日志中可以看到, redis master 由之前的 172.16.7.190 切换到了 172.16.7.192.

Redis 负载监控——redis-monitor

- - ITeye资讯频道
redis-monitor是一个Web可视化的 redis 监控程序. 使用 Flask 来开发的,代码结构非常简单,适合移植到公司内网使用. redis 服务器信息,包括 redis 版本、上线时间、 os 系统信息等等. 实时的消息处理信息,例如处理 command 数量、连接总数量等. 内存占用、 cpu 消耗实时动态图表.

Redis 起步

- - 博客园_首页
Rdis和JQuery一样是纯粹为应用而产生的,这里记录的是在CentOS 5.7上学习入门文章:. Redis是一个key-value存储系统. 和Memcached类似,但是解决了断电后数据完全丢失的情况,而且她支持更多无化的value类型,除了和string外,还支持lists(链表)、sets(集合)和zsets(有序集合)几种数据类型.

redis 配置

- - 谁主沉浮
# 当配置中需要配置内存大小时,可以使用 1k, 5GB, 4M 等类似的格式,其转换方式如下(不区分大小写). # 内存配置大小写是一样的.比如 1gb 1Gb 1GB 1gB. # daemonize no 默认情况下,redis不是在后台运行的,如果需要在后台运行,把该项的值更改为yes. # 当redis在后台运行的时候,Redis默认会把pid文件放在/var/run/redis.pid,你可以配置到其他地址.

Cassandra代替Redis?

- - Tim[后端技术]
最近用Cassandra的又逐渐多了,除了之前的360案例,在月初的QCon Shanghai 2013 篱笆网也介绍了其使用案例. 而这篇 百万用户时尚分享网站feed系统扩展实践文章则提到了Fashiolista和Instagram从Redis迁移到Cassandra的案例. 考虑到到目前仍然有不少网友在讨论Redis的用法问题,Redis是一个数据库、内存、还是Key value store?以及Redis和memcache在实际场景的抉择问题,因此简单谈下相关区别.

redis 部署

- - CSDN博客云计算推荐文章
一、单机部署 tar xvf redis-2.6.16.tar.gz cd redis-2.6.16 make make PREFIX=/usr/local/redis install  #指定安装目录为/usr/local/redis,默认安装安装到/usr/local/bin. # chkconfig: 2345 80 10       #添加redhat系列操作系统平台,开机启动需求项(运行级别,开机时服务启动顺序、关机时服务关闭顺序) # description:  Starts, stops redis server.

nagios 监控redis

- - C1G军火库
下载check_redis.pl. OK: REDIS 2.6.12 on 192.168.0.130:6379 has 1 databases (db0) with 49801 keys, up 3 days 14 hours - connected_clients is 1, blocked_clients is 0 | connected_clients=1 blocked_clients=0.

转 redis vs memcached

- - 数据库 - ITeye博客
传统MySQL+ Memcached架构遇到的问题.   实际MySQL是适合进行海量数据存储的,通过Memcached将热点数据加载到cache,加速访问,很多公司都曾经使用过这样的架构,但随着业务数据量的不断增加,和访问量的持续增长,我们遇到了很多问题:.   1.MySQL需要不断进行拆库拆表,Memcached也需不断跟着扩容,扩容和维护工作占据大量开发时间.

Redis优化

- - 数据库 - ITeye博客
键名:尽量精简,但是也不能单纯为了节约空间而使用不易理解的键名. 键值:对于键值的数量固定的话可以使用0和1这样的数字来表示,(例如:male/female、right/wrong). 当业务场景不需要数据持久化时,关闭所有的持久化方式可以获得最佳的性能,不过一般都要持久化比较安全,而且是快照和aof同时使用比较安全.

笔记--redis

- - 移动开发 - ITeye博客
接着准备面试内容,今天学习了下redis,继续我的笔记加深印象. 1.为什么要使用redis.  答:主要是 性能和 并发两个方面,另外redis也可以做分布式锁和消息队列等其他功能. 但是如果只是为了分布式锁这些其他功能,完全还有其他中间件(如zookpeer等)代替,并不是非要使用redis.