案例

项目了解


    项目部署原则:先核心再扩展,从后向前
    了解项目的基本思路:

业务实施

     站在数据流转的维度,从前往后梳理

     为每台模拟主机上对应IP 

运维实施


      堆叠

实施的方式

  手工部署环境

      --了解实际情况和具体操作具体细节

接入层
1、流量入口|四层负载:Keepalived + 双 LVS
用户浏览器通过DNS 域名解析,指向 LVS 集群的虚拟 VIP。
Keepalived 做两台 LVS 主备,一台宕机自动漂移 VIP;LVS 四层转发,把访问请求轮询分给后端两台 Nginx。

反向代理层
2、七层负载:双 Nginx
流量进到 Nginx:
图片、JS、CSS 静态资源,Nginx 本机直接返回用户;
登录、发帖、提交表单这类动态请求,Nginx 反向代理转发到两台 Tomcat 服务器。

应用层
3、双 Tomcat(Discuz、JPress、WordPress 三套站点)
Tomcat 运行网站程序,分 3 条数据链路:
走 Redis 缓存:用户登录信息、热门帖子优先查 Redis,查到数据直接原路返回,不用碰数据库;
走 MyCat+MySQL:缓存没数据,Tomcat 连接MyCat 中间件;MyCat 实现读写分离、分库分表,读分流从库、写落主库,对接下方 3 台 MySQL;
走 NFS 文件存储:用户上传头像、附件,直接存入两台 NFS 共享服务器,两台 Tomcat 共用一套文件。


4、存储备份:Redis(数据缓冲层)、NFS、MySQL、Backup
两台 NFS 依靠rsync定时同步全部文件数据到 Backup 备份机,防止附件丢失;MySQL 由 MyCat 统一代理管理。


运维层
5、底层运维管控:Zabbix、Ansible、Bash,DNS
Zabbix 全集群监控所有服务器(LVS/Nginx/Tomcat/MyCat/MySQL/NFS/Redis)负载、端口异常;
Ansible+Playbook+Bash 脚本:批量部署整套环境、下发配置、自动执行定时备份脚本。

   脚本方式部署

      -- 自动化 

           --  脚本

            --  ansible

eg:高可用环境

keepalived主机部署

master基础环境部署

更新软件源

apt update

keepalived 安装

apt install keepalived -y

准备主配置文件

cd /etc/keepalived/
ls
cp keepalived.conf.sample keepalived.conf

定制子配置目录

mkdir conf.d
ls

定制主配置

cat keepalived.conf
global_defs {
   router_id LVS_master
}

