2025-08-18面试题(nginx,mysql,zabbix为主)

发布于:2025-09-01 ⋅ 阅读:(23) ⋅ 点赞:(0)

1.查看nginx连接数

1.1 用 netstat/ss 查看端口连接数

netstat -anp | grep 80 | wc -l
ss -ant | grep 80 | wc -l

1.2.使用 Nginx 内置状态模块 stub_status(最常用状态页)

在 nginx 配置里增加一个监控接口

server {
    # 监听端口
    listen 8080;
    # 服务器名称
    server_name localhost;

    # 配置 Nginx 状态监控路径
    location /nginx_status {
        # 启用 stub_status 模块(需 Nginx 编译时支持)
        stub_status on;
        # 仅允许本地 IP 访问
        allow 127.0.0.1;
        # 拒绝其他所有 IP 访问
        deny all;
    }
}

1.3.使用第三方监控工具

Prometheus + Grafana:通过 nginx-exporter 收集 Nginx 连接数、请求数、响应时间等指标
Zabbix / Nagios:通过插件监控 Nginx 活动连接数
Datadog / NewRelic:云端可视化监控

1.4.通过日志分析

可以用 awkgoaccess 等工具分析访问日志:

2.MySQL 查看连接情况

2.1.使用 SHOW PROCESSLIST

查看当前连接数统计
show status like 'Threads_connected';  -- 当前活跃连接数
show status like 'Threads_running';    -- 正在执行语句的连接数

2.2.查询 information_schema.PROCESSLIST

2.3.查看 MySQL 状态变量

2.4.使用性能模式(Performance Schema)

2.5.使用命令行工具

2.6.使用监控工具

MySQL Workbench:可实时查看连接数和状态
Percona Monitoring and Management (PMM):提供图形化连接趋势、查询性能
Zabbix / Prometheus + mysqld_exporter:自动化监控连接数、慢查询等

3.怎么自定义一个zabbix监控项

配置 Zabbix 监控项(Item)主要有几个步骤:创建主机 → 添加监控项 → 配置触发器 → 配置图表。我给你详细说明,并以 MySQL 监控为例。

1️⃣ 登录 Zabbix

  1. 打开 Zabbix Web 界面

  2. 使用管理员账号登录


2️⃣ 创建主机(Host)

  1. 配置 → 主机 → 创建主机

  2. 填写:

    • 主机名:例如 mysql-01

    • 可见名称:可选

    • 群组:选择已有群组或新建(如 MySQL 服务器)

    • 接口:填写被监控服务器 IP 和端口

      • Zabbix agent:默认 10050

      • SNMP 或 IPMI 可选


3️⃣ 添加监控项(Item)

  1. 主机页面 → 监控项 → 创建监控项

  2. 填写基本信息:

    • 名称:监控项显示名,例如 MySQL Threads_connected

    • 类型

      • Zabbix agent(主动或被动采集)

      • Simple check(如 ping)

      • SNMP

      • External script / UserParameter(自定义脚本)

    • 键值(Key):唯一标识

      • 示例:

        • MySQL 线程数:mysql.threads_connected(需在 agent 配置里定义 UserParameter)

        • 自定义 shell:system.run[mysql -e "SHOW STATUS LIKE 'Threads_connected';"]

    • 类型信息(Type of information)

      • 数值(整数/浮点)、文本、日志、布尔

    • 更新间隔:多久采集一次,比如 60 秒

    • 历史数据保存时间:默认 90 天

  3. 点击 添加


4️⃣ 配置触发器(Trigger)

  1. 监控项创建好后 → 触发器 → 创建触发器

  2. 填写:

    • 名称MySQL 连接数过多

    • 表达式:选择监控项 → 设置阈值

      {mysql-01:mysql.threads_connected.last()}>500
      • 表示当前线程数超过 500 就告警

  3. 设置严重等级和告警动作


5️⃣ 可选:创建图表(Graph)

  1. 主机 → 图表 → 创建图表

  2. 选择监控项,设置显示样式(折线/柱状等)


6️⃣ Zabbix Agent 自定义 MySQL 监控示例

