环境准备
准备两台主机并且都装有Nginx和Apache或者Tomcat
我的第一个主机A的ip:-.-.-.244;第二个主机B的ip:-.-.-.17
在主机A和主机B的apache访问目录(默认是/var/www/html)下放测试代码loadBalanceTest.html,内容分别为【I am -.-.-.244 server】、 【I am -.-.-.17 server】
环境测试
访问主机B,看到如下页面则说明环境可用,A主机同样的方式。
配置反向服务代理器
打开A主机的Nginx配置文件,在http模块内server模块外添加代码
重启A主机的Nginx,【systemctl reload nginx】,在浏览器上访问A主机的loadBalanceTest.html
可以看到,访问的实际上是B主机上的loadBalanceTest.html页面
配置负载均衡
在A和B两台主机上做相同的如下配置
现在分别访问三次A主机和B主机都会出现的情况是:I am -.-.-.244 server连续出现两次,第三次是I am -.-.-.17 server,此后的刷新都是按照该规律
搭建Keepalived:(Keepalived需要依赖openssl)
1.下载源码包到/usr/local/keepalived目录
wget http://www.keepalived.org/software/keepalived-2.0.15.tar.gz //2019年4月前的最新版本
2.解压
tar zxvf keepalived-2.0.15.tar.gz
3.安装依赖插件
yum install -y gcc openssl-devel popt-devel
4.编译安装
cd keepalived-2.0.15
#指定安装目录
./configure --prefix=/usr/local/keepalived
#编译 安装
make && make install
5.运行前配置
cp /usr/local/keepalived-1.4.2/keepalived/etc/init.d/keepalived /etc/init.d/
mkdir /etc/keepalived
cp /usr/local/keepalived/etc/keepalived/keepalived.conf /etc/keepalived/
cp /usr/local/keepalived-1.4.2/keepalived/etc/sysconfig/keepalived /etc/sysconfig/
cp /usr/local/keepalived/sbin/keepalived /usr/sbin/
使用systemctl start keepalived命令启动服务时,默认会将/etc/sysconfig/keepalived文件中KEEPALIVED_OPTIONS参数作为keepalived服务启动时的参数,并从/etc/keepalived/目录下加载keepalived.conf配置文件,或用-f参数指定配置文件的位置。
防止出现脑裂现象(主备同时获取了VIP地址)
# 指定keepalived配置的网卡:eth0,固定的VRRP广播地址:224.0.0.18
firewall-cmd --direct --permanent --add-rule ipv4 filter INPUT 0 --in-interface eth0 --destination 224.0.0.18 --protocol vrrp -j ACCEPT
firewall-cmd --direct --permanent --add-rule ipv4 filter OUTPUT 0 --out-interface eth0 --destination 224.0.0.18 --protocol vrrp -j ACCEPT
firewall-cmd --reload
# 查看配置的规则
firewall-cmd --direct --get-rules ipv4 filter INPUT
firewall-cmd --direct --get-rules ipv4 filter OUTPUT
启动
systemctl start keepalived
查看启动情况
ps -aux |grep keepalived
查看启动状态
systemctl status keepalived
查看vip
查看启动日志
journalctl -xe
查看keepalived日志
tail -f /var/log/messages
让keepalived监控Nginx的状态来搭建keepalived+Nginx实现负载均衡
进入A主机的目录/etc/keepalived,把已经存在的keepalived.conf改为其他名字,然后重新生成一个名为keepalived.conf的文件,内容如下
1 ! Configuration File for keepalived
2 #全局配置
3 global_defs {
4 #一个没有重复的名字即可
5 router_id server_master
6 }
12
13 vrrp_instance VI_1 {
14 # 此处不设置为MASTER,代表主服务器
15 state MASTER
16 # 网卡名字
17 interface eth0
18 # 同一个keepalived集群的virtual_router_id相同
19 virtual_router_id 51
20 # 权重,master要大于slave
21 priority 100
22 # 主备通讯时间间隔
23 advert_int 1
24 authentication {
25 auth_type PASS
26 auth_pass 1111
27 }
28 #虚拟ip,随便写一个没有被用到的ip,可以直接用keepalived.conf默认vip中的一个
29 virtual_ipaddress {
30 192.168.200.16
31 }
36 }
在B主机做同样的操作,keepalived.conf内容如下
1 ! Configuration File for keepalived
2 #全局配置
3 global_defs {
4 #一个没有重复的名字即可
5 router_id server_slave
6 }
12
13 vrrp_instance VI_1 {
14 # 此处不设置为MASTER,代表主服务器
15 state BACKUP
16 # 网卡名字
17 interface eth0
18 # 同一个keepalived集群的virtual_router_id相同
19 virtual_router_id 51
20 # 权重,master要大于slave
21 priority 99
22 # 主备通讯时间间隔
23 advert_int 1
24 authentication {
25 auth_type PASS
26 auth_pass 1111
27 }
28 #虚拟ip,随便写一个没有被用到的ip,可以直接用keepalived.conf默认vip中的一个
29 virtual_ipaddress {
30 192.168.200.16
31 }
36 }
这样,如果主服务器的keepalived停止服务,从服务器会自动接管VIP对外服务;一旦主服务器的keepalived恢复,会重新接管VIP。
验证:
(1)先后在主、从服务器上启动keepalived;
(2)在主服务器上查看是否已经绑定了虚拟IP: ip addr;
(3)停止主服务器上的keepalived,然后在从服务器上查看是否已经绑定了虚拟IP:
(4)启动主服务器上的keepalived,看看主服务器能否重新接管虚拟IP。
但这我们需要的是当NginX停止服务的时候能够自动切换。
keepalived支持配置监控脚本,我们可以通过脚本监控Nginx的状态,如果状态不正常则进行一系列的操作,最终仍不能恢复Nginx则杀掉keepalived,使得从服务器能够接管服务。
让keepalived监控Nginx的状态最简单的做法是监控Nginx进程,更靠谱的做法是检查Nginx端口,最靠谱的做法是检查多个url能否获取到页面。
尝试恢复服务的做法为:如果发现NginX不正常,重启之。等待3秒再次校验,仍然失败则不再尝试。
这里使用nmap检查nginx端口来判断nginx的状态
安装nmap
yum install nmap
生成监控脚本文件
#创建nginx检测脚本
#touch nginx_check.sh
#给脚本增加可执行权限
#chmod +x nginx_check.sh
内容如下
1 #! /bin/bash
2 # check nginx server status
3 NGINX=/usr/sbin/nginx
4 PORT=80
5 nmap localhost -p $PORT | grep "$PORT/tcp open"
6 #echo $?
7 if [ $? -ne 0 ];then
8 $NGINX -s stop
9 $NGINX
10 sleep 3
11 nmap localhost -p $PORT | grep "$PORT/tcp open"
12 [ $? -ne 0 ] && /etc/init.d/keepalived stop
13 fi
修改A主机的keepalived.conf如下
1 ! Configuration File for keepalived
2 #全局配置
3 global_defs {
4 #一个没有重复的名字即可
5 router_id server_master
6 }
7 vrrp_script chk_http_port {
8 script "/etc/keepalived/nginx_check.sh"
9 interval 1
10 weight -2
11 }
12
13 vrrp_instance VI_1 {
14 # 此处不设置为MASTER,通过priority来竞争master
15 state MASTER
16 # 网卡名字
17 interface eth0
18 # 同一个keepalived集群的virtual_router_id相同
19 virtual_router_id 51
20 # 权重,master要大于slave
21 priority 100
22 # 主备通讯时间间隔
23 advert_int 1
24 authentication {
25 auth_type PASS
26 auth_pass 1111
27 }
28 virtual_ipaddress {
29 192.168.200.16
30 }
31 # 与上方nginx运行状况检测呼应
32 track_script {
33 chk_http_port
34 }
35 }
在B主机的keepalived.conf中添加同样的内容,以及生成同样的检测脚本,可以通过scp命令直接将A主机上的检测脚本文件发送给B主机,命令如下
scp nginx_check.sh root@A主机ip:/etc/keepalived/nginx_check.sh
重启keepalived,发现A B两台主机都绑定上了虚拟IP
先在浏览器上做准备环境中所说的同样的测试,如果结果同准备环境中的结果,说明配置大概没问题。现在,停止A主机上的Nginx,让后去浏览器上通过A主机的IP访问loadBalanceTest.html页面,可以达到同样的效果,说明配置成功。