欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

高可用Nginx集群安装搭建

程序员文章站 2022-05-07 10:53:49
...

高可用Nginx集群安装搭建

环境准备

两台linux服务器,IP地址分别为

192.168.120.103

192.168.120.58

准备IP地址信息打印程序nginx-1.0.0.jar,http://hostname:port/server/ip,打印服务器的IP端口号信息。

安装两台Nginx

安装步骤,参考前面Nginx的手册来操作,将Nginx分别安装在前面准备的两台linux服务器上。

启动Nginx,都为80端口,代理前面的的nginx-1.0.0.jar服务。

安装LVS

LVS全称为Linux Virtual Server,工作在ISO模型中的第四层,由于其工作在第四层,因此与iptables类似,必须工作在内核空间上。因此lvs与iptables一样,是直接工作在内核中的,叫ipvs,主流的linux发行版默认都已经集成了ipvs,因此用户只需安装一个管理工具ipvsadm即可。
LVS现在已成为Linux内核的一部分,默认编译为ip_vs模块,必要时能够自动调用。以下操作可以手动加载ip_vs模块,并查看当前系统中ip_vs模块的版本信息。

安装依赖

$ sudo yum install -y popt-static kernel-devel make gcc openssl-devel lftplibnl* popt* openssl-devel lftplibnl* popt* libnl* libpopt* gcc*

加载LVS

# 通过下面命令来检查,如果没有显示,则说明没有加载
$ lsmod |grep ip_vs
ip_vs                 145497  0 
# 加载LVS,执行下面命令就可以把ip_vs模块加载到内核
$ sudo modprobe ip_vs
# 查看LVS版本号,说明安装成功
$ cat /proc/net/ip_vs
IP Virtual Server version 1.2.1 (size=4096)
Prot LocalAddress:Port Scheduler Flags
  -> RemoteAddress:Port Forward Weight ActiveConn InActConn

安装ipvsadm

curl "http://www.linuxvirtualserver.org/software/kernel-2.6/ipvsadm-1.26.tar.gz" -o ipvsadm-1.26.tar.gz
tar zxf ipvsadm-1.26.tar.gz  
cd ipvsadm-1.26 
rpm -qa | grep kernel-devel	# 确认是否安装了kernel-devel(默认已经安装)
su root # 需要root权限执行
make && make install

curl "http://www.linuxvirtualserver.org/software/kernel-2.6/ipvsadm-1.25-1.src.rpm" -o ipvsadm-1.25-1.src.rpm
sudo rpm -ivh ipvsadm-1.25-1.src.rpm

# 检查是否安装成功,显示下面的内容表示安装成功
$ sudo ipvsadm
IP Virtual Server version 1.2.1 (size=4096)
Prot LocalAddress:Port Scheduler Flags
  -> RemoteAddress:Port           Forward Weight ActiveConn InActConn

LVS DR模式

DR模式是LVS三种实现负载均衡方式中性能最好的一个,下面就使用这个模式,配置Nginx负载均衡的实现。

设定IP环境如下

VIP:192.168.120.200

lvs-director:192.168.120.58

Nginx1:192.168.120.103

Nginx2:192.168.120.58

DR配置

LVS配置

编辑lvs文件

sudo vim /usr/local/sbin/lvs_dr.sh

输入下面内容

#! /bin/bash
# 1,启用ip转发;0,禁止ip转发;默认0。
echo 1 > /proc/sys/net/ipv4/ip_forward
# 定义两个变量方便后面使用
ipv=/sbin/ipvsadm
vip=192.168.120.200
# 通过ifconfig,找到自己的网卡名,我这里是enp0s3
# 下掉enp0s3:0的虚拟ip
ifconfig enp0s3:0 down
# 通过ifconfig,找到自己的网卡名,在其下面绑定虚拟ip
# 在enp0s3上绑定虚拟ip,虚拟ip地址的广播地址是它本身
ifconfig enp0s3:0 $vip broadcast $vip netmask 255.255.255.255 up
# 添加路由规则
route add -host $vip dev enp0s3:0
# 清除原有转发规则
$ipv -C
# 新增虚拟服务,采用轮询策略,负载转发端口是8080
$ipv -A -t $vip:8080 -s rr

# 定义实际服务ip
rs1=192.168.120.103
rs2=192.168.120.58
# -a在虚拟IP中添加上游服务信息;-t表示tcp服务
# -r表示真实服务信息;-g指定为LVS为直接路由模式
$ipv -a -t $vip:8080 -r $rs1:80 -g
$ipv -a -t $vip:8080 -r $rs2:80 -g

使配置生效

sudo sh /usr/local/sbin/lvs_dr.sh
sudo ipvsadm

可能出现的错误

0、SIOCSIFFLAGS: 无法指定被请求的地址
没有对应的enp0s3:0网卡ip,本来就没有,可以忽略。运行脚本后enp0s3:0正常出现就没有问题。

