集群介绍&keepalived介绍&用keepalived配置高可用集群

18.1 集群介绍

• Linux集群根据功能划分为两大类:高可用和负载均衡html

• 高可用集群一般为两台服务器,一台工做,另一台做为冗余,当提供服务的机器宕机,冗余将接替继续提供服务mysql

• 实现高可用的开源软件有:heartbeat、keepalivedlinux

• 负载均衡集群,须要有一台服务器做为分发器,它负责把用户的请求分发给后端的服务器处理,在这个集群里,除了分发器外,就是给用户提供服务的服务器了,这些服务器数量至少为2nginx

• 实现负载均衡的开源软件有LVS、keepalived、haproxy、nginx,商业的有F五、Netscalerweb

18.2 keepalived介绍

• 使用keepalived来实现高可用集群,由于heartbeat在centos6上有一些问题,影响实验效果sql

• keepalived经过VRRP(Virtual Router Redundancy Protocl)来实现高可用。vim

• 在这个协议里会将多台功能相同的路由器组成一个小组,这个小组里会有1个master角色和N(N>=1)个backup角色。后端

• master会经过组播的形式向各个backup发送VRRP协议的数据包,当backup收不到master发来的VRRP数据包时,就会认为master宕机了。此时就须要根据各个backup的优先级来决定谁成为新的mater。centos

• Keepalived要有三个模块,分别是core、check和vrrp。其中core模块为keepalived的核心,负责主进程的启动、维护以及全局配置文件的加载和解析,check模块负责健康检查,vrrp模块是来实现VRRP协议的。bash

18.3/18.4/18.5 用keepalived配置高可用集群

准备两台服务器,一台做为master,另外一台做为backup。

安装keepalived软件包

keepalived,实际是包含一个服务的,也能够说这个服务用来实现高可用

两台机器都执行yum install -y keepalived

安装nginx

使用 nginx ,把它做为一个高可用的对象——>使用nginx做为演示对象的缘由,由于nginx在工做中,在生产环境中,不少企业把nginx作一个负载均衡器 ,假设nginx一旦挂掉,那么后端全部的web,即便说是正常的,那也没法访问到

yum安装nginx

yum install -y nginx

源码包安装Nginx

主服务器配置

修改主服务器上keepalived的配置文件

########################  清除原有配置  #######################
[root@linux-5 ~]# vim /etc/keepalived/keepalived.conf 
[root@linux-5 ~]#  > !$
 > /etc/keepalived/keepalived.conf
[root@linux-5 ~]# vim /etc/keepalived/keepalived.conf 
########################  全局配置  #######################
global_defs {                            //global_defs 全局配置标识
   notification_email {                  //notification_email用于设置报警邮件地址
   lem@qq.com                            //能够设置多个,每行一个
   }
   notification_email_from root@lem.com    //设置邮件发送地址  
   smtp_server 127.0.0.1                   //设置邮件的smtp server地址
   smtp_connect_timeout 30                 //设置链接smtp sever超时时间
   router_id LVS_DEVEL
}

#######################  check模块配置  ######################
vrrp_script chk_nginx {               
    script "/usr/local/sbin/check_ng.sh"   //检查服务是否正常,经过写脚本实现,脚本检查服务健康状态
    interval 3                             //检查的时间间断是3秒
}
#######################  vrrp模块配置  ######################
vrrp_instance VI_1 {                      //VRRP配置标识 VI_1是实例名称 
    state MASTER                          //定义master相关
    interface ens33                       //经过vrrp协议去通讯、去发广播。配置时,需注意本身的网卡名称
    virtual_router_id 51                  //定义路由器ID ,配置的时候和从机器一致
    priority 100                          //权重,主角色和从角色的权重是不一样的
    advert_int 1                          //设定MASTER与BACKUP主机质检同步检查的时间间隔,单位为秒
    authentication {                      //认证相关信息
        auth_type PASS                    //这里认证的类型是PASS
        auth_pass 123456                  //密码的形式是一个字符串
    }
    virtual_ipaddress {                   //设置虚拟IP地址 (VIP),又叫作漂移IP地址
        192.168.88.100                    //更改成192.168.88.100
    }
    track_script {                        //加载脚本 
        chk_nginx            
    }
}

漂移IP地址是一个共有地址,当主机宕机后,备机Nginx启动,若是备机Nginx解析地址依然为源主机IP,则依旧没法正常访问(源主机宕机,IP地址失效)。为解决上述问题,主机和备机都解析到一个公共IP地址,在主机宕机后备机Nginx服务启动便可解析到正常能够访问的IP地址。

配置监控脚本

主机器配置监控脚本
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
       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

