基于Keepalived的Web集群项目
目录
1.服务器拓扑图
2.项目描述
3.项目环境
4.项目步骤
4.1 集群整体规划
4.2 安装Nginx
4.2 搭建DNS服务器
4.3 Nginx实现负载均衡
realip问题
4层/7层负载均衡
4.4 NFS实现文件共享
4.5 压力测试ab
4.6 Keepalived双vip实现高可用
4.7 Prometheus+Grafana监控数据
5.项目总结
1.服务器拓扑图

2.项目描述
本项目是基于Nginx做负载均衡,Keepalived的双vip实现高可用,NFS实现文件共享,同时使用Prometheus+Grafana进行Web服务器监控的项目。考虑到企业对于高并发和高可用的追求,本项目模拟企业的业务环境构建一个Web集群,并通过压力测试来检验其性能,寻找优化的可能。
3.项目环境
Centos7.9(1核2G)8台服务器,Nginx1.23.2,Keepalived1.3.5,NFS4,Prometheus2.34.0,
Grafana9.3.2。
4.项目步骤
4.1 集群整体规划
客户机:192.168.237.136
LB1:192.168.237.130
LB2: 192.168.237.129
Web1:192.168.237.131
Web2:192.168.237.132
Web3:192.168.237.133
NFS:192.168.237.134
Prometheus:192.168.237.135
4.2 安装Nginx
1.编写Nginx一键安装脚本,脚本名:onekey_install_nginx.sh。
#!/bin/bash#新建一个文件夹用来存放下载的nginx源码包
mkdir -p /nginx
cd /nginx#新建用户
useradd -s /sbin/nologin hehe#下载nginx
curl -O http://nginx.org/download/nginx-1.23.2.tar.gz#解压nginx源码包
tar xf nginx-1.23.2.tar.gz#解决依赖关系
yum install gcc openssl openssl-devel pcre pcre-devel automake make -y#编译前的配置
cd nginx-1.23.2./configure --prefix=/usr/local/nginx99 --user=hehe --with-http_ssl_module --with-http_v2_module --with-threads --with-http_stub_status_module --with-stream #编译,开启两个进程同时编译,速度更快
make -j 2 #安装
make install#启动nginx
/usr/local/nginx99/sbin/nginx#修改PATH变量
#临时修改
PATH=$PATH:/usr/local/nginx99/sbin
#永久修改
echo "PATH=$PATH:/usr/local/nginx99/sbin" >>/root/.bashrc#设置nginx的开机启动
echo "/usr/local/nginx99/sbin/nginx" >>/etc/rc.local
chmod +x /etc/rc.d/rc.local #selinux和firewalld防火墙都关闭
service firewalld stop
systemctl disable firewalld#临时关闭selinux
setenforce 0
#永久关闭selinux
sed -i '/^SELINUX=/ s/enforcing/disabled/' /etc/selinux/config
2.查看nginx是否启动成功:
[root@lb nginx]# ps aux|grep nginx
root 1557 0.0 0.0 69936 1472 ? Ss 14:41 0:00 nginx: master process nginx
hehe 1558 0.0 0.1 70880 2376 ? S 14:41 0:00 nginx: worker process
hehe 1559 0.0 0.1 70880 2624 ? S 14:41 0:00 nginx: worker process
hehe 1560 0.0 0.1 70880 2376 ? S 14:41 0:00 nginx: worker process
hehe 1561 0.0 0.1 70880 2864 ? S 14:41 0:00 nginx: worker process
root 1606 0.0 0.0 112824 980 pts/0 S+ 15:41 0:00 grep --color=auto nginx
[root@lb nginx]# netstat -anplut|grep nginx
tcp 0 0 0.0.0.0:80 0.0.0.0:* LISTEN 1557/nginx: master
tcp 0 0 0.0.0.0:443 0.0.0.0:* LISTEN 1557/nginx: master
3.浏览器进行访问,默认显示Nginx的欢迎页面,这里使用自定义页面:

4.为了防止漏洞攻击,可以对Nginx的版本进行隐藏。
使用 core_module/server_tokens 模块,在 nginx.conf 文件中:

查看效果:

