通知脚本的使用方式:
示例通知脚本:
#!/bin/bash
#
contact='root@localhost'---定义谁能接收,将来是一个数组,用python来编写,连接真正的邮件服务器,去发真正的邮件

        notify() {
            local mailsubject="$(hostname) to be $1,vip floating"---float流动
            local mailbody="$(date+'%F %T'):vrrp transition,$(hostname) changed to be $1"
            echo "$mailbody" | mail -s "mailsubject" $contact
        }

        case $1 in
        master)
            notify master---给上边的函数传递参数master
            ;;
        backup)
            notify backup
            ;;
        fault)
            notify fault
            ;;
        *)
            echo "Usage:$(basename $0){master|backup|fault}"
            exit 1
            ;;
        esac

    脚本的调用方法:
        notify_master "/etc/keepalived/notify.sh master"
        notify_backup "/etc/keepalived/notify.sh backup"
        notify_fault "/etc/keepalived/notify.sh fault"

虚拟服务器:
配置参数:
virtual_server IP port |
virtual_server fwmark int
{
...
real_server {
...
}
}

常用参数:
    delay_loop <INI>:服务轮询的时间间隔
    lb_algo rr|wrr|lc|wlc|lblc|sh|dh:定义调度方法
    lb_kind NAT|DR|TUN:集群的类型
    persistence_timeout<INI>:持久连接时长
    sorry_server <IPADDR><PORT>:备用服务器地址;
    real_server <IPADDR><PORT>
    {
        weight <INI>
        notify_up <STRING>|<QUOTED-STRING>
        notify_down <STRING>|<QUOTED-STRING>
        HTTP_GET|SSL_GET|TCP_CHECK|SMTP_CHECK|MISC_CHECK{...}:定义当前主机的健康状态检测方法
    }

    HTTP_GET|SSL_GET:应用层检测
    HTTP_GET|SSL_GET {
        url {
            path <URL_PATH>:dinginess要监控的URL;
            status_code <INI>:判断上述检测机制为健康状态的响应码;
            digest <STRING>:判断上述检测机制为健康状态的响应的内容的校验码;
        }
        nb_get_retry <INI>:重试次数
        delay_before_retry <INI>:重试之前的延迟时长;
        connect_ip <IP ADDRESS>:向当前RS的哪个IP地址发起健康状态检测请求
        connect_port <PORT>:向当前RS的哪个PORT发起健康状态检测请求
        bindto <IP ADDRESS>:发出健康状态检测请求时使用的源地址
        bind_port <PORT>:发出健康状态检测时使用的源端口;
        connect_timeout <INTEGER>:连接请求的超时时长;
    }

高可用的ipvs集群示例:

node1:
vim /etc/keepalived/notify.sh
#!/bin/bash
#
contact='root@localhost'---定义谁能接收,将来是一个数组,用python来编写,连接真正的邮件服务器,去发真正的邮件

notify() {
local mailsubject="$(hostname) to be $1,vip floating"---float流动
local mailbody="$(date+'%F %T'):vrrp transition,$(hostname) changed to be $1"
echo "$mailbody" | mail -s "mailsubject" $contact
}

case $1 in
master)
notify master---给上边的函数传递参数master
;;
backup)
notify backup
;;
fault)
notify fault
;;
*)
echo "Usage:$(basename $0){master|backup|fault}"
exit 1
;;
esac

chmod +x notify.sh---给脚本文件执行权限
bash -n notify.sh---检查语法
bash -x notify.sh master---手动执行脚本文件(一步一步执行),并传递一个参数master
可以看下有没有收到邮件,使用mail命令,可以使用mail -r命令删除测试的邮件
scp -p notify.sh node2:/etc/keepalived/---复制到node2节点上
然后可以先复制下keepalived配置文件,让结果更明晰
cp keepalived.conf{,.dual}

vim keepalived.conf
!Configuration File for keepalived

