• Linux集群根据功能划分为两大类:高可用和负载均衡html
• 高可用集群一般为两台服务器,一台工做,另一台做为冗余,当提供服务的机器宕机,冗余将接替继续提供服务mysql
• 实现高可用的开源软件有:heartbeat、keepalivedlinux
• 负载均衡集群,须要有一台服务器做为分发器,它负责把用户的请求分发给后端的服务器处理,在这个集群里,除了分发器外,就是给用户提供服务的服务器了,这些服务器数量至少为2nginx
• 实现负载均衡的开源软件有LVS、keepalived、haproxy、nginx,商业的有F五、Netscalerweb
• 使用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
准备两台服务器,一台做为master,另外一台做为backup。
keepalived,实际是包含一个服务的,也能够说这个服务用来实现高可用
两台机器都执行yum install -y keepalived
使用 nginx ,把它做为一个高可用的对象——>使用nginx做为演示对象的缘由,由于nginx在工做中,在生产环境中,不少企业把nginx作一个负载均衡器 ,假设nginx一旦挂掉,那么后端全部的web,即便说是正常的,那也没法访问到
yum安装nginx
yum install -y nginx
######################## 清除原有配置 ####################### [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服务前都要先检查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的日志位于/var/log/messages下
[root@linux-5 ~]# less /var/log/messages
[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均已关闭
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
[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
[root@linux-5 ~]# vim /usr/share/nginx/html/index.html master master
[root@linux-10 ~]# cat /data/wwwroot/default/index.html This is a default site.
访问VIP会跳转至主机的Nginx服务。
在以前配置master服务器仍是backup服务器,均已成功启动(经过keepalived服务从新拉起)。
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协议包并不能达到主从切换的目的。
systemctl stop keepalived
[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)。
[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成功在从机监听。
systemctl start keepalived.service
[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
[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的高可用,必定要保证两边的数据一致)