高可用Nginx集群安装搭建
高可用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
下一篇: substr()函数中文版_PHP教程