3台服务器Redis高可用哨兵模式

@(学习)[redis, 高可用]

  • 3台服务器Redis高可用哨兵模式

    • 介绍
    • redis程序安装
    • 哨兵模式配置
      • 1 主redis配置
      • 2 从redis配置
    • 3 启动redis和哨兵
    • 总结

1. 介绍


Redis 的 Sentinel 系统用于管理多个 Redis 服务器(instance), 该系统执行以下三个任务:
监控(Monitoring): Sentinel 会不断地检查你的主服务器和从服务器是否运作正常。
提醒(Notification): 当被监控的某个 Redis 服务器出现问题时, Sentinel 可以通过 API 向管理员或者其他应用程序发送通知。
自动故障迁移(Automatic failover): 当一个主服务器不能正常工作时, Sentinel 会开始一次自动故障迁移操作, 它会将失效主服务器的其中一个从服务器升级为新的主服务器, 并让失效主服务器的其他从服务器改为复制新的主服务器; 当客户端试图连接失效的主服务器时, 集群也会向客户端返回新主服务器的地址, 使得集群可以使用新主服务器代替失效服务器。
Redis Sentinel 是一个分布式系统, 你可以在一个架构中运行多个 Sentinel 进程(progress), 这些进程使用流言协议(gossip protocols)来接收关于主服务器是否下线的信息, 并使用投票协议(agreement protocols)来决定是否执行自动故障迁移, 以及选择哪个从服务器作为新的主服务器。
虽然 Redis Sentinel 释出为一个单独的可执行文件 redis-sentinel , 但实际上它只是一个运行在特殊模式下的 Redis 服务器, 你可以在启动一个普通 Redis 服务器时通过给定 –sentinel 选项来启动 Redis Sentinel 。

环境
CentOS7.2
redis3.2.8

服务器IP redis端口 哨兵端口 服务器角色
10.1.0.160 6379 26379
10.1.0.161 6379 26379 从1
10.1.0.71 6379 26379 从2

2. redis程序安装

以下是单redis安装脚本,可适用于单redis使用。
cat install_redis.sh

#!/usr/bin/env bash
# It's Used to be install redis.
# Created on 2016/10/19 11:18.
# @author: Chinge_Yang.
# Version: 1.0function install_redis () {
#################################################################################################sourcepackage_dir="/tmp"redis_install_dir="/usr/local/redis"cd ${sourcepackage_dir}if [ ! -f " redis-stable.tar.gz" ]; thenwget http://download.redis.io/releases/redis-stable.tar.gzficd ${makework_dir}tar -zxvf ${sourcepackage_dir}/redis-stable.tar.gzcd redis-stablemake PREFIX=/usr/local/redis installreturn_echo "make"mkdir -p /usr/local/redis/{etc,var}rsync -avz redis.conf  /usr/local/redis/etc/sed -i 's@pidfile.*@pidfile /var/run/redis-server.pid@' $redis_install_dir/etc/redis.confsed -i "s@logfile.*@logfile $redis_install_dir/var/redis.log@" $redis_install_dir/etc/redis.confsed -i "s@^dir.*@dir $redis_install_dir/var@" $redis_install_dir/etc/redis.confsed -i 's/daemonize no/daemonize yes/g' /usr/local/redis/etc/redis.confsed -i 's/^# bind 127.0.0.1/bind 127.0.0.1/g' /usr/local/redis/etc/redis.confrsync -avz ${sourcepackage_dir}/init.d/redis-server /etc/init.d//etc/init.d/redis-server startchkconfig --add redis-serverchkconfig redis-server on#################################################################################################
}install_redis

redis启停脚本示例:
cat redis-server

