机器IP (hostname) | 作用 |
---|---|
192.168.59.130 (zhdy-02) | master |
192.168.59.131 (zhdy-03) | backup |
192.168.59.100 | vip |
1.2 安装keepalived 两台测试机器分别安装keepalived服务:
yum install -y keepalived
1.3 两台机器的环境
两台机器都安装nginx,其中131上已经编译安装过nginx,130上需要yum安装nginx:
yum install -y nginx
2.1 编辑zhdy-02 130上keepalived配置文件:
[root@zhdy-02 ~]# vim /etc/keepalived/keepalived.conf
删除默认的配置,增加如下新配置
global_defs {
notification_email {
[email protected]
}
notification_email_from [email protected]
smtp_server 127.0.0.1
smtp_connect_timeout 30
router_id LVS_DEVEL
}
vrrp_script chk_nginx {
script "/usr/local/sbin/check_ng.sh"
interval 3
}
vrrp_instance VI_1 {
state MASTER
interface ens33
virtual_router_id 51
priority 100
advert_int 1
authentication {
auth_type PASS
auth_pass aminglinux>com
}
virtual_ipaddress {
192.168.59.100
}
track_script {
chk_nginx
}
}
详解:
notification_email //出现问题后接收提示的邮箱
notification_email_from //发件人
smtp_server 127.0.0.1 //邮件服务器
smtp_connect_timeout 30 //延时
vrrp_script chk_nginx //检查服务状态
vrrp_instance VI_1 //定义master相关的配置
state MASTER //设定角色
interface ens33 //指定ens33这块网卡,通过vrrp协议去发广播
virtual_router_id 51 //定义虚拟路由器的ID,一定要和从保持一致
priority 100 //优先级,数字越大优先级越高
advert_int 1
authentication { //认证相关的信息
auth_type PASS //认证类型,PASS
auth_pass zhangduanya //密码为:
virtual_ipaddress //VIP,当我们有主从两台机器,我们需要绑定域名到指定的IP,如果绑定在主上面。如果主宕机,我们就无法提供服务,所以Vitrual IP就起到了关键性作用,默认配置在主服务器上面,但是一旦宕机,从服务器就会立即启动,并且把这个IP绑定在从上面从而不会影响业务的状态!
chk_nginx //加载定义的chk_nginx脚本
2.2 zhdy-02 59.130编辑监控脚本
[root@zhdy-02 ~]# vim /usr/local/sbin/check_ng.sh
增加如下内容:
#!/bin/bash
#时间变量,用于记录日志
d=`date --date today +%Y%m%d_%H:%M:%S`
#计算nginx进程数量
n=`ps -C nginx --no-heading|wc -l`
#如果进程为0,则启动nginx,并且再次检测nginx进程数量,
#如果还为0,说明nginx无法启动,此时需要关闭keepalived
if [ $n -eq "0" ]; then
/etc/init.d/nginx start
n2=`ps -C nginx --no-heading|wc -l`
if [ $n2 -eq "0" ]; then
echo "$d nginx down,keepalived will stop" >> /var/log/check_ng.log
systemctl stop keepalived
fi
fi
脚本的大概意思是:
如果进程里面没发现nginx那就代表着服务宕机了,然后脚本自动的再次启动nginx服务。 如果服务还是不可以启动,就把启动报错日志输入到指定的位置,然后把keepalived也关闭。
为什么需要关闭keepalived呢? 行业里面有个名词叫做“脑裂”,如果主服务宕机,从服务势必会马上启动顶替主服务再次服务,如果主服务的keepalived没有关闭,一定会造成混乱,两台机器都争抢服务。
在高可用(HA)系统中,当联系2个节点的“心跳线”断开时,本来为一整体、动作协调的HA系统,就分裂成为2个独立的个体。由于相互失去了联系,都以为是对方出了故障。两个节点上的HA软件像“裂脑人”一样,争抢“共享资源”、争起“应用服务”,就会发生严重后果——或者共享资源被瓜分、2边“服务”都起不来了;或者2边“服务”都起来了,但同时读写“共享存储”,导致数据损坏
这是绝对不可以发生的脑裂问题!
2.3 授权
[[email protected]02 ~]# chmod 755 /usr/local/sbin/check_ng.sh
2.4 启动服务
[[email protected]02 ~]# systemctl start keepalived
[[email protected]02 ~]# ps aux | grep keep
root 4303 0.0 0.1 111708 1300 ? Ss 17:23 0:00 /usr/sbin/keepalived -D
root 4304 0.0 0.2 111708 2544 ? S 17:23 0:00 /usr/sbin/keepalived -D
root 4305 0.0 0.1 111708 1520 ? S 17:23 0:00 /usr/sbin/keepalived -D
root 4319 0.0 0.0 112664 972 pts/0 R+ 17:23 0:00 grep --color=auto keep
2.5 查看日志:
less /var/log/messages
2.6 查看虚拟IP地址
[[email protected]02 ~]# ip addr
inet 192.168.59.100/32 scope global ens33
2.7 关闭防火墙: 在配置从之前,我们一定需要检查防火墙的状态以及selinux。
[root@zhdy-02 ~]# systemctl stop firewalld
[root@zhdy-02 ~]# systemctl disable firewalld
[root@zhdy-02 ~]# setenforce 0
setenforce: SELinux is disabled
趁热打铁,先关闭防火墙:
[root@zhdy-03 ~]# systemctl stop firewalld
[root@zhdy-03 ~]# systemctl disable firewalld
[root@zhdy-03 ~]# setenforce 0
setenforce: SELinux is disabled
2.2 配置
[root@zhdy-03 ~]# vim /etc/keepalived/keepalived.conf
增加如下内容:
global_defs {
notification_email {
[email protected]
}
notification_email_from [email protected]
smtp_server 127.0.0.1
smtp_connect_timeout 30
router_id LVS_DEVEL
}
vrrp_script chk_nginx {
script "/usr/local/sbin/check_ng.sh"
interval 3
}
vrrp_instance VI_1 {
state BACKUP
interface ens33
virtual_router_id 51
priority 90
advert_int 1
authentication {
auth_type PASS
auth_pass aminglinux>com
}
virtual_ipaddress {
192.168.59.100
}
track_script {
chk_nginx
}
}
需要注意的配置的地方:
state BACKUP
interface ens33
virtual_router_id 51
priority 90
2.3 编写启动脚本
[root@zhdy-03 ~]# vim /usr/local/sbin/check_ng.sh
#时间变量,用于记录日志
d=`date --date today +%Y%m%d_%H:%M:%S`
#计算nginx进程数量
n=`ps -C nginx --no-heading|wc -l`
#如果进程为0,则启动nginx,并且再次检测nginx进程数量,
#如果还为0,说明nginx无法启动,此时需要关闭keepalived
if [ $n -eq "0" ]; then
systemctl start nginx
n2=`ps -C nginx --no-heading|wc -l`
if [ $n2 -eq "0" ]; then
echo "$d nginx down,keepalived will stop" >> /var/log/check_ng.log
systemctl stop keepalived
fi
fi
2.4 授权
[[email protected]03 ~]# chmod 755 /usr/local/sbin/check_ng.sh
2.5 启动服务:
[[email protected]03 ~]# systemctl start keepalived
[[email protected]03 ~]# ps aux | grep keep
root 3224 0.0 0.1 111708 1304 ? Ss 17:49 0:00 /usr/sbin/keepalived -D
root 3225 0.0 0.2 111708 2552 ? S 17:49 0:00 /usr/sbin/keepalived -D
root 3226 0.0 0.1 111708 1524 ? S 17:49 0:00 /usr/sbin/keepalived -D
为了测试简单明了,修改主上面的主页为:
[root@zhdy-02 ~]# vim /usr/share/nginx/html/index.html
this is master server!
修改从上面的主页为(因为之前已经做过了LNMP所以)配置文件为:
[root@zhdy-03 ~]# vim /data/wwwroot/www.haha.com/index.html
this is backup server!
页面配置好了,但真实的环境我们需要绑定59.100为访问IP地址。如果成功的话,现在如果我们访问192.168.59.100会自动跳转到主server上去!
看来是正常的!
3.2 如果把master 的keepalived服务停掉,也就是模拟宕机的情况,是不是服务就会转移到backup呢?
停掉keepalived服务:
[root@zhdy-02 ~]# systemctl stop keepalived
发现192.168.59.100已经被释放掉了。
[[email protected]02 ~]# ip addr
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN qlen 1
link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
inet 127.0.0.1/8 scope host lo
valid_lft forever preferred_lft forever
inet6 ::1/128 scope host
valid_lft forever preferred_lft forever
2: ens33: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP qlen 1000
link/ether 00:0c:29:50:b7:0a brd ff:ff:ff:ff:ff:ff
inet 192.168.59.130/24 brd 192.168.59.255 scope global ens33
valid_lft forever preferred_lft forever
inet6 fe80::855:2a0f:94b6:3066/64 scope link
valid_lft forever preferred_lft forever
inet6 fe80::bf95:da75:15e3:78ca/64 scope link tentative dadfailed
valid_lft forever preferred_lft forever
查看zhdy-03上面是否已经加载了VIP地址:
[[email protected]03 ~]# ip addr
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN qlen 1
link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
inet 127.0.0.1/8 scope host lo
valid_lft forever preferred_lft forever
inet6 ::1/128 scope host
valid_lft forever preferred_lft forever
2: ens33: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP qlen 1000
link/ether 00:0c:29:75:98:c1 brd ff:ff:ff:ff:ff:ff
inet 192.168.59.131/24 brd 192.168.59.255 scope global ens33
valid_lft forever preferred_lft forever
inet 192.168.59.100/32 scope global ens33
再次访问192.168.59.100 结果可想而知:
从服务器(zhdy-03)已经成启动并开始服务!
如果再次把主的keepalived服务启动呢?
那答案必须是主服务器接替从继续服务呗!
如果现实环境中有多台backup呢?我们需要什么呢?
只需要调节优先级即可,调节一个适当的值,取决于现场的需求!
vim /etc/keepalived/keepalived.conf
priority 90
除了配置nginx的高可用,我们当然也可以配置mysql的高可用,前提是一定要保证双方的数据是一致的。如果主mysql宕机,从mysql的数据一定会和主不一致。我们需要想到这一点!