博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
集群介绍&keepalived介绍&用keepalived配置高可用集群
阅读量:5874 次
发布时间:2019-06-19

本文共 15401 字,大约阅读时间需要 51 分钟。

hot3.png

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

c1737b19986dde9e4633c256d628fb29945.jpg

访问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

访问测试

c0f42a0b37321630c254663d8c7a9b70671.jpg

测试发现封堵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

测试访问

43f8e167c4fd97678a4016c560221172699.jpg

测试发现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已在从机上被清除了

测试访问

6a340e3553ee8077243d23d79ac4baed70c.jpg

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

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

转载于:https://my.oschina.net/u/3804357/blog/1841738

你可能感兴趣的文章
凡客诚品站点打不开:页面显示域名到期了!
查看>>
从位图数据取得位图句柄
查看>>
Spark RDD、DataFrame原理及操作详解
查看>>
程序计数器、反汇编工具
查看>>
Android N: jack server failed
查看>>
007-Shell test 命令,[],[[]]
查看>>
关于Linux系统使用遇到的问题-1:vi 打开只读(readonly)文件如何退出保存?
查看>>
pandas 按照某一列进行排序
查看>>
在WPF中如何使用RelativeSource绑定
查看>>
Map的深浅拷贝的探究
查看>>
XSLT语法 在.net中使用XSLT转换xml文档示例
查看>>
如何将lotus 通讯簿导入到outlook 2003中
查看>>
WinForm 应用程序中开启新的进程及控制
查看>>
前端工程师的职业发展路线在哪?
查看>>
IOS 内存警告 Memory warning level
查看>>
[转]PAC Manager: Ubuntu 上强大的 SSH 帐号管理工具,可取代 SecureCRT_Miracle_百度空间...
查看>>
顺序容器 (2)string类型操作
查看>>
转载:我最近的研究成果(IGeometry.Project and IGeometry.SpatialReference)
查看>>
提示框
查看>>
HDOJ1233 畅通工程之一(最小生成树-Kruscal)
查看>>