若是不中止keepalived服务,则容易使服务器发生脑裂,在高可用(HA)系统中,当联系2个节点的“心跳线”断开时,原本为一总体、动做协调的HA系统,就分裂成为2个独立的个体。因为相互失去了联系,都觉得是对方出了故障。两个节点上的HA软件像“裂脑人”同样,争抢“共享资源”、争起“应用服务”,就会发生严重后果——或者共享资源被瓜分、2边“服务”都起不来了;或者2边“服务”都起来了,但同时读写“共享存储”,致使数据损坏。

如何判断脑裂?

分别在两台机查看当前服务器是否拥有虚拟IP,若是两台服务器都拥有,则说明发生了脑裂,证实目前双机通讯出现问题,产生此问题的原有在于 两台服务器都探测不到组内其余服务器的状态(心跳请求没法正常响应),私自断定另外一台服务器挂起,则抢占虚拟IP,脑裂的出现是不被容许的,解决此问题的方法为检查防火墙设置(关闭防火墙)或者使用串口通讯。

注:因为主上的Nginx服务是经过yum安装的,所以脚本启动Nginx的命令要使用systemctl start Nginx,不然没法正常启动。若是是经过源码包编译安装的,则使用/etc/init.d/nginx start

脚本权限变动

chmod 755 /usr/local/sbin/check_ng.sh

启动keepalived服务

主机和备机启动keepalived服务前都要先检查selinux以及防火墙是否关闭

[root@linux-5 ~]# systemctl start keepalived.service
[root@linux-5 ~]# ps aux |grep keepalived
root       4572  0.0  0.0 118608  1384 ?        Ss   23:00   0:00 /usr/sbin/keepalived -D
root       4573  0.0  0.1 122804  2364 ?        S    23:00   0:00 /usr/sbin/keepalived -D
root       4574  0.0  0.1 122804  2408 ?        S    23:00   0:00 /usr/sbin/keepalived -D
root       4576  0.0  0.0 112676   984 pts/0    S+   23:00   0:00 grep --color=auto keepalived

注:启动keepalived服务前须要先启动Nginx服务,不然会被断定为Nginx服务宕机,没法启动keepalived服务。

测试监控脚本可用性

[root@linux-5 ~]# ps aux |grep nginx
root       1448  0.0  0.1 120752  2096 ?        Ss   16:41   0:00 nginx: master process /usr/sbin/nginx
nginx      1449  0.0  0.1 121136  3124 ?        S    16:41   0:00 nginx: worker process
root       1519  0.0  0.0 112676   980 pts/0    R+   16:42   0:00 grep --color=auto nginx
[root@linux-5 ~]# systemctl stop nginx
[root@linux-5 ~]# ps aux |grep nginx
root       1568  0.0  0.1 120752  2092 ?        Ss   16:42   0:00 nginx: master process /usr/sbin/nginx
nginx      1569  0.0  0.1 121136  3120 ?        S    16:42   0:00 nginx: worker process
root       1586  0.0  0.0 112676   984 pts/0    R+   16:42   0:00 grep --color=auto nginx

能够发现,当keepalived服务检测到Nginx服务中止后,会经过监控脚本从新拉起Nginx。

查看keepalived日志

keepalived的日志位于/var/log/messages下

[root@linux-5 ~]# less /var/log/messages

查看漂移IP地址(VIP)

[root@linux-5 ~]# ip add
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:58:d2:aa brd ff:ff:ff:ff:ff:ff
    inet 192.168.88.5/24 brd 192.168.88.255 scope global ens33
       valid_lft forever preferred_lft forever
    inet 192.168.88.100/32 scope global ens33
       valid_lft forever preferred_lft forever
    inet 192.168.88.50/24 brd 192.168.88.255 scope global secondary ens33:0
       valid_lft forever preferred_lft forever
    inet6 fe80::531b:14ea:3a75:f113/64 scope link 
       valid_lft forever preferred_lft forever
3: ens37: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP qlen 1000
    link/ether 00:0c:29:58:d2:b4 brd ff:ff:ff:ff:ff:ff
    inet6 fe80::97b3:ed:1e9b:98c8/64 scope link 
       valid_lft forever preferred_lft forever

能够发如今配置文件中设定的VIP(192.168.88.100)已处于监听状态

注:漂移IP只能经过ip add命令查看

从服务器配置

配置以前确保系统防火墙以及selinux均已关闭

修改从服务器的keepalived配置文件