#!/bin/bash
#
# redis - this script starts and stops the redis-server daemon
#
# chkconfig:   - 85 15
# description:  Redis is a persistent key-value database
# processname: redis-server
# config:      /usr/local/redis/etc/redis.conf
# config:      /etc/sysconfig/redis
# pidfile:     /usr/local/redis/var/redis-server.pid# Source function library.
. /etc/rc.d/init.d/functions# Source networking configuration.
. /etc/sysconfig/network# Check that networking is up.
[ "$NETWORKING" = "no" ] && exit 0redis="/usr/local/redis/bin/redis-server"
prog=$(basename $redis)REDIS_CONF_FILE="/usr/local/redis/etc/redis.conf"[ -f /etc/sysconfig/redis ] && . /etc/sysconfig/redislockfile=/var/lock/subsys/redis-serverstart() {[ -x $redis ] || exit 5[ -f $REDIS_CONF_FILE ] || exit 6echo -n $"Starting $prog: "daemon $redis $REDIS_CONF_FILEretval=$?echo[ $retval -eq 0 ] && touch $lockfilereturn $retval
}stop() {echo -n $"Stopping $prog: "killproc $prog retval=$?echo[ $retval -eq 0 ] && rm -f $lockfilereturn $retval
}restart() {stopstart
}reload() {echo -n $"Reloading $prog: "killproc $redis -HUPRETVAL=$?echo
}force_reload() {restart
}rh_status() {status $prog
}rh_status_q() {rh_status >/dev/null 2>&1
}case "$1" instart)rh_status_q && exit 0$1;;stop)rh_status_q || exit 0$1;;restart)$1;;reload)rh_status_q || exit 7$1;;force-reload)force_reload;;status)rh_status;;condrestart|try-restart)rh_status_q || exit 0;;*)echo $"Usage: $0 {start|stop|status|restart|condrestart|try-restart|reload|force-reload}"exit 2
esac

redis-sentinel启停脚本示例:

#!/bin/bash
#
# redis-sentinel - this script starts and stops the redis-server sentinel daemon
#
# chkconfig:   - 85 15
# description:  Redis sentinel
# processname: redis-server
# config:      /usr/local/redis/etc/sentinel.conf
# config:      /etc/sysconfig/redis
# pidfile:     /usr/local/redis/var/redis-sentinel.pid# Source function library.
. /etc/rc.d/init.d/functions# Source networking configuration.
. /etc/sysconfig/network# Check that networking is up.
[ "$NETWORKING" = "no" ] && exit 0redis="/usr/local/redis/bin/redis-sentinel"
prog=$(basename $redis)REDIS_CONF_FILE="/usr/local/redis/etc/sentinel.conf"[ -f /etc/sysconfig/redis ] && . /etc/sysconfig/redislockfile=/var/lock/subsys/redis-sentinelstart() {[ -x $redis ] || exit 5[ -f $REDIS_CONF_FILE ] || exit 6echo -n $"Starting $prog: "daemon $redis $REDIS_CONF_FILE --sentinelretval=$?echo[ $retval -eq 0 ] && touch $lockfilereturn $retval
}stop() {echo -n $"Stopping $prog: "killproc $prog retval=$?echo[ $retval -eq 0 ] && rm -f $lockfilereturn $retval
}restart() {stopstart
}reload() {echo -n $"Reloading $prog: "killproc $redis -HUPRETVAL=$?echo
}force_reload() {restart
}rh_status() {status $prog
}rh_status_q() {rh_status >/dev/null 2>&1
}case "$1" instart)rh_status_q && exit 0$1;;stop)rh_status_q || exit 0$1;;restart)$1;;reload)rh_status_q || exit 7$1;;force-reload)force_reload;;status)rh_status;;condrestart|try-restart)rh_status_q || exit 0;;*)echo $"Usage: $0 {start|stop|status|restart|condrestart|try-restart|reload|force-reload}"exit 2
esac

3. 哨兵模式配置

3台主机相同设置:
1. 按照前面单redis安装方法安装程序;
2. 创建相应数据目录;

mkdir -p /usr/local/redis/data/redis
mkdir -p /usr/local/redis/data/sentinel
mkdir -p /usr/local/redis/sbin
vim /usr/local/redis/sbin/redis-server  # 使用上文中的示例脚本
vim /usr/local/redis/sbin/redis-sentinel  # 使用上文中的示例脚本

3.1 主redis配置

vim redis.conf

daemonize yes
pidfile "/usr/local/redis/var/redis-server.pid"
port 6379
tcp-backlog 128
timeout 0
tcp-keepalive 0
loglevel notice
logfile "/usr/local/redis/var/redis-server.log"
databases 16
save 900 1
save 300 10
save 60 10000
stop-writes-on-bgsave-error yes
rdbcompression yes
rdbchecksum yes
dbfilename dump.rdb
dir "/usr/local/redis/data/redis"
masterauth "20170310"
requirepass "20170310"
slave-serve-stale-data yes
slave-read-only yes
repl-diskless-sync no
repl-diskless-sync-delay 5
repl-disable-tcp-nodelay no
slave-priority 100
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
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