1、没有轮询效果
一条tcp的连接经过lvs后,lvs会把这台记录保存15分钟
sudo ipvsadm -L --timeout	# 查看timeout配置信息
可以设置短一点,达到实验效果:
sudo ipvsadm --set 1 2 1

注: 保存添加的虚拟ip记录和ipvsadm的规则可以使用service ipvsadm save,还可以用-S或--save。清除所有记录和规则除了使用-C,还以使用--clear

2、错误:Memory allocation problem
查看一下vmlloc使用情况: 
cat /proc/meminfo | grep -i vmalloc
在/etc/default/grub文件的末尾添加如下一行:
GRUB_CMDLINE_LINUX="vmalloc=256MB"

完成上述操作之后,发现lvs状态仍然是SYN_RECV。

3、lvs状态仍然是SYN_RECV
抓包后的pcap文件中,没有syn ack。于是想到是不是在什么地方丢掉了。
看到官方文档中有描述要设置re_ filter。
查了一下这个参数的解释
======================================
rp_filter参数有三个值,0、1、2,具体含义:
0:不开启源地址校验。
1:开启严格的反向路径校验。对每个进来的数据包,校验其反向路径是否是最佳路径。如果反向路径不是最佳路径,则直接丢弃该数据包。
2:开启松散的反向路径校验。对每个进来的数据包,校验其源地址是否可达,即反向路径是否能通(通过任意网口),如果反向路径不同,则直接丢弃该数据包。
=======================================
default的值是1,这里改为2
echo 2 > /proc/sys/net/ipv4/conf/ 网卡名/rp_filter
echo 2 > /proc/sys/net/ipv4/conf/ 网卡名/rp_filter
systemctl restart network.service

echo "1" > /proc/sys/net/ipv4/conf/lo/arp_ignore
echo "2"> /proc/sys/net/ipv4/conf/lo/arp_announce
echo "1"> /proc/sys/net/ipv4/conf/all/arp_ignore
echo "2" > /proc/sys/net/ipv4/conf/all/arp_announce

ipvsadm操作说明

sudo ipvsadm -C 清除
说明:
-A  --add-service在服务器列表中新添加一条新的虚拟服务器记录
-t 表示为tcp服务
-u 表示为udp服务
-s --scheduler 使用的调度算法, rr | wrr | lc | wlc | lblb | lblcr | dh | sh | sed | nq 默认调度算法是 wlc
-a --add-server 在服务器表中添加一条新的真实主机记录
-r --real-server  真实服务器地址
-m --masquerading 指定LVS工作模式为NAT模式
-w --weight 真实服务器的权值
-g --gatewaying 指定LVS工作模式为直接路由器模式(也是LVS默认的模式)
-i --ipip 指定LVS的工作模式为隧道模式

sudo ipvsadm -help 可以查看更多的帮助信息

真实服务配置

在lvs的DR和TUn模式下,用户的访问请求到达真实服务器后,是直接返回给用户的,而不再经过前端的Director Server,因此,就需要在每个Real server节点上增加虚拟的VIP地址,这样数据才能直接返回给用户。

2台真实web服务器的配置信息,编辑lvs_dr_rs.sh文件

sudo vim /usr/local/sbin/lvs_dr_rs.sh

输入内容

#! /bin/bash
vip=192.168.120.200
ifconfig enp0s3:0 $vip broadcast $vip netmask 255.255.255.255 up
route add -host $vip enp0s3:0
# 关闭arp解析
echo "1" >/proc/sys/net/ipv4/conf/lo/arp_ignore
echo "2" >/proc/sys/net/ipv4/conf/lo/arp_announce
echo "1" >/proc/sys/net/ipv4/conf/all/arp_ignore
echo "2" >/proc/sys/net/ipv4/conf/all/arp_announce

关闭arp解析

arp_ignore:当ARP请求发过来后发现自己正是请求的地址是否响应;

0 - 利用本地的任何地址,不管配置在哪个接口上去响应ARP请求;
1 - 哪个接口上接受ARP请求,就从哪个端口上回应。

arp_announce :定义不同级别,当ARP请求通过某个端口进来是否利用这个接口来回应。

0 - 利用本地的任何地址,不管配置在哪个接口上去响应ARP请求;
1 - 避免使用另外一个接口上的mac地址去响应ARP请求;
2 - 尽可能使用能够匹配到ARP请求的最佳地址。

使配置生效

sudo sh /usr/local/sbin/lvs_dr_rs.sh
sudo sysctl -p

测试

在浏览器输入访问

http://192.168.120.200:8080/server/ip

如果你发现IP地址在变化,恭喜你,成功了!

安装Keepalived

只有一台LVS服务,万一挂了怎么办?需要Keepalived来做高可用,准备两台linux服务器,用来安装两台keepalived,Keepalived安装过程如下。

安装依赖

2.0.18版本

sudo yum install -y openssl-devel popt-devel libnl-devel kernel-devel gcc

