设为首页 收藏本站
查看: 3225|回复: 0

[经验分享] Redis+Keeplived实现高可用

[复制链接]

尚未签到

发表于 2018-11-3 13:24:07 | 显示全部楼层 |阅读模式
  博文说明【前言】:
  本文将通过个人口吻介绍Redis+Keeplived实现高可用的相关知识,在目前时间点【2017年6月23号】下,所掌握的技术水平有限,可能会存在不少知识理解不够深入或全面,望大家指出问题共同交流,在后续工作及学习中如发现本文内容与实际情况有所偏差,将会完善该博文内容。
  本文为我编写的部署文档(word格式)中关于redis部分的内容复制粘贴而来,因此会存在一些格式问题,因不影响阅读和理解,也没有改的必要了,这样反而便于大家慢下来理解。发表此处,一来是有方便自己查看,二来是给广大网友参考,谢谢大家阅读。
  正文:
  Redis配置信息
  Redis部署使用两台服务器,实现Redis+keepalived,提供redis服务高可用,当主redis进程或服务器宕机之后,备redis进程或服务器继续提供服务。
  服务器配置信息如下所示:
  主机名/IP
  端口
  用途
  JZSHPT-APP5/
  10.133.214.15
  6379
  Redis主服务器-master
  JZSHPT-APP6/
  10.133.214.16
  6379
  Redis从服务器-salve
  一:Redis主服务器搭建-redis-master
1、安装redis
  JZSHPT-APP5:/soft # tar -zxf redis-3.2.1.tar.gz  -C /usr/local
  JZSHPT-APP5:/soft # cd /usr/local/redis-3.2.1/
  JZSHPT-APP5:/usr/local/redis-3.2.1 # make
  JZSHPT-APP5:/usr/local/redis-3.2.1 # cd src &&make install
  JZSHPT-APP5:/usr/local # mv /usr/local/redis-3.2.1/ /usr/local/redis
  1)redis配置文件修改
  JZSHPT-APP5:/usr/local# vim /usr/local/redis/redis.conf
  修改文件相关内容为:
  #bind 127.0.0.1
  protected-mode no
  port 6379
  daemonizeyes
  pidfile/usr/local/redis/redis.pid
  logfile"/usr/local/redis/redis.log"
  dbfilename dump6379.rdb
  dir /usr/local/redis/
  2)redis启动脚本编写
  JZSHPT-APP5:/usr/local/redis# vim /etc/init.d/redisd
  #!/bin/sh
  #chkconfig345 86 14
  #descriptionStartup and Shutdown script for Redis-3.2.1
  progdir=/usr/local/redis/src
  progname=redis-server
  daemon=$progdir/$progname
  config=/usr/local/redis/redis.conf
  pidfile=/usr/local/redis/redis.pid
  desc="redisdaemon"
  scriptname=/etc/init.d/redisd
  start()
  {
  if test -x $daemon;
  then
  echo -e "Starting$desc:$progname"
  if $daemon $config
  then
  echo -e "Start OK!!!"
  else
  echo -e "Startfailed!!!"
  fi
  else
  echo -e "Couldn't find RedisServer($daemon)"
  fi
  }
  stop()
  {
  if test -e $pidfile;
  then
  echo -e "Stopping$desc:$progname"
  if kill `cat $pidfile`
  then
  echo -e "stop OK!!!"
  else
  echo -e "Stop failed!!!"
  fi
  else
  echo -e "No Redis Server($daemoon)running"
  fi
  }
  restart()
  {
  echo -e "Restarting$desc:$progname"
  stop
  start
  }
  status()
  {
  ps aux | grep $progname
  }
  case$1 in
  start)
  start
  ;;
  stop)
  stop
  ;;
  restart)
  restart
  ;;
  status)
  status
  ;;
  *)
  echo"Usage:$scriptnme{start|stop|restart|status}" >&2
  exit 1
  ;;
  esac
  exit0
  JZSHPT-APP5:/usr/local/redis #chmod +x /etc/init.d/redisd
  JZSHPT-APP5:/usr/local/redis #chkconfig --add redisd
