Keepalived+redis高可用安装部署
简单介绍keepalived: keepalived将自己的ip地址扩展, 在自己机器ip地址的基础上使用虚拟ip (Vip) , 那么就可以使用虚拟ip访问到当前的机器, 而不是单纯的使用自己机器的ip地址, 当然如果仅只是生成一个虚拟ip地址的话是没什么用的, 但是如果配置两台或者多台服务器keepalived, 那么他们可以配置相同的虚拟ip, keepalived会根据内部脚本检测当前机器在这个虚拟ip地址上面的服务是否正常, 如果当前机器的服务挂掉, 就可以自动切换到另外一台机器的相同服务上, 保证了服务的高可用,前言
提示:默认redis已经安装好了,可能还有些步骤缺少,后期在补充。
提示:以下是本篇文章正文内容,下面案例可供参考
一、安装部署
# 先安装依赖包,下面展示,有网络情况下的例子
yum update
yum install -y gcc gcc-c++ openssl-devel
# ------------------------------------------------------------------
cd /opt/cloudquery/env
tar -zxvf keepalived-1.4.3.tar.gz
cd keepalived-1.4.3
# ( yum install -y libnfnetlink-devel 如果make命令失败 说明./configure失败了,需要执行这个命令)
./configure --prefix=/usr/local/keepalived
make && make install
cp /usr/local/keepalived/sbin/keepalived /usr/sbin/
mkdir -p /etc/keepalived
cp /usr/local/keepalived/etc/keepalived/keepalived.conf /etc/keepalived/keepalived.conf
cp /usr/local/keepalived/etc/sysconfig/keepalived /etc/sysconfig/
cp ./keepalived/etc/init.d/keepalived /etc/init.d/
chmod 755 /etc/init.d/keepalived
#编辑keepalived.service,将所有的字符串 “/usr/local/keepalived” 替换为空白,vi编辑器命令:【%s/\/usr\/local\/keepalived//g】
vi /lib/systemd/system/keepalived.service
:wq
# 刷新配置
systemctl daemon-reload
修改配置文件
# 修改文件中所有标注的地方
vi /etc/keepalived/keepalived.conf
# virtual_ipaddress 虚拟ip可以根据现场情况进行调整.但是主从一定要保持一致
执行上面所有的命令, 但是这个安装包是直接下载好上传到服务器上面的, 大家可以根据版本情况自己下载所使用的版本,已经基本完成keepalived的安装
# 启动
systemctl start keepalived
# 配置开机自启动
chkconfig keepalived on
二、使用步骤
1.配置文件内容
keepalived.conf
global_defs {
router_id LVS_DEVEL1
script_user root
enable_script_security
}
# @warning
# 1.所有标注的地方均需要根据机器情况进行相应的修改.
# 2.vrrp_script 一定要放在 vrrp_instance 的上面
#============================================== nginx 555===============================
vrrp_script chk_ng
{
script "/etc/keepalived/scripts/ng/ng_check.sh" #监控脚本
interval 10
fall 10
}
vrrp_instance VI_ng {
state BACKUP
interface ens192 # 改成主机的网卡名称
virtual_router_id 555 # 为了方便统一, 直接修改为对应ip地址的参数即可, 避免重复 .主从一致 ( ID必须是网段里的唯一值,主从一致(避免与网段里其他安装的Keepalived服务冲突))
mcast_src_ip 192.168.3.111 # 改成主机的IP
priority 80
advert_int 1
nopreempt
authentication {
auth_type PASS
auth_pass 1111
}
virtual_ipaddress {
192.168.1.555 #改成自己的浮动IP
}
track_script {
chk_ng
}
}
#============================================== Redis 主从 666============================
vrrp_script chk_redis
{
script "/etc/keepalived/scripts/redis/redis_check.sh" #监控脚本 监控redis的状态如果故障切换到从机上面去 目录要放对
interval 30 #redis监控检查时间
fall 30 # 失败次数切换
}
vrrp_instance VI_redis {
state MASTER # 根据实际情况配置, 如果当前机器redis是主机,那么则配置MASTER , 否则 BACKUP , 从机需要修改为相反状态
# state BACKUP
interface ens192 # 改成主机的网卡名称
virtual_router_id 666 # 为了方便统一, 直接修改为对应ip地址的参数即可, 避免重复 .主从一致 ( ID必须是网段里的唯一值) 可以修改为任意值 ,但是主机和从机的virtual_router_id 一定要一样.
mcast_src_ip 192.168.3.999 #改成主机的IP
priority 80
advert_int 1
nopreempt
authentication {
auth_type PASS
auth_pass 1111
}
virtual_ipaddress {
192.168.3.143 #这个值就是Redis对外开放的虚拟ip
}
track_script {
chk_redis
}
notify_master "/etc/keepalived/scripts/redis/redis_master.sh 192.168.1.222 6379" # 参数:192.168.1.2221 另外一台机器的ip地址(这是脚本的参数, 不是必须的,根据脚本的情况)
notify_backup "/etc/keepalived/scripts/redis/redis_backup.sh 192.168.1.222 6379" # 参数:192.168.1.222 另外一台机器的ip地址(这是脚本的参数, 不是必须的,根据脚本的情况)
}
2.脚本文件
redis_check.sh
检查redis是否正常的脚本,但是这个脚本是基于docker的环境编写的, 可以根据情况重新调整
# 这个脚本
LOGFILE="/var/log/keepalived-redis.log"
echo "[CHECK] KA 启动ping redis "
date >> $LOGFILE
r=`docker ps | grep cloudquery-redis |wc -l`
echo $r >> $LOGFILE
if [ $r -gt 0 ]; then
echo " $r Redis check=====>Success " >>$LOGFILE
echo "===============================================" >>$LOGFILE
exit 0
else
echo "Redis check =====>Failed" >>$LOGFILE
echo "===============================================" >>$LOGFILE
exit 1
fi
redis_master.sh
先将redis切换为从机同步一下另外一台机器的数据, 然后在切换为主机
#!/bin/bash
LOGFILE="/var/log/redis.log"
echo "切换为主机" >> $LOGFILE
echo "[master]" >> $LOGFILE
date >> $LOGFILE
echo "Being master...." >> $LOGFILE
echo "Run MASTER cmd ..." >> $LOGFILE
docker exec -i cloudquery-redis redis-cli <<EOF
auth aaaaa # 本机redis密码
config set masterauth aaaaa # 主机redis密码 如果没有密码可以跳过这一步
SLAVEOF $1 $2 # 参数 可以直接写死 192.168.1.111 6379
exit
EOF
sleep 3 #delay 10 s wait data async cancel sync
echo "Run SLAVEOF NO ONE cmd ..." >> $LOGFILE
# <<EOF 括起来的命令可以使得redis-cli一次执行多条,一步一步执行
docker exec -i cloudquery-redis redis-cli <<EOF
auth aaaaa # 本机redis密码
SLAVEOF NO ONE
exit
EOF
# 进入容器查看状态 可以忽略
docker exec -it cloudquery-redis redis-cli -a aaaa(密码) info replication
# 待完善,如果执行失败, 那么将当前机器直接切换为主机即可.保持可用状态
echo "If it is'f', it is a Master" >> $LOGFILE
echo "Run SLAVEOF NO ONE cmd end" >> $LOGFILE
redis_backu.sh
#!/bin/bash
LOGFILE="/var/log/redis.log"
echo "切换为从机" >> $LOGFILE
date >> $LOGFILE
echo "SLAVEOF $1 $2 Run SLAVEOF cmd ..." >> $LOGFILE
docker exec -i cloudquery-redis redis-cli <<EOF
auth aaaaa # 本机redis密码
config set masterauth aaaaa # 主机redis密码
SLAVEOF $1 $2 # 参数 可以直接写死 192.168.1.111 6379
exit
EOF
# 查看状态 aaaaa 是本机redis的密码
docker exec -it cloudquery-redis redis-cli -a aaaaa info replication
# 待完善,如果执行失败, 那么将当前机器直接切换为主机即可.保持可用状态
echo "If it is role:slaveof, it is a SLAVEOF" >> $LOGFILE
echo "===========================================" >> $LOGFILE
该处使用的url网络请求的数据。
总结
主机配置完成后同样的步骤重新配置一遍从机的keepalived, 然后可以通过虚拟ip访问redis 测试虚拟ip是否正常
当主机redis挂掉之后keepalived检测到主机redis挂掉, 然后从机的keepalived切换到master状态, 执行 notify_master 中路径里面配置的脚本, 将redis切换为主机状态, 保证redis可用