include /etc/keepalived/conf.d/*.conf

入口 vip 配置 定制专属的入口配置文件

cp keepalived.conf.sample conf.d/vip.yang.com.conf
cat conf.d/vip.yang.com.conf
vrrp_instance VI_1 {
    state MASTER
    interface ens33
    virtual_router_id 51
    priority 100
    advert_int 1
    authentication {
        auth_type PASS
        auth_pass 1111
    }
    virtual_ipaddress {
        10.0.0.130
    }
}

virtual_server 10.0.0.130 80 {
    delay_loop 6
    lb_algo sh
    lb_kind DR
    persistence_timeout 50
    protocol TCP

    real_server 10.0.0.105 80 {
        HTTP_GET {
            url {
                path /
                status_code 200
            }
            connect_timeout 3
            nb_get_retry 3
            delay_before_retry 3
        }
    }
    real_server 10.0.0.106 80 {
        HTTP_GET {
            url {
                path /
                status_code 200
            }
            connect_timeout 3
            nb_get_retry 3
            delay_before_retry 3
        }
    }
}

重启服务

systemctl restart keepalived

确认效果

hostname -I

backup 环境配置

子配置部署

准备主配置文件

cd /etc/keepalived/
ls
cp keepalived.conf.sample keepalived.conf

定制子配置目录

mkdir conf.d
ls

定制主配置

scp root@10.0.0.125:/etc/keepalived/keepalived.conf ./
cat keepalived.conf
global_defs {
   router_id LVS_backup
}

include /etc/keepalived/conf.d/*.conf

入口 vip 配置定制专属的入口配置文件

scp root@10.0.0.125:/etc/keepalived/conf.d/vip.yang.com.conf conf.d/
cat conf.d/vip.yang.com.conf
vrrp_instance VI_1 {
    state BACKUP
    interface ens33
    virtual_router_id 51
    priority 90
    advert_int 1
    authentication {
        auth_type PASS
        auth_pass 1111
    }
    virtual_ipaddress {
        10.0.0.130
    }
}

virtual_server 10.0.0.130 80 {
    delay_loop 6
    lb_algo sh
    lb_kind DR
    persistence_timeout 50
    protocol TCP

    real_server 10.0.0.105 80 {
        HTTP_GET {
            url {
                path /
                status_code 200
            }
            connect_timeout 3
            nb_get_retry 3
            delay_before_retry 3
        }
    }
    real_server 10.0.0.106 80 {
        HTTP_GET {
            url {
                path /
                status_code 200
            }
            connect_timeout 3
            nb_get_retry 3
            delay_before_retry 3
        }
    }
}

重启服务

systemctl restart keepalived

确认效果

hostname -I

验证 vip 飘移 关闭 master 主机的 keepalived

systemctl stop keepalived
hostname -I

确认 backup 主机效果

hostname -I

启动 master 主机的 keepalived

systemctl start keepalived
hostname -I

结果显示: keepalived 基础环境正常

定制专属的入口配置文件

cp keepalived.conf.sample conf.d/vip.yang.com.conf
cat conf.d/vip.yang.com.conf
vrrp_instance VI_1 {
    state MASTER
    interface ens33
    virtual_router_id 51
    priority 100
    advert_int 1
    authentication {
        auth_type PASS
        auth_pass 1111
    }
    virtual_ipaddress {
        10.0.0.130
    }
}

virtual_server 10.0.0.130 80 {
    delay_loop 6
    lb_algo sh
    lb_kind DR
    persistence_timeout 50
    protocol TCP

    real_server 10.0.0.105 80 {
        HTTP_GET {
            url {
                path /
                status_code 200
            }
            connect_timeout 3
            nb_get_retry 3
            delay_before_retry 3
        }
    }
    real_server 10.0.0.106 80 {
        HTTP_GET {
            url {
                path /
                status_code 200
            }
            connect_timeout 3
            nb_get_retry 3
            delay_before_retry 3
        }
    }
}
重启服务
systemctl restart keepalived

确认效果

hostname -I

zabbix7.0安装和基础管理

安装Zabbix Server包

访问链接:https://www.zabbix.com/download找到仓库的源

#Ubuntu24.04安装Zabbix7.0
https://www.zabbix.com/cn/download?
zabbix=7.0&os_distribution=ubuntu&os_version=24.04&components=server_frontend_ag
ent&db=mysql&ws=apache

在ubuntu24.04安装Zabbix Server 7.0

官网下载

#wget https://repo.zabbix.com/zabbix/7.0/ubuntu/pool/main/z/zabbix-release/zabbix-
release_latest_7.0+ubuntu24.04_all.deb

镜像加速

sed -i
's#https://repo.zabbix.com#https://mirrors.aliyun.com/zabbix#'
/etc/apt/sources.list.d/*
apt update

安装包

apt -y install zabbix-server-mysql zabbix-frontend-php
 zabbix-apache-conf zabbix-agent zabbix-get

安装MySQL

apt -y install mysql-server

开放端口

vim  /etc/mysql/mysql.conf.d/mysqld.cnf
bind-address=0.0.0.0

重启

systemctl restart mysql.service

准备数据库和用户

mysql -uroot
mysql> create database zabbix character set utf8 collate utf8_bin;
mysql> create user zabbix@localhost identified by '123456';
mysql> grant all privileges on zabbix.* to zabbix@localhost;
mysql> quit;

初始化数据库的表

zcat /usr/share/doc/zabbix-server-mysql*/create.sql.gz | mysql -uzabbix -p123456 zabbix

修改Zabbix Server 连接MySQL

vim /etc/zabbix/zabbix_server.conf
DBPassword=123456

修改PHP配置

vim /etc/zabbix/apache.conf
php_value date.timezone Asia/Shanghai
systemctl restart zabbix-server zabbix-agent apache2
systemctl is-active zabbix-server zabbix-agent apache2
active
active
active
systemctl enable zabbix-server zabbix-agent apache2

安装中文包

apt -y install language-pack-zh-hans

浏览器访问

#浏览器访问
http://server_ip_or_name/zabbix

准备数据库和数据表

安装MySQL并开机自启

apt -y install mysql-server
systemctl enable --now mysql

登录MySQL

mysql -uroot -p
Enter password:

创建zabbix数据库、本地账号并授权

mysql> create database zabbix character set utf8 collate utf8_bin;
mysql> create user zabbix@localhost identified by '123456';
mysql> grant all privileges on zabbix.* to zabbix@localhost;