global_defs {
notification_email {---收邮件地址,要在互联网上真正能接收br/>root@localhost
}
notification_email_from Alexandre.Cassen@firewall.loc---发邮件地址,可以伪装源地址,但是有的服务器不允许伪装,要通过下面的smtp_server的检查
smtp_server 127.0.0.1---一般是本机,可以使用ss -tnl查看25号端口始终是开启的,可以很容易的从本机发送邮件到本机,例如:echo "hello" | mail -s "hi" root@localhost---s可以给上邮件的标题,收邮件的命令是mail,就可以看到收到的邮件,按提示的数字就可以打开查看邮件
smtp_connect_timeout 30
router_id nide1---用来标识当前主机
vrrp_mcast group4 224.1.101.33---224.0.0.18是默认的,但是有可能会冲突,可以自己随便写一个
}

vrrp_instance VI_1 {---第一个实例就是第一个路由器,VI_1是名称随便定义
state MASTER---配置为主设备,但是还需要设置优先级
priority 100---优先级是100
interface eno167777736---把vip绑定到哪个网卡设备
virtual_router_id 33---0到255之间使用哪一个都行,但是两个设备之间要统一
advert_int 1---每隔多长时间向外通告一次
authentication {---要不要认证
auth_type PASS---简单字符串认证
auth_pass RT3SKUI2---这里不要使用默认的1111,可以用openssl rand -base64 7生成一个随机的字符串
}
virtual_ipaddress {---指定IP地址的格式为ip、掩码、设备、别名
172.16.0.99/16 dev eno16777736 label eno16777736:0
}

notify_master "/etc/keepalived/notify.sh master"----要放到实例中
notify_backup "/etc/keepalived/notify.sh backup"
notify_fault "/etc/keepalived/notify.sh fault"

}

定义虚拟主机
virtual_server 172.16.0.99 80 {
delay_loop 2---定义每隔2秒钟检测一次
lb_algowrr---定义调度算法
lb_kind DR---定义类型
protocol TCP---协议
sorry_server 127.0.0.1 80---定义sorry_server

real_server 172.16.0.6 80 {
    weight 1---权重是1
    HTTP_GET {---健康状态检测方式
        url {---对哪个url发请求,不指定会默认对主页发请求
            path /index.html
            status_code 200---只有是200才认为是成功的,也可以使用别的方式,digest(后端realserver响应的内容应该都是一样的)curl -s http://172.16.0.6 | genhash---把响应的结果用管道送给md5这个命令,能帮助我们生成校验码,每次做健康状态检测时,会自动比对,比对成功,说明是正确的,这种方法比响应码严格多了,也可以使用genhash -s 172.16.0.6 -p 80 -u /index.html会生成校验码,跟上边的md5生成的结果一样
            nb_get_retry 3---重试几次来做检测
            delay_before_retry 2---每一次重试前延迟多长时间
            connect_timeout 3---真正发起请求的连接的超时时长
        }
    }
}

real_server 172.16.0.7 80 {
    weight 1---权重是1
    HTTP_GET {---健康状态检测方式
        url {---对哪个url发请求,不指定会默认对主页发请求
            path /index.html
            status_code 200---只有是200才认为是成功的,也可以使用别的方式,digest(后端realserver响应的内容应该都是一样的)curl -s http://172.16.0.6 | genhash---把响应的结果用管道送给md5这个命令,能帮助我们生成校验码,每次做健康状态检测时,会自动比对,比对成功,说明是正确的,这种方法比响应码严格多了,也可以使用genhash -s 172.16.0.6 -p 80 -u /index.html会生成校验码,跟上边的md5生成的结果一样
            nb_get_retry 3---重试几次来做检测
            delay_before_retry 2---每一次重试前延迟多长时间
            connect_timeout 3---真正发起请求的连接的超时时长
        }
    }
}

}
配置双主模型:
vrrp_instance VI_2 {---第一个实例就是第一个路由器,VI_1是名称随便定义
state BACKUP---配置为主设备,但是还需要设置优先级
priority 96---优先级是96
interface eno167777736---把vip绑定到哪个网卡设备
virtual_router_id 34---0到255之间使用哪一个都行,但是两个设备之间要统一
advert_int 1---每隔多长时间向外通告一次
authentication {---要不要认证
auth_type PASS---简单字符串认证
auth_pass Ra3S7Uy2---这里不要使用默认的1111,可以用openssl rand -base64 7生成一个随机的字符串
}
virtual_ipaddress {---指定IP地址的格式为ip、掩码、设备、别名
172.16.0.99/16 dev eno16777736
}
}

