主机 master 192.168.2.28
主机 slave 192.168.2.29
vir ip192.168.2.32
背景:
1, master 的redis 服务挂掉会vir ip自动切换
2, master 的keepalived 服务挂掉会vir ip自动切换
3, master 主机宕机会vir ip自动切换
4,master 主机的redis 和keepalived 恢复后,vir ip 又会自动切回到 master 主机
#一,redis 的安装配置
1 编译和安装所需的包:
yum install gcc tcl gcc-c++ make wget lsof -y
2 解压Redis(此处须自行去官网下载Redis安装包,并上传到服务器)
tar -zxvf redis-3.2.8.tar.gz
3 进入Redis所在文件夹
cd redis-3.2.8
4 编译安装Redis
make && make install
[root@redis-master redis-3.2.8]# cp redis.conf /etc/
服务启动脚本内容太多,你可以在网上随便找一下,因为内容太多我就不贴在文章里面了
介绍:5.1-5.10 主从配置都一样, 5.11 只有slave配置
5 更改配置文件,vi /etc/redis.conf
5.1 设置redis会后台启动.找到daemonize no 修改为 daemonize yes。
5.2 找到port 6379 修改为对应节点目录的端口号
5.3 找到bind这一行,bind后要修改为 0.0.0.0的IP地址。
5.4 找到 dir 这一行 指定数据文件的存放路径。设置为各个节点下的目录。目录结构类似为,需要预先建立目录
"/data/redis/"
5.5 开启持久化 appendonly yes
5.6 # 指定 AOF 文件名 appendfilename appendonly.aof
5.7# 关闭保护模式
protected-mode no
5.8 设置密码,在配置文件中加
requirepass 123456
5.9 , redis 设置了密码验证,所以在主从的配置文件中都要加
masterauth 123456
5.10 日志路径设置
logfile "/var/log/redis.log"
5.11, slave 主机的配置 redis.conf 文件最后添加从复制
slaveof 192.168.2.47 6379
#二,keepalived 安装配置
1,安装基础库
yum -y install openssl-devel libnl3-devel ipset-devel iptables-devel libnfnetlink-devel net-snmp-devel
2,源码安装keepalived
1. tar zxf keepalived-1.3.5.tar.gz
2. cd keepalived-1.3.5
3. ./configure --prefix=/usr/local/keepalived/
4. make
5. make install 拷贝需要的文件: $ cp /usr/local/src/keepalived-1.3.5/keepalived/etc/init.d/keepalived /etc/init.d/keepalived
$ cp /usr/local/keepalived/sbin/keepalived /usr/sbin/
$ cp /usr/local/keepalived/etc/sysconfig/keepalived /etc/sysconfig/
$ mkdir -p /etc/keepalived/
$ cp /usr/local/keepalived/etc/keepalived/keepalived.conf /etc/keepalived/keepalived.conf
/etc/keepalived/keepalived.conf是默认的配置文件
三,主从公共脚本 和keepalived 配置
3.2.1 Redis监控脚本
该脚本检测redis的运行状态,并在nginx进程不存在时尝试重新启动ngnix,如果启动失败则停止keepalived,准备让其它机器接管。
/etc/keepalived/scripts/check_redis.sh(主从不一样)
```
#!/bin/bash
PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games
CHECK=`/usr/local/bin/redis-cli -h 192.168.2.28 -p 6379 -a vkel2018 PING` #这里要改为相应的ip
if [ "$CHECK" == "PONG" ] ;then
echo $CHECK
exit 0
else
echo $CHECK
service stop keepalived #可确保让出MASTER
exit 1
fi
```
3.2.2 redis_fault.sh (主从都一样)
vim /etc/keepalived/scripts/redis_fault.sh
```
# !/bin/bash
LOGFILE=/usr/local/src/redis-2.8.19/keepalived-redis-state.log
echo "[fault]" >> $LOGFILE
date >> $LOGFILE
```
3.2.3 redis_stop.sh (主从都一样)
vim /etc/keepalived/scripts/redis_stop.sh
```
# !/bin/bash
LOGFILE=/usr/local/src/redis-2.8.19/keepalived-redis-state.log
echo "[stop]" >> $LOGFILE
date >> $LOGFILE
```
3.3 keepalived scripts for redis
为redis配置keepalived所需要的脚本。
3.3.1 Redis Master scripts
在redis master配置:
vim/etc/keepalived/scripts/redis_master.sh
```
#!/bin/bash
REDISCLI="/usr/local/bin/redis-cli"
LOGFILE="/var/log/keepalived-redis-state.log"
echo "[master]" >> $LOGFILE
date >> $LOGFILE
echo "Being master...." >> $LOGFILE 2>&1
echo "Run SLAVEOF cmd ..." >> $LOGFILE
$REDISCLI -h 192.168.2.28 -p 6379 -a 123456 SLAVEOF 192.168.2.29 6379 >> $LOGFILE 2>&1
sleep 10 #延迟10秒以后待数据同步完成后再取消同步状态
echo "Run SLAVEOF NO ONE cmd ..." >> $LOGFILE
$REDISCLI -h 192.168.2.28 -p 6379 -a 123456 SLAVEOF NO ONE >> $LOGFILE 2>&1
```
vim /etc/keepalived/scripts/redis_backup.sh
```
#!/bin/bash
REDISCLI="/usr/local/bin/redis-cli"
LOGFILE="/var/log/keepalived-redis-state.log"
echo "[backup]" >> $LOGFILE
date >> $LOGFILE
echo "Being slave...." >> $LOGFILE 2>&1
sleep 15 #延迟15秒待数据被对方同步完成之后再切换主从角色
echo "Run SLAVEOF cmd ..." >> $LOGFILE
$REDISCLI -h 192.168.2.28 -p 6379 -a 123456 SLAVEOF 192.168.2.29 6379 >> $LOGFILE 2>&1
```
3.3.2 Redis Backup scripts
和3.3.1节的配置基本一样,只是脚本中redis的IP为原master主机的IP。
在redis backup配置:
vim /etc/keepalived/scripts/redis_master.sh
```
#!/bin/bash
REDISCLI="/usr/local/bin/redis-cli"
LOGFILE="/var/log/keepalived-redis-state.log"
echo "[master]" >> $LOGFILE
date >> $LOGFILE
echo "Being master...." >> $LOGFILE 2>&1
echo "Run SLAVEOF cmd ..." >> $LOGFILE
$REDISCLI -h 192.168.2.29 -p 6379 -a 123456 SLAVEOF 192.168.2.28 6379 >> $LOGFILE 2>&1
sleep 10 #延迟10秒以后待数据同步完成后再取消同步状态
echo "Run SLAVEOF NO ONE cmd ..." >> $LOGFILE
$REDISCLI -h 192.168.2.29 -p 6379 -a 123456 SLAVEOF NO ONE >> $LOGFILE 2>&1
```
vim /etc/keepalived/scripts/redis_backup.sh
```
#!/bin/bash
REDISCLI="/usr/local/bin/redis-cli"
LOGFILE="/var/log/keepalived-redis-state.log"
echo "[backup]" >> $LOGFILE
date >> $LOGFILE
echo "Being slave...." >> $LOGFILE 2>&1
sleep 15 #延迟15秒待数据被对方同步完成之后再切换主从角色
echo "Run SLAVEOF cmd ..." >> $LOGFILE
$REDISCLI -h 192.168.2.29 -p 6379 -a 123456 SLAVEOF 192.168.2.28 6379 >> $LOGFILE 2>&1
```
3.4 配置keepalived.conf
keepalived.conf样例
```
! Configuration File for keepalived
global_defs {
router_id redis
}
vrrp_script chk_redis {
script "/etc/keepalived/scripts/check_redis.sh"
interval 4
fall 2
rise 1
}
vrrp_instance VI_REDIS {
state MASTER #slave 主机改为 BACKUP
interface eth1
virtual_router_id 51
priority 100
advert_int 1
nopreempt
authentication {
auth_type PASS
auth_pass 11111
}
virtual_ipaddress {
192.168.2.49
}
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/redsi_stop.sh
}
```
注意,在同一个网段内的,若为不同的应用做高可用,不同应用使用不同的VIP,那么vrrp_instance的名字(这里是VI_REDIS)、virtual_router_id在不同的高可用实例必须设置不同的值区分开。否则keepalived会报如下错误:
Aug 11 11:28:36 localhostKeepalived_vrrp[16958]: (VI_1): received an invalid ip number count 1, expected2!
Aug 11 11:28:36 localhostKeepalived_vrrp[16958]: bogus VRRP packet received on eth1 !!!
Aug 11 11:28:36 localhostKeepalived_vrrp[16958]: VRRP_Instance(VI_1) Dropping received VRRP packet...
以上是keepalived MASTER节点配置文件/etc/keepalived/keepalived.conf的配置信息。在BACKUP节点,只需把vrrp_instance->state改为BACKUP,vrrp_instance->priority改为99即可。
在默认的keepalive.conf里面还有 virtual_server,real_server 这样的配置,我们这用不到,它是为lvs准备的。 notify 可以定义在切换成MASTER或BACKUP时执行的脚本,如有需求请自行google。
配置选项说明
global_defs
☉notification_email: keepalived在发生诸如切换操作时需要发送email通知地址,后面的 smtp_server 相比也都知道是邮件服务器地址。也可以通过其它方式报警,毕竟邮件不是实时通知的。
☉router_id: 机器标识,通常可设为hostname。故障发生时,邮件通知会用到
vrrp_instance
☉state : 指定instance(Initial)的初始状态,就是说在配置好后,这台服务器的初始状态就是这里指定的,但这里指定的不算,还是得要通过竞选通过优先级来确定。如果这里设置为MASTER,但如若他的优先级不及另外一台,那么这台在发送通告时,会发送自己的优先级,另外一台发现优先级不如自己的高,那么他会就回抢占为MASTER
☉interface: 实例绑定的网卡,因为在配置虚拟IP的时候必须是在已有的网卡上添加的,可以用ifconfig命令查看网卡。
☉mcast_src_ip: 发送多播数据包时的源IP地址,这里注意了,这里实际上就是在那个地址上发送VRRP通告,这个非常重要,一定要选择稳定的网卡端口来发送,这里相当于heartbeat的心跳端口,如果没有设置那么就用默认的绑定的网卡的IP,也就是interface指定的IP地址
☉virtual_router_id: 这里设置VRID,这里非常重要,相同的VRID为一个组,他将决定多播的MAC地址
☉priority: 设置本节点的优先级,优先级高的为master
☉advert_int: 检查间隔,默认为1秒。这就是VRRP的定时器,MASTER每隔这样一个时间间隔,就会发送一个advertisement报文以通知组内其他路由器自己工作正常
☉authentication: 定义认证方式和密码,主从必须一样,样例用的是密码方式。
☉virtual_ipaddress: 这里设置的就是VIP,也就是虚拟IP地址,他随着state的变化而增加删除,当state为master的时候就添加,当state为backup的时候删除,这里主要是有优先级来决定的,和state设置的值没有多大关系。这里可以设置多个虚拟IP地址,类似于一个域名可以解析对应多个IP地址。
☉track_script: 引用VRRP脚本,即在 vrrp_script 部分指定的名字。每隔vrrp_script->interval时间运行脚本,如果监控服务有异常则改变优先级,并最终引发主备切换。
vrrp_script
告诉 keepalived 在什么情况下切换,所以尤为重要。可以有多个 vrrp_script
☉script : 自己写的检测脚本。也可以是一行命令如killall-0 nginx
☉interval4 : 每4s检测一次,这里要大于监控脚本执行的时间,监控脚本会执行超时,☉keepalived会发送SIGTERM信号结束监控脚本的执行。
☉weight-5 : 检测失败(脚本返回非0)则优先级 -5
☉fall 2: 检测连续 2 次失败才算确定是真失败。会用weight减少优先级(1-255之间)
☉rise 1: 检测 1 次成功就算成功。但不修改优先级
4.1启动keepalived
在Redis Master和Redis Backup上将keepalived启动
启动keepalived:
service keepalived start
或者
/etc/init.d/keepalived start
或者
/usr/local/keepalived/sbin/keepalived -f/etc/keepalived/keepalived.conf -
查看进程,正常会有三个进程
[root@localhost ~]# ps -ef | grepkeepalived
root 3870 1 0 14:46 ? 00:00:00 keepalived -D
root 3872 3870 0 14:46 ? 00:00:00 keepalived -D
root 3873 3870 0 14:46 ? 00:00:00 keepalived -D
root 3887 18774 0 14:46 pts/1 00:00:00 grep keepalived