如果使用 Zabbix agent + UserParameter:

编辑 /etc/zabbix/zabbix_agentd.d/userparameter_mysql.conf

UserParameter=mysql.threads_connected,mysql -uroot -e "SHOW STATUS LIKE 'Threads_connected';" | grep Threads_connected | awk '{print $2}'

UserParameter=mysql.threads_running,mysql -uroot -e "SHOW STATUS LIKE 'Threads_running';" | grep Threads_running | awk '{print $2}'

重启 agent: systemctl restart zabbix-agent   

在 Zabbix Web 端用 mysql.threads_connected 创建监控项

4.DML和DDl区别

1️⃣ DML(Data Manipulation Language)数据操作语言

作用:操作数据库中的数据(表里的记录)

常用语句

  • SELECT:查询数据

  • INSERT:插入数据

  • UPDATE:更新数据

  • DELETE:删除数据

特点

  • 操作的是 表中的数据,不改变表结构

  • 支持事务(可以 COMMITROLLBACK

  • 对数据库影响较小,但会修改内容

示例:

-- 插入数据   INSERT INTO users (id, name) VALUES (1, 'Alice');
-- 更新数据   UPDATE users SET name='Bob' WHERE id=1;
-- 删除数据   DELETE FROM users WHERE id=1;
-- 查询数据   SELECT * FROM users;

2️⃣ DDL(Data Definition Language)数据定义语言

作用:操作数据库结构(表、库、索引等)

常用语句

  • CREATE:创建数据库、表、索引等

  • ALTER:修改表结构

  • DROP:删除数据库、表、索引

  • TRUNCATE:清空表

特点

  • 操作的是 数据库对象和结构

  • 通常不支持事务(执行后立即生效)

  • 会影响数据库的结构和元数据

示例

-- 创建表
CREATE TABLE users (
  id INT PRIMARY KEY,
  name VARCHAR(50)
);

-- 修改表结构  ALTER TABLE users ADD COLUMN age INT;
-- 删除表  DROP TABLE users;
-- 清空表  TRUNCATE TABLE users;

3️⃣ 总结对比

特性 DML DDL
操作对象 表中的数据 数据库对象/表结构
是否支持事务 支持(可回滚) 通常不支持(立即生效)
影响 数据内容 数据库结构
常用语句 SELECT, INSERT, UPDATE, DELETE CREATE, ALTER, DROP, TRUNCATE

💡 面试小技巧

  • 可以补充 TRUNCATE 既清空表又相当于 DDL,因为它会重置表的自增 ID,立即生效且无法回滚(在大部分数据库中)

  • 强调 DML 操作是“数据层”,DDL 操作是“结构层”

5.怎么添加一个新的主机添加到zabbix-server中

1️⃣ 登录 Zabbix 前端

  • 打开 Zabbix Web 界面,输入账号密码登录。


2️⃣ 添加主机

  1. 进入 “配置(Configuration)” → “主机(Hosts)” → “创建主机(Create host)”

  2. 填写主机信息:

    • 主机名称(Host name):例如 mysql-server-01

    • 可见名称(Visible name,可选):在监控列表中显示的名字。

    • 群组(Groups):选择或创建一个群组,例如 Database Servers

    • 接口(Agent interface)

      • 输入主机 IP 地址或 DNS 名称。

      • 保留默认端口 10050(Zabbix Agent 端口)。


3️⃣ 关联模板

  • 模板(Templates) 中点击 “选择模板(Select)”

  • 常见模板:

    • Template OS Linux → Linux 系统基础监控

    • Template DB MySQL → MySQL 监控

  • 点击 添加(Add),然后保存主机。


4️⃣ 在主机上安装 Zabbix Agent

Linux 主机示例
# 安装 agent (以CentOS为例)
yum install -y zabbix-agent

# 编辑配置文件 /etc/zabbix/zabbix_agentd.conf
Server=<Zabbix Server IP>       # Zabbix 服务器 IP
ServerActive=<Zabbix Server IP> # 主动检查服务器
Hostname=<主机名>               # 必须与 Web 前端主机名一致

# 启动 agent
systemctl enable zabbix-agent
systemctl start zabbix-agent
Windows 主机示例
  1. 下载 Zabbix Agent 安装包。

  2. 安装时填写 Zabbix Server IP。

  3. 启动服务。


5️⃣ 验证主机连接

  • 在 Zabbix Web 前端的 “最新数据(Latest data)” 查看数据是否正常采集。

  • 如果数据未显示,可检查:

    • Agent 是否启动

    • 防火墙是否放行 10050 端口

    • 配置的主机名是否与 Agent 中一致

6.怎么自定义一个zabbix监控项多种方法

1️⃣ 通过 Zabbix Agent 自定义

1.1 UserParameter

  • 编辑 Zabbix Agent 配置文件 /etc/zabbix/zabbix_agentd.conf,添加:
    UserParameter=custom.mysql.connections,mysql -e "SHOW STATUS LIKE 'Threads_connected';" | awk '{print $2}'

  • 重启 Zabbix Agent: systemctl restart zabbix-agent

  • 在 Zabbix Web 前端创建 **Item**:

    - 类型(Type):Zabbix agent
    - 键(Key):`custom.mysql.connections`
    - 数据类型(Type of information):Numeric (unsigned)
    - 单位(Units):可选,例如 `connections`

1.2 自定义脚本

  • 编写脚本,例如 /usr/local/bin/check_disk.sh

    #!/bin/bash
    df / | awk 'NR==2 {print $5}' | sed 's/%//'
  • 在 Zabbix Agent 配置中添加:UserParameter=disk.usage,/usr/local/bin/check_disk.sh

  • 然后在 Zabbix Web 中添加对应 Item。

2️⃣ 通过 Zabbix Trapper 主动采集

  • Trapper 是被动接收数据的方式,由外部脚本主动发送。

  • 示例发送命令:zabbix_sender -z <Zabbix_Server_IP> -s "mysql-server-01" -k custom.mysql.qps -o 123

  • 在 Web 前端创建 Item:

    • 类型(Type):Zabbix trapper

    • 键(Key):custom.mysql.qps

3️⃣ 通过 Zabbix External Script

  • 将自定义脚本放到 Zabbix server 的 /usr/lib/zabbix/externalscripts/

  • 在 Web 前端创建 Item:

    • 类型(Type):External check

    • 键(Key):脚本名,例如 check_mysql_replication.sh


4️⃣ 通过 Zabbix Low-Level Discovery (LLD)

  • 自动发现和监控多实例:

    • 创建一个 LLD 规则,例如发现数据库实例或磁盘分区。

    • 配置 Item prototype 来定义每个发现的实体要监控的指标。

  • 示例:

    • LLD JSON 输出:

      {
        "data":[
          {"{#DISK}":"/"},
          {"{#DISK}":"/var"}
        ]
      }

  • 自动生成磁盘使用监控项。

5️⃣ 使用 Zabbix API

  • 通过 API 添加 Item,适合批量配置:

curl -X POST \
  -H 'Content-Type: application/json' \
  -d '{
    "jsonrpc": "2.0",
    "method": "item.create",
    "params": {
      "name": "Custom Connections",
      "key_": "custom.mysql.connections",
      "hostid": "10105",
      "type": 0,
      "value_type": 3
    },
    "auth": "YOUR_AUTH_TOKEN",
    "id": 1
  }' \
  http://<ZABBIX_SERVER>/api_jsonrpc.php

