环境

keepalived 版本: keepalived-2.2.7 操作系统: cenos7 安装方式: 源码编译安装

环境安装

#安装包下载
wget https://keepalived.org/software/keepalived-2.2.7.tar.gz

#安装编译源码所需依赖
yum -y install gcc openssl-devel libnfnetlink-devel libnl libnl-devel popt-devel  gcc make

# 解压至 /usr/local/ 目录下
tar -zxvf keepalived-2.2.7.tar.gz -C /usr/local/

# 进入源码包
cd /usr/local/keepalived-2.2.7/

# 编译安装,-j 后面的参数是CPU核心数,根据自己机器的CPU核心数指定
./configure && make -j 4 && make install

#查找所有keepalived 文件位置
find / -name keepalived

/etc/selinux/targeted/active/modules/100/keepalived
/etc/sysconfig/keepalived
/etc/rc.d/init.d/keepalived
/etc/keepalived
/usr/sbin/keepalived
/usr/local/etc/keepalived
/usr/local/etc/sysconfig/keepalived
/usr/local/sbin/keepalived
/usr/local/share/doc/keepalived
/usr/local/keepalived-2.2.7/keepalived
/usr/local/keepalived-2.2.7/keepalived/etc/sysconfig/keepalived
/usr/local/keepalived-2.2.7/keepalived/etc/openrc/keepalived
/usr/local/keepalived-2.2.7/keepalived/etc/keepalived
/usr/local/keepalived-2.2.7/keepalived/etc/init.d/keepalived
/usr/local/keepalived-2.2.7/keepalived/keepalived
/usr/local/keepalived-2.2.7/bin/keepalived

# 把 keepalived的启动文件复制到init.d下,加入开机启动项
cp /usr/local/keepalived-2.2.7/keepalived/etc/init.d/keepalived /etc/rc.d/init.d/

# 复制启动服务至 /etc/sysconfig/
cp -r cp /usr/local/etc/sysconfig/keepalived /etc/sysconfig/

#把 keepalived 加入系统命令目录
cp /usr/local/sbin/keepalived /usr/sbin/

# 创建 keepalived 配置文件夹
mkdir /etc/keepalived

keepalived 配置

1、检测脚本

cat << \EOF >  /etc/keepalived/check.sh
#!/bin/sh

num=`ps -ef | grep test.jar  | grep -v grep | wc -l`
# $? -ne 不存在 0     $? -eq 0 存在
if [ $num -eq 0 ]
then
    systemctl stop keepalived
fi
EOF

检测java程序进程是否存在,如果不清楚有哪些 java 进程可以使用下面命令获取

ps - ef | grep java

2、设置脚本权限

chmod 744 /etc/keepalived/check.sh

3、keepalived.conf 配置(主从节点都需要配置)