global_defs {
   notification_email {
     lem@lemlinux.com
   }
   notification_email_from root@lemlinux.com
   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                      //从机的类型为BACKUP 
    interface ens33
    virtual_router_id 51
    priority 90                       //从机的权重要低于主机
    advert_int 1
    authentication {
        auth_type PASS
        auth_pass 123456
    }
    virtual_ipaddress {
        192.168.88.100                //漂移IP地址与主机保持一致
    }   
    
    track_script {
        chk_nginx
    }   
    
}

修改监控脚本

[root@linux-10 ~]# 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            //从机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

修改监控脚本文件权限

chmod 755 /usr/local/sbin/check_ng.sh

启动keepalived服务

[root@linux-10 ~]# systemctl start keepalived
[root@linux-10 ~]# ps aux|grep keep
root       1790  0.0  0.0 118652  1396 ?        Ss   23:01   0:00 /usr/sbin/keepalived -D
root       1791  0.0  0.1 127516  3292 ?        S    23:01   0:00 /usr/sbin/keepalived -D
root       1792  0.0  0.1 127456  2836 ?        S    23:01   0:00 /usr/sbin/keepalived -D
root       1818  0.0  0.0 112720   972 pts/0    R+   23:01   0:00 grep --color=auto keep

查看主Nginx默认访问页

[root@linux-5 ~]# vim /usr/share/nginx/html/index.html 
master master

查看从Nginx默认访问页

[root@linux-10 ~]# cat /data/wwwroot/default/index.html 
This is a default site.

访问VIP

访问VIP会跳转至主机的Nginx服务。

测试高可用性

测试1:关闭master上的nginx服务

在以前配置master服务器仍是backup服务器,均已成功启动(经过keepalived服务从新拉起)。

测试2:在master上增长iptabls规则

iptables -I OUTPUT -p vrrp -j DROP   //封禁主服务器发出的vrrp协议包
[root@linux-5 ~]# iptables -nvL
Chain INPUT (policy ACCEPT 44 packets, 3284 bytes)
 pkts bytes target     prot opt in     out     source               destination         

Chain FORWARD (policy ACCEPT 0 packets, 0 bytes)
 pkts bytes target     prot opt in     out     source               destination         

Chain OUTPUT (policy ACCEPT 30 packets, 3224 bytes)
 pkts bytes target     prot opt in     out     source               destination         
   12   480 DROP       112  --  *      *       0.0.0.0/0            0.0.0.0/0

访问测试

测试发现封堵vrrp协议包并不能达到主从切换的目的。

测试3:关闭master上的keepalived服务

systemctl stop keepalived

查看主机IP

[root@linux-5 ~]# systemctl stop keepalived.service 
[root@linux-5 ~]# ip add
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:58:d2:aa brd ff:ff:ff:ff:ff:ff
    inet 192.168.88.5/24 brd 192.168.88.255 scope global ens33
       valid_lft forever preferred_lft forever
    inet 192.168.88.50/24 brd 192.168.88.255 scope global secondary ens33:0
       valid_lft forever preferred_lft forever
    inet6 fe80::531b:14ea:3a75:f113/64 scope link 
       valid_lft forever preferred_lft forever
3: ens37: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP qlen 1000
    link/ether 00:0c:29:58:d2:b4 brd ff:ff:ff:ff:ff:ff

主机已再也不监听192.168.88.100(VIP)。

查看从机IP

[root@linux-10 ~]# ip add
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:66:22:58 brd ff:ff:ff:ff:ff:ff
    inet 192.168.88.10/24 brd 192.168.88.255 scope global ens33
       valid_lft forever preferred_lft forever
    inet 192.168.88.100/32 scope global ens33
       valid_lft forever preferred_lft forever
    inet6 fe80::b1af:cd92:adf1:4329/64 scope link 
       valid_lft forever preferred_lft forever
3: ens37: <NO-CARRIER,BROADCAST,MULTICAST,UP> mtu 1500 qdisc pfifo_fast state DOWN qlen 1000
    link/ether 00:0c:29:66:22:62 brd ff:ff:ff:ff:ff:ff

从机已开始监听192.168.88.100(VIP)。

查看从机日志

