18.1 集群介绍
18.2 keepalived介绍
18.3/18.4/18.5 用keepalived配置高可用集群
18.1 集群介绍
- 集群根据功能划分为两大类:
高可用
和负载均衡
高可用集群
通常为两台服务器,一台工作,另外一台作为冗余,当提供服务的机器宕机,冗余将接替继续提供服务
实现高可用的开源软件有:heartbeat
、keepalived
负载均衡集群
,需要有一台服务器作为分发器,它负责把用户的请求分发给后端的服务器处理,在这个集群里,除了分发器外,就是给用户提供服务的服务器了,这些服务器数量至少为2。实现负载均衡的开源软件有LVS
、keepalived
、haproxy
、nginx
,商业的有F5
、Netscaler
18.2 keepalived介绍
在这里我们使用keepalived
来实现高可用集群,因为heartbeat
在centos6上有一些问题,不太稳定。建议以后使用高可用使用keepalived实现。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配置高可用集群
先准备两台机器做高可用集群 一般使用高可用都是针对机器上的服务的 这里以Nginx服务为例子,就是针对Nginx来实现高可用 企业上一般会让Nginx
作为负载均衡
来使用,当他出现单点故障时,就会导致后端的web机器访问不了, Nginx使用高可用是很有必要的。
192.168.80.102为master 192.168.80.104为backup
步骤
1.两台机器上分别安装keepalived
1 | [root@localhost ~]# yum install -y keepalived |
2.两台机器上分别安装好针对的服务,这里是Nginx
master上之前编译安装过Nginx
backup为了区别用master 这里使用yum安装1
2[root@localhost ~]# yum install -y epel-release
[root@localhost ~]# yum install -y nginx
3.master上编辑keepalived配置文件
我们可以先把自动的配置文件清空 才自定义编辑1
2[root@localhost ~]# > /etc/keepalived/keepalived.conf ##清空内容
[root@localhost ~]# vim /etc/keepalived/keepalived.conf
输入下面内容1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34global_defs {
notification_email {
aming@aminglinux.com
}
notification_email_from root@aminglinux.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 MASTER
interface ens33
virtual_router_id 51
priority 100
advert_int 1
authentication {
auth_type PASS
auth_pass 38003800
}
virtual_ipaddress {
192.168.80.66
}
track_script {
chk_nginx
}
}
内容在 https://coding.net/u/aminglinux/p/aminglinux-book/git/blob/master/D21Z/master_keepalived.conf
keepalived配置文件路径在/etc/keepalived/keepalived.conf
参数 | 含义 |
---|---|
global_defs | 全局定义 |
notification_email | 出现问题时给邮箱发邮件 |
notification_email_from | 又哪个邮箱发邮件 |
vrrp_script chk_nginx | 检查Nginx服务是否正常 指定检查脚本的路径 |
interval 3 | 检查间断为3秒 |
state MASTER | 定义master |
interface | 指定网卡发送VRRP包 |
virtual_router_id | 定义路由群的id |
priority | 定义权重 |
authentication | 定义认证 |
auth_type | 认证类型 |
auth_pass | 认证密码 |
virtual_ipaddress | 定义虚拟ip(vip)此IP用来访问此虚拟路由群的,就是把master和backup看作一台机器单个IP |
chk_nginx | 加载检查脚本 |
4.master上编写检查Nginx脚本
1 | [root@localhost ~]# vim /usr/local/sbin/check_ng.sh |
输入下面内容1
2
3
4
5
6
7
8
9
10
11
12
13
14
15#!/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
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
内容在 https://coding.net/u/aminglinux/p/aminglinux-book/git/blob/master/D21Z/master_check_ng.sh
脚本上systemctl stop keepalived
关闭keepalived服务是为了启动backup上的keepaliveed时候 不会出现“脑裂
”现象。即master和backup的keepaliveed各自抢占资源,如VIP,外部访问时候出现两台机器同个ip。
5.更改检查脚本的权限
1 | [root@localhost ~]# chmod 755 /usr/local/sbin/check_ng.sh |
6.master上启动keepalived服务
1 | [root@localhost ~]# systemctl start keepalived |
测试
master上停止Nginx服务看是否自动开启1
2
3
4
5[root@localhost ~]# service nginx start
Starting nginx (via systemctl): [ 确定 ]
[root@localhost ~]# ps aux |grep nginx
root 2720 0.0 0.0 112720 964 pts/0 R+ 23:19 0:00 grep --color=auto nginx
发现没有启动Nginx,这里是防火墙问题1
2[root@localhost ~]# setenforce 0
[root@localhost ~]# systemctl stop firewalld
现在看到Nginx是自动开启的1
2
3
4
5[root@localhost ~]# ps aux |grep nginx
root 3387 0.0 0.1 45888 1284 ? Ss 23:22 0:00 nginx: master process /usr/local/nginx/sbin/nginx -c /usr/local/nginx/conf/nginx.conf
nobody 3391 0.0 0.4 48380 4168 ? S 23:22 0:00 nginx: worker process
nobody 3392 0.0 0.3 48380 3916 ? S 23:22 0:00 nginx: worker process
root 3394 0.0 0.0 112720 968 pts/0 R+ 23:22 0:00 grep --color=auto nginx
ip add
查看VIP
keepalived日志在/var/log/messages
中看到
7.为了让实验成功 两台机器都关闭防火墙
1 | [root@localhost ~]# setenforce 0 |
8.backup上编辑keepalived配置文件
1 | [root@localhost ~]# > /etc/keepalived/keepalived.conf |
输入下面内容1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34global_defs {
notification_email {
aming@aminglinux.com
}
notification_email_from root@aminglinux.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
interface ens33
virtual_router_id 51
priority 90
advert_int 1
authentication {
auth_type PASS
auth_pass aminglinux>com
}
virtual_ipaddress {
192.168.80.66
}
track_script {
chk_nginx
}
}
内容在 https://coding.net/u/aminglinux/p/aminglinux-book/git/blob/master/D21Z/backup_keepalived.conf
这里和master上的不一样的地方是state BACKUP
和priority 90
backup的权重比主少
9.backup上编写检查Nginx脚本
1 | [root@localhost ~]# vim /usr/local/sbin/check_ng.sh |
输入下面内容1
2
3
4
5
6
7
8
9
10
11
12
13
14
15#!/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
内容在 https://coding.net/u/aminglinux/p/aminglinux-book/git/blob/master/D21Z/backup_check_ng.sh
和主上的区别在于 systemctl start nginx
是由于从机器上使用yum安装的
10.修改backup上的脚本权限并启动keepalived服务
1 | [root@localhost ~]# chmod 755 /usr/local/sbin/check_ng.sh |
测试
master上之前设置了默认虚拟主机 更改主页内容
backup主页的地址在/usr/share/nginx/html/index.html
并更改主页内容
同时查看vip是加载maser的主页的
模拟master机器宕机,直接把maser上的keepalied服务给停掉 早看看vip是否给了backup1
[root@localhost ~]# systemctl stop keepalived
留意backup1
2
3
4
5
6
7
8
9[root@localhost ~]# ip add
2: ens33: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP qlen 1000
link/ether 00:0c:29:71:e1:ca brd ff:ff:ff:ff:ff:ff
inet 192.168.80.104/24 brd 192.168.80.255 scope global ens33
valid_lft forever preferred_lft forever
inet 192.168.80.66/32 scope global ens33
valid_lft forever preferred_lft forever
inet6 fe80::7e09:37c4:bc0a:504a/64 scope link
valid_lft forever preferred_lft forever
看到vip已经来到了backup上,再用浏览器看看
再把maser上的keepalived启动 发现vip又回到了主上1
2
3
4
5
6
7
8
9
10[root@localhost ~]# systemctl start keepalived
2: ens33: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP qlen 1000
link/ether 00:0c:29:06:17:0b brd ff:ff:ff:ff:ff:ff
inet 192.168.80.102/24 brd 192.168.80.255 scope global ens33
valid_lft forever preferred_lft forever
inet 192.168.80.66/32 scope global ens33
valid_lft forever preferred_lft forever
inet6 fe80::c25c:7f22:5b19:4d48/64 scope link
valid_lft forever preferred_lft forever