MySQL与Zabbix服务端分离时,创建远程账号(网段10.0.0.%)

mysql> create user zabbix@'%' identified by '123456';
mysql> grant all privileges on zabbix.* to zabbix@'10.0.0.%';

导入zabbix初始化数据表

zcat /usr/share/doc/zabbix-server-mysql*/create.sql.gz | mysql -uzabbix -p123456 zabbix

验证表是否导入成功

mysql -uzabbix -p123456 zabbix -e 'show tables;'

修改zabbix的配置文件

编辑zabbix服务端配置

vim /etc/zabbix/zabbix_server.conf
LogFile=/var/log/zabbix/zabbix_server.log
LogFileSize=0
PidFile=/var/run/zabbix/zabbix_server.pid
SocketDir=/var/run/zabbix
DBName=zabbix
DBUser=zabbix
DBPassword=123456
SNMPTrapperFile=/var/log/snmptrap/snmptrap.log
Timeout=4
AlertScriptsPath=/usr/lib/zabbix/alertscripts
ExternalScripts=/usr/lib/zabbix/externalscripts
LogSlowQueries=3000

启动并设置开机自启全套服务

systemctl enable --now zabbix-server zabbix-agent httpd php-fpm

查看监听端口验证服务

ss -ntl

访问Zabbix的Web管理页面完成配置向导

基于Apache
http://server_ip_or_name/zabbix

zabbix核心管理

触发器:表达式判定指标异常,生成告警

滞后:持续故障才告警,过滤瞬时抖动

触发器依赖:底层故障屏蔽上层业务告警

模板:批量复用告警规则

CPU 告警案例

Web 创建触发器 配置→模板→Linux 模板→触发器→创建 表达式:{Linux by Zabbix agent:system.cpu.util[,idle].last()}<10 滞后 5m,启用保存

压测模拟故障

apt install stress -y
stress --cpu 4 --timeout 600

校验采集数据

zabbix_get -s 192.168.1.30 -k system.cpu.util[,idle]

配置依赖抑制告警风暴 新建主机离线触发器{Linux by Zabbix agent:agent.ping.last()}=0,CPU 触发器绑定该依赖,主机断连后仅显示主机故障。

排错命令

tail -f /var/log/zabbix/zabbix_agent2.log
tail -f /var/log/zabbix/zabbix_server.log | grep trigger

超限无告警:触发器未启用、表达式错误

所有触发器统一滞后 3~5 分钟,核心主机配置主机离线依赖

触发器判定故障,滞后防抖,依赖抑制告警风暴,模板批量统一管控。

模板图形:模板内创建多指标曲线,绑定模板的主机自动继承,无需单台重复配置。

仪表盘:全局总览大屏、模板专属业务大屏,快速查看故障与负载。

用户 & 角色管理:区分开发只读、运维全操作账号,按业务分组隔离主机权限。

案例

模板自定义图形
配置→模板→图形→创建图形,添加 CPU、内存两项监控指标,保存后所有关联主机自动生成趋势图。
模板仪表盘
模板内新建仪表盘组件,添加主机故障、内存使用率图表,业务主机自动展示专属监控面板。
只读开发账号配置
管理→角色→新建只读角色,仅开放查看权限;创建用户归属只读组,仅分配测试机房主机访问权限。

排错命令

systemctl restart apache2 php-fpm
tail -f /var/log/apache2/error.log

问题:开发看不到主机 → 用户组未分配对应主机分组权限 问题:

           仪表盘无数据 → 模板未正确关联主机

业务统一使用模板图形,禁止单主机单独创建图表 开发账号统一分配只读角色,禁止修改监控配置 核心业务配置独立模板仪表盘,便于故障快速定位

邮件:依托邮箱 SMTP 服务发送故障通知,QQ/163 需授权码登录。

企业微信:自定义脚本调用企业微信 API 推送消息。

  • 邮箱开启 POP3/SMTP,获取 16 位授权码;
  • Zabbix 媒介类型新建 Email,参数:smtp.qq.com:465 SSL;
  • 用户绑定收件邮箱,触发器动作配置故障、恢复消息模板。

微信

