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

[经验分享] SuSE11环境下Redis+Keepalived实现高可用技术

[复制链接]

尚未签到

发表于 2018-11-2 08:31:48 | 显示全部楼层 |阅读模式
  1.Redis配置信息
  Redis部署使用两台服务器,实现Redis+keepalived,提供redis服务高可用,当主redis进程或服务器宕机之后,备redis进程或服务器继续提供服务。
  实现目的:主MASTER宕机后,从BACKUP接管VIP提供服务,升为MASTER,主MASTER恢复后状态变为从BACKUP,不抢占回VIP,待新MASTER宕机后继续接替VIP,重新升为MASTER
  

                 MASTER-->BACKUP-->MASTER 依次轮询接管服务  

  服务器配置信息如下所示:
  主机名/IP
  端口
  用途
  JZSHPT-APP5/
  10.133.214.15
  6379
  Redis主服务器
  JZSHPT-APP6/
  10.133.214.16
  6379
  Redis从服务器
  2.Redis主服务器搭建
  2.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
  修改文件相关内容为:
  protected-mode no
  port 6379
  daemonize yes
  pidfile /usr/local/redis/redis.pid
  logfile "/usr/local/redis/redis.log"
  2)redis启动脚本编写(非必须)
  JZSHPT-APP5:/usr/local/redis # vim /etc/init.d/redisd
  #!/bin/sh
  #chkconfig 345 86 14
  #description Startup 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="redis daemon"
  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 "Start failed!!!"
  

  fi
  

  
else
  

  
echo -e "Couldn't find Redis Server($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
  exit 0
  JZSHPT-APP5:/usr/local/redis # chmod +x /etc/init.d/redisd
  JZSHPT-APP5:/usr/local/redis # chkconfig --add redisd
  2.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_id Redis1_DEVEL  

  }
  vrrp_script chk_redis {
  

     script "/etc/keepalived/scripts/redis_check.sh"  

  interval 2
  

  timeout 2
  

  fall 3
  

  }
  vrrp_instance VI_1 {
  

state BACKUP  

  interface eth0
  

  virtual_router_id 51
  

  nopreempt
  

  priority 200
  

  advert_int 5
  

  authentication {
  

  auth_type PASS
  

    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/ /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 old master" >> $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..." >> $LOGFILE 2>&1
  echo "date +'%Y-%m-%d:%H:%M:%S'|$pid|state:[master] wait 10 sec for data sync from old master" >> $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.21 ok..." >> $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
  2.2.安装rsyslog实现keepalived日志分离
  1)安装rsyslog软件包
  JZSHPT-APP5:/soft # rpm -ivh rsyslog-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 start
  2.3.启动Redis和Keepalived
  JZSHPT-APP5:~ # /etc/init.d/redisd start
  JZSHPT-APP5:~ # /etc/init.d/keepalived.suse start
  3.Redis从服务器搭建
  3.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
  修改文件相关内容为:
  protected-mode no
  port 6379
  daemonize yes
  pidfile /usr/local/redis/redis.pid
  logfile "/usr/local/redis/redis.log"
  2)redis启动脚本编写(非必须)
  JZSHPT-APP6:/usr/local/redis # vim /etc/init.d/redisd
  #!/bin/sh
  #chkconfig 345 86 14
  #description Startup 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="redis daemon"
  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 "Start failed!!!"
  

  fi
  

  
else
  

  
echo -e "Couldn't find Redis Server($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
  exit 0
  JZSHPT-APP6:/usr/local/redis # chmod +x /etc/init.d/redisd
  JZSHPT-APP6:/usr/local/redis # chkconfig --add redisd
  3.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_id Redis2_DEVEL  

  }
  vrrp_script chk_redis {
  

     script "/etc/keepalived/scripts/redis_check.sh"  

  interval 2
  

  timeout 2
  

  fall 3
  

  }
  vrrp_instance VI_1 {
  

state BACKUP  

  interface eth0
  

  virtual_router_id 51
  

  priority 150
  

  advert_int 5
  

  authentication {
  

  auth_type PASS
  

    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/ /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 old master" >> $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-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 old master" >> $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.3.安装rsyslog实现keepalived日志分离
  1)安装rsyslog软件包
  JZSHPT-APP5:/soft # rpm -ivh rsyslog-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 start
  3.4.启动Redis和Keepalived
  JZSHPT-APP6:~ # /etc/init.d/redisd start
  JZSHPT-APP6:~ # /etc/init.d/keepalived.suse start
  测试结果可通过依次停Redis主从单节点来观测vip漂移



运维网声明 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-629608-1-1.html 上篇帖子: redis的配置文件 下篇帖子: redis故障处理 process is already running or crashed
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

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

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

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

扫描微信二维码查看详情

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


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


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


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



合作伙伴: 青云cloud

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