[root@linux-10 ~]# tail /var/log/messages
Jul  8 00:24:53 linux-10 Keepalived_vrrp[1792]: Sending gratuitous ARP on ens33 for 192.168.88.100
Jul  8 00:24:53 linux-10 Keepalived_vrrp[1792]: Sending gratuitous ARP on ens33 for 192.168.88.100
Jul  8 00:24:53 linux-10 Keepalived_vrrp[1792]: Sending gratuitous ARP on ens33 for 192.168.88.100
Jul  8 00:24:53 linux-10 Keepalived_vrrp[1792]: Sending gratuitous ARP on ens33 for 192.168.88.100
Jul  8 00:24:58 linux-10 Keepalived_vrrp[1792]: Sending gratuitous ARP on ens33 for 192.168.88.100
Jul  8 00:24:58 linux-10 Keepalived_vrrp[1792]: VRRP_Instance(VI_1) Sending/queueing gratuitous ARPs on ens33 for 192.168.88.100
Jul  8 00:24:58 linux-10 Keepalived_vrrp[1792]: Sending gratuitous ARP on ens33 for 192.168.88.100
Jul  8 00:24:58 linux-10 Keepalived_vrrp[1792]: Sending gratuitous ARP on ens33 for 192.168.88.100
Jul  8 00:24:58 linux-10 Keepalived_vrrp[1792]: Sending gratuitous ARP on ens33 for 192.168.88.100
Jul  8 00:24:58 linux-10 Keepalived_vrrp[1792]: Sending gratuitous ARP on ens33 for 192.168.88.100

测试访问

测试发现keepalived服务已生效,VIP成功在从机监听。

测试4:启动master上的keepalived服务

systemctl start keepalived.service

查看主机IP

[root@linux-5 ~]# systemctl start keepalived.service 
[root@linux-5 ~]# ip add
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:58:d2:aa brd ff:ff:ff:ff:ff:ff
    inet 192.168.88.5/24 brd 192.168.88.255 scope global ens33
       valid_lft forever preferred_lft forever
    inet 192.168.88.100/32 scope global ens33
       valid_lft forever preferred_lft forever
    inet 192.168.88.50/24 brd 192.168.88.255 scope global secondary ens33:0
       valid_lft forever preferred_lft forever
    inet6 fe80::531b:14ea:3a75:f113/64 scope link 
       valid_lft forever preferred_lft forever
3: ens37: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP qlen 1000
    link/ether 00:0c:29:58:d2:b4 brd ff:ff:ff:ff:ff:ff
    inet6 fe80::97b3:ed:1e9b:98c8/64 scope link 
       valid_lft forever preferred_lft forever

查看从机IP

[root@linux-10 ~]# ip add
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:66:22:58 brd ff:ff:ff:ff:ff:ff
    inet 192.168.88.10/24 brd 192.168.88.255 scope global ens33
       valid_lft forever preferred_lft forever
    inet6 fe80::b1af:cd92:adf1:4329/64 scope link 
       valid_lft forever preferred_lft forever
3: ens37: <NO-CARRIER,BROADCAST,MULTICAST,UP> mtu 1500 qdisc pfifo_fast state DOWN qlen 1000
    link/ether 00:0c:29:66:22:62 brd ff:ff:ff:ff:ff:ff

查看从机日志

[root@linux-10 ~]# tail /var/log/messages
Jul  8 00:24:53 linux-10 Keepalived_vrrp[1792]: Sending gratuitous ARP on ens33 for 192.168.88.100
Jul  8 00:24:58 linux-10 Keepalived_vrrp[1792]: Sending gratuitous ARP on ens33 for 192.168.88.100
Jul  8 00:24:58 linux-10 Keepalived_vrrp[1792]: VRRP_Instance(VI_1) Sending/queueing gratuitous ARPs on ens33 for 192.168.88.100
Jul  8 00:24:58 linux-10 Keepalived_vrrp[1792]: Sending gratuitous ARP on ens33 for 192.168.88.100
Jul  8 00:24:58 linux-10 Keepalived_vrrp[1792]: Sending gratuitous ARP on ens33 for 192.168.88.100
Jul  8 00:24:58 linux-10 Keepalived_vrrp[1792]: Sending gratuitous ARP on ens33 for 192.168.88.100
Jul  8 00:24:58 linux-10 Keepalived_vrrp[1792]: Sending gratuitous ARP on ens33 for 192.168.88.100
Jul  8 00:28:39 linux-10 Keepalived_vrrp[1792]: VRRP_Instance(VI_1) Received advert with higher priority 100, ours 90
Jul  8 00:28:39 linux-10 Keepalived_vrrp[1792]: VRRP_Instance(VI_1) Entering BACKUP STATE
Jul  8 00:28:39 linux-10 Keepalived_vrrp[1792]: VRRP_Instance(VI_1) removing protocol VIPs.

从日志能够看出,VIP已在从机上被清除了

测试访问

测试发现主机keepalived服务从新使主机Nginx服务运行。

注:在生产环境中,可能会用到2-3台backup角色, vim /etc/keepalived/keepalived.conf 这里面的权重调成不通级别,权重越高优先级越高!除了nginx服务的话,还能够作MySQL的高可用集群服务。(作mysql的高可用,必定要保证两边的数据一致)

相关文章
相关标签/搜索