群集文件配置
vim sentinel.conf

port 26379
pidfile "/usr/local/redis/var/redis-sentinel.pid"
dir "/usr/local/redis/data/sentinel"
daemonize yes
logfile "/usr/local/redis/var/redis-sentinel.log"
sentinel monitor mymaster 10.1.0.160 6379 2
sentinel parallel-syncs mymaster 2
sentinel auth-pass mymaster 20170310

3.2 从redis配置

相对主redis配置,多添加了如下行:

slaveof 10.1.0.160 6379

vim redis.conf

daemonize yes
pidfile "/usr/local/redis/var/redis-server.pid"
port 6379
tcp-backlog 128
timeout 0
tcp-keepalive 0
loglevel notice
logfile "/usr/local/redis/var/redis-server.log"
databases 16
save 900 1
save 300 10
save 60 10000
stop-writes-on-bgsave-error yes
rdbcompression yes
rdbchecksum yes
dbfilename dump.rdb
dir "/usr/local/redis/data/redis"
masterauth "20170310"
requirepass "20170310"
slaveof 10.1.0.160 6379
slave-serve-stale-data yes
slave-read-only yes
repl-diskless-sync no
repl-diskless-sync-delay 5
repl-disable-tcp-nodelay no
slave-priority 90
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
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

vim sentinel.conf

port 26379
pidfile "/usr/local/redis/var/redis-sentinel.pid"
dir "/usr/local/redis/data/sentinel"
daemonize yes
logfile "/usr/local/redis/var/redis-sentinel.log"
sentinel monitor mymaster 10.1.0.160 6379 2
sentinel config-epoch mymaster 0

3.3 启动redis和哨兵

启动redis,主从都要启动
/usr/local/redis/sbin/redis-server start
启动群集监控,主从都要启动
/usr/local/redis/sbin/redis-sentinel start

启动报错处理

错误1:
WARNING overcommit_memory is set to 0! Background save may fail under low memory condition. To fix this issue add 'vm.overcommit_memory = 1' to /etc/sysctl.conf and then reboot or run the command 'sysctl vm.overcommit_memory=1' for this to take effect.解决方法(overcommit_memory)
1. `vim /etc/sysctl.conf`添加如下设置 , 然后`sysctl -p`
"vm.overcommit_memory = 1"
可选值:0、1、2。0, 表示内核将检查是否有足够的可用内存供应用进程使用;如果有足够的可用内存,内存申请允许;否则,内存申请失败,并把错误返回给应用进程。
1, 表示内核允许分配所有的物理内存,而不管当前的内存状态如何。
2, 表示内核允许分配超过所有物理内存和交换空间总和的内存注意:redis在dump数据的时候,会fork出一个子进程,理论上child进程所占用的内存和parent是一样的,比如parent占用 的内存为8G,这个时候也要同样分配8G的内存给child,如果内存无法负担,往往会造成redis服务器的down机或者IO负载过高,效率下降。所 以这里比较优化的内存分配策略应该设置为 1(表示内核允许分配所有的物理内存,而不管当前的内存状态如何)。
这里又涉及到Overcommit和OOM。什么是Overcommit和OOM?
在Unix中,当一个用户进程使用malloc()函数申请内存时,假如返回值是NULL,则这个进程知道当前没有可用内存空间,就会做相应的处理工作。许多进程会打印错误信息并退出。
Linux使用另外一种处理方式,它对大部分申请内存的请求都回复"yes",以便能跑更多更大的程序。因为申请内存后,并不会马上使用内存。这种技术叫做Overcommit。
当内存不足时,会发生OOM killer(OOM=out-of-memory)。它会选择杀死一些进程(用户态进程,不是内核线程),以便释放内存。Overcommit的策略
Linux下overcommit有三种策略(Documentation/vm/overcommit-accounting):
0. 启发式策略。合理的overcommit会被接受,不合理的overcommit会被拒绝。
1. 任何overcommit都会被接受。
2. 当系统分配的内存超过swap+N%*物理RAM(N%由vm.overcommit_ratio决定)时,会拒绝commit。
overcommit的策略通过vm.overcommit_memory设置。
overcommit的百分比由vm.overcommit_ratio设置。# echo 2 > /proc/sys/vm/overcommit_memory
# echo 80 > /proc/sys/vm/overcommit_ratio当oom-killer发生时,linux会选择杀死哪些进程
选择进程的函数是oom_badness函数(在mm/oom_kill.c中),该函数会计算每个进程的点数(0~1000)。
点数越高,这个进程越有可能被杀死。
每个进程的点数跟oom_score_adj有关,而且oom_score_adj可以被设置(-1000最低,1000最高)。错误2:
WARNING: The TCP backlog setting of 511 cannot be enforced because /proc/sys/net/core/somaxconn is set to the lower value of 128.echo 511 > /proc/sys/net/core/somaxconn错误3:
16433:X 12 Jun 14:52:37.734 * Increased maximum number of open files to 10032 (it was originally set to 1024).新装的linux默认只有1024,当负载较大时,会经常出现error: too many open filesulimit -a:使用可以查看当前系统的所有限制值vim /etc/security/limits.conf
在文件的末尾加上* soft nofile 65535
* hard nofile 65535执行su或者重新关闭连接用户再执行ulimit -a就可以查看修改后的结果。 

