💝💝💝欢迎来到我的博客,很高兴能够在这里和您见面!希望您在这里可以感受到一份轻松愉快的氛围,不仅可以获得有趣的内容和知识,也可以畅所欲言、分享您的想法和见解。
推荐:Linux运维老纪的首页,持续学习,不断总结,共同进步,活到老学到老
导航剑指大厂系列:全面总结 运维核心技术:系统基础、数据库、网路技术、系统安全、自动化运维、容器技术、监控工具、脚本编程、云服务等。
常用运维工具系列:常用的运维开发工具, zabbix、nagios、docker、k8s、puppet、ansible等
数据库系列:详细总结了常用数据库 mysql、Redis、MongoDB、oracle 技术点,以及工作中遇到的 mysql 问题等
懒人运维系列:总结好用的命令,解放双手不香吗?能用一个命令完成绝不用两个操作
数据结构与算法系列:总结数据结构和算法,不同类型针对性训练,提升编程思维,剑指大厂
非常期待和您一起在这个小小的网络世界里共同探索、学习和成长。💝💝💝 ✨✨ 欢迎订阅本专栏 ✨✨
mysql+ nginx+nfs lvs+keepalived +inotify+rsync高可用群集
简介
这是一个典型的Linux服务器群集解决方案,包括MySQL、Nginx、NFS、LVS和Keepalived。
MySQL:提供数据库服务。
Nginx:提供网页服务器和负载均衡。
NFS:提供文件存储服务。
LVS:提供负载均衡服务。
Keepalived:提供高可用性服务,通过VRRP协议实现。
inotify:Linux内核特性,用于检测文件系统的变动。
rsync:文件同步工具,用于同步文件和数据。
高可用性(High Availability,简称 HA)通常是指系统有效性和持续性。在这个解决方案中,Keepalived确保了服务的高可用性,即使一个节点失效,另一个备份节点可以接管服务。
NFS用于数据存储,确保了所有服务器节点都可以访问同一份数据。
LVS通过负载均衡算法分配用户请求到不同的服务器节点。
Nginx和MySQL配合工作,提供完整的网站服务和数据库服务。
inotify监控文件系统的变动,并通过rsync将变更的文件同步到其他服务器节点。
这个解决方案提供了一个高性能、高可用的网站服务平台。
项目负责人:老纪
1 、配置和管理 MySQL 数据库。
2 、部署和管理 Nginx 。
3 、设置和管理 NFS 文件共享系统。
4 、部署 LVS+Keeplived 高可用负载均衡。
5 、部署 inotify+rsync 服务进行数据备份。
企业网站群集架构部署—项目报告、项目需求 项目环境表
主机 | 操作系统 | 主机名 / IP地址主机名 / IP地址 | 主要软件 |
客户端 | Windows 11 | 192.168.23.10 | |
MySQL 服务器 | CentOS7.6 | mysql_master / 192.168.244.203 | MySQL5.7 |
MySQL 服务器 | CentOS7.6 | mysql_slave / 192.168.244.204 | MySQL5.7 |
Web 服务器 | CentOS7.6 | Web01 / 192.168.244.205 | nginx 、 php-fpm 、 rpcbind |
Web 服务器 | CentOS7.6 | Web01 / 192.168.244.206 | nginx、php-fpm |
NFS 共享服务器 | CentOS7.6 | NFS / 192.168.244.207 | rpcbind、rsync |
负载均衡服务器 | CentOS7.6 | Lvs-master ens32 : 192.168.23.208 ens34 : 192.168.244.179 VIP : 192.168.23.100 VIP : 192.168.244.100 | LVS、Keepalived |
负载均衡服务器 | CentOS7.6 | Lvs-slave ens32 : 192.168.23.209 ens34 : 192.168.244.209 VIP : 192.168.23.100 VIP : 192.168.244.100 | LVS、Keepalived |
数据备份服务器 | CentOS7.6 | rsync / 192.168.244.210 | inotify、rsync |
项目实施:
💡 注意:所有服务器的 Firewalld 与 Selinux 已关闭
一:配置和管理 MySQL 数据库
1、安装两台 MySQL数据库,配置主从复制
修改主机名
1 [root@centos7-3 ~]# hostnamectl set-hostname mysql_master
2 [root@centos7-3 ~]# bash
3 [root@mysql_master ~]#
4
5 [root@centos7-4 ~]# hostnamectl set-hostname mysql_slave
6 [root@centos7-4 ~]# bash
7 [root@mysql_slave ~]#
安装 NTP 时间同步( master 上操作)
1 [root@mysql_master ~]# yum -y install ntp
2 [root@mysql_master ~]# vim /etc/ntp.conf (添加下面两行)
3 server 127.127.1.0
4 fudge 127.127.1.0 stratum 8
5 [root@mysql_master ~]# systemctl restart ntpd
6 [root@mysql_master ~]# systemctl enable ntpd
7
8 在从节点上进行时间同步( slave 上操作)
9 [root@mysql_slave ~]# yum -y install ntpdate
10 [root@mysql_slave ~]# ntpdate 192.168.244.203
11 30 Mar 09:54:58 ntpdate[9034]: adjust time server 192.168.244.203 offset -0.000334 sec
安装 MySQL 数据库(在 master 、 slave 上面操作) 1 [root@mysql_master ~]# cd /etc/yum.repos.d/
2 [root@mysql_master yum.repos.d]# vim mysql57.repo
3 [mysql57-community]
4 name=MySQL 5.7 Community Server
5 baseurl=http://repo.mysql.com/yum/mysql-5.7-community/el/7/$basearch/
6 enabled=1
7 gpgcheck=0
8 [root@mysql_master yum.repos.d]# yum -y install mysql mysql-server
9 [root@mysql_master ~]# systemctl enable mysqld --now
2、设置 MySQL 数据库的用户名和密码(master、slave上面操作)
1 [root@mysql_master ~]# grep password /var/log/mysqld.log
2 2024-03-30T02:10:02.167999Z 1 [Note] A temporary password is generated for
root@localhost: qUUp,.:p!7fw
3 [root@mysql_master ~]# mysql -u root -p'qUUp,.:p!7fw'
4
5 mysql> set password=password('Cisco@123');
6 Query OK, 0 rows affected, 1 warning (0.01 sec)
7
8 [root@mysql_slave ~]# grep password /var/log/mysqld.log
9 2024-03-30T02:10:02.790999Z 1 [Note] A temporary password is generated for
root@localhost: iakZfwxfv1(p
10 [root@mysql_slave ~]# mysql -u root -p'iakZfwxfv1(p'
11
12 mysql> set password=password('Cisco@123');
13 Query OK, 0 rows affected, 1 warning (0.01 sec)
3、配置主数据库的 binlog 格式和 binlog 同步。
1 ## 编辑 /etc/my.cnf 配置文件,增加以下三行
2 [root@mysql_master ~]# vim /etc/my.cnf
3 server-id = 11
4 log-bin = master-bin
5 log-slave-updates = true 6
7 ## 重启 mysql 服务
8 [root@mysql_master ~]# systemctl restart mysqld
9
10 ## 登录 MySQL 程序,给从服务器授权
11 [root@mysql_master ~]# mysql -u root -pCisco@123
12
13 mysql> grant replication slave on *.* to 'myslave'@'192.168.244.%' identified by
'Cisco@123';
14
15 mysql> flush privileges;
16
17 mysql> show master status;
18 +-------------------+----------+--------------+------------------+-------------------+
19 | File | Position | Binlog_Do_DB | Binlog_Ignore_DB | Executed_Gtid_Set |
20 +-------------------+----------+--------------+------------------+-------------------+
21 | master-bin.000001 | 604 | | | |
22 +-------------------+----------+--------------+------------------+-------------------+
23 1 row in set (0.00 sec)
4、配置 slave 从服务器
1 ## 编辑 /etc/my.cnf 配置文件,增加以下三行
2 [root@mysql_slave ~]# vim /etc/my.cnf
3 server-id = 22
4 relay-log = relay-log-bin
5 relay-log-index = slave-relay-bin.index
6
7 ## 重启 MySQL 服务
8 [root@mysql_slave ~]# systemctl restart mysqld
9
10 ## 登录 MySQL ,配置同步。(按主服务器结果更改下面命令中 master_log_file 和 master_log_pos 参
数。)
11 [root@mysql_slave ~]# mysql -u root -pCisco@123
12
13 mysql> change master to
master_host='192.168.244.203',master_user='myslave',master_password='Cisco@123',master_
log_file='master-bin.000001',master_log_pos=604;
14 15 Query OK, 0 rows affected, 2 warnings (0.02 sec)
16
17 ## 启动同步
18 mysql> start slave;
19 Query OK, 0 rows affected (0.00 sec)
20
21 ## 查看 Slave 状态,确保以下两个值为 YES 。
22 mysql> show slave status\G
23 *************************** 1. row ***************************
24 Slave_IO_Running: Yes
25 Slave_SQL_Running: Yes
26 1 row in set (0.00 sec)
5、测试主从复制是否正常
在主服务器上新建数据库 auth 。
1 mysql> create database auth;
2 Query OK, 1 row affected (0.00 sec)
3
4 mysql> show databases;
5 +--------------------+
6 | Database |
7 +--------------------+
8 | information_schema |
9 | auth |
10 | mysql |
11 | performance_schema |
12 | sys |
13 +--------------------+
14 5 rows in set (0.00 sec)
在从服务器上查看数据库,显示数据库相同,则主从复制成功。
1 mysql> show databases;
2 +--------------------+
3 | Database | 4 +--------------------+
5 | information_schema |
6 | auth |
7 | mysql |
8 | performance_schema |
9 | sys |
10 +--------------------+
11 5 rows in set (0.00 sec)
二、部署和管理 Nginx
1、安装 Nginx 服务器,配置支持使用 epoll 模型提高性能 。
修改主机名
1 [root@centos7-5 ~]# hostnamectl set-hostname web01
2 [root@centos7-5 ~]# bash
3 [root@web01 ~]#
4
5 [root@centos7-6 ~]# hostnamectl set-hostname web02
6 [root@centos7-6 ~]# bash
7 [root@web02 ~]#
配置 Nginx 的官方 yum 源
💡 web01 、 web02 相同操作,以下在 web01 上演示
1 [root@web01 ~]# cd /etc/yum.repos.d/
2 [root@web01 yum.repos.d]# vim nginx.repo
3 [nginx-stable]
4 name=nginx stable repo
5 baseurl=http://nginx.org/packages/centos/$releasever/$basearch/
6 gpgcheck=1
7 enabled=1
8 gpgkey=https://nginx.org/keys/nginx_signing.key
9 module_hotfixes=true 安装 Nginx
1 [root@web01 ~]# yum -y install nginx
配置支持 epoll 模型提高性能
1 ## 编辑配置文件 /etc/nginx/nginx.conf
2 [root@web01 ~]# vim /etc/nginx/nginx.conf
3 events {
4 use epoll; // 在 events 模块中添加此行
2、设置 Nginx 的工作进程数和最大连接数
1 ## 编辑配置文件 /etc/nginx/nginx.conf
2 [root@web01 ~]# vim /etc/nginx/nginx.conf
3 worker_processes 1; // 工作进程数量
4 events {
5 use epoll;
6 worker_connections 1024; // 最大连接数
7 }
3、部署安装 php
1 ## 安装 php 相关软件
2 [root@web01 ~]# yum -y install php php-fpm php-mysql php-gd
3
4 ## 编辑 php 配置文件 /etc/php-fpm.d/www.conf ,定用户与组,并开启状态页面用于监控服务状态。
5 [root@web01 ~]# vim /etc/php-fpm.d/www.conf
6 39 user = nginx
7 41 group = nginx
8 121 pm.status_path = /php_status // 取消注释(默认被注释)并改名为 /php_status
9 10 ## 修改配置 /etc/php.ini 指定 php 时区
11 [root@web01 ~]# vim /etc/php.ini
12 878 date.timezone = "Asia/Shanghai" // 指定时区
13
14 ## 启动 php-fpm
15 [root@web01 ~]# systemctl start php-fpm
16 [root@web01 ~]# systemctl enable php-fpm
17 Created symlink from /etc/systemd/system/multi-user.target.wants/php-fpm.service to
/usr/lib/systemd/system/php-fpm.service.
4、配置 Nginx 的虚拟主机,根据要求设置各虚拟主机的域名、访问日志前缀、网站根目录和默认字 符集。
1 ## 编辑配置文件 /etc/nginx/nginx.conf
2 [root@web01 ~]# vim /etc/nginx/nginx.conf
3 ......
4 http {
5 include mime.types;
6 default_type application/octet-stream;
7 ## 配置日志格式
8 log_format main '$remote_addr - $remote_user [$time_local] "$request" '
9 '$status $body_bytes_sent "$http_referer" '
10 '"$http_user_agent" "$http_x_forwarded_for"';
11
12 ## 配置 access.log 日志及存放路径,并且使用上面定义的 main 日志格式
13 access_log /var/log/nginx/access.log main;
14 sendfile on; // 高效文件传输模式
15 #tcp_nopush on;
16 #keepalive_timeout 0;
17 keepalive_timeout 65; // 连接超时时间,单位秒
18 #gzip on;
19 server { // 配置虚拟主机
20 listen 80; // 指定虚拟主机的服务端口
21 server_name www.bdqn.com; // 虚拟主机域名
22 charset utf-8; // 默认字符集
23 access_log /var/log/nginx/bdqn.access.log main; // 日志存放路径,最后的 main 指定
访问日志的输出格式
24 location / { 25 root /var/www/bdqn; // 虚拟主机网页根目录
26 index index.html index.php;
27 }
28 ## 配置 nginx 连接 php
29 location ~ \.php$ {
30 root /var/www/bdqn;
31 fastcgi_pass 127.0.0.1:9000;
32 fastcgi_index index.php;
33 fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
34 include fastcgi_params;
35 }
36 ## 开启 php 页面
37 location /php_status {
38 root html;
39 fastcgi_pass 127.0.0.1:9000;
40 fastcgi_index index.php;
41 fastcgi_param SCRIPT_FILENAME /scripts$fastcgi_script_name;
42 include fastcgi_params;
43 }
44 }
45 }
46 ## 配置 stream 反向代理模块
47 stream {
48 upstream mysql {
49 server 192.168.244.203:3306; // 后端数据库的 ip 地址和端口
50 server 192.168.244.204:3306;
51 }
52 server {
53 listen 3306; // 监听 3306 端口,远程登录时不用加 -p 参数
54 proxy_connect_timeout 10s;
55 proxy_timeout 30s;
56 proxy_pass mysql;
57 }
58 }
59
60 ## 检查配置文件
61 [root@web01 ~]# nginx -t
62 nginx: the configuration file /etc/nginx/nginx.conf syntax is ok
63 nginx: configuration file /etc/nginx/nginx.conf test is successful 64
65 ## 建立虚拟 web 主机根目录以及测试文件
66 [root@web01 ~]# mkdir -p /var/www/bdqn
67 [root@web01 ~]# cd /var/www/bdqn/
68 [root@web01 bdqn]# vim index.html
69 www.bdqn.com
70
71 ## 建立 nginx 与 php 连接测试文件
72 [root@web02 ~]# cd /var/www/bdqn/
73 [root@web02 bdqn]# vim info.php
74 <?php
75 phpinfo();
76 ?>
77
78 ## 建立 php 与后端 mysql 服务器测试文件
79 [root@web02 ~]# cd /var/www/bdqn/
80 [root@web02 bdqn]# vim mysql.php
81 <?php
82 $con=mysql_connect("192.168.244.203","root","Cisco@123");
83 if(!$con) echo "error";
84 else echo "success";
85 ?>
86
87 ## 启动 nginx
88 [root@web01 ~]# systemctl restart nginx
89 [root@web01 ~]# systemctl enable nginx
90 Created symlink from /etc/systemd/system/multi-user.target.wants/nginx.service to
/usr/lib/systemd/system/nginx.service.
配置后端 mysql 数据库 root 用户远程连接权限
在 master 、 slave 上面操作
1 mysql> grant all privileges on *.* to 'root'@'%' identified by 'Cisco@123' with grant
option;
2 Query OK, 0 rows affected, 1 warning (0.01 sec)
3
4 mysql> flush privileges;
5 Query OK, 0 rows affected (0.01 sec)
5、测试
测试访问虚拟 web 主机
提前在 windows 中配置域名解析: C:\Windows\System32\drivers\etc\hosts
三、设置和管理 NFS 共享文件系统
1、安装 NFS 服务器,配置共享目录为/opt/wwwroot
修改主机名
1 [root@centos7-7 ~]# hostnamectl set-hostname nfs
2 [root@centos7-7 ~]# bash
3 bash
4 [root@nfs ~]#
安装 nfs-utils rpcbind 软件包
1 [root@nfs ~]# yum -y install nfs-utils rpcbind
2 [root@nfs ~]# systemctl enable rpcbind
3 [root@nfs ~]# systemctl enable nfs
4 Created symlink from /etc/systemd/system/multi-user.target.wants/nfs-server.service to
/usr/lib/systemd/system/nfs-server.service.
设置共享目录
1 [root@nfs ~]# mkdir -p /opt/wwwroot
2 [root@nfs ~]# vim /etc/exports
3 /opt/wwwroot 192.168.244.0/24(rw,sync,no_root_squash) 启动 NFS 服务程序
1 [root@nfs ~]# systemctl start rpcbind
2 [root@nfs ~]# systemctl start nfs
3 [root@nfs ~]# netstat -anpt | grep rpcbind
4 tcp 0 0 0.0.0.0:111 0.0.0.0:* LISTEN
711/rpcbind
5 tcp6 0 0 :::111 :::* LISTEN
711/rpcbind
查看本机发布的 NFS 共享目录
1 [root@nfs ~]# showmount -e
2 Export list for nfs:
3 /opt/wwwroot 192.168.244.0/24
2、配置 web 节点服务器
这里在 web01 上面演示, web02 同样操作,这里不在赘述
安装 nfs-utils rpcbind 软件包
1 [root@web01 ~]# yum -y install nfs-utils rpcbind
2 [root@web01 ~]# systemctl enable rpcbind
3 [root@web01 ~]# systemctl start rpcbind
4 [root@web01 ~]# netstat -anpt | grep rpcbind
5 tcp 0 0 0.0.0.0:111 0.0.0.0:* LISTEN
68241/rpcbind
6 tcp6 0 0 :::111 :::* LISTEN
68241/rpcbind
查看共享服务器的服务目录
1 [root@web01 ~]# showmount -e 192.168.244.207
2 Export list for 192.168.244.207: 3 /opt/wwwroot 192.168.244.0/24
挂载 NFS 共享目录
1 [root@web01 ~]# mount 192.168.244.207:/opt/wwwroot /var/www/bdqn/ // 手动挂载
2 [root@web01 ~]# vim /etc/fstab
3 ......
4 192.168.244.207:/opt/wwwroot /var/www/bdqn nfs defaults,_netdev 0 0 // 添加此行,设
置开机自动挂载
3、在共享目录下创建各虚拟主机对应的 PHP 测试网页,并添加数据库连接测试代码
1 [root@nfs ~]# cd /opt/wwwroot/
2 [root@nfs wwwroot]# vim info.php
3 <?php
4 phpinfo();
5 ?>
6
7 [root@nfs wwwroot]# vim mysql.php
8 <?php
9 $link=mysqli_connect('192.168.244.203','root','Cisco@123');
10 if($link) echo "<h1> 恭喜你,数据库连接成功 </h1>";
11 mysqli_close($link);
12 ?>
13
4、验证各虚拟主机的 PHP 测试网页能够连接 MySQL 数据库。
测试 php 测试连接 mysql
四、部署 LVS+Keeplived 高可用负载均衡
修改主机名
1 [root@centos7-8 ~]# hostnamectl set-hostname lvs-master
2 [root@centos7-8 ~]# bash
3 bash
4 [root@lvs-master ~]#
5
6
7 [root@centos7-9 ~]# hostnamectl set-hostname lvs-slave
8 [root@centos7-9 ~]# bash
9 bash
10 [root@lvs-slave ~]#
检查网卡地址 1 [root@lvs-master ~]# ip add | grep ens32
2 2: ens32: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP group
default qlen 1000
3 inet 192.168.23.208/24 brd 192.168.23.255 scope global noprefixroute ens32
4 [root@lvs-master ~]# ip add | grep ens34
5 3: ens34: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP group
default qlen 1000
6 inet 192.168.244.179/24 brd 192.168.244.255 scope global noprefixroute dynamic
ens34
7
8
9 [root@lvs-slave ~]# ip add | grep ens32
10 2: ens32: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP group
default qlen 1000
11 inet 192.168.23.209/24 brd 192.168.23.255 scope global noprefixroute ens32
12 [root@lvs-slave ~]# ip add | grep ens34
13 3: ens34: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP group
default qlen 1000
14 inet 192.168.244.180/24 brd 192.168.244.255 scope global noprefixroute dynamic
ens34
15
1、安装 LVS 和 Keepalived 工具
lvs-master 、 lvs-slave 相同操作,这里演示 lvs-master
1 [root@lvs-master ~]# yum -y install ipvsadm keepalived
2、配置 LVS-NAT 模式,设置 VIP 地址为 192.168.23.100
创建虚拟服务器
1 [root@lvs-master ~]# ipvsadm -A -t 192.168.23.100:80 -s rr
添加节点服务器 1 [root@lvs-master ~]# ipvsadm -a -t 192.168.23.100:80 -r 192.168.244.205:80 -m -w 1
2 [root@lvs-master ~]# ipvsadm -a -t 192.168.23.100:80 -r 192.168.244.206:80 -m -w 1
查看群集节点状态
1 [root@lvs-master ~]# ipvsadm -ln
2 IP Virtual Server version 1.2.1 (size=4096)
3 Prot LocalAddress:Port Scheduler Flags
4 -> RemoteAddress:Port Forward Weight ActiveConn InActConn
5 TCP 192.168.23.100:80 rr
6 -> 192.168.244.205:80 Masq 1 0 0
7 -> 192.168.244.206:80 Masq 1 0 0
保存负载分配策略
1 [root@lvs-master ~]# ipvsadm-save > /etc/sysconfig/ipvsadm
开启路由转发规则
1 [root@lvs-master ~]# vim /etc/sysctl.conf
2 ......
3 net.ipv4.ip_forward = 1
4 [root@lvs-master ~]# sysctl -p
5 net.ipv4.ip_forward = 1
开启服务
1 [root@lvs-master ~]# systemctl start ipvsadm
2 [root@lvs-master ~]# systemctl enable ipvsadm
3 Created symlink from /etc/systemd/system/multi-user.target.wants/ipvsadm.service to
/usr/lib/systemd/system/ipvsadm.service.
3、设置负载调度算法为轮询,健康检查间隔为 10 秒,连接超时为 3 秒,重试次数为 3 次,重试间隔 为 5 秒。
编辑 keepalived 配置文件( lvs-master )
1 [root@lvs-master ~]# cd /etc/keepalived/
2 [root@lvs-master keepalived]# cp keepalived.conf keepalived.conf.bak
3 [root@lvs-master keepalived]# vim keepalived.conf
4 ! Configuration File for keepalived
5
6 global_defs {
7 notification_email { // 设置邮箱报警地址
8 m17602062016@163.com
9 }
10 notification_email_from 1780950432@qq.com // 设置邮件的发送地址
11 smtp_server 192.168.200.1
12 smtp_connect_timeout 30
13 router_id LVS_master // 运行 keepalive 服务器标识
14 }
15 vrrp_instance VI_1 { // 实例名
16 state MASTER // 指定 keepalived 角色
17 interface ens32 // 指定 HA 监测网络的接口
18 virtual_router_id 1 // 虚拟路由标识
19 priority 100 // 节点优先级
20 advert_int 1 // 设定 master 与 backup 主机之间同步检查时间间隔,单位是秒
21 authentication { // 设定节点间通信验证类型和密码
22 auth_type PASS // 验证类型
23 auth_pass 123456 // 验证密码
24 }
25 virtual_ipaddress { // 虚拟 IP 地址( VIP )
26 192.168.23.100
27 }
28 }
29
30 vrrp_instance VI_2 { // 第二个虚拟 IP 实例
31 state MASTER 32 interface ens34
33 virtual_router_id 1
34 priority 100
35 advert_int 1
36 authentication {
37 auth_type PASS
38 auth_pass 123456
39 }
40 virtual_ipaddress {
41 192.168.244.100
42 }
43 }
44
45 virtual_server 192.168.23.100 80 { // 虚拟服务器开始
46 delay_loop 10 // 健康检查时间间隔,单位是秒
47 lb_algo rr // 设置负载调度算法
48 lb_kind NAT // 设置 LVS 负载均衡的机制
49 persistence 60 // 会话保持时间,单位是秒
50 protocol TCP // 指定转发协议类型
51 real_server 192.168.244.205 80 { // 指定 real server 节点
52 weight 1 // 设置 real server 节点的权重值
53 TCP_CHECK {
54 connect_port 80 // 健康检查的端口
55 connect_timeout 3 // 无响应超时时间,单位是秒
56 nb_get_retry 3 // 重试次数
57 delay_before_retry 5 // 重试间隔时间,单位是秒
58 }
59 }
60 real_server 192.168.244.206 80 {
61 weight 1
62 TCP_CHECK {
63 connect_port 80
64 connect_timeout 3
65 nb_get_retry 3
66 delay_before_retry 5
67 }
68 }
69 }
70 [root@lvs-master keepalived]# systemctl restart keepalived 71 [root@lvs-master keepalived]# systemctl enable keepalived
72 Created symlink from /etc/systemd/system/multi-user.target.wants/keepalived.service to
/usr/lib/systemd/system/keepalived.service.
lvs-slave配置文件
1 [root@lvs-slave ~]# cd /etc/keepalived/
2 [root@lvs-slave keepalived]# cp keepalived.conf keepalived.conf.bak
3 [root@lvs-slave keepalived]# vim keepalived.conf
4 ! Configuration File for keepalived
5
6 global_defs {
7 notification_email {
8 m17602062016@163.com
9 }
10 notification_email_from Alexandre.Cassen@firewall.loc
11 smtp_server 192.168.200.1
12 smtp_connect_timeout 30
13 router_id LVS_master
14 }
15 vrrp_instance VI_1 {
16 state BACKUP
17 interface ens32
18 virtual_router_id 1
19 priority 99
20 advert_int 1
21 authentication {
22 auth_type PASS
23 auth_pass 123456
24 }
25 virtual_ipaddress {
26 192.168.23.100
27 }
28 }
29
30 vrrp_instance VI_2 {
31 state BACKUP 32 interface ens34
33 virtual_router_id 1
34 priority 99
35 advert_int 1
36 authentication {
37 auth_type PASS
38 auth_pass 123456
39 }
40 virtual_ipaddress {
41 192.168.244.100
42 }
43 }
44
45 virtual_server 192.168.23.100 80 {
46 delay_loop 10
47 lb_algo rr
48 lb_kind NAT
49 persistence 60
50 protocol TCP
51 real_server 192.168.244.205 80 {
52 weight 1
53 TCP_CHECK {
54 connect_port 80
55 connect_timeout 3
56 nb_get_retry 3
57 delay_before_retry 5
58 }
59 }
60 real_server 192.168.244.206 80 {
61 weight 1
62 TCP_CHECK {
63 connect_port 80
64 connect_timeout 3
65 nb_get_retry 3
66 delay_before_retry 5
67 }
68 }
69 }
70 71 [root@lvs-slave ~]# cd /etc/keepalived/
72 [root@lvs-slave keepalived]# cp keepalived.conf keepalived.conf.bak
73 [root@lvs-slave keepalived]# vim keepalived.conf
💡 注意:
内网两台 web 服务器的网关地址修改为第二个实例的 VIP 地址
192.168.244.100
第一个实例的 VIP 地址用于客户端访问使用
4、测试负载均衡是否正常工作
客户端测试访问 VIP 地址
可以看到,我们在客户端一共访问 2 次, LVS 调度器分别将请求交给 web01 和 web02
关闭 lvs-master 服务器
可以看到, 当主服务器 master 关闭时, VIP 地址漂移到 slave 从服务器
5、启用邮件通知功能,以便及时了解各 Web 节点服务器的健康状况 。
1 [root@lvs-master ~]# head -5 /etc/keepalived/keepalived.conf
2 ! Configuration File for keepalived
3
4 global_defs {
5 notification_email { // 启用邮件告警功能
6 m17602062016@163.com
7
五、部署 inotify+rsync 服务进行数据备份
1、在 Web 服务器上设置计划任务,每天凌晨 1 点通过推送方式备份网站访问日志 。
修改 web01 配置文件
1 [root@web01 ~]# vim /etc/rsyncd.conf
2 uid = nobody
3 gid = nobody
4 use chroot = yes // 禁锢在源目录
5 max connections = 4 // 最大连接数
6 pid file = /var/run/rsyncd.pid // 存放进程 ID 的文件位置
7 log file = /var/log/rsyncd.log // 日志文件位置
8 dont compress = *.gz *.tgz *.zip *.z *.Z *.rpm *.deb *.bz2 // 同步时不在压缩的文件类型
9 address = 192.168.244.205 // 监听地址
10 port = 873 // 监听端口
11 hosts allow = 192.168.244.0/24 // 允许访问的客户机地址
12 [wwwroot] // 共享模块名称
13 path = /var/log/nginx // 源目录的实际路径
14 read only = yes // 是否为只读
15 auth users = backuper // 授权账户
16 secrets file = /etc/rsyncd_users.db // 存放账户信息的数据文件
17 [root@web01 ~]# vim /etc/rsyncd_users.db
18 backuper:cisco@123 19 [root@web01 ~]# chmod 600 /etc/rsyncd_users.db
20 [root@web01 ~]# rsync --daemon
21 [root@web01 ~]# ss -anpt | grep rsync
22 LISTEN 0 5 192.168.244.205:873 *:*
users:(("rsync",pid=79686,fd=4))
23
配置 rsync 服务器,每天凌晨 1 点将 web 服务器的访问日志备份至 rsync 服务器下的 /bdqn_access_log.bak 目录
1 [root@centos7-10 ~]# hostnamectl set-hostname rsync
2 [root@centos7-10 ~]# bash
3 [root@rsync ~]# vim /etc/server.pass
4 cisco@123
5 [root@rsync ~]# chmod 600 /etc/server.pass
6 [root@rsync ~]# crontab -e // 设置定时任务,每天凌晨一点备份网站的访问日志
7 00 1 * * * /usr/bin/rsync -az --delete --password-file=/etc/server.pass
backuper@192.168.244.205::wwwroot /bdqn_access_log.bak
8 [root@rsync ~]# mkdir /bdqn_access_log.bak
9 [root@rsync ~]# systemctl restart crond
10 [root@rsync ~]# systemctl enable crond
2、配置 inotify 监控 NFS 文件服务器共享目录的变动情况,一旦有更新就触发 rsync 同步操作
配置 rsync 服务器
1 [root@rsync ~]# useradd aaa
2 [root@rsync ~]# passwd aaa
3 [root@rsync ~]# vim /etc/rsyncd.conf
4 uid = aaa
5 gid = aaa
6 use chroot = yes
7 max connections = 4
8 pid file = /var/run/rsyncd.pid
9 log file = /var/log/rsyncd.log
10 dont compress = *.gz *.tgz *.zip *.z *.Z *.rpm *.deb *.bz2
11 address = 192.168.244.210
12 port = 873 13 hosts allow = 192.168.244.0/24
14 [wwwroot]
15 path = /var/www/html
16 comment = wwwroot
17 read only = no
18 [root@rsync ~]# mkdir -p /var/www/html
19 [root@rsync ~]# chown -R aaa:aaa /var/www/html
20 [root@rsync ~]# ls -ld /var/www/html/
21 drwxr-xr-x 2 aaa aaa 6 3 月 31 11:03 /var/www/html/
22 [root@rsync ~]# rsync --daemon
23 [root@rsync ~]# systemctl enable rsyncd
24 [root@rsync ~]# ss -anpt | grep rsync
25 LISTEN 0 5 192.168.244.210:873 *:*
users:(("rsync",pid=1637,fd=4))
配置 NFS 共享文件服务器
1 [root@nfs ~]# vim /etc/sysctl.conf
2 .......
3 fs.inotify.max_queued_events = 16384
4 fs.inotify.max_user_instances = 1024
5 fs.inotify.max_user_watches = 1048576
6 [root@nfs ~]# sysctl -p
7
8
9 ## 安装 inotify 工具
10 [root@nfs ~]# tar zxf inotify-tools-3.14.tar.gz -C /usr/src/
11 [root@nfs ~]# cd /usr/src/inotify-tools-3.14/
12 [root@nfs inotify-tools-3.14]# ./configure
13 [root@nfs inotify-tools-3.14]# make && make install
14
15 [root@nfs ~]# vim /etc/server.pass
16 cisco@123
17 [root@nfs ~]# chmod 600 /etc/server.pass
18 [root@nfs ~]# vim /opt/inotify_rsyncd.sh
19 #!/bin/bash
20 INOTIFY_CMD="inotifywait -mrq -e modify,create,move,delete /opt/wwwroot" 21 RSYNC_CMD="rsync -az --delete --password-file=/etc/server.pass /opt/wwwroot/
root@192.168.244.210::wwwroot"
22 $INOTIFY_CMD | while read DIRECTORY EVENT FILE
23 do
24 $RSYNC_CMD
25 done
26 [root@nfs wwwroot]# chmod +x /opt/inotify_rsyncd.sh
3、验证数据备份是否正常工作
在 nfs 服务器的 /opt/wwwroot/ 目录下创建文件
1 [root@nfs wwwroot]# touch a.txt b.txt c.txt
在 rsync 服务器的 /var/www/html 目录下查看,刚才在 nfs 服务器上创建的文件有没有被同步过来
1 [root@rsync ~]# cd /var/www/html/
2 [root@rsync html]# ls
3 1.txt 2.txt 3.txt a.txt b.txt c.txt index.html info.php mysql.php
可以看到,数据被同步过来
至此,项目完成
六、问题及分析
1、测试 PHP 无法解析后端数据库(已解决)
解决办法:后端数据库用户没有远程连接权限,添加远程连接权限即可。
2、无法通过 lvs-slave 从负载调度器访问 web 页面(已解决)
解决办法:经排查主从调度器切换没问题,VIP 地址能正常飘逸,最后发现内网 web 服务
器网关未设置正确, Keepallived 配置文件再次添加一个实例 VIP 地址,网关设置成这个地
址即可。3、inotify 监控与 rsync 同步,用户问题无法触发更新,暂且使用 root 用户(已解决)
解决办法:修改 rsync 服器共享目录所属用户,属组即可。
4、inotify 触发脚本设置开机启动无法生效。(未解决)