高可用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开机启动

[root@localhost ~]#systemctl stop firewalld.service
[root@localhost ~]#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
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值