linux 学习笔记-062-linux 集群架构-linux 集群介绍,keepalived 介绍及搭建高可用集群

发布于 2018-04-08  423 次阅读


linux 集群介绍

01:根据功能划分为两大类:高可用和负载均衡

02:高可用集群通常为两台服务器,一台工作,另外一台作为冗余,当提供服务的机器宕机,冗余将接替继续提供服务,实现高可用的开源软件有:heartbeat(BUG 比较多,不推荐)、keepalived

03:负载均衡集群,需要有一台服务器作为分发器,它负责把用户的请求分发给后端的服务器处理,在这个集群里,除了分发器外,就是给用户提供服务的服务器了,这些服务器数量至少为 2,实现负载均衡的开源软件有 LVS、keepalived、haproxy、nginx,商业的有 F5、Netscaler

keepalived 介绍

在这里使用 keepalived 来实现高可用集群,因为 heartbeat 的 BUG 比较多,所以不使用 heartbeat 做实验

keepalived 通过 VRRP(Virtual Router Redundancy Protocl)协议来实现高可用

在这个协议里会将多台功能相同的路由器组成一个小组,这个小组里会有 1 个 master 角色和 N(N>=1)个 backup 角色(这里的实验是使用 linux 机器,你可以把这个机器当成是路由器)

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

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

keepalived 配置高可用集群

这里使用两台机器做实验,一台 240 是 master,一台 242 是 backup

两台机器均安装 keepalived 和 nginx

实现高可用,得有一个实现高可用的服务(如 keepalived)和一个需要实现高可用的软件(如 nginx)

两台机器分别安装 keepalived,检测有没有 nginx,没有的话使用 yum 安装即可