2、安装Keepalived
  安装keepalived前请自行安装解决依赖关系(可能会涉及的软件包为libopenssl-devel、zlib-devel、ipvsadm内核模块等)
  JZSHPT-APP5:/soft # tar -zxf keepalived-1.2.23.tar.gz
  JZSHPT-APP5:/soft # cd keepalived-1.2.23/
  JZSHPT-APP5:/soft/keepalived-1.2.23 # ./configure--prefix=/usr/local/keepalived/
  JZSHPT-APP5:/soft/keepalived-1.2.23 # make &&make install
  1)keepalived配置文件编辑
  JZSHPT-APP5:~# mkdir -p /etc/keepalived/{scripts,log}
  JZSHPT-APP5:~ # vim /usr/local/keepalived/etc/keepalived/
  ! Configuration File for keepalived
  global_defs {
  router_idRedis1_DEVEL
  }
  vrrp_script chk_redis {
  script"/etc/keepalived/scripts/redis_check.sh"
  interval2
  timeout2
  fall 3
  }
  vrrp_instance VI_1 {
  stateMASTER
  interfaceeth0
  virtual_router_id 51
  nopreempt
  priority200
  advert_int5
  authentication {
  auth_typePASS
  auth_pass redis
  }
  virtual_ipaddress {
  10.133.214.50
  }
  track_script {
  chk_redis
  }
  notify_master /etc/keepalived/scripts/redis_master.sh
  notify_backup /etc/keepalived/scripts/redis_backup.sh
  notify_fault  /etc/keepalived/scripts/redis_fault.sh
  notify_stop  /etc/keepalived/scripts/redis_stop.sh
  }
  2)keepalived启动脚本配置
  JZSHPT-APP5:~ # cp /soft/keepalived-1.2.23/keepalived/etc/init.d/keepalived.suse.init/etc/init.d/keepalived.suse
  JZSHPT-APP5:~ # cp/usr/local/keepalived/sbin/keepalived /usr/local/sbin/
  JZSHPT-APP5:~ # cp /usr/local/keepalived/etc/keepalived/keepalived.conf/etc/keepalived/
  3)定义监控脚本
  JZSHPT-APP5:~ # vim/etc/keepalived/scripts/redis_check.sh
  #!/bin/sh
  ###/etc/keepalived/scripts/redis_check.sh
  ALIVE=`/usr/local/bin/redis-cli PING`
  if [ "$ALIVE" == "PONG" ]; then
  echo $ALIVE
  exit 0
  else
  echo $ALIVE
  exit 1
  fi
  4)定义状态切换为master时执行的脚本
  JZSHPT-APP5:~ # vim/etc/keepalived/scripts/redis_master.sh
  #!/bin/sh
  ###/etc/keepalived/scripts/redis_master.sh
  REDISCLI="redis-cli"
  LOGFILE="/etc/keepalived/log/redis-state.log"
  pid=$$
  echo "`date +'%Y-%m-%d:%H:%M:%S'`|$pid|state:[slaver]">> $LOGFILE
  echo "`date +'%Y-%m-%d:%H:%M:%S'`|$pid|state:[slaver]Run 'SLAVEOF 10.133.214.16 6379'" >> $LOGFILE
  $REDISCLI SLAVEOF 10.133.214.16 6379 >>$LOGFILE  2>&1
  echo "`date+'%Y-%m-%d:%H:%M:%S'`|$pid|state:[slaver] wait 10 sec for data sync from oldmaster" >> $LOGFILE
  sleep 10
  echo "`date+'%Y-%m-%d:%H:%M:%S'`|$pid|state:[slaver] data rsync from old mater ok...">> $LOGFILE
  echo "`date+'%Y-%m-%d:%H:%M:%S'`|$pid|state:[master] Run slaveof no one,close master/slave">> $LOGFILE
  $REDISCLI SLAVEOF NO ONE >> $LOGFILE 2>&1
  echo "`date+'%Y-%m-%d:%H:%M:%S'`|$pid|state:[master] wait other slave connect....">> $LOGFILE
  5)定义状态切换为backups时执行的脚本
  JZSHPT-APP5:~ # vim/etc/keepalived/scripts/redis_backup.sh
  #!/bin/bash
  ###/etc/keepalived/scripts/redis_backup.sh
  REDISCLI="redis-cli"
  LOGFILE="/etc/keepalived/log/redis-state.log"
  pid=$$
  echo "`date+'%Y-%m-%d:%H:%M:%S'`|$pid|state:[master]" >> $LOGFILE
  echo "`date+'%Y-%m-%d:%H:%M:%S'`|$pid|state:[master] Being slave state..." >> $LOGFILE2>&1
  echo "`date+'%Y-%m-%d:%H:%M:%S'`|$pid|state:[master] wait 10 sec for data sync from oldmaster" >> $LOGFILE
  sleep 10
  echo "`date+'%Y-%m-%d:%H:%M:%S'`|$pid|state:[master] data rsync from old mater ok...">> $LOGFILE
  echo "`date +'%Y-%m-%d:%H:%M:%S'`|$pid|state:[slaver]Run 'SLAVEOF 10.133.214.16 6379'" >> $LOGFILE
  $REDISCLI SLAVEOF 10.133.214.16 6379 >>$LOGFILE  2>&1
  echo "`date+'%Y-%m-%d:%H:%M:%S'`|$pid|state:[slaver] slave connect to 192.18.3.21ok..." >> $LOGFILE
  6) 定义状态切换为stop时执行的脚本
  JZSHPT-APP5:~ # cp/etc/keepalived/scripts/redis_backup.sh /etc/keepalived/scripts/redis_stop.sh
  7) 定义状态切换为fault时执行的脚本
  JZSHPT-APP5:~ # cp/etc/keepalived/scripts/redis_backup.sh /etc/keepalived/scripts/redis_fault.sh
