-★出爺;3 发表于 2015-11-19 15:26:05

keepalived+redis高可用性实现


[*]软件安装和搭建规划
[*]搭建规划:
  选取ip为169.254.19.4的机器为master(主服务器)
  选取ip为169.254.19.5的机器为slave(备用服务器)
  两台机器用keepalived来保持高可用连接

[*]安装redis,先用winscp将redis-2.6.16.tar.gz和keepalived-1.2.7.tar.gz拷贝到两台机器的/usr/soft/目录下,按照以下步骤安装好软件
[*]修改部分基础配置,启动服务器测试:
[*]安装keepalived ,先安装前置软件包:
openssl-devel
    popt-devel
配置yum源后直接执行 yum -y install openssl-devel 和 yum -y install popt-devel


[*]执行 ./configure--sysconfdir=/etc--with-kernel-dir=/usr/src/kernel/`uname -r` 编译keepalived指定配置文件在/etc目录下安装目录在/usr/src/kernel/`uname -r` 下
[*]重启keepalived时发现有问题:
  执行cp /usr/local/sbin/keepalived /usr/sbin/解决问题

[*]

[*]keepalived实现redis高可用的原理和配置
  169.254.19.4:master(主服务器)
  169.254.19.5:slave(备用服务器)
  169.254.19.188:vip(虚拟ip)
  此处要交由keepalived来处理,需要两台机器分别设定同一虚拟ip,不用手动去设,    keepalived配好了就行,此处先规划
  设计思路:
    1.Master与Slave均运作正常时, Master负责只支持服务,不做持久化,Slave负责同    步    复制数据,持久化,如快照等方式。
    2.如果Master挂掉,Slave正常时, 由Slave接管服务成为master,同时关闭主从复制    功能,本实验此时就没有了从服务器了,不过实际生产环境中仍然可以配置其他    slave。
    3.重新启动Master,使之恢复正常,则从Slave同步数据到master,同步数据之后关    闭    主从复制功能,恢复Master身份,并从slave接管服务,而slave还原到原来的状    态,恢复Slave身份,负责同步数据和持久化。
    4.上述为一个完整的循环。

[*] 配置/etc/keepalived/keeepalived.conf
[*]
[*] 通过上述配置可以知道需要写一些shell脚本来实现需求,其实keepalived是一个很灵活的探听心跳并管理集群机器的框架,很多东西可以灵活配置和嵌套其他东西来实现,比如上图配有配置global属性,没有配置邮件推送,需要自己设计shell脚本来协助完成功能,复杂的情况可以再加上python来实现,接下来就是写shell脚本了
[*] shell脚本相对不复杂,但是新手也不是很容易写,网上看来的,这里稍微解释一下,需要了解详细的需要自己自学shell脚本:
/etc/keepalived文件夹下新建scripts文件夹来存放sh脚本
1. vi redis_check.sh 此脚本在master和slave都要配置且内容如下:
#!/bin/bash
ALIVE=`/usr/local/bin/redis-cli PING`
if [ "$ALIVE" == "PONG" ]; then
echo $ALIVE
exit 0
else
echo $ALIVE
exit 1
fi

2.1 vi redis_master.sh主服务器的redis_master.sh配置如下:
#!/bin/bash
REDISCLI="/usr/local/bin/redis-cli"
LOGFILE="/var/log/keepalived-redis-state.log"
echo "" >> $LOGFILE
date >> $LOGFILE
echo "Being master...." >> $LOGFILE 2>&1
echo "Run SLAVEOF cmd ..." >> $LOGFILE
$REDISCLI SLAVEOF 169.254.19.5 6379 >> $LOGFILE2>&1
sleep 10
echo "Run SLAVEOF NO ONE cmd ..." >> $LOGFILE
$REDISCLI SLAVEOF NO ONE >> $LOGFILE 2>&1

2.2vi redis_master.sh 从服务器的redis_master.sh配置如下:
#!/bin/bash
REDISCLI="/usr/local/bin/redis-cli"
LOGFILE="/var/log/keepalived-redis-state.log"
echo "" >> $LOGFILE
date >> $LOGFILE
echo "Being master...." >> $LOGFILE 2>&1
echo "Run SLAVEOF cmd ..." >> $LOGFILE
$REDISCLI SLAVEOF 169.254.19.4 6379 >> $LOGFILE2>&1
sleep 10
echo "Run SLAVEOF NO ONE cmd ..." >> $LOGFILE
$REDISCLI SLAVEOF NO ONE >> $LOGFILE 2>&1
其实可以发现主服务器和从服务器的配置就是ip配的不一样,其余都一样,因为主从服务器的位置是任意转换的,对等的,因此作用不在阐述,上述忘了讲sleep的作用了,sleep是线程沉睡下,让服务器有足够的时间来同步数据

  3.1 viredis_backup.sh主服务器的redis_backup.sh配置如下:
  #!/bin/bash
  REDISCLI="/usr/local/bin/redis-cli"
  LOGFILE="/var/log/keepalived-redis-state.log"
  echo "" >> $LOGFILE
  date >> $LOGFILE
  echo "Being slave...." >> $LOGFILE 2>&1
  sleep 15
  echo "Run SLAVEOF cmd ..." >> $LOGFILE
  $REDISCLI SLAVEOF 169.254.19.5 6379 >> $LOGFILE2>&1

  3.2 viredis_backup.sh从服务器的redis_backup.sh配置如下:
  #!/bin/bash
  REDISCLI="/usr/local/bin/redis-cli"
  LOGFILE="/var/log/keepalived-redis-state.log"
  echo "" >> $LOGFILE
  date >> $LOGFILE
  echo "Being slave...." >> $LOGFILE 2>&1
  sleep 15
  echo "Run SLAVEOF cmd ..." >> $LOGFILE
  $REDISCLI SLAVEOF 169.254.19.4 6379 >> $LOGFILE2>&1

  可以看出backup.sh的主服务器和从服务器上是基本一样的,除了ip不一致,但是个    人觉得主服务器的backup.sh没多大意义,待有时间可以测试去掉看有什么影响
  
  4.vi redis_fault.sh redis_fault.sh配置如下:
  #!/bin/bash
  LOGFILE=/var/log/keepalived-redis-state.log
  echo "" >> $LOGFILE
  date >> $LOGFILE

  5.viredis_stop.sh redis_stop.sh配置如下:
  #!/bin/bash
  LOGFILE=/var/log/keepalived-redis-state.log
  echo "" >> $LOGFILE
  date >> $LOGFILE

  配置完成后执行chmod +x /etc/keepalived/scripts/*.sh 给上述shell脚本加可执行权限

[*]配置完成后分别启动两台服务器的redis和keepalived ,执行:
redis-cli -h 169.254.19.188 info查看结果

在主服务器上执行killall -9 redis-server后再执行redis-cli -h 169.254.19.188 info,查看结果
再启动主服务器redis-server redis.conf

查看日志如下:
Master:


[*] 实验成功

[*]常见错误排查
[*]主从服务器配置连不上
可能是redis设置了密码导致同步不了
  b)其他错误排查
没遇到其他问题,但是建议从keepalived.conf和几个脚本文件考虑排查问题·


             版权声明:本文为博主原创文章,未经博主允许不得转载。
页: [1]
查看完整版本: keepalived+redis高可用性实现