[root@am-01:~#] yum -y install keepalived

[root@am-01:~#] ps -aux | grep nginx

root      39729  0.0  0.1  45992  1296 ?        Ss   16:31   0:00 nginx: master process /usr/local/nginx/sbin/nginx -c /usr/local/nginx/conf/nginx.conf

nobody    39730  0.1  0.3  48480  3944 ?        S    16:31   0:00 nginx: worker process

nobody    39731  0.0  0.3  48480  3944 ?        S    16:31   0:00 nginx: worker process

root      39733  0.0  0.0 112676   980 pts/0    S+   16:31   0:00 grep --color=auto nginx
[root@am-02:~#] yum -y install keepalived

[root@am-02:~#] yum -y install nginx

[root@am-02:~#] service nginx start

Redirecting to /bin/systemctl start nginx.service

[root@am-02:~#] ps -aux | grep nginx

root      14131  0.0  0.2 122900  2100 ?        Ss   16:34   0:00 nginx: master process /usr/sbin/nginx

nginx     14132  0.0  0.3 123364  3132 ?        S    16:34   0:00 nginx: worker process

nginx     14133  0.0  0.3 123364  3132 ?        S    16:34   0:00 nginx: worker process

root      14135  0.0  0.0 112672   980 pts/0    S+   16:34   0:00 grep --color=auto nginx

查看 240 机器配置文件,并清空配置文件,重新设置

模版文件地址:https://coding.net/u/aminglinux/p/aminglinux-book/git/blob/master/D21Z/master_keepalived.conf?public=true

[root@am-01:~#] ls /etc/keepalived/keepalived.conf

/etc/keepalived/keepalived.conf

[root@am-01:~#] echo "" > /etc/keepalived/keepalived.conf

[root@am-01:~#] cat /etc/keepalived/keepalived.conf

[root@am-01:~#] vim /etc/keepalived/keepalived.conf

global_defs {

notification_email {

runfali@outlook.com

}

#定义出现问题时给哪个邮箱发送邮件,如果用不着可以不定义



notification_email_from root@outlook.com

smtp_server 127.0.0.1

smtp_connect_timeout 30

router_id LVS_DEVEL

}

#定义以什么邮箱发送邮件的参数



vrrp_script chk_nginx {

script "/usr/local/sbin/check.sh"

interval 3

}

#开启检测模块,用脚本检测服务是否正常,当不正常时使用脚本启动服务,检测间隔为 3 秒钟(脚本需要自定义)



vrrp_instance VI_1 {

state MASTER

interface eno16777736

virtual_router_id 51

priority 100

advert_int 1

authentication {

auth_type PASS

auth_pass itsupport.0

}

virtual_ipaddress {

172.18.0.10

}

track_script {

chk_nginx

}

}

#用来定义 MASTER 相关的信息

#state 定义角色,interface 定义网卡名称,virtual_router_id 定义虚拟路由的 ID,priority 定义权重

#authentication 定义认证相关的信息,auth_type 定义以什么形式认证,这里为密码形式,auth_pass 定义认证密码

#virtual_ipaddress 定义 vip,这个为 MASTER 和 BACKUP 的共有的虚拟 IP,当 MASTER 挂了,客户端也能通过这个虚拟 IP 解析到 BACKUP 上

#track_script 中的 chk_nginx 用来加载之前设置的脚本

#BACKUP 有两个地方跟 MASTER 的配置不一样(state 和 priority)

设置脚本"check.sh",并赋予适当权限并启动 keepalived 服务

模版文件地址:https://coding.net/u/aminglinux/p/aminglinux-book/git/blob/master/D21Z/master_check_ng.sh?public=true

[root@am-01:~#] vim /usr/local/sbin/check.sh

#!/bin/bash

d=`date --date today +%Y%m%d_%H:%M:%S`

#时间变量,用于记录日志

n=`ps -C nginx --no-heading|wc -l`

#计算 nginx 进程数量

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.log

systemctl stop keepalived

fi

fi

#如果进程为 0,则启动 nginx,并且再次检测 nginx 进程数量,

#如果还为 0,说明 nginx 无法启动,此时需要关闭 keepalived
[root@am-01:~#] chmod 755 /usr/local/sbin/check.sh

[root@am-01:~#] systemctl start keepalived.service

[root@am-01:~#] ps -aux | grep keep

root      40187  0.0  0.1 120708  1400 ?        Ss   17:07   0:00 /usr/sbin/keepalived -D

root      40188  0.0  0.3 122780  3100 ?        S    17:07   0:00 /usr/sbin/keepalived -D

root      40189  0.1  0.2 122848  2652 ?        S    17:07   0:00 /usr/sbin/keepalived -D

root      40234  0.0  0.0 112676   980 pts/0    S+   17:07   0:00 grep --color=auto keep

做实验测试脚本是否可用,发现就算停止了,过一会又会自动重启,脚本是可用的

[root@am-01:~#] systemctl stop nginx.service

[root@am-01:~#] ps -aux | grep nginx

root      40401  0.0  0.1  45992  1304 ?        Ss   17:08   0:00 nginx: master process /usr/local/nginx/sbin/nginx -c /usr/local/ngin/conf/nginx.conf

nobody    40402  0.0  0.3  48480  3948 ?        S    17:08   0:00 nginx: worker process

nobody    40403  0.0  0.3  48480  3948 ?        S    17:08   0:00 nginx: worker process

root      40414  0.0  0.0 112676   976 pts/0    S+   17:08   0:00 grep --color=auto nginx

keepalived 的日志可以看,查看 vip 是否设置成功需要使用 ip addr 命令

[root@am-01:~#] less /var/log/messages

Apr  8 17:07:09 am-01 Keepalived_vrrp[40189]: Sending gratuitous ARP on eno16777736 for 172.18.0.10

[root@am-01:~#] ip addr

1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN

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: eno16777736: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP qlen 1000

link/ether 00:0c:29:08:ac:45 brd ff:ff:ff:ff:ff:ff

inet 172.17.1.240/24 brd 172.17.1.255 scope global eno16777736

valid_lft forever preferred_lft forever

inet 172.18.0.10/32 scope global eno16777736

valid_lft forever preferred_lft forever

inet 172.17.1.241/24 brd 172.17.1.255 scope global secondary eno16777736:0

valid_lft forever preferred_lft forever

inet6 fe80::20c:29ff:fe08:ac45/64 scope link

valid_lft forever preferred_lft forever

最后检查 iptables 和 SElinux 是否关闭或者放行

[root@am-01:~#] iptables -nvL

Chain INPUT (policy ACCEPT 9049K packets, 4701M 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 8914K packets, 4828M bytes)

pkts bytes target     prot opt in     out     source               destination

[root@am-01:~#] getenforce

Disabled

查看 242 机器配置文件,并清空配置文件,重新设置

模版文件地址:https://coding.net/u/aminglinux/p/aminglinux-book/git/blob/master/D21Z/backup_keepalived.conf?public=true

[root@am-02:~#] echo "" > /etc/keepalived/keepalived.conf

[root@am-02:~#] vim /etc/keepalived/keepalived.conf

global_defs {

notification_email {

runfali@outlook.com

}

notification_email_from root@outlook.com

smtp_server 127.0.0.1

smtp_connect_timeout 30

router_id LVS_DEVEL

}

vrrp_script chk_nginx {

script "/usr/local/sbin/check.sh"

interval 3

}

vrrp_instance VI_1 {

state BACKUP

interface eno16777736

virtual_router_id 51

priority 90

advert_int 1

authentication {

auth_type PASS

auth_pass itsupport.0

}

virtual_ipaddress {

172.18.0.10

}

track_script {

chk_nginx

}

}

#注意修改 state、priority,其他的跟 MASTER 保持一致即可

设置脚本"check.sh",并赋予适当权限并启动 keepalived 服务,BACKUP 的脚本跟 MASTER 的是一样的,或许可能启动 nginx 的命令不同,自行修改,我这里是一样的

[root@am-02:~#] vim /usr/local/sbin/check.sh

#!/bin/bash

d=`date --date today +%Y%m%d_%H:%M:%S`

#时间变量,用于记录日志

n=`ps -C nginx --no-heading|wc -l`

#计算 nginx 进程数量

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.log

systemctl stop keepalived

fi

fi

#如果进程为 0,则启动 nginx,并且再次检测 nginx 进程数量,

#如果还为 0,说明 nginx 无法启动,此时需要关闭 keepalived
[root@am-02:~#] chmod 755 /usr/local/sbin/check.sh

[root@am-02:~#] systemctl start keepalived.service

[root@am-02:~#] ps -aux | grep keep

root      14332  0.0  0.1 120692  1404 ?        Ss   17:23   0:00 /usr/sbin/keepalived -D

root      14333  0.0  0.3 122764  3108 ?        S    17:23   0:00 /usr/sbin/keepalived -D

root      14334  0.1  0.2 122832  2656 ?        S    17:23   0:00 /usr/sbin/keepalived -D

root      14361  0.0  0.0 112672   976 pts/0    S+   17:23   0:00 grep --color=auto keep

检查是否有 vip(是没有的,因为目前 MASTER 可用,所以 vip 在 MASTER 上),检查 iptables 和 SElinux 是否关闭或者放行

[root@am-02:~#] ip addr

1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN

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: eno16777736: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP qlen 1000

link/ether 00:0c:29:5f:c1:ea brd ff:ff:ff:ff:ff:ff

inet 172.17.1.242/24 brd 172.17.1.255 scope global eno16777736

valid_lft forever preferred_lft forever

inet6 fe80::20c:29ff:fe5f:c1ea/64 scope link

valid_lft forever preferred_lft forever

[root@am-02:~#] iptables -nvL

Chain INPUT (policy ACCEPT 0 packets, 0 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 0 packets, 0 bytes)

pkts bytes target     prot opt in     out     source               destination

[root@am-02:~#] getenforce

Disabled

测试

两边都设置好了,接下来做实验测试一下

01:首先,我们试下 MASTER 和 BACKUP 是否可以正常访问

修改 MASTER 的默认虚拟主机的主页(默认虚拟主机站点目录所在可以看配置文件)

[root@am-01:~#] vim /data/wwwroot/default/index.html

This is the default site.

MASTER

客户端上访问 MASTER 的 IP 可以见到,能访问

linux 学习笔记-062-linux 集群架构-linux 集群介绍,keepalived 介绍及搭建高可用集群

因为 BACKUP 的 nginx 是使用 yum 安装的,所以默认虚拟主机配置文件目录有所不同

[root@am-02:~#] ls /usr/share/nginx/html/index.html

/usr/share/nginx/html/index.html

[root@am-02:~#] vim /usr/share/nginx/html/index.html

[root@am-02:~#] echo '' > /usr/share/nginx/html/index.html

[root@am-02:~#] vim /usr/share/nginx/html/index.html

BACKUP

客户端上访问 BACKUP 的 IP 可以见到,也能访问的

linux 学习笔记-062-linux 集群架构-linux 集群介绍,keepalived 介绍及搭建高可用集群

02:访问 vip 地址,可以见到,默认访问到的是 MASTER,说明目前 vip 在 MASTER 上

linux 学习笔记-062-linux 集群架构-linux 集群介绍,keepalived 介绍及搭建高可用集群

03:测试 keepalived 是否可用

在 MASTER 上增加防火墙

[root@am-01:~#] iptables -I OUTPUT -p vrrp -j DROP

[root@am-01:~#] iptables -nvL

Chain INPUT (policy ACCEPT 15 packets, 2076 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 6 packets, 840 bytes)

pkts bytes target     prot opt in     out     source               destination

3   120 DROP       112  --  *      *       0.0.0.0/0            0.0.0.0/0

再次访问 vip,可以见到,其实使用防火墙封禁 vrrp 协议,一时半会还不会生效

linux 学习笔记-062-linux 集群架构-linux 集群介绍,keepalived 介绍及搭建高可用集群

这里换种方法测试,先把防火墙封禁的 vrrp 协议命令删掉,以免影响后续实验

[root@am-01:~#] iptables -F

[root@am-01:~#] iptables -nvL

Chain INPUT (policy ACCEPT 7 packets, 468 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 5 packets, 504 bytes)

pkts bytes target     prot opt in     out     source               destination

模拟 MASTER 挂了的状态,把 keepalived 服务停止运行,查看日志里得知 vip 已被释放,使用 ip addr 可以见到 vip 已经没见了

[root@am-01:~#] systemctl stop keepalived.service

[root@am-01:~#] tail -5 /var/log/messages

Apr  8 17:45:44 am-01 Keepalived_vrrp[40189]: VRRP_Instance(VI_1) removing protocol VIPs.

Apr  8 17:45:44 am-01 Keepalived_healthcheckers[40188]: Stopped

Apr  8 17:45:45 am-01 Keepalived_vrrp[40189]: Stopped

Apr  8 17:45:45 am-01 Keepalived[40187]: Stopped Keepalived v1.3.5 (03/19,2017), git commit v1.3.5-6-g6fa32f2

Apr  8 17:45:45 am-01 systemd: Stopped LVS and VRRP High Availability Monitor.

[root@am-01:~#] ip addr

1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN

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: eno16777736: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP qlen 1000

link/ether 00:0c:29:08:ac:45 brd ff:ff:ff:ff:ff:ff

inet 172.17.1.240/24 brd 172.17.1.255 scope global eno16777736

valid_lft forever preferred_lft forever

inet 172.17.1.241/24 brd 172.17.1.255 scope global secondary eno16777736:0

valid_lft forever preferred_lft forever

inet6 fe80::20c:29ff:fe08:ac45/64 scope link

valid_lft forever preferred_lft forever

查看 BACKUP 日志,可以见到已经获取到 vip,使用 ip addr 也能见到 vip 到了 BACKUP 上

[root@am-02:~#] tail /var/log/messages

Apr  8 17:45:46 am-02 Keepalived_vrrp[14334]: Sending gratuitous ARP on eno16777736 for 172.18.0.10

Apr  8 17:45:46 am-02 Keepalived_vrrp[14334]: Sending gratuitous ARP on eno16777736 for 172.18.0.10

Apr  8 17:45:46 am-02 Keepalived_vrrp[14334]: Sending gratuitous ARP on eno16777736 for 172.18.0.10

Apr  8 17:45:46 am-02 Keepalived_vrrp[14334]: Sending gratuitous ARP on eno16777736 for 172.18.0.10

Apr  8 17:45:51 am-02 Keepalived_vrrp[14334]: Sending gratuitous ARP on eno16777736 for 172.18.0.10

Apr  8 17:45:51 am-02 Keepalived_vrrp[14334]: VRRP_Instance(VI_1) Sending/queueing gratuitous ARPs on eno16777736 for 172.18.0.10

[root@am-02:~#] ip addr

1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN

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: eno16777736: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP qlen 1000

link/ether 00:0c:29:5f:c1:ea brd ff:ff:ff:ff:ff:ff

inet 172.17.1.242/24 brd 172.17.1.255 scope global eno16777736

valid_lft forever preferred_lft forever

inet 172.18.0.10/32 scope global eno16777736

valid_lft forever preferred_lft forever

inet6 fe80::20c:29ff:fe5f:c1ea/64 scope link

valid_lft forever preferred_lft forever

再次访问 vip 地址,可以见到,现在访问的是 BACKUP 服务器

linux 学习笔记-062-linux 集群架构-linux 集群介绍,keepalived 介绍及搭建高可用集群

把 MASTER 服务器的 keepalived 服务运行,能见到 vip 已经被 MASTER 获取

[root@am-01:~#] systemctl start keepalived.service

[root@am-01:~#] ip addr

1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN

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: eno16777736: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP qlen 1000

link/ether 00:0c:29:08:ac:45 brd ff:ff:ff:ff:ff:ff

inet 172.17.1.240/24 brd 172.17.1.255 scope global eno16777736

valid_lft forever preferred_lft forever

inet 172.18.0.10/32 scope global eno16777736

valid_lft forever preferred_lft forever

inet 172.17.1.241/24 brd 172.17.1.255 scope global secondary eno16777736:0

valid_lft forever preferred_lft forever

inet6 fe80::20c:29ff:fe08:ac45/64 scope link

valid_lft forever preferred_lft forever

客户端上测试,可以见到访问到的服务器是 MASTER 了

linux 学习笔记-062-linux 集群架构-linux 集群介绍,keepalived 介绍及搭建高可用集群

注:

一般公司会使用两台或多台 BACKUP,这时主要是要设置不同的 priority(权重)

特别说明下,这篇文章说的是使用 keepalived 实现 nginx 的高可用,当然,也可以实现 mysql 的高可用,但 mysql 的高可用必须要求 MASTER 和 BACKUP 的数据库保持一致

扩展

heartbeat 和 keepalived 比较:

http://blog.csdn.net/yunhua_lee/article/details/9788433

DRBD 工作原理和配置:

http://502245466.blog.51cto.com/7559397/1298945

mysql+keepalived:

http://lizhenliang.blog.51cto.com/7876557/1362313