安装Keepalived

2.0.18版本

cd ~
wget https://www.keepalived.org/software/keepalived-2.0.18.tar.gz
tar -xvzf keepalived-2.0.18.tar.gz
cd keepalived 
# 安装到/usr/local/keepalived目录
./configure --prefix=/usr/local/keepalived --sysconf=/etc  

sudo make & sudo make install

配置

配置放在/etc/keepalived/,三份配置文件(一个nginx_monitor监控脚本,主备各一份keepalived配置)

Nginx监控脚本

新建nginx_monitor.sh文件

sudo vim /etc/keepalived/nginx_monitor.sh

脚本内容

#!/bin/bash
# shell脚本监控:如果程序的进程存在,则认为没有问题
if [ "$(ps -ef | grep "nginx"| grep -v grep| grep -v keepalived )" == "" ]
  then
    # 输出日志
    echo "nginx ############# app down " >> /var/log/messages
    exit 1
  else
    # 一切正常
	exit 0
fi

执行脚本

# 创建nginx monitor 脚本,并赋予可执行权限
sudo chmod +x /etc/keepalived/nginx_monitor.sh
# 测试一下脚本能不能执行
sh /etc/keepalived/nginx_monitor.sh 
# 没报错即表示为成功

Keepalived配置

主配置 /etc/keepalived/keepalived-nginx-master.conf

# 定义一个名为monitor的脚本
vrrp_script monitor {
     # 监控脚本存放地址
	 script "/etc/keepalived/nginx_monitor.sh"
	 # 每隔1秒执行一次
	 interval 1
}

# 定义一个vrrp示例
vrrp_instance VI_1 {
	state MASTER    #(主机为MASTER,备用机为BACKUP)
	interface enp0s3  #(HA监测网卡接口)

	virtual_router_id 61 #(主、备机的virtual_router_id必须相同,不大于255)
	priority 90 #(主、备机取不同的优先级,主机值较大,备份机值较小,值越大优先级越高)
	advert_int 1 #(VRRP Multicast广播周期秒数)

	track_script {
		monitor #(监控脚本名称)
	}
	virtual_ipaddress {
            192.168.120.200 #(VRRP HA虚拟IP)
	}
}

备份配置 /etc/keepalived/keepalived-nginx-backup.conf

# 定义一个名为monitor的脚本
vrrp_script monitor {
     # 监控nginx的脚本存放地址
	 script "/etc/keepalived/nginx_monitor.sh"
	 # 每隔1秒执行一次
	 interval 1
}

# 定义一个vrrp示例
vrrp_instance VI_1 {
	state BACKUP    #(主机为MASTER,备用机为BACKUP)
	interface enp0s3  #(HA监测网卡接口)

	virtual_router_id 61 #(主、备机的virtual_router_id必须相同)
	priority 80 #(主、备机取不同的优先级,主机值较大,备份机值较小,值越大优先级越高)
	advert_int 1 #(VRRP Multicast广播周期秒数)

	track_script {
		monitor #(监控脚本名称)
	}
	virtual_ipaddress {
            192.168.120.200 #(VRRP HA虚拟IP)
	}
}
# - master主机
keepalived-nginx-master.conf
# - backup备机
keepalived-nginx-backup.conf

启动Keepalived服务

# 启动master主机
/usr/local/keepalived/sbin/keepalived -f /etc/keepalived/keepalived-nginx-master.conf
# 启动backup备机
/usr/local/keepalived/sbin/keepalived -f /etc/keepalived/keepalived-nginx-backup.conf

注意事项

两台keepalived服务间需要通信,关闭防火墙

firewall-cmd --state #查看默认防火墙状态(关闭后显示notrunning,开启后显示running)
systemctl list-unit-files|grep firewalld.service
systemctl stop firewalld.service #停止firewall
systemctl disable firewalld.service #禁止firewall开机启动

[[email protected] ~]#systemctl stop firewalld.service
[[email protected] ~]#systemctl disable firewalld.service
启动一个服务:systemctl start firewalld.service
关闭一个服务:systemctl stop firewalld.service
重启一个服务:systemctl restart firewalld.service
显示一个服务的状态:systemctl status firewalld.service
在开机时启用一个服务:systemctl enable firewalld.service
在开机时禁用一个服务:systemctl disable firewalld.service
查看服务是否开机启动:systemctl is-enabled firewalld.service;echo $?
查看已启动的服务列表:systemctl list-unit-files|grep enabled

测试

关闭master服务,服务是否仍然可用,backup服务是否替补上来。

ps -ef|grep keepalived
root      4701     1  0 16:33 ?        00:00:00 /usr/local/keepalived/sbin/keepalived -f /etc/keepalived/keepalived-nginx-master.conf
root      4702  4701  0 16:33 ?        00:00:04 /usr/local/keepalived/sbin/keepalived -f /etc/keepalived/keepalived-nginx-master.conf

sudo kill 4701