项目环境
centos7.95台、nginx、nfs、keepalived、Prometheus
项目描述
构建了一个基于nginx的负载均衡项目,通过keepalived实现了高可用,使用Prometheus监控两台负载均衡器
准备工作
先准备四台真实的机器,分别作为负载均衡器1(LB1)、负载均衡器2(LB2)、后端服务器1(web1)、后端服务器2(web2),还有一台搭建nfs+Prometheus,
前四台都需要安装nginx。
nginx的安装可以对照的官方文档,装完一个写一个脚本,后面三台都可以一键安装,或者是装完一台直接克隆三台
nginx脚本
#!/bin/bash
# 新建文件夹用来下载nginx源码包
mkdir -p /nginx
cd /nginx
# 新建用户
useradd -s /sbin/nologin nginx
# 下载nginx
# 推荐下载好后直接传到机器里,然后直接解压
# curl -O https://nginx.org/download/nginx-1.23.4.tar.gz
# 解压nginx
tar xf nginx-1.23.4.tar.gz
# 解决依赖关系
yum install gcc -y
yum install openssl openssl-devel pcre pcre-devel automake make -y
# 编译前的配置
cd nginx-1.23.4
./configure --prefix=/usr/local/my_nginx --user=nginx --with-http_ssl_module --with-http_v2_module --with-threads --with-http_stub_status_module --with-stream
# 编译,开启两个进程同时开始
make -j 2
# 安装,将编译好的二进制文件复制到指定的文件目录下
make install
# 修改path变量
PATH=$PATH:/usr/local/my_nginx/sbin
echo "PATH=$PATH:/usr/local/my_nginx/sbin" >>/root/.bashrc
# 设置开机自启
echo "/usr/local/my_nginx/sbin/nginx" >>/root/.bashrc
chmod +x /etc/rc.d/rc.local
# selinux和firewalld防火墙都关闭
systemctl stop firewalld
# 临时关闭
# setenforce 0
# 永久
sed -i '/^SELINUX=/ s/enforcing/disabled/' /etc/selinux/config
实现负载均衡
准备四台服务器,两台做负载均衡器,另外两台做web服务器,都建议编译安装nginx(由于是dhcp服务的,所以ip地址可能会发生变化)
三种实现负载均衡的方式(https://nginx.org/en/docs/http/load_balancing.html)
1.轮询
2.最小连接
3.ip-hash
LB1:192.168.1.22
LB2:192.168.1.19
WEB1:192.168.1.20
WEB2:192.168.1.26
修改LB1和LB2的配置文件(修改前可以先备份一份)
http {
...
...
upstream myapp1 {
# least_conn;
server 192.168.1.26 weight=3;
server 192.168.1.20 weight=2;
}
...
...
server {
location / {
#root html;
#index index.html index.htm;
proxy_pass http://myapp1;
# 这里添加了一个真实的ip,添加之后能在日志中看到用户访问的ip,在log_fiemat中添加 - $HTTP_X_REAL_IP
proxy_set_header X-Real-IP $remote_addr;
}
}
}
使用nginx -s reload刷新配置
在LB2中也类似设置
修改web1和web2的html,便于测试
# web1
<h1>this is web1</h1>
# web3
<h1>this is web2</h1>
在浏览器中输入对应的两个负载均衡器的地址(192.168.1.22,192.168.1.19)
使用keepalived实现高可用
在两台负载均衡器上安装keepalived
yum install keepalived -y
修改配置文件
vim /etc/keepalived/keepalived.conf
配置LB1配置文件
vrrp_instance VI_1 {
state MASTER # 做master角色
interface ens33 # 指定监听网络的端口
virtual_router_id 112 # 虚拟路由器id 0~255
priority 120 # 优先级 0~255
advert_int 1 # 宣告消息的时间间隔
authentication {
auth_type PASS # 密码认证
auth_pass 1111 # 具体密码
}
virtual_ipaddress { # 虚拟ip地址
192.168.1.188
}
}
LB2类型上面步骤,配置文件
vrrp_instance VI_1 {
state BACKUP
interface ens33
virtual_router_id 112
priority 100
advert_int 1
authentication {
auth_type PASS
auth_pass 1111
}
virtual_ipaddress {
192.168.1.188
}
}
可以看到,在LB1上出现了VIP
停掉LB1的nginx
可以发现,VIP已经消失了,在去LB2中查看一下ip地址
可以看到,LB2上出现了VIP,证明keepalive设置成功
编写脚本检查LB是否挂掉,如果挂掉,就重新开启,如果没有开启成功,就实现vip漂移
思路:只需要检测nginx是否讯息就可以了可以通过nginx的pid是否存在
#!/bin/bash
# 检测nginx是否正常运行
if /usr/sbin/pidof nginx &>/dev/null ;then
exit 0
else
exit 1
fi
在LB1的keepalived配置文件中修改
# 定义监控脚本
vrrp_script chk_nginx {
script "/nginx_sh/check_nginx.sh"
interval 1
weight -30
}
vrrp_instance VI_1 {
...
# 调用监控脚本
track_script {
chk_nginx
}
...
}
监控和nfs
这里监控和nfs放在了一台机器上,使用docker搭建了Prometheus服务器,ip为192.168.1.17
搭建nfs
安装nfs
yum install nfs-utils -y
启动nfs服务,两条都可以
service nfs restart
service nfs-server restart
# 新建共享目录
mkdir -p /web
编辑共享配置文件(vim /etc/exports)
# 共享/web出去允许192.168.1.0/24这个网段的机器来访问,只有只读的权限
/web 192.168.1.0/24(ro,all_squash,sync)
# rw 可读可写
# ro 只能读
# all_squash 任何人访问都当作为普通用户
# root_squash 任何人访问都当作为root用户
# no_root_squash 当
# sync 同步 同时将数据写入到磁盘
# async 异步 先保存在磁盘中,然后再写入
输出当前主机中NFS服务器所有的共享目录
exportfs -av
# exporting 192.168.1.0/24:/web
编辑共享文件夹
vim index.html
# this is nfs server
在两台后端服务器上(web1和wen2上挂载)
mount 192.168.1.17:/web /usr/local/my_nginx/html
# 查看
df -h
如果挂载不成功,关闭防火墙
结果
安装Prometheus
需要先安装docker(因为现在centos已经不更新了,所以docker的界面上找不到centos的安装,这里直接给出安装步骤)
# 卸载之前的版本
yum remove docker \
docker-client \
docker-client-latest \
docker-common \
docker-latest \
docker-latest-logrotate \
docker-logrotate \
docker-selinux \
docker-engine-selinux \
docker-engine \
docker-ce
# 安装gcc
yum -y install gcc
yum -y install gcc-c++
# 安装yum工具
yum install -y yum-utils \
device-mapper-persistent-data \
lvm2 --skip-broken
# 设置stable镜像地址
yum-config-manager \
--add-repo \
https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
sed -i 's/download.docker.com/mirrors.aliyun.com\/docker-ce/g' /etc/yum.repos.d/docker-ce.repo
# 更新yum包软件索引
yum makecache fast
# 安装docker
yum -y install docker-ce docker-ce-cli containerd.io
# 启动docker
systemctl start docker
# 查看版本
docker version
# 常用命令
systemctl daemon-reload //重载系统服务
systemctl list-unit-files --type service //查看全部服务命令
systemctl status docker // 查看docker服务状态
systemctl enable docker //设置docker开机自启动
systemctl disable docker // 关闭docker开机启动
systemctl start docker // 启动docker服务
systemctl stop docker // 停止docker服务
systemctl restart docker // 重启docker服务
# 配置镜像加速
sudo mkdir -p /etc/docker
sudo tee /etc/docker/daemon.json <<-'EOF'
{
"registry-mirrors": ["https://qlmy5iw9.mirror.aliyuncs.com"]
}
EOF
sudo systemctl daemon-reload
sudo systemctl restart docker
# 测试
docker run hello-world
拉取镜像
docker pull prom/prometheus
部署(这里先把容器中的配置文件给拷贝出来,然后通过挂载实现容器和宿主机之间的互通)
docker run -d --name prometheus prom/prometheus
docker cp prometheus:/etc/prometheus /prom
# 记得删除容器
docker run -d --name prometheus -p 9090:9090 -v /prom:/etc/prometheus prom/prometheus
开放端口(每一步都要做,下面就不演示了)
firewall-cmd --zone=public --add-port=9100/tcp --permanent
firewall-cmd --reload
测试,浏览器输入本机地址+端口号
安装node-exporter
拉取镜像
docker pull prom/node-exporter
docker run -d --name node-exporter -p 9100:9100 -v "/proc:/host/proc:ro" -v "/sys:/host/sys:ro" -v "/:/rootfs:ro" --net="host" prom/node-exporter
修改Prometheus.yml配置文件
- job_name: 'node-exporter'
static_configs:
- targets: ['192.168.1.17:9100']
labels:
instance: node-exporter
测试,浏览器输入本机地址+端口号
安装grafana
拉取镜像
docker pull grafana/grafana
安装
docker run -d --name=grafana -p 3000:3000 -v /grafana:/var/lib/grafana grafana/grafana
浏览器测试(默认的账号和密码都是admin),这里直接跳到最后一步了,推荐几个还行的模板,模板id:1860 8919(中文)
安装cadvisor
拉取镜像
docker pull google/cadvisor
安装
注意google/cadviso目前国内下载不了,有需要的可以直接下载链接: 链接: https://pan.baidu.com/s/1JpuaCti-MeqlokrMZqazxw?pwd=tyy1
docker run -d \
--name=cadvisor \
--volume=/:/rootfs:ro \
--volume=/var/run:/var/run:rw \
--volume=/sys:/sys:ro \
--volume=/var/lib/docker/:/var/lib/docker:ro \
--volume=/cgroup:/cgroup:ro \
--publish=9595:8080 \
--detach=true \
--privileged=true \
google/cadviso
浏览器测试
到此结束