故障切换机制

  1. 启动群集之后,群集程序默认会在主从的sentinel.conf文件中加入群集信息

主:

port 26379
pidfile "/usr/local/redis/var/redis-sentinel.pid"
dir "/usr/local/redis/data/sentinel"
daemonize yes
logfile "/usr/local/redis/var/redis-sentinel.log"
sentinel myid aeff525d03a2234ef834808f7991761db03a1973
sentinel monitor mymaster 10.1.0.160 6379 2
sentinel parallel-syncs mymaster 2
sentinel auth-pass mymaster 20170310
# Generated by CONFIG REWRITE
sentinel config-epoch mymaster 0
sentinel leader-epoch mymaster 0
sentinel known-slave mymaster 10.1.0.71 6379
sentinel known-slave mymaster 10.1.0.161 6379
sentinel current-epoch 0

从1:

port 26379
pidfile "/usr/local/redis/var/redis-sentinel.pid"
dir "/usr/local/redis/data/sentinel"
daemonize yes
logfile "/usr/local/redis/var/redis-sentinel.log"
sentinel myid 01b1b7674abe648f6a2344fc5610e73b7e87cb8a
sentinel monitor mymaster 10.1.0.160 6379 2
sentinel config-epoch mymaster 0
# Generated by CONFIG REWRITE
sentinel leader-epoch mymaster 0
sentinel current-epoch 0

从2:

port 26379
pidfile "/usr/local/redis/var/redis-sentinel.pid"
dir "/usr/local/redis/data/sentinel"
daemonize yes
logfile "/usr/local/redis/var/redis-sentinel.log"
sentinel myid f1589f48079b3b3b536add4e2e01a36304aeba8c
sentinel monitor mymaster 10.1.0.160 6379 2
sentinel config-epoch mymaster 0
# Generated by CONFIG REWRITE
sentinel leader-epoch mymaster 0
sentinel current-epoch 0

模拟主故障

[root@show160 redis]# /usr/local/redis/bin/redis-cli -p 6379
127.0.0.1:6379> AUTH 20170310
OK
127.0.0.1:6379> DEBUG SEGFAULT
Could not connect to Redis at 127.0.0.1:6379: Connection refused
not connected> quit

从哨兵配置文件中可以看到当前的主库的已经发生了改变

4. 总结

redis的哨兵端口26379使用redis-cli可以连接查看哨兵相关信息,要想连接此高可用redis,可使用官方的连接客户端。使用哨兵监控当主故障后会自动切换从为主,当主启动后就变成了从。至少要3哨兵和3redis节点才能允许挂一节点还能保证服务可用性。

参考资料:
https://redis.io/topics/sentinel
http://www.redis.cn/topics/sentinel.html
http://www.majunwei.com/view/201610302123020678.html