3、安装rsyslog实现keepalived日志分离
  1)安装rsyslog软件包
  JZSHPT-APP5:/soft # rpm -ivhrsyslog-5.10.1-0.7.49.x86_64.rpm
  2)修改rsyslog配置文件
  JZSHPT-APP5:/soft # vim /etc/rsyslog.conf
  140 #*.*;mail.none;news.none                        -/var/log/messages
  141 *.*;mail.none;news.none;local0.none                     -/var/log/messages
  153 #local0,local1.*                               -/var/log/localmessages
  154 local0.*                               -/var/log/keepalived.log
  155 local1.*                               -/var/log/localmessages
  156 local2,local3.*                         -/var/log/localmessages
  157 local4,local5.*                        -/var/log/localmessages
  158  cal6,local7.*                        -/var/log/localmessages
  3)修改rsyslog启动脚本配置文件
  根据/etc/init.d/syslog中的三个启动选项,修改该文件内的”SYSLOG_DAEMON”选项
  JZSHPT-APP5:/soft # vim /etc/sysconfig/syslog
  40 #SYSLOG_DAEMON="syslog-ng"
  41 SYSLOG_DAEMON="rsyslogd"
  4)修改Keepalived启动脚本选项
  JZSHPT-APP5:/soft #  vim /etc/init.d/keepalived.suse
  17 DAEMON_OPT="-d "
  18 DAEMON_OPT="-d -D -S 0"
  5)启动rsyslog服务
  JZSHPT-APP5:/soft # /etc/init.d/syslog restart
4、启动Redis和Keepalived
  JZSHPT-APP5:~ # /etc/init.d/redisd start
  JZSHPT-APP5:~ # /etc/init.d/keepalived.suse start
二:Redis从服务器搭建-redis-slave
1、安装redis
  JZSHPT-APP6:/soft # tar -zxf redis-3.2.1.tar.gz  -C /usr/local
  JZSHPT-APP6:/soft # cd /usr/local/redis-3.2.1/
  JZSHPT-APP6:/usr/local/redis-3.2.1 # make
  JZSHPT-APP6:/usr/local/redis-3.2.1 # cd src &&make install
  JZSHPT-APP6:/usr/local # mv /usr/local/redis-3.2.1/ /usr/local/redis
  1)redis配置文件修改
  JZSHPT-APP6:/usr/local# vim /usr/local/redis/redis.conf
  修改文件相关内容为:
  #bind 127.0.0.1
  protected-mode no
  port 6379
  daemonizeyes
  pidfile/usr/local/redis/redis.pid
  logfile"/usr/local/redis/redis.log"
  dbfilename dump6379.rdb
  dir /usr/local/redis/
  2)redis启动脚本编写
  JZSHPT-APP6:/usr/local/redis# vim /etc/init.d/redisd
  #!/bin/sh
  #chkconfig345 86 14
  #descriptionStartup and Shutdown script for Redis-3.2.1
  progdir=/usr/local/redis/src
  progname=redis-server
  daemon=$progdir/$progname
  config=/usr/local/redis/redis.conf
  pidfile=/usr/local/redis/redis.pid
  desc="redisdaemon"
  scriptname=/etc/init.d/redisd
  start()
  {
  if test -x $daemon;
  then
  echo -e "Starting$desc:$progname"
  if $daemon $config
  then
  echo -e "Start OK!!!"
  else
  echo -e "Startfailed!!!"
  fi
  else
  echo -e "Couldn't find RedisServer($daemon)"
  fi
  }
  stop()
  {
  if test -e $pidfile;
  then
  echo -e "Stopping$desc:$progname"
  if kill `cat $pidfile`
  then
  echo -e "stop OK!!!"
  else
  echo -e "Stop failed!!!"
  fi
  else
  echo -e "No Redis Server($daemoon)running"
  fi
  }
  restart()
  {
  echo -e "Restarting$desc:$progname"
  stop
  start
  }
  status()
  {
  ps aux | grep $progname
  }
  case$1 in
  start)
  start
  ;;
  stop)
  stop
  ;;
  restart)
  restart
  ;;
  status)
  status
  ;;
  *)
  echo"Usage:$scriptnme{start|stop|restart|status}" >&2
  exit 1
  ;;
  esac
  exit0
  JZSHPT-APP6:/usr/local/redis #chmod +x /etc/init.d/redisd
  JZSHPT-APP6:/usr/local/redis #chkconfig --add redisd
