目录
LAMP高可用论坛系统与自动化监控平台建设
技术栈: LAMP架构 | MySQL GTID主从复制 | Zabbix分布式监控 | Shell自动化运维 项目角色: 运维工程师(独立完成架构设计/自动化部署/监控体系建设)
项目描述: 设计并实施基于Discuz的企业级高可用论坛系统,构建智能化运维监控体系,保障业务连续性及运维效率:
-
LAMP环境自动化部署
-
开发Shell脚本实现Apache/PHP/MySQL安装,集成Discuz论坛配置,部署耗时大大减少,环境一致性达100%
-
-
MySQL高可用架构设计
-
基于GTID搭建主从同步集群(一主一从),配置双机SSH互信实现故障自动切换,主库故障时从库恢复耗时<30秒
-
通过mysqldump全量备份+binlog增量备份策略,保障RPO=0,设计定时备份脚本实现每日自动备份
-
-
Zabbix智能监控体系构建
-
部署Zabbix Server+Agent监控集群,开发20+自定义监控项(包括Apache工作进程/MySQL慢查询/PHP-FPM队列深度等核心指标)
-
配置告警规则(邮件告警),实现关键指标异常5秒内触发告警,历史故障响应时间缩短80%
-
项目成果:
-
系统连续稳定运行12个月,年可用性达99.99%,累计承载用户访问量50万+
-
数据库故障切换实现业务无感知,数据恢复完整率100%
-
运维监控平台日均处理告警300+条,服务器资源利用率提升40%,运维团队人力成本降低50%
具体代码,步骤:
项目准备
192.168.10.2 主库 zabbix-agent
192.168.10.3 从库
192.168.10.4 zabbix-server
主从复制,从库负责主库故障时候的数据恢复
192.168.10.4 zabbix-server负责性能监控 192.168.10.2 zabbix-agent的cpu等信息
项目描述:
编写部署lamp环境脚本,进行主从配置,进行zabbix部署,进行zabbix监控,监控步骤省略,后面附带监控脚本进行自定义键值,配置省略。。。
1.一键部署上线discuz论坛-lamp
#!/bin/bash
#install discuz
Mysql_Pass=Qwer@123
#update
#yum update
#epel
yum -y install epel-release
#env
yum -y install bash-completion vim wget
systemctl stop firewalld
setenforce 0
#apache
yum -y install httpd gd
rm -rf /etc/httpd/conf.d/welcome.conf
#sed -ri 's/Listen 80/Listen 8080/' /etc/httpd/conf/httpd.conf
systemctl enable httpd
#mysql
yum -y install mariadb-server mariadb
systemctl start mariadb
systemctl enable mariadb
mysqladmin -uroot password "$Mysql_Pass"
mysql -uroot -p"$Mysql_Pass" -e "create database discuz"
#安装PHP7.0
rpm -Uvh https://rpms.remirepo.net/enterprise/remi-release-7.rpm
yum-config-manager --enable remi-php70
yum -y install php php-cli php-common php-mysqlnd php-gd php-mbstring php-xml
#discuz
if [ ! -f download ] ;then
wget https://gitee.com/Discuz/DiscuzX/attach_files/2044572/download
fi
yum install -y unzip
if [ ! -d upload ] ;then
unzip download
fi
rm -rf /var/www/html/*
cp -rf upload/* /var/www/html
chown -R apache.apache /var/www/html
systemctl restart httpd mariadb
2.主从配置
项目准备:
两台安装好mysql/mariadb的机器,一主一从,要关闭防火墙和selinux
这里我使用的是mariadb,如果需要mysql的步骤可以参考我之前发布的mysql80主从配置的文章,两者操作命令有点区别
#两台机器都进行一下域名解析
vim /etc/hosts
192.168.10.2 master
192.168.10.3 salve
mariadb
主库操作
1.#修改配置文件
vim /etc/my.cnf.d/server.cnf
log-bin
server-id=1
2.#重启mariadb服务
systemctl restart mariadb
3.#创建复制专用用户
第一步:create user'rep'@'192.168.10.%' identified by '200375Wang.';
第二步:grant replication slave,replication client on *.* to 'rep'@'192.168.10.%';
第三步:flush privileges;
4.#查看主库状态,注意记录 File 和 Position信息,配置从库需要用
SHOW MASTER STATUS;
5.#备份
mysqldump -p'Qwer@123' --all-databases --single-transaction --master-data=2 --flush-logs > `date +%F`-mysql-allwang.sql
6.#拷贝到二号机
scp -r 2025-03-10-mysql-allwang.sql slave:/tmp/
从库操作
1.#修改配置文件
vim /etc/my.cnf.d/server.cnf
server-id=2
2.#重启mariadb服务
systemctl restart mariadb
3.#手动同步数据,进入mysql输入
set sql_log_bin=0;
source /tmp/2025-04-04-mysql-allwang.sql
4.#启动主从复制,从库设置主库信息
change master to
master_host='master',
master_user='rep',
master_password='Qwer@123',
master_log_file='mariadb-bin.000001',
master_log_pos=245;
5.#开启从设备
START SLAVE;
6.#查看开启状态
SHOW SLAVE STATUS\G
#!!注意查看开启状态这些字段
Replica_IO_Running: Yes
Last_IO_Error: (应为空)
3.部署zabbix
zabbix-server端配置
官网地址:Zabbix Manual
环境准备:两台机子
ip:
192.168.10.4 zabbix-server
192.168.10.2 zabbix-agent
1.关闭防火墙和selinux
systemctl stop firewalld
systemctl disable firewalld
setenforce 0
2.准备zabbix-repo
rpm -Uvh https://repo.zabbix.com/zabbix/5.0/rhel/7/x86_64/zabbix-release-latest-5.0.el7.noarch.rpm
国外镜像不可用时,可以使用阿里提供的zabbixYUM源
#下载rpm包
wget https://repo.zabbix.com/zabbix/5.0/rhel/7/x86_64/zabbix-release-latest-5.0.el7.noarch.rpm
#然后卸载掉
yum remove -y zabbix-release.noarch
#查看一下发现没了
ls /etc/yum.repos.d/
yum repolist
vim /etc/yum.repos.d/zabbix.repo
[zabbix]
name=alibaba zabbix
baseurl=https://mirrors.aliyun.com/zabbix/zabbix/5.0/rhel/7/x86_64/
gpgcheck=0
enabled=1
[zabbix2]
name=alibaba zabbix frontend
baseurl=https://mirrors.aliyun.com/zabbix/zabbix/5.0/rhel/7/x86_64/frontend/
gpgcheck=0
enabled=1
#清一下列表看一下
yum clean all
yum repolist
#开始安装主包
yum -y install zabbix-server-mysql zabbix-agent
#安装插件
yum install centos-release-scl
#安装zabbix前端配置包
yum install zabbix-web-mysql-scl zabbix-apache-conf-scl
这里可能会有问题,需要做一些更改
centos-release-scl是scl源,用yum下载的两个源都已经失效,解决办法是删除CentOS-SCLo-scl.repo,修改CentOS-SCLo-scl-rh.repo的文件内容为
【centos-sclo-rh】
name=CentOS-7 - SCLo rh
baseurl=http://vault.centos.org/centos/7/sclo/$basearch/rh/
gpgcheck=1
enabled=1
gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-CentOS-SIG-SCLo
#或者使用这个
sed -i 's|baseurl=http://mirror.centos.org/centos|baseurl=https://mirrors.aliyun.com/centos|g' /etc/yum.repos.d/CentOS-SCLo-scl*.repo
sed -i 's|baseurl=http://vault.centos.org/centos|baseurl=https://mirrors.aliyun.com/centos|g' /etc/yum.repos.d/CentOS-SCLo-scl*.repo
3.准备数据库
#安装数据库
yum -y install mariadb mariadb-server
#启动数据库
systemctl enable mariadb
systemctl start mariadb
#授权zabbix账号,mariadb默认没有登录密码,直接输入mysql进入
mysql
#在数据库里执行以下操作
create database zabbix character set utf8 collate utf8_bin;
create user zabbix@localhost identified by 'Wang@123';
grant all privileges on zabbix.* to zabbix@localhost;
flush privileges;
quit;
4.初始化zabbix
#先检查一下安装的版本
ls /usr/share/doc/zabbix-server-* -d
#发现版本是
/usr/share/doc/zabbix-server-mysql-5.0.46
#然后执行下面命令
zcat /usr/share/doc/zabbix-server-mysql-5.0.46/create.sql.gz | mysql -uzabbix -p'Wang@123' zabbix
5.配置sql账号密码
#编辑zabbix_server.conf文件找到DBHost,DBName,DBUser,DBPassword取消注释或者更改内容为以下内容
vim /etc/zabbix/zabbix_server.conf
DBHost=localhost
DBName=zabbix
DBUser=zabbix
DBPassword=Wang@123
6.配置时区
#进入文件有一个分号;把他去掉然后配置时区为亚洲上海
vim /etc/opt/rh/rh-php72/php-fpm.d/zabbix.conf
php_value[date.timezone]=Asia/Shanghai
7.启动
systemctl restart zabbix-server zabbix-agent httpd rh-php72-php-fpm
systemctl enable zabbix-server zabbix-agent httpd rh-php72-php-fpm
#输入网址访问
192.168.10.3/zabbix
!#注意第一次登录默认用户名为Admin,密码为zabbix
zabbix-agent端配置
1.关闭防火墙和selinux
systemctl stop firewalld
systemctl disable firewalld
setenforce 0
2.准备zabbix-repo
vim /etc/yum.repos.d/zabbix.repo
[zabbix]
name=alibaba zabbix
baseurl=https://mirrors.aliyun.com/zabbix/zabbix/5.0/rhel/7/x86_64/
gpgcheck=0
enabled=1
[zabbix2]
name=alibaba zabbix frontend
baseurl=https://mirrors.aliyun.com/zabbix/zabbix/5.0/rhel/7/x86_64/frontend/
gpgcheck=0
enabled=1
#直接拷贝写好的
scp 192.168.10.4:/etc/yum.repos.d/zabbix.repo /etc/yum.repos.d
#安装zabbix-agent
yum -y install zabbix-agent
#配置主服务器地址
vim /etc/zabbix/zabbix_agentd.conf
Server=192.168.10.4
ServerActive=192.168.10.4
Hostname=web1
#启动
systemctl start zabbix-agent
systemctl enable zabbix-agent
#检查有没有10050端口
ss -anpt | grep 10050
3.命令行测试
#5.0zabbix默认没有安装zabbix-get,在zabbix_server安装
yum -y install zabbix-get
#然后在主服务器测试一下
zabbix_get -s 192.168.10.2 -k system.uname
zabbix监控
负责监控apache,php-fpm,mysql,磁盘IO
脚本创建自定义监控项
apache
#首先编写监控脚本
cd /etc/zabbix/apache_status.confg/
vim apache_status.sh
#!/bin/bash
if [[ "$1" = "Workers" ]]; then
wget --quiet -O - http://localhost/server-status?auto | grep Score | grep -o "\." | wc -l
else
wget --quiet -O - http://localhost/server-status?auto | head -n 9 | grep "$1" | awk -F ":" '{print $2}'
fi
#然后配置 Zabbix Agent的UserParameter即自定义键值
[root@master zabbix_agentd.d]# cd /etc/zabbix/zabbix_agentd.d
[root@master zabbix_agentd.d]# ls
apache_status.conf
[root@master zabbix_agentd.d]# vim apache_status.conf
UserParameter=apache.status[*], /etc/zabbix/apache_status.confg/apache_status.sh "$1"
#键值的含义
Total Accesses 总请求数
BusyWorkers:忙碌的Worker进程数
Uptime:服务器运行时间(秒)
CPULoad:CPU负载
mysql
这个建议使用zabbix自带的模版就可以
#!/bin/bash
#mysql for zabbix
Uptime() {
mysqladmin status |awk '{print $2}'
}
Slow_queries() {
mysqladmin status |awk '{print $9}'
}
Com_update() {
mysqladmin extended-status |awk '/\<Com_update\>/ {print $4}'
}
Com_select() {
mysqladmin extended-status |awk '/\<Com_select\>/ {print $4}'
}
Com_rollback() {
mysqladmin extended-status |awk '/\<Com_rollback\>/ {print $4}'
}
Com_delete() {
mysqladmin extended-status |awk '/\<Com_delete\>/ {print $4}'
}
Com_insert() {
mysqladmin extended-status |awk '/\<Com_insert\>/ {print $4}'
}
Com_commit() {
mysqladmin extended-status |awk '/\<Com_commit\>/ {print $4}'
}
Bytes_sent() {
mysqladmin extended-status |awk '/\<Bytes_sent\>/ {print $4}'
}
Bytes_received() {
mysqladmin extended-status |awk '/\<Bytes_received\>/ {print $4}'
}
Com_begin() {
mysqladmin extended-status |awk '/\<Com_begin\>/ {print $4}'
}
$1
#键值含义
Uptime 获取MySQL服务运行时间(秒)
Slow_queries 获取慢查询数量
Com_update update操作次数
Com_select select操作次数
Com_rollback 执行 ROLLBACK 语句的次数,即事务回滚的次数。
Com_delete delete操作次数
Com_insert insert操作次数
Com_commit 记录执行 COMMIT 语句的次数,即事务成功提交的次数
Bytes_sent 发送的字节数
Bytes_receivedMySQL 服务端接收到的数据总量(单位:字节)。
Com_begin 记录执行 START TRANSACTION 或 BEGIN 语句的次数,即事务开始的次数。
php-fpm
#!/bin/bash
#php status by tianyun 2015/12/16 v1.0
idle(){
wget --quiet -O - http://127.0.0.1/php-fpm_status?auto |grep "idle processes:" |awk -F: '{print $2}'
}
total(){
wget --quiet -O - http://127.0.0.1/php-fpm_status?auto |grep "total processes:" |awk -F: '{print $2}'
}
active(){
wget --quiet -O - http://127.0.0.1/php-fpm_status?auto |grep "active processes:" |awk -F: '{print $2}'
}
mactive(){
wget --quiet -O - http://127.0.0.1/php-fpm_status?auto |grep "max active processes:" |awk -F: '{print $2}'
}
listenqueuelen(){
wget --quiet -O - http://127.0.0.1/php-fpm_status?auto |grep "listen queue len:" |awk -F: '{print $2}'
}
listenqueue(){
wget --quiet -O - http://127.0.0.1/php-fpm_status?auto |grep "listen queue:" |awk -F: '{print $2}'
}
since(){
wget --quiet -O - http://127.0.0.1/php-fpm_status?auto |grep "start since: " |awk -F: '{print $2}'
}
conn(){
wget --quiet -O - http://127.0.0.1/php-fpm_status?auto |grep "accepted conn:" |awk -F: '{print $2}'
}
$1
#键值含义
idle 空闲进程数
total 总进程数(活跃+空闲)
active 活跃进程数(当前正在处理请求的PHP-FPM子进程数量。)
mactive 历史最大活跃进程数(PHP-FPM启动以来活跃进程数的峰值)
listenqueuelen 监听队列最大长度
listenqueue 监听队列当前长度
since PHP-FPM服务已运行的时间
conn PHP-FPM启动以来累计接受的客户端连接数
#然后配置 Zabbix Agent的UserParameter即自定义键值
UserParameter=idle.processe,/usr/local/zabbix-agent-ops/bin/php-fpm_status.sh idle
UserParameter=total.processes,/usr/local/zabbix-agent-ops/bin/php-fpm_status.sh total
UserParameter=active.processes,/usr/local/zabbix-agent-ops/bin/php-fpm_status.sh active
UserParameter=max.active.processes,/usr/local/zabbix-agent-ops/bin/php-fpm_status.sh mactive
UserParameter=listen.queue.len,/usr/local/zabbix-agent-ops/bin/php-fpm_status.sh listenqueuelen
UserParameter=listen.queue,/usr/local/zabbix-agent-ops/bin/php-fpm_status.sh listenqueue
UserParameter=start.since,/usr/local/zabbix-agent-ops/bin/php-fpm_status.sh since
UserParameter=accepted.conn,/usr/local/zabbix-agent-ops/bin/php-fpm_status.sh conn
磁盘IO
编写磁盘IO监控脚本
[root@host ]# vi /usr/local/zabbix/scripts/disk-status.sh
#!/bin/bash
if [ $# -ne 1 ];then
echo "Follow the script name with an argument"
fi
case $1 in
rrqm)
iostat -dxk 1 1|grep -w vda |awk '{print $2}'
;;
wrqm)
iostat -dxk 1 1|grep -w vda |awk '{print $3}'
;;
rps)
iostat -dxk 1 1|grep -w vda|awk '{print $4}'
;;
wps)
iostat -dxk 1 1|grep -w vda |awk '{print $5}'
;;
rKBps)
iostat -dxk 1 1|grep -w vda |awk '{print $6}'
;;
wKBps)
iostat -dxk 1 1|grep -w vda |awk '{print $7}'
;;
avgrq-sz)
iostat -dxk 1 1|grep -w vda |awk '{print $8}'
;;
avgqu-sz)
iostat -dxk 1 1|grep -w vda |awk '{print $9}'
;;
await)
iostat -dxk 1 1|grep -w vda|awk '{print $10}'
;;
svctm)
iostat -dxk 1 1|grep -w vda |awk '{print $13}'
;;
util)
iostat -dxk 1 1|grep -w vda |awk '{print $14}'
;;
*)
echo -e "\e[033mUsage: sh $0 [rrqm|wrqm|rps|wps|rKBps|wKBps|avgqu-sz|avgrq-sz|await|svctm|util]\e[0m"
esac
#键值的含义
脚本中每个参数对应 iostat -dxk 输出的列,具体含义如下:
rrqm: 每秒合并的读请求数。合并的请求是指,内核将相邻的读请求合并成一个更大的请求,提高效率。
wrqm: 每秒合并的写请求数,类似读合并。
rps: 每秒实际发送到设备的读请求数。
wps: 每秒实际发送到设备的写请求数。
rKBps: 每秒读取的数据量,单位为KB。
wKBps: 每秒写入的数据量,单位为KB。
avgrq-sz: 平均每个请求的大小(单位是扇区,通常一个扇区是512字节,所以avgrq-sz乘以512得到字节数,再除以1024得到KB)。
avgqu-sz: 平均I/O队列长度,即在该时间段内平均有多少个请求在队列中等待处理。
await: 平均每个I/O请求的等待时间(包括队列等待时间和服务时间),单位毫秒。该值较高可能表示设备饱和或存在性能问题。
svctm: 平均每个I/O请求的服务时间(设备处理请求的时间),单位毫秒。这个指标在较新的系统版本中可能不可靠,通常建议结合其他指标。
util: 设备利用率百分比,表示设备有I/O操作的时间比例。如果接近100%,说明设备可能已经饱和。
#编辑userparameter_mysql.conf文件
[root@host ]# vi /etc/zabbix/zabbix_agentd.d/userparameter_mysql.conf
UserParameter=disk.status[*],/usr/local/zabbix/scripts/disk-status.sh $1