3台服务器Redis高可用哨兵模式相关推荐

  1. mysql哨兵模式_3台服务器Redis高可用哨兵模式实现

    1. 介绍 Redis 的 Sentinel 系统用于管理多个 Redis 服务器(instance), 该系统执行以下三个任务: 监控(Monitoring): Sentinel 会不断地检查你的主 ...

  2. Redis高可用哨兵Sentinel

    Redis的高可用哨兵Sentinel 什么是Sentinel 如何启动Sentinel服务 Sentinel状态与实例结构 工作流程 主观下线 客观下线 选举领头Sentinel 故障转移 什么是S ...

  3. redis经典三节点高可用哨兵模式集群搭建

    生产环境下,为保证redis的高可用性,通常会搭建集群,redis集群的好处无需多说,提升单节点的读写性能从而整体提升并发效率,达到整体QPS的提升,同时,多个节点可以实现数据共享,在集群模式下,从节 ...

  4. python redis 哨兵_Redis高可用哨兵机制及SpringBoot整合哨兵

    前言:在前面讲到了Redis分片机制可实现内存数据的扩容来提高执行速率---Redis分片机制,可是Redis分片依旧有一些问题,如果redis分片的节点如果有一个服务器宕机,则直接影响用户的使用.R ...

  5. Redis高可用:主从复制及哨兵模式

    目录 主从复制 作用 复制原理 使用的方式 哨兵模式 主从切换过程 Redis Sentinel的配置文件 参考 主从复制 主从复制,是指将一台Redis服务器的数据,复制到其他的Redis服务器.前 ...

  6. redis 高可用(持久化、主从复制、哨兵、集群)以及集群的三种模式

    Redis高可用定义 在web服务器中,高可用代表服务器可以正常访问的时间,一般使用百分比来衡量多长时间内可以提供正常服务 但是在redis中,高可用的定义还要更广泛一点,除了提供正常的服务(如主从分 ...

  7. Redis高可用——主从复制、哨兵模式、集群

    文章目录 一.Redis高可用 1.什么是高可用 2.Redis的高可用技术 二.Redis主从复制 1.Redis主从复制的作用 2.主从复制的流程 三.主从复制的搭建 实验准备 1.所有主机安装R ...

  8. Redis高可用方案:sentinel(哨兵模式)和集群

    一. redis高可用方案–sentinel(哨兵模式) 当我们搭建好redis主从复制方案后会发现一个问题,那就是当主服务器宕机后,需要手动把一台从服务器切换为主服务器,这就需要人工干预,费事费力, ...

  9. Redis高可用解决方案:sentinel(哨兵模式)和集群

    一. redis高可用方案–sentinel(哨兵模式) 当我们搭建好redis主从复制方案后会发现一个问题,那就是当主服务器宕机后,需要手动把一台从服务器切换为主服务器,这就需要人工干预,费事费力, ...

最新文章

  1. (原创)JS兼容性笔记(更新)
  2. TensorFlow下载文件到当前目录
  3. 商店购物java程序_java操纵数据库-商店购物管理系统
  4. 数据结构——顺序存储二叉树
  5. fiddler和wireshark工具介绍及对比 - [测试技术知识]
  6. JAVA_出神入化学习路线大纲
  7. 印象笔记编辑pdf_做笔记就用印象笔记,支持录音做笔记( 附插件下载)
  8. android文件添加一行代码怎么写,Android:以编程方式添加Textview,而不是将文本包装到下一行(示例代码)...
  9. URI,URL,URN
  10. 觉得自己目前还很菜。
  11. VS2015之博大精深的MFC项目开发(一)
  12. IT公司、软件公司资质
  13. Visual Studio2017 MSDN安装
  14. UOJ449. 【集训队作业2018】喂鸽子 [概率期望,min-max容斥,生成函数]
  15. 基于ETest的航电系统通用测试平台
  16. 黑苹果系统完全移植新硬盘
  17. 初中学历程序员面试被HR吐槽,初中学历还有要月薪3万5,到底是学历重要还是能力重要?...
  18. 4399知名游戏-赛尔号图鉴的爬取
  19. zblog php 安装,初级教程:如何安装zblog?zblog单文件安装教程 全程有图
  20. 免费!在线WORD转PDF的方法分享

热门文章

  1. python的起源简史和优点
  2. linux内核函数kmalloc,Linux内核内存分配函数之devm_kmalloc和devm_kzalloc
  3. [勇者闯LeetCode] 190. Reverse Bits
  4. 特征分解与奇异值分解:例子说明
  5. 协作与自我价值的关系
  6. 解决打开CentOS时出现Cannot connect virtual device ide1:0导致电脑重启蓝屏问题
  7. katalon 测试app_Katalon Studio一款免费的自动化测试工具
  8. 第一个显卡满了,导致不能用其他显卡的解决方案
  9. 一个不错的网站 各个人工智能任务的sota也就是 排名 state of the arts
  10. javaweb设计简易计算器