通知脚本的使用方式:
示例通知脚本:
#!/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 :服务轮询的时间间隔
lb_algo rr|wrr|lc|wlc|lblc|sh|dh:定义调度方法
lb_kind NAT|DR|TUN:集群的类型
persistence_timeout:持久连接时长
sorry_server :备用服务器地址;
real_server
{
weight
notify_up |
notify_down |
HTTP_GET|SSL_GET|TCP_CHECK|SMTP_CHECK|MISC_CHECK{...}:定义当前主机的健康状态检测方法
}
HTTP_GET|SSL_GET:应用层检测
HTTP_GET|SSL_GET {
url {
path :dinginess要监控的URL;
status_code :判断上述检测机制为健康状态的响应码;
digest :判断上述检测机制为健康状态的响应的内容的校验码;
}
nb_get_retry :重试次数
delay_before_retry :重试之前的延迟时长;
connect_ip :向当前RS的哪个IP地址发起健康状态检测请求
connect_port :向当前RS的哪个PORT发起健康状态检测请求
bindto :发出健康状态检测请求时使用的源地址
bind_port :发出健康状态检测时使用的源端口;
connect_timeout :连接请求的超时时长;
}
高可用的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 [email protected]发邮件地址,可以伪装源地址,但是有的服务器不允许伪装,要通过下面的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 [email protected]发邮件地址,可以伪装源地址,但是有的服务器不允许伪装,要通过下面的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
Real Server1
Real Server2
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