systemctl stop keepalived.service


node2:
vim keepalived.conf
!Configuration File for keepalived

global_defs {
notification_email {---收邮件地址,要在互联网上真正能接收
br/>root@localhost
}
notification_email_from Alexandre.Cassen@firewall.loc---发邮件地址,可以伪装源地址,但是有的服务器不允许伪装,要通过下面的smtp_server的检查
smtp_server 127.0.0.1---一般是本机,可以使用ss -tnl查看25号端口始终是开启的,可以很容易的从本机发送邮件到本机,例如:echo "hello" | mail -s "hi" root@localhost---s可以给上邮件的标题,收邮件的命令是mail,就可以看到收到的邮件,按提示的数字就可以打开查看邮件
smtp_connect_timeout 30
router_id nide1---用来标识当前主机
vrrp_mcast group4 224.1.101.33---224.0.0.18是默认的,但是有可能会冲突,可以自己随便写一个
}

vrrp_instance VI_1 {---第一个实例就是第一个路由器,VI_1是名称随便定义
state MASTER---配置为主设备,但是还需要设置优先级
priority 100---优先级是100
interface eno167777736---把vip绑定到哪个网卡设备
virtual_router_id 33---0到255之间使用哪一个都行,但是两个设备之间要统一
advert_int 1---每隔多长时间向外通告一次
authentication {---要不要认证
auth_type PASS---简单字符串认证
auth_pass RT3SKUI2---这里不要使用默认的1111,可以用openssl rand -base64 7生成一个随机的字符串
}
virtual_ipaddress {---指定IP地址的格式为ip、掩码、设备、别名
172.16.0.99/16 dev eno16777736 label eno16777736:0
}

notify_master "/etc/keepalived/notify.sh master"----要放到实例中
notify_backup "/etc/keepalived/notify.sh backup"
notify_fault "/etc/keepalived/notify.sh fault"

}

定义虚拟主机
virtual_server 172.16.0.99 80 {
delay_loop 2---定义每隔2秒钟检测一次
lb_algowrr---定义调度算法
lb_kind DR---定义类型
protocol TCP---协议
sorry_server 127.0.0.1 80---定义sorry_server

real_server 172.16.0.6 80 {
    weight 1---权重是1
    HTTP_GET {---健康状态检测方式
        url {---对哪个url发请求,不指定会默认对主页发请求
            path /index.html
            status_code 200---只有是200才认为是成功的,也可以使用别的方式,digest(后端realserver响应的内容应该都是一样的)curl -s http://172.16.0.6 | genhash---把响应的结果用管道送给md5这个命令,能帮助我们生成校验码,每次做健康状态检测时,会自动比对,比对成功,说明是正确的,这种方法比响应码严格多了,也可以使用genhash -s 172.16.0.6 -p 80 -u /index.html会生成校验码,跟上边的md5生成的结果一样
            nb_get_retry 3---重试几次来做检测
            delay_before_retry 2---每一次重试前延迟多长时间
            connect_timeout 3---真正发起请求的连接的超时时长
        }
    }
}

real_server 172.16.0.7 80 {
    weight 1---权重是1
    HTTP_GET {---健康状态检测方式
        url {---对哪个url发请求,不指定会默认对主页发请求
            path /index.html
            status_code 200---只有是200才认为是成功的,也可以使用别的方式,digest(后端realserver响应的内容应该都是一样的)curl -s http://172.16.0.6 | genhash---把响应的结果用管道送给md5这个命令,能帮助我们生成校验码,每次做健康状态检测时,会自动比对,比对成功,说明是正确的,这种方法比响应码严格多了,也可以使用genhash -s 172.16.0.6 -p 80 -u /index.html会生成校验码,跟上边的md5生成的结果一样
            nb_get_retry 3---重试几次来做检测
            delay_before_retry 2---每一次重试前延迟多长时间
            connect_timeout 3---真正发起请求的连接的超时时长
        }
    }
}
上边是http状态检测,下边是tcp状态检测:
real_server 172.16.0.7 80 {
    weight 1---权重是1
    TCP_CHECK {---健康状态检测方式

            nb_get_retry 3---重试几次来做检测
            delay_before_retry 2---每一次重试前延迟多长时间
            connect_timeout 3---真正发起请求的连接的超时时长
        }
    }
}

}
配置双主模型:
vrrp_instance VI_2 {---第一个实例就是第一个路由器,VI_1是名称随便定义
state BACKUP---配置为主设备,但是还需要设置优先级
priority 96---优先级是96
interface eno167777736---把vip绑定到哪个网卡设备
virtual_router_id 34---0到255之间使用哪一个都行,但是两个设备之间要统一
advert_int 1---每隔多长时间向外通告一次
authentication {---要不要认证
auth_type PASS---简单字符串认证
auth_pass Ra3S7Uy2---这里不要使用默认的1111,可以用openssl rand -base64 7生成一个随机的字符串
}
virtual_ipaddress {---指定IP地址的格式为ip、掩码、设备、别名
172.16.0.99/16 dev eno16777736
}
}

