搭建高可用负载均衡架构—QQ农场项目

1、事前准备

负载均衡调度器+keepalived

keepalived-01:192.168.10.11

keepalived-02:192.168.10.12

nginx+php

web-01:192.168.10.13

web-02:192.168.10.14

MySQL数据库

mysql-01:192.168.10.15

NFS网络共享存储

nfs-01:192.168.10.16

关闭防火墙与SELinux、关闭NetworkManager、关闭防火墙firewalld。

2、部署nginx(keepalived-01、keepalived-02、web-01、web-02)

1、 避免:Nginx 与 httpd 发生端口冲突

卸载:可能已经安装的 httpd,从而避免发生<端口冲突>

1
(rpm -qa | grep -P "^httpd-([0-9].)+") && rpm -e --nodeps httpd || echo "未安装" 

2、 下载:Nginx 源码安装包,并解压

1
2
3
cd ~ 
which wget || yum install -y wget
wget http://nginx.org/download/nginx-1.19.7.tar.gz

3、安装其他依赖

1
yum install -y gcc pcre-devel zlib-devel 

4、创建运行账户nginx

1
useradd -M -s /sbin/nologin nginx

2.3 安装nginx

  1. 解压nginx-xx.tar.gz包

    1
    tar -axf nginx-1.19.7.tar.gz 
  2. 进入解压目录,执行./configure 设置安装路径和运行账户

    1
    2
    cd ~/nginx-1.19.7 
    ./configure --prefix=/usr/local/nginx --user=nginx --group=nginx
  3. make&&make install

    1
    make && make install
  4. 配置网页

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    cat >/usr/local/nginx/conf/nginx.conf <<EOF
    worker_processes 1;
    events {
    worker_connections 1024;
    }
    http {
    include mime.types;
    default_type application/octet-stream;
    sendfile on;
    keepalive_timeout 65;
    charset utf-8;
    server {
    listen 80;
    server_name localhost;
    include conf.d/*.conf;
    location / {
    root html;
    index index.html index.htm;
    }
    error_page 500 502 503 504 /50x.html;
    location = /50x.html {
    root html;
    }
    }
    }
    EOF

    #创建辅助配置文件目录
    [ -d /usr/local/nginx/conf/conf.d ] || mkdir -p /usr/local/nginx/conf/conf.d

2.3 设置环境变量,同时设置开机自启

1、设置变量

1
2
3
cat > /etc/profile.d/nginx.sh<<EOF 
export PATH="/usr/local/nginx/sbin:\$PATH"
EOF

2、刷新环境

1
source /etc/profile 

3、启停:Nginx 服务进程

1
2
3
echo "/usr/local/nginx/sbin/nginx" >> /etc/rc.d/rc.local 	## 设置:开机自启动 
chmod +x /etc/rc.d/rc.local
nginx 或 nginx -c /usr/local/nginx/conf/nginx.conf ## 启动:Nginx 服务

2.4 访问

1
2
3
4
curl 192.168.10.11
curl 192.168.10.12
curl 192.168.10.13
curl 192.168.10.14

3、反向代理+负载均衡(keepalived-01、keepalived-02)

Nginx upstream 上游模块(负载均衡)

1
2
3
4
5
6
7
8
9
vim /usr/local/nginx/conf/nginx.conf
....
http {
upstream farm { ##test是服务器池的命名,不要有下划线
server 192.168.10.13:80; ##上游服务器ip:端口
server 192.168.10.14:80;
}
...
}

Nginx proxy反向代理模块

1
2
3
4
5
6
7
8
vim /usr/local/nginx/conf/nginx.conf
...
location / {
proxy_pass http://farm;
}
...
保存后出去重载文件
nginx -s reload

4、安装部署Keepalived软件(keepalived-01、keepalived-02)

1、安装keepalived软件

1
yum install keepalived -y

设置Keepalived配置文件

1
vim /etc/keepalived/keepalived.conf 

keepalived-01操作

第一步:按冒号:进入末行模式输入set nu 使文件带行号显示,然后使用35gg切换光标到35行,然后按dG,删除35行以 后的所有内容

第二步:了解一下配置文件中每一行的含义19~34行

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
...
# vrrp_strict #将这个第十四行注释掉
...
vrrp_instance farm {
state MASTER
interface ens33
virtual_router_id 51
priority 100
advert_int 1
authentication {
auth_type PASS
auth_pass 1111
}
virtual_ipaddress {
192.168.10.100
}
}

设置完成后,保存并退出

第三步:启动Keepalived软件

1
2
systemctl start keepalived
systemctl status keepalived

keepalived-02操作

第一步:按冒号:进入末行模式输入set nu 使文件带行号显示,然后使用35gg切换光标到35行,然后按dG,删除35行以 后的所有内容

第二步:了解一下配置文件中每一行的含义19~34行

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
...
# vrrp_strict #将这个第十四行注释掉
...
vrrp_instance farm {
state BACKUP
interface ens33
virtual_router_id 51
priority 90
advert_int 1
authentication {
auth_type PASS
auth_pass 1111
}
virtual_ipaddress {
192.168.10.100
}
}

设置完成后,保存并退出

第三步:启动Keepalived软件

1
2
systemctl start keepalived
systemctl status keepalived

让Keepalived可以监测Nginx服务(keepalived-01、keepalived-02)

第一步:编写nginx.sh脚本,自动检测Nginx的运行状态

1
2
3
4
5
6
7
mkdir /scripts
vim /scripts/nginx.sh
#!/bin/bash
nginx_status=`ps -C nginx --no-header |wc -l`
if [ $nginx_status -eq 0 ]; then
systemctl stop keepalived
fi

第二步:给nginx.sh文件添加一个可执行权限

1
chmod +x /scripts/nginx.sh

第三步:在keepalived-01、keepalived-02两台机器的keepalived.conf文件中配置 nginx.sh脚本

1
2
3
4
5
6
7
vim /etc/keepalived/keepalived.conf
...
vrrp_script check_nginx {
script /scripts/nginx.sh ## 指定:<外部脚本>的<调用路径>
interval 1 ## 设置:<健康跟踪检测>的<时间间隔>,默认为 1 秒
}
...

以上只是在keepalived配置文件中定义了一个检测脚本,但是还没有真正的调用。

第四步:在vrrp_instance标签中真正调用check_nginx这个检测脚本

1
2
3
4
5
6
7
vrrp_instance farm {
...
track_script {
check_nginx
}
...
}

第五步:设置完成后,重启keepalived

1
2
systemctl enable keepalived
systemctl restart keepalived

5、配置nginx+php(web-01、web-02)

1、安装php服务和插件

1
yum -y install php php-fpm php-curl php-intl php-mysql

2、修改nginx配置文件

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
vim /usr/local/nginx/conf/nginx.conf
...
location / {
root /farm;
index index.php index.htm;
}
...

cat > /usr/local/nginx/conf/conf.d/farm.conf <<EOF
location ~ \.php$ {
root /farm;
fastcgi_pass 127.0.0.1:9000;
fastcgi_index index.php;
fastcgi_param SCRIPT_FILENAME \$document_root\$fastcgi_script_name;
include fastcgi_params;
}
EOF

3、创建发布目录

1
mkdir /farm

4、配置我们的php服务

1
2
vim /etc/php.ini
#short_open_tag,将211行short_open_tag = Off 改为 on

5、重启服务

1
2
3
nginx -s reload
systemctl enable php-fpm
systemctl restart php-fpm

6、配置网络共享存储实现Web网页数据一致(nfs-01)

1、安装共享存储软件NFS

1
yum -y install nfs-utils rpcbind

2、启动软件&设置开机自启

1
2
systemctl enable nfs
systemctl start nfs

3、创建共享目录设置权限

1
2
mkdir /php
setfacl -R -m u:nfsnobody:rwx /php

4、将目录设置共享

1
2
3
4
echo '/php *(rw)' > /etc/exports.d/farm.exports
exportfs -r
showmount -e
systemctl restart nfs

5、Web机器下载nfs客户端(web-01、web-02)

1
yum -y install nfs-utils

6、挂载该项目目录(web-01、web-02)

1
mount 192.168.100.140:/php /farm

7、配置农场动态页面

1、下载QQ农场数据包并上传解压(web-01)

1
2
3
4
5
6
7
cd ~
yum -y install lrzsz ##然后将farm-ucenter1.5.zip包进行上传
yum -y install unzip
unzip farm-ucenter1.5.zip ##解压完会有一个upload目录
cp -r upload/* /farm
cd /farm
chmod 777 * -R

2、将/farm目录中qqfarm.sql文件通过scp命令发送给mysql-01的MySQL机器

1
scp /farm/qqfarm.sql 192.168.10.15:/root/

PS:解决报错问题

之前许多人做错了导致数据库连接出问题,所以我们需要

1、删除/farm目录中所有的文件

1
rm -rf /farm/*

然后执行第七大点的操作

报错后数据库的解决办法在数据库节点下面

8、配置MySQL数据库(mysql-01)

1、MySQL的安装与初始化设置

1
2
3
4
5
6
7
8
9
10
11
12
13
#安装mysql
yum -y install mariadb-server mariadb
systemctl enable mariadb
systemctl start mariadb
#设置MySQL登录密码
初始密码可用来登录,建议我们进入mysql后还是需要修改一下密码


语法:
mysqladmin -u root -p'旧密码' password '新密码' #这个不需要进入mysql内就能修改
案例:
mysqladmin -u root -p'旧密码' password 'Blue@123'
回车两下即可

2、创建farm库

1
2
3
mysql -uroot -p'Blue@123'
mysql> create database farm;
mysql> exit

3、在MySQL服务端,账号登陆并将传输的数据文件导入到新建的farm库中

1
mysql -u root -p'Blue@123' farm < /root/qqfarm.sql

4、允许web服务端登陆数据库,需要数据库更改授权,然后重新加载授权表,注意数据库登陆进去以后,命令结尾都要加上;

1
2
3
4
5
mysql -uroot -p'Blue@123'
create user 'root'@'%' identified by 'Blue@123';
grant all on *.* to 'root'@'%';
flush privileges;
exit

PS:数据库报错的解决办法

我们需要登陆MySQL,删除原来在farm库,创建新库然后导入

1
2
3
mysql -uroot -p'Blue@123'
drop database farm;
然后重复执行一遍第八大点的2、3、4小点

9、web服务器端重新启动(web-01、web-02)

1
2
nginx -s reload
systemctl restart php-fpm

五、浏览器访问(访问web-01的ip进行网站安装,安装完毕后再用vip进行访问)

1、在浏览器端输入服务端地址访问,根据提示修改权限

注意数据库服务器一栏填写数据库机器的ip地址

这里下面三个选一个当主页

点完成后会开一个新界面,我们就可以浏览了,这里我们点网络家园

可以看到我们的qq农场,那到底能不能显示出来呢?我们试一试