小结

方法 场景 优点
UserParameter Linux Agent 灵活,直接调用脚本或命令
Trapper 脚本主动发送 数据主动推送,适合异步采集
External Script Server 执行脚本 无需修改 Agent,跨平台
LLD 动态发现 自动生成大量监控项,减轻手动工作
API 自动化/批量 自动化部署或批量管理监控项

7.zabbix-proxy作用

Zabbix Proxy 是 Zabbix 监控体系中的一个中间组件,主要作用是在分布式或网络隔离环境下收集监控数据,然后再统一发送给 Zabbix Server。详细解释如下:


1️⃣ 作用概述

  1. 数据缓冲和转发

    • Proxy 收集被监控主机的数据,缓存到本地数据库(通常是 SQLite 或 MySQL/PostgreSQL)。

    • 定时将数据批量发送到 Zabbix Server,减少 Server 的压力。

  2. 支持网络隔离或远程环境

    • 对于无法直接访问 Zabbix Server 的远程站点或分支机构,可以部署 Proxy。

    • Proxy 与 Zabbix Server 仅需单向通信,解决防火墙或跨网络访问问题。

  3. 分布式监控

    • 当监控主机数量巨大时,可以通过 Proxy 分担 Server 的压力。

    • 每个 Proxy 管理一部分主机,Server 统一接收 Proxy 上报的数据。

  4. 高可用和容错

    • Proxy 可以缓存数据,即使短时间与 Server 失联,也不会丢失监控数据。

    • 恢复通信后会批量上报,保证数据完整性。