systemctl stop keepalived.service
systemctl start keepalived.service

keepalived不只能转移IP地址,还能转移服务
视频中演示的是DR类型的高可用以及负载均衡
两个server节点都安装上httpd服务,并且都要同步时间
yum -y install httpd
ntpdate 172.16.0.1
vim /var/www/html/index.html
<h1>Real Server1</h1>
<h1>Real Server2</h1>
systemctl start httpd.service
ss -tnl---验证服务有没有启动,查看端口80
要把两个server设置上vip,需要一个脚本(以前讲过的)
vim setrs.sh
#!/bin/bash
#
vip='172.16.0.99'
netmask='255.255.255.255'
iface='lo:0'

case $1 in
start)
echo 1 > /proc/sys/net/ipv4/conf/all/arp_ignore
echo 1 > /proc/sys/net/ipv4/conf/lo/arp_ignore
echo 2 > /proc/sys/net/ipv4/conf/all/arp_announce
echo 2 > /proc/sys/net/ipv4/conf/lo/arp_announce

ifconfig $iface $vip netmask $netmask broadcast $vip up
route -add -host $vip dev $iface
;;

stop)
ifconfig $iface down

echo 0 > /proc/sys/net/ipv4/conf/all/arp_ignore
echo 0 > /proc/sys/net/ipv4/conf/lo/arp_ignore
echo 0 > /proc/sys/net/ipv4/conf/all/arp_announce
echo 0 > /proc/sys/net/ipv4/conf/lo/arp_announce
;;

*)
exit 1
esac

bash -n setrs.sh---检查语法
bash -x setrs.sh start
ifconfig---查看ip地址有没有配置上去
route -n---查看路由有没有添加
scp setrs.sh 172.16.0.6:/root---复制脚本

n2节点:提供web服务的节点
bash -x setrs.sh start
ifconfig
route -n

剩下的就是生成ipvs规则了,但是使用keepalived自动生成,就不需要ipvsadm了,但是最好安装一下,为了看规则而不是生成规则

yum -y install ipvsadm
ipvsadm -ln---可以看到两个realserver
curl
http://172.16.0.99---多次请求可以看到是轮询状态
此时只是node2节点启动起来了,如果把node1节点启动,node1会抢占ip,并且ipvs也是配置上去了,客户端请求看到的仍然是轮询状态

}

注意:如何定义sorry server,两个虚拟主机都要装nginx,只要有nginx就当sorry server
yum install -y nginx
systemctl start nginx.service