2、安装Keepalived
  安装keepalived前请自行安装解决依赖关系(可能会涉及的软件包为libopenssl-devel、zlib-devel、ipvsadm内核模块等)
  JZSHPT-APP6:/soft # tar -zxf keepalived-1.2.23.tar.gz
  JZSHPT-APP6:/soft # cd keepalived-1.2.23/
  JZSHPT-APP6:/soft/keepalived-1.2.23 # ./configure--prefix=/usr/local/keepalived/
  JZSHPT-APP6:/soft/keepalived-1.2.23 # make &&make install
  1)keepalived配置文件编辑
  JZSHPT-APP6:~ # mkdir -p /etc/keepalived/{scripts,log}
  JZSHPT-APP6:~ # vim /usr/local/keepalived/etc/keepalived/
  ! Configuration File for keepalived
  global_defs {
  router_idRedis2_DEVEL
  }
  vrrp_script chk_redis {
  script"/etc/keepalived/scripts/redis_check.sh"
  interval 2
  timeout2
  fall 3
  }
  vrrp_instance VI_1 {
  state BACKUP
  interfaceeth0
  virtual_router_id 51
  priority200
  advert_int5
  authentication {
  auth_typePASS
  auth_pass redis
  }
  virtual_ipaddress{
  10.133.214.50
  }
  track_script {
  chk_redis
  }
  notify_master /etc/keepalived/scripts/redis_master.sh
  notify_backup /etc/keepalived/scripts/redis_backup.sh
  notify_fault  /etc/keepalived/scripts/redis_fault.sh
  notify_stop  /etc/keepalived/scripts/redis_stop.sh
  }
  2)keepalived启动脚本配置
  JZSHPT-APP6:~ # cp /soft/keepalived-1.2.23/keepalived/etc/init.d/keepalived.suse.init/etc/init.d/keepalived.suse
  JZSHPT-APP6:~ # cp /usr/local/keepalived/sbin/keepalived/usr/local/sbin/
  JZSHPT-APP6:~ # cp/usr/local/keepalived/etc/keepalived/keepalived.conf /etc/keepalived/
  3)定义监控脚本
  JZSHPT-APP6:~ # vim/etc/keepalived/scripts/redis_check.sh
  #!/bin/sh
  ###/etc/keepalived/scripts/redis_check.sh
  ALIVE=`/usr/local/bin/redis-cli PING`
  if [ "$ALIVE" == "PONG" ]; then
  echo $ALIVE
  exit 0
  else
  echo $ALIVE
  exit 1
  fi
  4)定义状态切换为master时执行的脚本
  JZSHPT-APP6:~ # vim/etc/keepalived/scripts/redis_master.sh
  #!/bin/sh
  ###/etc/keepalived/scripts/redis_master.sh
  REDISCLI="redis-cli"
  LOGFILE="/etc/keepalived/log/redis-state.log"
  pid=$$
  echo "`date+'%Y-%m-%d:%H:%M:%S'`|$pid|state:[slaver]" >> $LOGFILE
  echo "`date +'%Y-%m-%d:%H:%M:%S'`|$pid|state:[slaver]Run 'SLAVEOF 10.133.214.15 6379'" >> $LOGFILE
  $REDISCLI SLAVEOF 10.133.214.15 6379 >>$LOGFILE  2>&1
  echo "`date+'%Y-%m-%d:%H:%M:%S'`|$pid|state:[slaver] wait 10 sec for data sync from oldmaster" >> $LOGFILE
  sleep 10
  echo "`date+'%Y-%m-%d:%H:%M:%S'`|$pid|state:[slaver] data rsync from old mater ok...">> $LOGFILE
  echo "`date+'%Y-%m-%d:%H:%M:%S'`|$pid|state:[master] Run slaveof no one,closemaster/slave" >> $LOGFILE
  $REDISCLI SLAVEOF NO ONE >> $LOGFILE 2>&1
  echo "`date+'%Y-%m-%d:%H:%M:%S'`|$pid|state:[master] wait other slave connect....">> $LOGFILE
  5)定义状态切换为backups时执行的脚本
  JZSHPT-APP6:~ # vim/etc/keepalived/scripts/redis_backup.sh
  #!/bin/bash
  ###/etc/keepalived/scripts/redis_backup.sh
  REDISCLI="redis-cli"
  LOGFILE="/etc/keepalived/log/redis-state.log"
  pid=$$
  echo "`date+'%Y-%m-%d:%H:%M:%S'`|$pid|state:[master]" >> $LOGFILE
  echo "`date+'%Y-%m-%d:%H:%M:%S'`|$pid|state:[master] Being slave state..." >>$LOGFILE 2>&1
  echo "`date+'%Y-%m-%d:%H:%M:%S'`|$pid|state:[master] wait 10 sec for data sync from oldmaster" >> $LOGFILE
  sleep 10
  echo "`date +'%Y-%m-%d:%H:%M:%S'`|$pid|state:[master]data rsync from old mater ok..." >> $LOGFILE
  echo "`date +'%Y-%m-%d:%H:%M:%S'`|$pid|state:[slaver]Run 'SLAVEOF 10.133.214.15 6379'" >> $LOGFILE
  $REDISCLI SLAVEOF 10.133.214.15 6379 >>$LOGFILE  2>&1
  echo "`date +'%Y-%m-%d:%H:%M:%S'`|$pid|state:[slaver]slave connect to 10.133.214.15 ok..." >> $LOGFILE
  6) 定义状态切换为stop时执行的脚本
  JZSHPT-APP6:~ # cp/etc/keepalived/scripts/redis_backup.sh /etc/keepalived/scripts/redis_stop.sh
  7) 定义状态切换为fault时执行的脚本
  JZSHPT-APP6:~ # cp /etc/keepalived/scripts/redis_backup.sh/etc/keepalived/scripts/redis_fault.sh