2️⃣ 工作流程

监控主机 → Zabbix Agent → Zabbix Proxy → Zabbix Server → 前端展示
  • Agent → Proxy:Proxy 定期轮询或接收被动数据。

  • Proxy → Server:Proxy 将数据定期批量发送给 Server。

  • Server → 前端:集中存储和展示数据。


3️⃣ 使用场景

  • 远程分支机构:Proxy 部署在远程网络内,只需允许 Proxy 与 Server 通信。

  • 大规模集群:大量主机时,使用 Proxy 分担 Server 压力。

  • 高可靠性要求:网络短时中断,Proxy 缓存数据避免丢失。

  • 异地监控:监控不同网络区域,统一管理和收集数据。


4️⃣ 总结

特性 Proxy 作用
数据收集 收集远程主机数据,支持主动和被动模式
缓存 数据暂存本地数据库,避免丢失
转发 批量发送给 Zabbix Server
分布式 减轻 Server 负载,支持远程站点监控
网络隔离 Server 无法直接访问主机时,Proxy 可桥接

8.mysql主从延迟怎么办

MySQL 主从延迟(Replication Lag)是运维中常见的问题,通常发生在从库追不上主库写入速度。解决方法需要排查原因、优化配置和架构调整。下面给你整理一份全面指南:

1️⃣ 查看延迟情况

  1. 使用 SHOW SLAVE STATUS\G(MySQL 5.7 及以下):Seconds_Behind_Master

  • 显示从库落后主库的秒数。

  1. 对于 MySQL 8.0,使用:

SELECT * FROM performance_schema.replication_connection_status;
SELECT * FROM performance_schema.replication_applier_status;
  1. 查看二进制日志延迟:

SHOW BINARY LOGS;
SHOW MASTER STATUS;

2️⃣ 常见原因

  1. 从库硬件瓶颈:CPU、内存或磁盘 I/O 不足,导致 SQL 执行慢。

  2. 主库写入过快:写入量超过从库执行能力。

  3. 慢查询或事务大:大事务会阻塞从库应用 binlog。

  4. 网络延迟:主从位于不同数据中心或跨网络,传输慢。

  5. 配置问题:sync_binlog, innodb_flush_log_at_trx_commit, slave_parallel_workers 未优化。


3️⃣ 解决思路

(1)优化从库性能

  • 增加 CPU、内存、IOPS。

  • 调整 InnoDB 参数:

    innodb_buffer_pool_size = 70-80% of memory
    innodb_flush_log_at_trx_commit = 2   # 可以降低同步压力
  • 开启并行复制:

    slave_parallel_workers = 4   # MySQL 5.7+
    slave_parallel_type = LOGICAL_CLOCK

(2)优化 SQL/事务

  • 避免大事务一次提交。

  • 对慢查询添加索引,优化执行计划。

  • 避免频繁更新全表或批量删除大数据。

(3)优化主库写入

  • 批量写入分批提交。

  • 减少不必要的 binlog 写入。

(4)网络优化

  • 主从部署在同一机房或低延迟网络。

  • 对跨机房同步,可以考虑异步或半同步复制。

(5)临时应急措施

  • 停止主库写入一段时间,让从库追上。

  • 调整 slave_skip_errors(慎用)跳过特定错误。


