目录
项目名称
项目背景
项目目标
项目成果
我的角色与职责
我主要完成的工作内容
本次项目涉及的技术
本次项目遇到的问题与解决方法
本次项目中可能被面试官问到的问题
1、你是如何选择和部署监控系统的?
2、你是怎样优化服务器资源配置的?
3、你在本次项目有没有写一些shell脚本?
4、你们所使用的zabbix版本是哪一个,zabbix官方最新版本更新到哪一版本了?
5、本次项目中你们通过Zabbix主要监控了哪些指标?
5、本次项目中你们通过Prometheus主要监控了哪些指标?
6、你们对于故障告警一般通过那种媒介通知?
7、zabbix的监控流程是什么?
经验教训与自我提升
展望未来
项目名称
项目全名:服务器集群优化与监控项目
项目背景
随着公司业务的迅速扩展,服务器集群的规模日益庞大,运维复杂度不断增加。原有的监控和管理系统已无法满足需求,导致服务器故障响应慢、资源利用率低等问题频发。为了提升运维效率,确保系统稳定运行,公司决定开展此次运维项目。
项目目标
-
搭建高效稳定的监控系统,实时监控服务器集群状态。
-
优化服务器资源配置,提高资源利用率。
-
实现自动化运维,减少人工干预。
-
完善故障预警和快速响应机制,确保系统稳定性。
项目成果
-
成功部署了全新的监控系统,实现了对服务器集群的全面监控。
-
通过资源优化,服务器资源利用率提高了60%。
-
实现了多个运维流程的自动化,减少了运维人员的工作量。
-
故障预警和快速响应机制得到完善,系统故障率降低了40%。
我的角色与职责
-
角色:运维工程师
-
职责
:
-
负责监控系统的搭建与配置。
-
监控服务器集群状态,分析并处理异常。
-
优化服务器资源配置,提高资源利用率。
-
编写自动化运维脚本,减少人工干预。
-
我主要完成的工作内容
-
对市场上的监控系统进行了调研,选择了适合公司需求的监控系统,并完成了部署与配置。
-
编写并部署了自动化监控脚本,实现了对服务器集群的实时监控和异常告警。
-
对服务器集群的资源使用情况进行了深入分析,通过调整配置和迁移应用等方式,提高了资源利用率。
-
编写了多个自动化运维脚本,如自动备份、服务器初始化等,减少了运维人员的工作量。
本次项目涉及的技术
-
监控系统:Zabbix、Prometheus
-
自动化工具:Ansible、Shell脚本
-
脚本编写:shell
本次项目遇到的问题与解决方法
-
问题:监控系统在初期运行时,部分服务器数据收集不全。 解决方法:检查监控代理的配置,确保所有服务器都已正确安装并配置。同时,针对特定服务器的特性,调整监控策略。
-
问题:自动化运维脚本在某些环境下运行失败。 解决方法:对脚本进行兼容性测试,找出问题所在并进行修复。同时,增加脚本的日志输出,便于故障排查。
本次项目中可能被面试官问到的问题
1、你是如何选择和部署监控系统的?
答:
-
需求分析
-
首先,明确需要监控什么。这可能包括服务器、网络设备、应用程序、数据库、存储等。
-
确定监控的目标,如性能优化、故障预防、安全监控等。
-
考虑是否需要监控实时数据或历史数据。
-
-
市场调研
-
研究市场上的监控系统,了解各种产品的特点、优势和劣势。
-
考虑与现有基础设施和工具的兼容性。
-
评估成本效益,包括购买成本、维护成本、升级成本等。
-
-
选择监控系统
-
选择一个或多个符合需求的监控系统。
-
考虑系统的可扩展性、易用性、稳定性和安全性。
-
选择有良好技术支持和社区支持的产品。
-
-
规划和设计
-
设计监控架构,包括数据源、数据收集、数据存储、数据分析和警报通知等组件。
-
确定监控频率和粒度,以满足需求。
-
规划警报策略,确保在出现问题时能够及时通知相关人员。
-
-
部署和配置
-
安装和配置监控系统及其相关组件。
-
配置数据源,确保监控系统能够收集到所需的数据。
-
设置警报阈值和通知方式。
-
-
测试和优化
-
对监控系统进行测试,确保其能够正常工作并收集到准确的数据。
-
根据测试结果进行优化,调整配置和警报策略。
-
-
集成和自动化
-
将监控系统与现有的IT基础设施和工具集成,如CMDB(配置管理数据库)、自动化运维工具等。
-
实现自动化监控,包括自动发现新设备、自动配置监控参数等。
-
-
持续监控和维护
-
定期检查监控系统的状态和性能。
-
根据需要进行升级和维护,以确保系统的稳定性和安全性。
-
监控和分析警报数据,以发现潜在的问题并采取相应的措施。
-
-
培训和文档
-
为相关人员提供培训,确保他们能够熟练使用监控系统并理解其工作原理。
-
编写和维护相关的文档,包括安装指南、配置手册、用户手册等。
-
2、你是怎样优化服务器资源配置的?
答:
一、硬件优化
-
CPU优化
-
根据服务器的工作负载选择适当的CPU。对于需要处理大量并发任务的服务器,选择多核、多线程的CPU。
-
考虑CPU的主频和缓存大小,以满足处理复杂计算任务的需求。
-
-
内存优化
-
根据服务器的运行需求和预期负载增加内存容量,确保服务器可以同时处理更多的任务。
-
考虑使用更快的内存,以提高数据读写速度。
-
-
存储优化
-
选择高性能的硬盘或固态硬盘(SSD),以加快数据读写速度。
-
使用RAID技术(如RAID 5或RAID 10)来提高数据冗余和读写性能。
-
定期清理和压缩存储的数据,释放存储空间,提高磁盘性能。
-
-
网络优化
-
根据业务需求选择适当的网络带宽和接口类型,确保数据传输速度足够快。
-
使用负载均衡技术将请求分发到多个服务器上,提高整体性能和可靠性。
-
二、软件优化
-
操作系统优化
-
关闭不必要的服务和进程,释放系统资源。
-
调整系统参数和缓冲区大小,以提高系统性能。
-
定期进行系统更新和补丁安装,确保服务器操作系统的安全性和稳定性。
-
-
数据库优化
-
对数据库进行索引优化、查询优化和存储优化,提高数据库读写性能。
-
定期清理和归档旧数据,释放存储空间。
-
-
应用程序优化
-
优化应用程序的代码和算法,减少不必要的计算和I/O操作。
-
使用缓存技术(如Redis、Memcached等)来缓存常用数据和计算结果,减少数据库访问次数。
-
3、你在本次项目有没有写一些shell脚本?
答:有
1、写了两个服务器初始化优化shell脚本
脚本内容如下:
#/bin/bash
# 设置时区并同步时间
ln -s /usr/share/zoneinfo/Asia/Shanghai /etc/localtime
if ! crontab -l |grep ntpdate &>/dev/null ; then(echo "* 1 * * * ntpdate time.windows.com >/dev/null 2>&1";crontab -l) |crontab
fi# 禁用selinux
sed -i '/SELINUX/{s/permissive/disabled/}' /etc/selinux/config# 关闭防火墙
if egrep "7.[0-9]" /etc/redhat-release &>/dev/null; thensystemctl stop firewalldsystemctl disable firewalld
elif egrep "6.[0-9]" /etc/redhat-release &>/dev/null; thenservice iptables stopchkconfig iptables off
fi# 历史命令显示操作时间
if ! grep HISTTIMEFORMAT /etc/bashrc; thenecho 'export HISTTIMEFORMAT="%F %T `whoami` "' >> /etc/bashrc
fi# SSH超时时间
if ! grep "TMOUT=600" /etc/profile &>/dev/null; thenecho "export TMOUT=600" >> /etc/profile
fi# 禁止root远程登录
sed -i 's/#PermitRootLogin yes/PermitRootLogin no/' /etc/ssh/sshd_config# 禁止定时任务向发送邮件
sed -i 's/^MAILTO=root/MAILTO=""/' /etc/crontab# 设置最大打开文件数
if ! grep "* soft nofile 65535" /etc/security/limits.conf &>/dev/null; thencat >> /etc/security/limits.conf << EOF* soft nofile 65535* hard nofile 65535
EOF
fi# 系统内核优化
cat >> /etc/sysctl.conf << EOF
net.ipv4.tcp_syncookies = 1
net.ipv4.tcp_max_tw_buckets = 20480
net.ipv4.tcp_max_syn_backlog = 20480
net.core.netdev_max_backlog = 262144
net.ipv4.tcp_fin_timeout = 20
EOF# 减少SWAP使用
echo "0" > /proc/sys/vm/swappiness# 安装系统性能分析工具及其他
yum install gcc make autoconf vim sysstat net-tools iostat if
#包含安装epel源、yum源配置、清除缓存、新建缓存、关闭防火墙和selinux、安装vim、wget、lsfo常用工具等
#!/usr/bin/bash
echo "欢迎使用初始化jio本"
read -p "是否安装epel源?Y/N:" an1
if [ $an1 = 'y' ] || [ $an1 = 'Y' ];then
#安装epel源echo "正在安装epel源,请耐心等待..."yum -y install epel-release &> /dev/null
elsebreak
fi
{
read -p "是否需要配置base源?Y/N:" an2
if [ $an2 = 'y' ] || [ $an2 = 'Y' ];then
#配置yum源
/bin/cp /etc/yum.repos.d/CentOS-Base.repo /etc/yum.repos.d/CentOS-Base.repo.bak
sed -ri "s/\(mirrorlist=\)/#1/g" /etc/yum.repos.d/CentOS-Base.repo
sed -ri "s/#\(baseurl=\)/1/g" /etc/yum.repos.d/CentOS-Base.repo
elsebreak
fi
}
{
read -p "是否需要配置epel源?Y/N:" an3
if [ $an3 = 'y' ] || [ $an3 = 'Y' ];then/bin/cp /etc/yum.repos.d/epel.repo /etc/yum.repos.d/epel.repo.baksed -ri "s/\(mirrorlist=\)/#1/g" /etc/yum.repos.d/epel.reposed -ri "s/.*\(baseurl=\)/1/g" /etc/yum.repos.d/epel.repo
elsebreak
fi
}
read -p "是否清楚缓存并建立新的缓存?Y/N:" an4
if [ $an4 = 'y' ] || [ $an4 = 'Y' ];thenecho "正在清理缓存并建立新的缓存,请稍后..."#清除缓存yum clean all &> /dev/null#新建缓存yum makecache &> /dev/nullif [ $? -eq 0 ];thenecho "缓存建立完成!"else echo "缓存建立失败,请检查网络或者日志文件!"fi
elsebreak
fi
#关闭防火墙
systemctl stop firewalld &> /dev/null
systemctl disable firewalld &> /dev/null
#关闭selinux
setenforce 0 &> /dev/null
sed -ri 's/\(SELINUX=\)enforcing/\1disabled' /etc/selinux/config &> /dev/null
yum -y install vim wget lsfo &> /dev/null
if [ $? -eq 0 ];thenecho "常用工具安装完成,祝您使用愉快!"
elseecho "常用工具安装失败,请检查网络或日志"
fi
2、写了两个数据库备份脚本
脚本内容如下:
# 数据库全量备份
#!/bin/bash
# ##mysql用户
user="root"
# ##mysql密码
userPWD="xiaopeng@126.com"
# ##需要定时备份的数据库列表
dbNames=(pemass mysql)
# ##备份数据以日期创建文件夹存放,同时删除过期备份
DATE=`date -d "now" +%Y%m%d-%H%M%S`
ODATE=`date -d "-7day" +%Y%m%d-%H%M%S`
newdir=/opt/db_bak/mysql/$DATE
olddir=/opt/db_bak/mysql/$ODATE
# ##删除过期备份数据
if [ -d $olddir ];thenrm -rf $olddir
fi
# ##创建新备份文件夹
mkdir $newdir
# ##对备份数据库列表的所以数据库备份
for dbName in ${dbNames[*]}
dodumpFile=$dbName-$DATE.sql.gz/usr/bin/mysqldump -u$user -p$userPWD $dbName | gzip > $newdir/$dumpFile
done
# 数据库增量备份
#!/bin/bash
#增量备份时复制mysql--bin.00000*的目标目录
backupDir=/opt/db_bak/mysql/bakdir_add
#mysql的数据目录
mysqlDir=/var/lib/mysql
#mysql的index文件路径,,放在数据目录下的
logFile=/opt/db_bak/mysql/bakdir_add.log
BinFile=/var/lib/mysql/mysql-bin.index
#生产新的mysql--bin.00000*文件
mysqladmin -uroot -pxiaopeng@126.com flush-logs
#awk切片并统计行数
Counter=`wc -l $BinFile |awk '{print $1}'`
NextNum=0
#这个for循环用于比对$Counter,$NextNum这两个值来确定文件是不是存在或最新的
for file in `cat $BinFile`
dobase=`basename $file`echo $base#basename用于截取mysql-bin.00000*文件名,去掉./mysql-bin.000005前面的./NextNum=`expr $NextNum + 1`if [ $NextNum -eq $Counter ]thenecho $base skip! >> $logFileelsedest=$backupDir/$baseif (test -e $dest)#test -e用于检测目标文件是否存在,存在就写exist!到$logFile去thenecho $base exist! >> $logFileelsecp $mysqlDir/$base $backupDirecho $base copying >> $logFilefifi
done
echo `date +"%Y年%m月%d日 %H:%M:%S"` $Next Bakup succ! >> $logFile
4、你们所使用的zabbix版本是哪一个,zabbix官方最新版本更新到哪一版本了?
我们公司使用的是5.0版本,最新版本为zabbix 6.4。(截至2024年5月份)
5、本次项目中你们通过Zabbix主要监控了哪些指标?
端口占用情况
CPU使用率
内存使用率
磁盘使用率
网络状况
5、本次项目中你们通过Prometheus主要监控了哪些指标?
CPU使用率
内存使用率
磁盘使用率
网络上传和下载速度
kafka数据消费和积压情况
6、你们对于故障告警一般通过那种媒介通知?
我们的故障主要分为几个等级:一级、二级、三级
三级告警通过钉钉机器人在监控群内发消息通知
二级告警通过邮箱、微信消息、手机短信等消息通知
一级告警通过手机拨号进行通知并启动应急响应警报
7、zabbix的监控流程是什么?
-
zabbix server:负责接收agent发送的报告信息的核心组件,所有配置、统计数据及操作数据都由它组织进行
-
database storage:专用于存储所有配置信息,以及由zabbix收集的数据;
-
web interface:zabbix的GUI接口
-
proxy:可选组件,常用于监控节点很多的分布式环境中,代理server收集部分数据转发到server,可以减轻server的压力
-
agent:部署在被监控的主机上,负责收集主机本地数据如cpu、内存、数据库等数据发往server端或proxy端
经验教训与自我提升
-
经验教训:在项目实施过程中,我发现与业务部门的沟通非常关键。在未来的工作中,我将加强与业务部门的沟通,确保运维工作更加贴合业务需求。
-
自我提升:通过此次项目,我深刻认识到了自动化运维的重要性。我将继续学习并掌握更多的自动化运维工具和技术,提高自己的工作效率和质量。
展望未来
随着云计算、大数据等技术的不断发展,运维工作将面临更多的挑战和机遇。我将保持对新技术的关注和学习,不断提升自己的技术水平。同时,我也将关注行业动态,为公司的发展贡献自己的力量。