3、安装rsyslog实现keepalived日志分离
  1)安装rsyslog软件包
  JZSHPT-APP5:/soft # rpm -ivhrsyslog-5.10.1-0.7.49.x86_64.rpm
  2)修改rsyslog配置文件
  JZSHPT-APP5:/soft # vim /etc/rsyslog.conf
  140 #*.*;mail.none;news.none                        -/var/log/messages
  141 *.*;mail.none;news.none;local0.none                     -/var/log/messages
  153 #local0,local1.*                               -/var/log/localmessages
  154 local0.*                               -/var/log/keepalived.log
  155 local1.*                               -/var/log/localmessages
  156 local2,local3.*                        -/var/log/localmessages
  157 local4,local5.*                        -/var/log/localmessages
  159  cal6,local7.*                         -/var/log/localmessages
  3)修改rsyslog启动脚本配置文件
  根据/etc/init.d/syslog中的三个启动选项,修改该文件内的”SYSLOG_DAEMON”选项
  JZSHPT-APP5:/soft # vim /etc/sysconfig/syslog
  40 #SYSLOG_DAEMON="syslog-ng"
  41 SYSLOG_DAEMON="rsyslogd"
  4)修改Keepalived启动脚本选项
  JZSHPT-APP5:/soft #  vim /etc/init.d/keepalived.suse
  17 DAEMON_OPT="-d "
  18 DAEMON_OPT="-d -D -S 0"
  5)启动rsyslog服务
  JZSHPT-APP5:/soft # /etc/init.d/syslog restart
4、启动Redis和Keepalived
  JZSHPT-APP6:~ # /etc/init.d/redisd start
  JZSHPT-APP6:~ # /etc/init.d/keepalived.suse start
  结尾:
  感谢阅读,祝有收获的一天,谢谢!


运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-630275-1-1.html 上篇帖子: 论述Redis和Memcached的差异 下篇帖子: redis 持久化 AOF RDB
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表