4️⃣ 高级方案

  • 异步/半同步复制:半同步:主库等待至少一个从库确认,减少延迟带来的风险。

  • GTID 复制:更方便故障切换和追踪延迟。

  • 中间缓存:对高并发写入场景,使用 Redis 等缓存缓冲,减轻主库压力。

9.mysql怎么做的读写分离

MySQL 做读写分离通常有几个实现方式,可以用面试口语化的方式总结:

  1. 主从复制(Master-Slave)

    • 主库负责写操作,从库负责读操作,通过 binlog 同步数据。

    • 应用层或者中间件负责把写请求发到主库,读请求发到从库。

  2. 中间件代理

    • 使用 ProxySQL、MaxScale、Mycat 等中间件做读写路由。

    • 中间件感知主从角色,把写请求发主库,读请求发从库。

  3. 应用层控制

    • 在代码里直接区分读写逻辑,例如写操作调用 master 数据源,读操作调用 slave 数据源。

  4. 注意点

    • 要考虑 主从延迟,避免读取到旧数据。

    • 写操作必须严格走主库,避免数据冲突。

10.你们公司有多少台mysql

“我们公司 MySQL 做读写分离主要用 Mycat。主库负责写,从库负责读。Mycat 做中间件代理,它会把写请求自动路由到主库,读请求发到从库。这样可以减轻主库压力,同时提升查询性能。平时也会关注主从延迟,确保读到的数据是最新的。”

可以用更专业、更自然的“加强版”口语化回答:

“我们公司大概有 20~30 台 MySQL,主从架构,一主多从,主库负责写操作,从库主要做读请求分流和备份容灾。平时会结合 监控和告警,实时关注主从延迟和性能指标,一旦发现异常可以快速定位和处理,保证业务平稳运行。同时会定期做 备份和演练,确保容灾方案可用。”

这版强调了监控、容灾和运维能力,听起来更有水平。

我可以帮你压缩成面试中 25~30 秒内流畅讲完的口语版

11.几台redis实例

“我们公司 Redis 大概有 10 来台实例,分布在不同环境和业务线上。有主从结构,部分集群模式,用来做缓存、队列和会话存储。平时会关注内存使用、命中率和持久化状态,确保高可用和性能。”

12.你写过哪些技术文档

“我在运维工作中写过多种技术文档,主要包括几个方面:

  1. 服务器和数据库部署手册:比如 Linux 服务器安装配置流程、MySQL/MongoDB 集群搭建、版本升级步骤等。

  2. 运维流程文档:比如数据库备份和恢复流程、服务器巡检流程、应急故障处理流程。

  3. 监控和告警说明:包括 Zabbix/Prometheus 监控项配置、告警触发条件、处理方法,以及仪表盘的使用说明。

  4. 自动化脚本文档:我写过运维自动化脚本的使用说明,包括参数说明、执行步骤、注意事项。

  5. 故障排查指南:针对常见问题,比如 MySQL 主从延迟、服务挂掉、磁盘满等,整理了排查步骤和解决方案。

这些文档的目标是让团队成员能快速上手,也方便新人理解系统架构,同时保证遇到问题时有标准流程可参考。”

“我写过的技术文档主要包括:服务器部署和配置手册、数据库备份恢复流程、监控和告警配置说明、自动化脚本使用说明,以及一些故障排查指南。主要目的是让团队成员能快速上手,也方便排查问题。”

“我平时写过服务器和数据库部署手册、运维流程文档、监控和告警规则说明、自动化运维脚本使用手册,以及常见故障排查和性能优化指南。写这些文档的时候,我不仅记录操作步骤,还会结合架构设计、依赖关系、注意事项和最佳实践,让团队成员能够快速上手、标准化执行,同时方便新人理解整个系统的架构和运维逻辑,也便于后续优化和故障追踪。”

13.你运维工作待了3年了,平时工作内容是什么

回答这个问题时,可以按 日常工作 / 项目经验 / 工具使用 来拆分,尽量具体且体现价值:


示例回答结构

