通知脚本的使用方式:
示例通知脚本:
#!/bin/bash
#
contact='root@localhost'---定义谁能接收,未来是一个数组,用python来编写,链接真正的邮件服务器,去发真正的邮件html
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 {
...
}
}node
经常使用参数: 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集群示例:python
node1:
vim /etc/keepalived/notify.sh
#!/bin/bash
#
contact='root@localhost'---定义谁能接收,未来是一个数组,用python来编写,链接真正的邮件服务器,去发真正的邮件nginx
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
}web
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
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
}bash
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 serveryum install -y nginxsystemctl start nginx.service