5.Nginx里有许多模块可以实现许多功能,如状态统计、访问控制、下载功能、限制连接数等,这里碍于篇幅不再赘述。
4.2 搭建DNS服务器
1.准备工作:关闭防火墙服务和selinux
service firewalld stop
systemctl disable firewalld
2.安装软件bind
yum install bind* -y
3.设置named服务开机启动,并且启动DNS服务
#开机激活named
systemctl enable named
#开机立马启动named进程
ystemctl start named
#查看是否启动成功
ps aux|grep named
netstat -anplut|grep named
4.修改配置文件,重启服务器允许其他电脑能过来查询dns域名
[root@lb ~]# vim /etc/named.conf
options {
listen-on port 53 { any; }; #修改为any
listen-on-v6 port 53 { any; }; #修改为any
...
allow-query { any; }; #修改为any
#重启named服务
[root@lb ~]# service named restart#修改本机的dns解析文件,增加本机dns服务器地址
[root@lb ~]# vim /etc/resolv.conf
# Generated by NetworkManager
#nameserver 114.114.114.114
nameserver 192.168.237.130
5.测试是否搭建成功
[root@lb conf]# nslookup
> www.baidu.com
Server: 192.168.237.2
Address: 192.168.237.2#53Non-authoritative answer:
Name: www.baidu.com
Address: 14.215.177.38
Name: www.baidu.com
Address: 14.119.104.189
www.baidu.com canonical name = www.a.shifen.com.
4.3 Nginx实现负载均衡
1.以LB1为例,在 nginx.conf 文件中:

2.查看页面效果
注意到此时权重值相同,按照默认的轮询算法,会依次显示三个Web服务器的index.html页面



3.这里是默认是轮询算法,Nginx还有其他两种算法,如:最小连接数、ip-hash。
使用时在 nginx.conf 文件中添加一条语句即可。

1.默认是轮询, #单纯的轮询可以不指定权值
2.轮询还包含加权轮询,需要指定权值,权值大的转到该页面的概率更大
3.需要使用哪个轮询算法,指明即可
realip问题
Q:后端的real server不知道前端真正访问的ip地址,只是知道负载均衡的ip地址,如何让后端的real server知道前端真正的用户的ip地址?
A:1.在负载均衡器上修改http请求报文头部字段,添加一个X-Real-IP字段

2.在后端real server上使用这个x_real_ip这个字段

3.查看是否能获取到前端的ip地址
在后端服务器的 access.log 里:

4层/7层负载均衡
-
7层负载均衡:使用nginx作为7层负载均衡。nginx是根据http协议来做负载均衡的,而http协议工作在应用层,是web服务的一部分,按照OSI7层网络参考模型,属于第7层。只能对http协议做负载均衡。
-
4层负载均衡:在传输层完成所有工作。是根据端口号来区分不同的业务。支持的服务数量多:可以支持非http服务。效率高,因为做的事情要少一些。
由于篇幅限制,这里只展示4层负载均衡的过程:
在 nginx.conf 文件中:
stream {upstream dns_servers {least_conn;server 192.168.136.130:53;server 192.168.136.131:53;server 192.168.136.132:53;}upstream web_servers {server 192.168.237.131:80;server 192.168.237.132:80;server 192.168.237.133:80;}server {listen 53 udp;proxy_pass dns_servers;}server {listen 80 ;proxy_pass web_servers;}
}events {worker_connections 1024;
}worker_processes 2;
此时访问服务器,仍然可以实现负载均衡。
4.4 NFS实现文件共享
1.安装并启动NFS
yum install nfs-utils -y
service nfs restart
2.添加exports配置
共享出去的目录建议在根目录下,方便寻找,路径简洁
#共享web出去,允许192.168.237.0/24网段的机器能过来访问,只有只读的权限。
[root@nfs /]# cat /etc/exports
/web 192.168.237.0/24(ro,all_squash,sync)
查看共享目录 /web
[root@nfs web]# ll
总用量 4
drwxr-xr-x 2 root root 6 3月 22 16:41 cs
-rw-r--r-- 1 root root 26 3月 19 15:21 index.html[root@nfs web]# cat index.html
welcome to cs
hehe
[root@nfs web]# exportfs -rv
exporting 192.168.237.0/24:/web
3.刷新NFS服务
service nfs restart
4.关闭 selinux 和防火墙
#nfs服务器上:
[root@nfs web]# getenforce
Disabled
#关闭防火墙
[root@nfs web]# service firewalld stop
5.在其他的web服务器上挂载使用共享目录(共享文件夹)
#安装并启动NFS
yum install nfs-utils -y
service nfs restart
#挂载
mount 192.168.237.134:/web /usr/local/nginx99/html/
6.访问页面查看效果

4.5 压力测试ab
前期工作: 记得启动nginx!!!
1.准备一台虚拟机,进行测试。
2.yum install httpd-tools -y 得到ab命令
开始压力测试:
#-c:并发数 -n:请求数
ab -c 100 -n 1000 http://192.168.237.130/
#一步一步增加并发数和请求数
#最终发现当并发数为1000,请求数为1000的时候,效果最好
ab -c 1000 -n 1000 http://192.168.237.130/
结果如下:

下面对以上参数进行解释:
Requests per second:吞吐率,最关心的指标之一,相当于 LR 中的每秒事务数,后面括号中的 mean 表示这是一个平均值。
Time per request:用户平均请求等待时间,最关心的指标之二,相当于 LR 中的平均事务响应时间,后面括号中的 mean 表示这是一个平均值。
Time per request: 服务器平均请求处理时间,最关心的指标之三。
4.6 Keepalived双vip实现高可用
vip是虚拟的ip地址,真正对外提供业务ip地址,可以告诉用户的。
首先,明确一个问题,为什么需要使用双vip呢?
启动2个vrrp实例,每台机器上都启用2个vrrp实例,一个做master,一个做backup,启用2个vip,每台机器上都会有一个vip,这2个vip都对外提供服务,这样就可以避免单vip的情况下,一个很忙一个很闲。 可以提升设备的使用率。
1.负载均衡器上都需要安装nginx,使用nginx做7层负载均衡
2.安装keepalived软件,在2台负载均衡上都安装
yum install keepalived -y
3.修改配置文件
LB1:/etc/keepalived/keepalived.conf 文件

LB2:/etc/keepalived/keepalived.conf 文件

4.重启keepalvied
service keepalived restart
5.实现效果:会在LB1服务器和LB2服务器上看见vip


4.7 Prometheus+Grafana监控数据
在Prometheus服务器上安装:
1.安装prometheus server
#1.上传下载的源码包到linux服务器
#2.解压源码包
tar xf prometheus-2.34.0.linux-amd64.tar.gz
#3.修改解压后的压缩包名字
mv prometheus-2.34.0.linux-amd64 prometheus
#4.临时和永久修改PATH变量,添加prometheus的路径
PATH=/prom/prometheus:$PATH
vim /root/.bashrc
PATH=/prom/prometheus:$PATH #添加
2.执行prometheus程序
nohup prometheus --config.file=/prom/prometheus/prometheus.yml &
#查看prometheus的进程和端口号
ps aux|grep prome
netstat -anplut|grep prome #端口号为9090
#关闭服务器上的firewalld服务并设置永久不启动
service firewalld stop
systemctl disable firewalld
3.查看效果:访问http://192.168.237.135:9090

在node节点服务器上
1.安装exporter程序
#1.下载node_exporter-1.4.0-rc.0.linux-amd64.tar.gz源码,上传到节点服务器上
#2.解压
tar xf node_exporter-1.4.0-rc.0.linux-amd64.tar.gz
#3.修改解压后的压缩包名字
mv node_exporter-1.4.0-rc.0.linux-amd64 /node_exporter
#4.临时和永久修改PATH变量,添加node exporter的路径
PATH=/node_exporter/:$PATH
vim /root/.bashrc
PATH=/node_exporter/:$PATH #添加
2.执行node exporter 代理程序agent
#具体的端口号,可以自己定义,只要不和其他的服务冲突就可以
nohup node_exporter --web.listen-address 0.0.0.0:8090 &
3.实现效果:访问 http://192.168.237.130:8090/和http://192.168.237.129:8090/
将Grafana和Prometheus安装在同一台机器上(wb1)
1.安装Grafana
wget https://dl.grafana.com/enterprise/release/grafana-enterprise-9.3.2-1.x86_64.rpm
yum install grafana-enterprise-9.3.2-1.x86_64.rpm
2.启动Grafana
service grafana-server start
#监听的端口号是3000#设置grafana开机启动
[root@web1 grafana]# systemctl enable grafana-server
3.查看效果:访问 http://192.168.237.135:3000

4.导入Grafana模板,与Prometheus结合进行监控

图形化界面显示了服务器各种数据,如CPU使用率,内存使用率等,方便运维人员对服务器的状态有更好的了解和把控。
5.项目总结
1.实现了一键部署和安装,明白运维自动化的重要性;
2.对高性能和高可用有了更深刻的认识,并争取对系统进行更好的优化;
3.了解到了DNS负载均衡,4层/7层负载均衡的原理并进行了应用;
4.在压力测试下,看到了本服务器能承受的最大并发数和连接数;
5.接触到了监控软件,对图形化界面展示数据有了更直观的感受
本文来自互联网用户投稿,文章观点仅代表作者本人,不代表本站立场,不承担相关法律责任。如若转载,请注明出处。 如若内容造成侵权/违法违规/事实不符,请点击【内容举报】进行投诉反馈!
