18.1 集群介绍
• Linux集群根据功能划分为两大类:高可用和负载均衡
• 高可用集群通常为两台服务器,一台工作,另外一台作为冗余,当提供服务的机器宕机,冗余将接替继续提供服务
• 实现高可用的开源软件有:heartbeat、keepalived
• 负载均衡集群,需要有一台服务器作为分发器,它负责把用户的请求分发给后端的服务器处理,在这个集群里,除了分发器外,就是给用户提供服务的服务器了,这些服务器数量至少为2
• 实现负载均衡的开源软件有LVS、keepalived、haproxy、nginx,商业的有F5、Netscaler
18.2 keepalived介绍
• 使用keepalived来实现高可用集群,因为heartbeat在centos6上有一些问题,影响实验效果
• keepalived通过VRRP(Virtual Router Redundancy Protocl)来实现高可用。
• 在这个协议里会将多台功能相同的路由器组成一个小组,这个小组里会有1个master角色和N(N>=1)个backup角色。
• master会通过组播的形式向各个backup发送VRRP协议的数据包,当backup收不到master发来的VRRP数据包时,就会认为master宕机了。此时就需要根据各个backup的优先级来决定谁成为新的mater。
• Keepalived要有三个模块,分别是core、check和vrrp。其中core模块为keepalived的核心,负责主进程的启动、维护以及全局配置文件的加载和解析,check模块负责健康检查,vrrp模块是来实现VRRP协议的。
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
主服务器配置
修改主服务器上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无法启动,此时需要关闭keepalivedif [ $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 fifi
如果不停止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 keepalivedroot 4572 0.0 0.0 118608 1384 ? Ss 23:00 0:00 /usr/sbin/keepalived -Droot 4573 0.0 0.1 122804 2364 ? S 23:00 0:00 /usr/sbin/keepalived -Droot 4574 0.0 0.1 122804 2408 ? S 23:00 0:00 /usr/sbin/keepalived -Droot 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 nginxroot 1448 0.0 0.1 120752 2096 ? Ss 16:41 0:00 nginx: master process /usr/sbin/nginxnginx 1449 0.0 0.1 121136 3124 ? S 16:41 0:00 nginx: worker processroot 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 nginxroot 1568 0.0 0.1 120752 2092 ? Ss 16:42 0:00 nginx: master process /usr/sbin/nginxnginx 1569 0.0 0.1 121136 3120 ? S 16:42 0:00 nginx: worker processroot 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 add1: lo: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 forever2: ens33: 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 forever3: ens37: 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无法启动,此时需要关闭keepalivedif [ $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 fifi
修改监控脚本文件权限
chmod 755 /usr/local/sbin/check_ng.sh
启动keepalived服务
[root@linux-10 ~]# systemctl start keepalived[root@linux-10 ~]# ps aux|grep keeproot 1790 0.0 0.0 118652 1396 ? Ss 23:01 0:00 /usr/sbin/keepalived -Droot 1791 0.0 0.1 127516 3292 ? S 23:01 0:00 /usr/sbin/keepalived -Droot 1792 0.0 0.1 127456 2836 ? S 23:01 0:00 /usr/sbin/keepalived -Droot 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 -nvLChain 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 add1: lo: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 forever2: ens33: 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 forever3: ens37: 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 add1: lo: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 forever2: ens33: 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 forever3: ens37: 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/messagesJul 8 00:24:53 linux-10 Keepalived_vrrp[1792]: Sending gratuitous ARP on ens33 for 192.168.88.100Jul 8 00:24:53 linux-10 Keepalived_vrrp[1792]: Sending gratuitous ARP on ens33 for 192.168.88.100Jul 8 00:24:53 linux-10 Keepalived_vrrp[1792]: Sending gratuitous ARP on ens33 for 192.168.88.100Jul 8 00:24:53 linux-10 Keepalived_vrrp[1792]: Sending gratuitous ARP on ens33 for 192.168.88.100Jul 8 00:24:58 linux-10 Keepalived_vrrp[1792]: Sending gratuitous ARP on ens33 for 192.168.88.100Jul 8 00:24:58 linux-10 Keepalived_vrrp[1792]: VRRP_Instance(VI_1) Sending/queueing gratuitous ARPs on ens33 for 192.168.88.100Jul 8 00:24:58 linux-10 Keepalived_vrrp[1792]: Sending gratuitous ARP on ens33 for 192.168.88.100Jul 8 00:24:58 linux-10 Keepalived_vrrp[1792]: Sending gratuitous ARP on ens33 for 192.168.88.100Jul 8 00:24:58 linux-10 Keepalived_vrrp[1792]: Sending gratuitous ARP on ens33 for 192.168.88.100Jul 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 add1: lo: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 forever2: ens33: 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 forever3: ens37: 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 add1: lo: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 forever2: ens33: 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 forever3: ens37: 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/messagesJul 8 00:24:53 linux-10 Keepalived_vrrp[1792]: Sending gratuitous ARP on ens33 for 192.168.88.100Jul 8 00:24:58 linux-10 Keepalived_vrrp[1792]: Sending gratuitous ARP on ens33 for 192.168.88.100Jul 8 00:24:58 linux-10 Keepalived_vrrp[1792]: VRRP_Instance(VI_1) Sending/queueing gratuitous ARPs on ens33 for 192.168.88.100Jul 8 00:24:58 linux-10 Keepalived_vrrp[1792]: Sending gratuitous ARP on ens33 for 192.168.88.100Jul 8 00:24:58 linux-10 Keepalived_vrrp[1792]: Sending gratuitous ARP on ens33 for 192.168.88.100Jul 8 00:24:58 linux-10 Keepalived_vrrp[1792]: Sending gratuitous ARP on ens33 for 192.168.88.100Jul 8 00:24:58 linux-10 Keepalived_vrrp[1792]: Sending gratuitous ARP on ens33 for 192.168.88.100Jul 8 00:28:39 linux-10 Keepalived_vrrp[1792]: VRRP_Instance(VI_1) Received advert with higher priority 100, ours 90Jul 8 00:28:39 linux-10 Keepalived_vrrp[1792]: VRRP_Instance(VI_1) Entering BACKUP STATEJul 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的高可用,一定要保证两边的数据一致)