1️⃣ 日常运维工作

  • 服务器维护:Linux 系统管理、用户权限、磁盘和网络监控、日志排查。

  • 数据库运维:MySQL / Redis / MongoDB 的安装、配置、备份恢复、性能调优。

  • 监控告警:配置 Zabbix / Prometheus / Grafana 监控项,处理告警。

  • 自动化脚本:用 Shell / Python / Ansible / Terraform 自动化日常运维任务。

2️⃣ 项目经验

  • 数据库高可用:部署 MySQL 主从/主主、Redis 哨兵、ProxySQL、MHA 等。

  • 容量规划与优化:定期评估服务器负载、优化 SQL 查询、调整缓存策略。

  • 故障处理:处理系统宕机、服务不可用、数据库延迟、磁盘满等紧急情况。

3️⃣ 工具和技术栈

  • 监控:Zabbix、Prometheus、Grafana

  • 自动化:Ansible、Shell、Python

  • 日志与排错:ELK、journalctl、dmesg

  • 容器化与编排:Docker、Kubernetes 基础运维

4️⃣ 总结亮点

“整体上,我的工作主要是保证系统和数据库稳定可靠,通过自动化和监控提高效率,同时参与部署高可用架构和故障排查。”

✅ 示例回答(口语化)

“我主要负责 Linux 服务器和数据库的日常运维,包括 MySQL 主从部署、备份恢复、性能调优,以及 Redis、缓存和应用服务的维护。我也会做监控告警配置(Zabbix/Grafana)、自动化脚本来提高工作效率。在日常工作中,我经常处理故障排查、系统优化,确保服务稳定可靠,同时参与一些高可用架构的部署和优化。”

14.家常话:你都是怎么学习运维的怎么回答

面试官问这个问题,其实想了解 你的主动性、学习方法、实践能力。回答可以从 学习渠道 + 实践经验 + 项目驱动 三方面来组织。这里有一个精简、有面试亮点的回答示例:

1️⃣ 学习渠道

  • 书籍和文档:系统学习 Linux、网络、数据库、容器、监控等知识

    例如:《鸟哥的Linux私房菜》《高性能MySQL》《Kubernetes权威指南》

  • 官方文档和社区:跟随技术更新、学习最佳实践

    MySQL 官方文档、Nginx、Zabbix、Prometheus 文档等

  • 在线课程和教程:补充短板或学习新技术

    B站/慕课网/Pluralsight/Kubernetes 官方教程


2️⃣ 实践经验

  • 动手操作:在虚拟机、云服务器、容器里部署服务

    比如:自己搭建 MySQL 主从复制,做高可用实验

  • 小型项目练习:模拟生产环境问题

    写监控告警脚本、搭建日志收集、做自动化运维

  • 总结文档:记录遇到的问题和解决方案,形成自己的知识库


3️⃣ 项目驱动

  • 公司实际项目:参与真实运维任务

    比如:MySQL 集群维护、Nginx 高并发调优、部署 CI/CD 流程

  • 问题导向学习:遇到问题就查资料、做实验

    遇到性能瓶颈,先查监控,再调参数,再验证


✅ 示例回答(口语化)

“我平时主要通过看书、官方文档和在线课程学习运维理论知识,然后会在虚拟机或者云服务器上动手搭建服务,比如 MySQL 高可用集群、Nginx 负载均衡等。遇到问题,我会查官方文档和社区解决方案,调试并总结经验。此外,我也会把自己的操作步骤和问题记录下来,形成个人知识库,方便复盘和提升。”


示例回答

“我学习运维主要通过三种方式:

  1. 理论学习:阅读书籍、官方文档和在线课程,比如《鸟哥的Linux私房菜》、《高性能MySQL》,以及 Kubernetes、Zabbix 官方教程。

  2. 动手实践:在虚拟机或云服务器上搭建环境,例如 MySQL 主从复制、高可用集群,Nginx 负载均衡等,通过实际操作理解原理。

  3. 项目驱动:在公司项目中遇到问题,会查文档、社区和源码,解决问题后总结经验形成知识库,提升解决问题的能力。”


网站公告

今日签到

点亮在社区的每一天
去签到