mkdir -p /usr/lib/zabbix/alertscripts
vim /usr/lib/zabbix/alertscripts/wechat.sh
#!/bin/bash
CorpID="ww644a0d95807e476b"
Secret="cGp4gHUpHLL1KQZY5abM3panGp-uCrEZyrgDvOT0OZA"
agentid=1000003
GURL="https://qyapi.weixin.qq.com/cgi-bin/gettoken?corpid=$CorpID&corpsecret=$Secret"
Token=$(/usr/bin/curl -s -G $GURL |awk -F\": '{print $4}'|awk -F\" '{print $2}')
PURL="https://qyapi.weixin.qq.com/cgi-bin/message/send?access_token=$Token"

function body(){
    local userid=$1
    local subject=$2
    local msg=$(echo "$@" | cut -d" " -f3-)
    printf '{\n'
    printf '\t"touser": "'"$userid"\"",\n"
    printf '\t"msgtype": "text",\n'
    printf '\t"agentid": "'"$agentid"\"",\n'
    printf '\t"text": {\n'
    printf '\t\t"content": "'"$subject\n\n$msg"\""\n"
    printf '\t},\n'
    printf '\t"safe":"0"\n'
    printf '}\n'
}

/usr/bin/curl --data-ascii "$(body $*)" $PURL
chmod +x /usr/lib/zabbix/alertscripts/wechat.sh
chown zabbix:zabbix /usr/lib/zabbix/alertscripts/wechat.sh

邮件

mkdir -p /usr/lib/zabbix/alertscripts
vim /usr/lib/zabbix/alertscripts/send_email.sh
#!/bin/bash
email_send='lbtooth@163.com'
email_passwd='xxxxxxxxxxxxx'
email_smtp_server='smtp.163.com'

. /etc/os-release

msg_error() {
  echo -e "\033[1;31m$1\033[0m"
}

msg_info() {
  echo -e "\033[1;32m$1\033[0m"
}

msg_warn() {
  echo -e "\033[1;33m$1\033[0m"
}

color () {
    RES_COL=60
    MOVE_TO_COL="echo -en \\033[${RES_COL}G"
    SETCOLOR_SUCCESS="echo -en \\033[1;32m"
    SETCOLOR_FAILURE="echo -en \\033[1;31m"
    SETCOLOR_WARNING="echo -en \\033[1;33m"
    SETCOLOR_NORMAL="echo -en \E[0m"
    echo -n "$1" && $MOVE_TO_COL
    echo -n "["
    if [ $2 = "success" -o $2 = "0" ] ;then
        ${SETCOLOR_SUCCESS}
        echo -n $"  OK  "    
    elif [ $2 = "failure" -o $2 = "1"  ] ;then 
        ${SETCOLOR_FAILURE}
        echo -n $"FAILED"
    else
        ${SETCOLOR_WARNING}
        echo -n $"WARNING"
    fi
    ${SETCOLOR_NORMAL}
    echo -n "]"
    echo 
}

install_sendemail () {
    if [[ $ID =~ rhel|centos|rocky ]];then
        rpm -q sendemail &> /dev/null ||  yum install -y sendemail
    elif [ $ID = 'ubuntu' ];then
        dpkg -l |grep -q sendemail  || { apt update && apt install -y libio-socket-ssl-perl libnet-ssleay-perl sendemail ; } 
    else
        color "不支持此操作系统,退出!" 1
        exit
    fi
}

send_email () {
    local email_receive="$1"
    local email_subject="$2"
    local email_message="$3"
    sendemail -f $email_send -t $email_receive -u $email_subject -m $email_message -s $email_smtp_server -o message-charset=utf-8 -o tls=yes -xu $email_send -xp $email_passwd -o message-content-type=html
    [ $? -eq 0 ] && color "邮件发送成功!" 0 || color "邮件发送失败!" 1 
}

if [ $# -ne 3 ];then 
    color "脚本参数不正确!" 1
    msg_info "Usage: `basename $0` <mail_address> <subject> <message>"
    exit 1
fi

install_sendemail 

send_email "$1" "$2" "$3"
chmod +x /usr/lib/zabbix/alertscripts/send_email.sh
chown zabbix:zabbix /usr/lib/zabbix/alertscripts/send_email.sh

媒介类型选脚本,脚本名send_email.sh,入参顺序:收件邮箱、告警标题、告警内容。

本地测试发送

bash /usr/lib/zabbix/alertscripts/send_email.sh test@shturl. "CPU高负载告警" "服务器192.168.1.30 CPU使用率95%"

主动模式和被动模式

Zabbix 的主动和被动模式
从Agent角度相对于Zabbix  Server来看:
主动模式:Agent 主动向 Zabbix Server 发送指标,Zabbix Server 性能更好,推 push
被动模式:Zabbix Server 主动向 Agent 请求指标,默认,拉数据 pull

更多推荐