ps -ef | grep java
```bash
cat <<\EOF >/etc/keepalived/keepalived.conf

# 全局参数
global_defs {
   # 脚本执行用户
   script_user root
   enable_script_security
}

# 健康检查脚本,检查Haproxy状态,脚本返回0正常,返回非0失败,失败后节点降级 weight -15
# 名字自定义
vrrp_script maint-checkHaproxy {
    script "/etc/keepalived/check.sh"
    interval 3 # 检查间隔3秒
    weight -15 # 降低本节点权重
    fall 2   # 2次失败算失败
    rise 2   # 2次成功算成功
    timeout 2  # 超时
}

# 实例1,名字自定义
vrrp_instance Vs_1 {
    state BACKUP # 定义节点主/备,主MASTER,备BACKUP,这里2个节点均为BACKUP
    interface ens192 # 服务IP绑定的网卡
    virtual_router_id 45 # 集群号,所有节点需要相同
    priority 100 # 权重,weight -15 降低权重值,2个节点权重一致,降低权重后会发生切换
    advert_int 1 # 检测间隔

    # 抢占模式,(nopreempt非抢占模式),配置为抢占模式时,当节点权重降低时,另外一个高权重节点会抢占服务,发生切换;
    # 如果为非抢占模式,上面配置的检查脚本在检查到服务失败后,降低权重,但是不会发生切换。
    !nopreempt

    authentication {
        auth_type PASS
        auth_pass 1718 # 各节点密码一致
    }

    #开启邮件通知
    smtp_alert

    # 单播模式
    # keepalived在组播模式下所有的信息都会向224.0.0.18的组播地址发送,产生众多的无用信息,并且会产生干扰和冲突,所以需要改为单播。
    # 这是一种安全的方法,避免局域网内有大量的keepalived造成虚拟路由id的冲突。
    # 单薄模式需要关闭vrrp_strict,严格遵守vrrp协议这个选项
    # 需要在VIP实例配置段加入单播的源地址和目标地址
    # 在全局配置中global_defs那一段,不能配置vrrp_strict参数,如果有需注释。
    # 否则会因为不是组播而无法启动keepalived

    unicast_src_ip 192.168.46.56 # 本端,源地址
    unicast_peer {
        192.168.46.55 # 对端,目标地址
    }
    
	# 虚拟IP
    virtual_ipaddress {
        192.168.46.77
    }
    
    track_script {
        maint-checkHaproxy # 健康检查脚本,与上面同名;如果不配置也可以,就不检查状态。
    }

    track_interface {
        ens192 # 检查网卡健康
    }
    
     # 邮箱通知配置
     notify_master "/usr/bin/sudo /etc/keepalived/notify.sh master"
     notify_backup "/usr/bin/sudo /etc/keepalived/notify.sh backup"
     notify_fault "/usr/bin/sudo /etc/keepalived/notify.sh fault"
}
EOF

需要修改的地方

  • unicast_src_ip: 本机,源地址
  • unicast_peer: 对端,目标地址
  • unicast_peer: 服务IP地址 ens192 为网卡名称
  • track_interface: 检查网卡健康
  • vrrp_instance Vs_1.interface: 服务IP绑定的网卡
  • vrrp_instance Vs_1.state MASTER或者BACKUP

4、防火墙配置

firewall-cmd --direct --permanent --add-rule ipv4 filter INPUT 0 --protocol vrrp -j ACCEPT

firewall-cmd --reload

5、安装邮件推送服务

yum install -y mailx

5.1、设置邮箱参数

vim /etc/mail.rc
# 添加如下参数
# 发件人邮箱
set from=XXX@163.com
# 邮箱服务器
set smtp=smtp.163.com
# 发件人邮箱账号
set smtp-auth-user=XXX@163.com
# 发件人邮箱授权码
set smtp-auth-password=DFXCFXXX

5.2、测试邮件发送是否成功

echo "邮件内容1" | mail -s "邮件主11题" XXX@163.com

5.3、邮件发送脚本

:red_circle: 修改 contact 收件人邮箱

cat << \EOF > /etc/keepalived/notify.sh
#收件人邮箱
contact='15028999624@163.com'
#ip=`ifconfig -a|grep inet|grep -v 127.0.0.1|grep -v inet6|awk '{print $2}'|tr -d "addr:"`
notify() {
local mailsubject="$(hostname) to be $1, vip floating"
local mailbody="$(date +'%F %T'): vrrp transition, $(hostname) changed to be $1"
echo "$mailbody" | mail -s "$mailsubject" $contact
}

case $1 in
master)
        notify master
        ;;
backup)
        notify backup
        ;;
fault)
     notify fault
     ;;
*)
        echo "Usage: $(basename $0) {master|backup|fault}"
        exit 1
        ;;
esac


EOF

5.4 修改脚本权限

chmod 777 /etc/keepalived/notify.sh

6、重启keepalived 服务

systemctl restart keepalived
systemctl start keepalived
systemctl stop keepalived
systemctl status keepalived

7、检查虚拟IP是否正常运行

ens192 为虚拟IP设置的网卡名称

[root@curry keepalived]# ip addr | grep ens192
2: ens192: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc mq state UP group default qlen 1000
    inet 192.168.16.12/24 brd 192.138.16.255 scope global noprefixroute ens192
    inet 192.168.46.19/24 scope global secondary ens192

inet 192.168.46.19/24 scope global secondary ens192 为我们设置的虚拟IP

8、测试高可用

停止java服务看虚拟IP是否会切换到另一台机器

通过 ip addr | grep ens192 判断是否切换成功,如果本机是主节点则存在两个IP如下

2: ens192: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc mq state UP group default qlen 1000
    inet 192.168.16.12/24 brd 192.138.16.255 scope global noprefixroute ens192
    inet 192.168.46.19/24 scope global secondary ens192
阿里云国内75折 回扣 微信号:monov8
阿里云国际,腾讯云国际,低至75折。AWS 93折 免费开户实名账号 代冲值 优惠多多 微信号:monov8 飞机:@monov6
标签: centos