ubuntu版本
查看版本命令: lsb_release -a
安装前环境准备( 全敲一遍 )
sudo apt-get install libssl-dev
sudo apt-get install libpopt-dev
sudo apt-get install daemon
sudo apt-get install build-essential
sudo apt-get install libssl-dev
sudo apt-get install openssl
sudo apt-get install libpopt-dev
编译安装:
# 定义路径、定义版本(直接敲)
KEEPALIVED_HOME=/usr/local/keepalived
KEEPALIVED_VERSION=2.0.20
mkdir -p $KEEPALIVED_HOME
O_PATH=`pwd`
#下载并解压(keepalived 2.0.20版本)
cd $KEEPALIVED_HOME && \
wget https://www.keepalived.org/software/keepalived-2.0.20.tar.gz && \
tar -zxf keepalived-$KEEPALIVED_VERSION.tar.gz
# 编译安装
cd keepalived-$KEEPALIVED_VERSION
./configure --prefix=$KEEPALIVED_HOME
(如果报错 执行 :
apt-get install libnl-3-dev
apt-get install libnl-genl-3-dev
)
然后再执行一次 ./configure --prefix=$KEEPALIVED_HOME
make && make install
# 软连
ln -s $KEEPALIVED_HOME/sbin/keepalived /sbin/
# 拷贝配置文件,默认路径为/etc/keepalived
mkdir /etc/keepalived
\cp -rf $KEEPALIVED_HOME/etc/keepalived/keepalived.conf /etc/keepalived/
# 添加环境变量 (环境变量在 /etc/profile 在最后一行添加即可
echo "export KEEPALIVED_HOME=$KEEPALIVED_HOME" >> ~/.bashrc
. ~/.bashrc
cd $O_PATH
守护进程和开机启动
sudo mkdir -p /etc/keepalived
sudo ln -s /usr/local/keepalived/sbin/keepalived /usr/sbin/
sudo ln -s /usr/local/keepalived/etc/keepalived/keepalived.conf
/etc/keepalived/keepalived.conf
sudo ln -s /usr/local/keepalived/etc/sysconfig/keepalived /etc/default/keepalived
采用systemd的方式添加到系统服务,执行如下命令:
(
cat <<EOF
[Unit]
Description=Keepalive Daemon (LVS and VRRP)
After=syslog.target network-online.target
Wants=network-online.target
# Only start if there is a configuration file
ConditionFileNotEmpty=/etc/keepalived/keepalived.conf
[Service]
Type=forking
KillMode=process
# Read configuration variable file if it is present
EnvironmentFile=-/etc/default/keepalived
ExecStart=/usr/sbin/keepalived $KEEPALIVED_OPTIONS
ExecReload=/bin/kill -HUP $MAINPID
[Install]
WantedBy=multi-user.target
EOF
) > keepalived.service
sudo cp -a keepalived.service /lib/systemd/system/keepalived.service
sudo ln -s /lib/systemd/system/keepalived.service /etc/systemd/system/multi-user.target.wants/keepalived.se
Master主机配置
# 备份一下配置文件
cp /etc/keepalived/keepalived.conf /etc/keepalived/keepalived.conf.bak
# 重新编辑配置文件
echo '' > /etc/keepalived/keepalived.conf && vi /etc/keepalived/keepalived.conf
Master主机上的配置文件如下:
! Configuration File for keepalived
global_defs {
router_id HA-M1
}
vrrp_script chk_mysql {
script /etc/keepalived/chk_mysql.sh #健康监测脚本路径
interval 2
fall 3
rise 2
}
vrrp_instance VI_MYSQL {
state MASTER
interface eth0 # 监听的网卡
virtual_router_id 100 # 虚拟路由编号,同一实例可以一致,但是其权重一定不能一致
priority 100 # 权重,两个节点不能一样
advert_int 1
mcast_src_ip 172.17.0.10 #自己的ip,也可不设置
authentication {
auth_type PASS
auth_pass 1111
}
virtual_ipaddress {
172.17.0.101 dev eth0 label eth0:vip # 虚拟IP地址
# 240C::1234/64 # 支持IPv6
}
notify /etc/keepalived/kpad_notify.sh # keep状态传入脚本,通过该脚本可得知当前keep运行状态
track_script {
chk_mysql # 健康检查配置(调用上方vrrp_script的chk_mysql)
}
}
- router_id:标识,两台需不一样
- state MASTER:表明这台是Master角色
- priority:优先级,MASTER角色比BACKUP高!(谁的值越高谁越优先)
- virtual_router_id:虚拟路由编号,两台需要一致
- 172.17.0.101 dev eth0 label eth0:vip:这就是我们配置的VIP:172.17.0.101
- script /etc/keepalived/chk_mysql.sh:MySQL的检测脚本,定时去检测MySQL进程是否挂掉,如果挂掉,在脚本里面重启之,定时通过interval配置,上面配置的是2s检测一次
- notify /etc/keepalived/kpad_notify.sh:当Keepalived状态发生变化时,会调用该脚本,这也是我们实现Slave(m3)自动挂载Master的关键!!
当Keepalived从BACKUP提升为MASTER时,那么VIP就会漂移到自己身上
下面是两个脚本文件,Master主机和Master备机都是一样的。分别创建脚本文件
MySQL状态监测脚本
在Master主机和Master备机上都要创建该脚本
touch /etc/keepalived/chk_mysql.sh
chmod +x /etc/keepalived/chk_mysql.sh
vi /etc/keepalived/chk_mysql.sh
# 创建个日志文件
mkdir -p /var/log/keepalived && touch /var/log/keepalived/chk_mysql.log
chk_mysql.sh内容如下,可以看到可以根据当前Keepalived的状态分别处理,但是此处的处理都是启动MySQL(如果MySQL进程已退出)
#!/bin/bash
STATE=`cat /tmp/keepalived-state`
log_file="/var/log/keepalived/chk_mysql.log"
service_name="mysqld"
service_cmd="/etc/init.d/mysqld"
get_pid=`pidof $service_name`
log() {
echo "$(date +"%Y-%m-%d %H:%M:%S.%4N") [$STATE] $1" >> $log_file
}
case $STATE in
"MASTER")
if [ "${get_pid}" == "" ]; then
log "$service_name service isn't exist."
log "Try to restart $service_name service."
$service_cmd start #---start没作用可以改restart
if [ $? -eq 0 ]; then
log "restart $service_name service successfully."
else
log "restart $service_name service failed."
exit 1
fi
fi
exit 0
;;
"BACKUP")
if [ "${get_pid}" == "" ]; then
log "$service_name service isn't exist."
log "Try to restart $service_name service."
$service_cmd start #---start没作用可以改restart
if [ $? -eq 0 ]; then
log "restart $service_name service successfully."
else
log "restart $service_name service failed."
exit 1
fi
fi
exit 0
;;
"FAULT")
exit 0
;;
*)
exit 1
;;
esac
开启keepalived : sudo service keepalived start
杀掉mysql进程 ps aux | grep -v grep | grep mysql | awk '{ print $2 }' | xargs kill -15
Keepalived状态变更脚本
在Master主机和Master备机上都要创建该脚本
touch /etc/keepalived/kpad_notify.sh
chmod +x /etc/keepalived/kpad_notify.sh
vi /etc/keepalived/kpad_notify.sh
# 创建个日志文件
mkdir -p /var/log/keepalived && touch /var/log/keepalived/kpad_notify.log
kpad_notify.sh内容如下,
#!/bin/bash
TYPE=$1
NAME=$2
STATE=$3
log_file="/var/log/keepalived/kpad_notify.log"
log() {
echo "$(date +"%Y-%m-%d %H:%M:%S.%4N") [$STATE] $1" >> $log_file
}
case $STATE in
"MASTER")
echo 'MASTER' > /tmp/keepalived-state
# Slave自动切换Master
/etc/keepalived/chg_master.sh >> $log_file
log "changed master status $STATE"
exit 0
;;
"BACKUP")
echo 'BACKUP' > /tmp/keepalived-state
log "do nothing $STATE"
exit 0
;;
"FAULT")
echo 'FAULT' > /tmp/keepalived-state
log "keepalived status is fault."
exit 0
;;
*)
log "unknown keepalived status. $STATE"
exit 1
;;
esac
Master备机配置
# 备份一下配置文件
cp /etc/keepalived/keepalived.conf /etc/keepalived/keepalived.conf.bak
# 重新编辑配置文件
echo '' > /etc/keepalived/keepalived.conf && vi /etc/keepalived/keepalived.conf
Master备机上的配置文件如下:
! Configuration File for keepalived
global_defs {
router_id HA-M2
}
vrrp_script chk_mysql {
script /etc/keepalived/chk_mysql.sh #健康监测脚本路径
interval 2
fall 3
rise 2
}
vrrp_instance VI_MYSQL {
state BACKUP
interface eth0 # 监听网卡
virtual_router_id 100 # 虚拟路由编号,同一实例可以一致,但是其权重一定不能一致
nopreempt
priority 50 # 权重,两个节点不能一样
advert_int 1
mcast_src_ip 172.17.0.11
authentication {
auth_type PASS
auth_pass 1111
}
virtual_ipaddress {
172.17.0.101 dev eth0 label eth0:vip # 虚拟IP地址
# 240C::1234/64 # 支持IPv6
}
notify /etc/keepalived/kpad_notify.sh # keep状态传入脚本,通过该脚本可得知当前keep运行状态
track_script {
chk_mysql # 健康检查配置
}
}
注意router_id需要不一样,state BACKUP表明是备机,virtual_router_id需要一致,priority要比MASTER低!
启动Keepalived
最后在Master主机和Master备机上分别启动Keepalived
启动 : $KEEPALIVED_HOME/sbin/keepalived
查看状态 : sudo systemctl status keepalived
不出意外的话在Master主机上执行ifconfig将会看到VIP,在Master备机上却看不到!
eth0:vip: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1500
inet 172.17.0.101 netmask 255.255.255.255 broadcast 0.0.0.0
ether 02:42:ac:11:00:0a txqueuelen 0 (Ethernet)
或者使用ip addr 可以看到ip中有刚刚设置的vip地址也代表ok
测试
测试的时候可以先把kpad_notify.sh中的
/etc/keepalived/chg_master.sh >> $log_file这句话注释掉再测试,因为现在我们还没有引入Slave(m3)
经过我的测试,有如下测试结论:
杀掉Master主机上的Keepalived和mysql:
- VIP会漂移到Master备机上,ifconfig能看到VIP信息
- 通过/tmp/keepalived-state和日志kpad_notify.log观察Keepalived是从BACKUP状态转换为了MASTER状态
启动Master上的Keepalived和mysql:
- ifconfig看下VIP会漂移回来,并且Master备机上的VIP会消失
- Keepalived的状态是从FAULT转变为BACKUP,最后变成MASTER