- 看面试问题列表, 点击此处面试列表
- linux基础问题
- 基础命令
- 性能命令
- 网络命令
- 进程命令
- 其他
- shell脚本
- for 循环
- while 循环
- 退出当前循环 break
- 立即下一个循环 continue
- yum命令
- 中间件
- redis
- docker问题
- 实施问题
- 性能排查步骤
- 项目经验
- 数据库相关
- 常用的SQL基础
- mysql主从复制的原理和步骤
- 简单聚合查询
- 数据库大的了要不要分库分表
- 你们公司巡检一般一天几次,
- 数据库备份
- 增量备份
- 慢日志查询
- k8s
- ansible
- 其他问题
- 你日常主要工作是什么
- 你们运维的流程是什么
- 如果是云平台
- 如果是自己公司内部
- 你们公有云一般有多少机器
- 你们的产品是哪家的
- 你们的项目奖金是怎么发的
- 面试记录通过chatgpt总结出来的一些方向。
- 排错问题
- kafka,redis,mysql,zk,nginx,tomcat 的版本和端口号
- redis的二种模式,你常用的模式,各有什么优点缺点
- etcd的备份
- mysql主从复制,你用的是几个节点,几主几从。
- mysql的慢查询怎么启用,什么时候需要用到
- 常见的k8s命令
看面试问题列表, 点击此处面试列表
linux基础问题
基础命令
性能命令
top,vmstat,iostat ,free
网络命令
ifconfig ,ip,netstat ( -antp ) lsof ,ss wget,curl tcpdump
常用软件的端口
进程命令
ps (aux,ef ),kill -9 ,pkill job
其他
lsmod, lscpu,
[TOC]
shell脚本
for 循环
for i in {1..100}
do
sum=$((sum+1))
done
while 循环
cat file.txt | while read line
do
echo $line
done
退出当前循环 break
立即下一个循环 continue
yum命令
中间件
redis
docker问题
这些隔离原理的组合使得Docker能够在同一主机上运行多个容器,每个容器都具有独立的运行环境和资源,并且彼此之间相互隔离,从而提供了更高的安全性和资源利用率。
实施问题
性能排查步骤
在处理过程中,可以使用的命令包括top、htop、free、df、iostat、ping、netstat、ps等。具体使用哪些命令,需要根据具体情况进行判断和选择
这些是一些常见的排查思路和命令,具体的排查过程可能因环境和配置而有所差异。请根据实际情况进行排查,并结合错误日志来定位和解决503错误的问题。
项目经验
数据库相关
常用的SQL基础
mysql主从复制的原理和步骤
一、概述
1、什么是主从复制?
概念 主从复制是用来建立一个和 主数据库完全一样的数据库环境称为从数据库;主数据库一般是准实时的业务数据库。
2、主从复制作用
我们来思考如果在企业网站中,后端MYSQL数据库只有一台时候,会有以下问题:
1、单点故障服务不可用
2、无法处理大量的并发数据请求
3、数据丢失
所以通过主从复制后,它的优点就很明显
1、如果主节点出现故障,那么我们就直接将服务切到从节点,来保证服务立马可用。
2、如果并发请求特别大的时候,我们可用进行读写分离操作,让主库负责写,从库负责读。
3、如果主库数据丢失,但从库还保存一份,减少数据丢失的风险。
二、主从复制原理
1、主从复制原理
这里先放一张图,这张图很好的诠释的主从复制的原理
在这里插入图片描述上面主要分成了三步,下面会详细说明。
(1) Master的更新事件(update、insert、delete)会按照顺序写入bin-log中。当Slave连接到Master的后,Master机器会为Slave开启
binlog dump线程,该线程会去读取bin-log日志
(2) Slave连接到Master后,Slave库有一个I/O线程 通过请求binlog dump thread读取bin-log日志,然后写入从库的relay log日志中。
(3) Slave还有一个 SQL线程,实时监控 relay-log日志内容是否有更新,解析文件中的SQL语句,在Slave数据库中去执行。
总结
(1) 既然是要把事件记录到bin-log日志,那么对于Master就必须开启bin-log功能。
(2) 整个Mysql主从复制一共开启了3个线程。Master开启 IO线程,Slave开启 IO线程 和 SQL线程。
(3) 这点也很重要那就是Master和Slave交互的时候,记住这里是Slave去请求Master,而不是Master主动推给Slave。Slave通过IO线程
连接Master后发起请求,Master服务器收到Slave IO线程发来的日志请求信息,io线程去将bin-log内容返回给slave IO线程。
2、MySQL主从复制同步方式
(1)异步复制
MySQL主从同步 默认是异步复制的。就是上面三步中,只有第一步是同步的(也就是Mater写入bin log日志),就是主库写入binlog日志后即可成功返回客户端,无须等待binlog
日志传递给从库的过程。Master 不关心 Slave 的数据有没有写入成功。因此如果Master和Slave之间有网络延迟,就会造成暂时的数据不一致的现象;如果Master出故障,而数据还没有复制过去,则会造成数据丢失;但也有好处,效率较其他两种复制方式最高。
(2)同步复制
对于同步复制而言,Master主机将事件发送给Slave主机后会触发一个等待,直到所有Slave节点(如果有多个Slave)返回数据复制成功的信息给Master。这种复制方式最安全,但是同时,效率也是最差的。
(3)半同步复制
对于半同步复制而言,Master主机将事件发送给Slave主机后会触发一个等待,直到其中一个Slave节点(如果有多个Slave)返回数据复制成功的信息给Master。由此增强了数据的一致性,但是因为Master主机的确认开销,会损耗一部分的性能;另外,半同步复制除了不需要等待所有Slave主机确认事件的接收外,半同步数据复制并不要求那些事件完全地执行,因此,仍有可能看到在Slave主机上数据复制延迟的发生,如果因为网络延迟等原因造成Slave迟迟没有返回复制成功的信息,超过了Master设置的超时时长,半同步
复制就降级为异步复制方式,而后继续数据复制。
三、Mysql主从同步延时
上面也说了,Mysql默认采用的异步操作,因为它的效率明显是最高的。因为只要写入bin log后事物就结束返回成功了。但由于从库从主库异步拷贝日志 以及串行执行 SQL 的特点,所以从库的数据一定会比主库慢一些,是有延时的。所以经常出现,刚写入主库的数据可能是读不到的,要过几十毫秒,甚至几百毫秒才能读取到。这就是主从同步延时问题。
1、如何查看主从延迟时间
通过监控 show slave status 命令输出的Seconds_Behind_Master参数的值来判断:
mysql> show slave status\G;
// 状态一
Seconds_Behind_Master: NULL
// 状态二
Seconds_Behind_Master: 0
// 状态三
Seconds_Behind_Master: 79
Seconds_Behind_Master=0: 表示主从复制良好;
Seconds_Behind_Master=NULL: 表示io_thread或是sql_thread有任何一个发生故障;
Seconds_Behind_Master=79: 数字越大表示从库延迟越严重。
2、影响延迟因素
这里整理了影响主从复制延迟大致有以下几个原因:
1)主节点如果执行一个很大的事务,那么就会对主从延迟产生较大的影响
2)网络延迟,日志较大,slave数量过多
3)主上多线程写入,从节点只有单线程同步
4)机器性能问题,从节点是否使用了“烂机器”
5)锁冲突问题也可能导致从机的SQL线程执行慢
3、优化主从复制延迟
这个没有说去完全解决,要想解决那么就只能采用同步复制策略。不过,一般不建议使用这种同步模式。显而易见,如果写操作必须等待更新同步完成,肯定会
极大地影响性能,除非你不在乎性能。
1)大事务:将大事务分为小事务,分批更新数据
2)减少Slave的数量,不要超过5个,减少单次事务的大小
3)MySQL 5.7之后,可以使用多线程复制,使用MGR复制架构
4)在磁盘、raid卡、调度策略有问题的情况下可能会出现单个IO延迟很高的情况,可用iostat命令查看DB数据盘的IO情况,再进一步判断
5)针对锁问题可以通过抓去processlist以及查看information_schema下面和锁以及事务相关的表来查看
总结
主机与从机之间的物理延迟是无法避免的,既然无法避免就可以考虑尝试通过缓存等方式,降低新修改数据被立即读取的概率。
简单聚合查询
select sum(score) from student group by sid
数据库大的了要不要分库分表
分库分表做的比较少,我们会使用分区。分区的话速度比较快,应用程序做起来会比较简单。
在MySQL中,当数据量很大时,可以采取分库分表的方式来提高系统的性能和扩展性。下面是一种常见的分库分表方案和详细步骤:
1\. 数据库水平分库:将原始数据库按照一定规则拆分成多个数据库,每个数据库存储一部分数据。可以根据业务需求选择合适的拆分规则,如按照用户ID的哈希值进行拆分。
2\. 数据库垂直分库:将原始数据库按照业务功能进行拆分,每个数据库只存储特定的数据表。可以根据业务需求选择合适的拆分规则,如将用户相关的表放在一个数据库,商品相关的表放在另一个数据库。
3\. 数据库水平分表:将原始数据表按照一定规则拆分成多个数据表,每个数据表存储一部分数据。可以根据业务需求选择合适的拆分规则,如按照时间范围进行拆分。
4\. 数据库垂直分表:将原始数据表按照业务功能进行拆分,每个数据表只存储特定的字段。可以根据业务需求选择合适的拆分规则,如将用户的基本信息和订单信息分别存储在不同的数据表中。
5\. 使用分库分表中间件:为了简化分库分表的管理和操作,可以使用一些开源的分库分表中间件,如MyCAT、ShardingSphere等。这些中间件可以自动将SQL语句路由到正确的数据库和数据表,实现透明的分库分表。
具体步骤如下:
1\. 数据库水平分库:创建多个数据库实例,每个实例存储一部分数据。可以使用MySQL的主从复制功能将数据同步到各个实例中。
2\. 数据库垂直分库:根据业务功能创建多个数据库,每个数据库存储特定的数据表。可以使用MySQL的导入导出工具将数据迁移到新的数据库中。
3\. 数据库水平分表:根据拆分规则创建多个数据表,每个数据表存储一部分数据。可以使用MySQL的分区表功能来实现数据的自动分配。
4\. 数据库垂直分表:根据业务功能创建多个数据表,每个数据表只存储特定的字段。可以使用MySQL的表拆分工具将原始数据表拆分成多个新的数据表。
5\. 配置分库分表中间件:根据中间件的文档,配置中间件的路由规则和数据源信息。可以根据业务需求选择合适的中间件。
6\. 测试和验证:对系统进行全面的测试和验证,确保分库分表的功能和性能符合预期。
需要注意的是,分库分表会增加系统的复杂性和维护成本,需要根据具体的业务需求和数据量来选择合适的方案。同时,分库分表也可能引入一些新的问题,如跨库事务、数据一致性等,需要进行充分的测试和验证。
你们公司巡检一般一天几次,
主要是监控日志,每天大概2-3次,基本有软件监控的
数据库备份
增量备份
\# 定义备份目录和文件名
BACKUP_DIR="/path/to/backup/directory"
FULL_BACKUP_DIR="$BACKUP_DIR/full"
INCREMENTAL_BACKUP_DIR="$BACKUP_DIR/incremental"
CURRENT_DATE=$(date +%Y%m%d%H%M%S)
FULL_BACKUP_NAME="full_$CURRENT_DATE"
INCREMENTAL_BACKUP_NAME="incremental_$CURRENT_DATE"
\# 定义MySQL连接参数
MYSQL_USER="mysql_user"
MYSQL_PASSWORD="mysql_password"
MYSQL_HOST="localhost"
\# 创建备份目录
mkdir -p $FULL_BACKUP_DIR
mkdir -p $INCREMENTAL_BACKUP_DIR
\# 创建全量备份
xtrabackup --backup --user=$MYSQL_USER --password=$MYSQL_PASSWORD --host=$MYSQL_HOST --target-dir=$FULL_BACKUP_DIR/$FULL_BACKUP_NAME
\# 列出最近的全量备份
LATEST_FULL_BACKUP=$(ls -t $FULL_BACKUP_DIR | head -n1)
\# 如果存在最近的全量备份,则创建增量备份
if [ -n "$LATEST_FULL_BACKUP" ]; then
xtrabackup --backup --user=$MYSQL_USER --password=$MYSQL_PASSWORD --host=$MYSQL_HOST --target-dir=$INCREMENTAL_BACKUP_DIR/$INCREMENTAL_BACKUP_NAME --incremental-basedir=$FULL_BACKUP_DIR/$LATEST_FULL_BACKUP
fi
\# 清理旧的备份
find $FULL_BACKUP_DIR -type f -mtime +7 -exec rm {} \;
find $INCREMENTAL_BACKUP_DIR -type f -mtime +7 -exec rm {} \;
`
### 全量备份
`
\#!/bin/bash
\# 设置备份文件存储路径
backup_dir="/path/to/backup"
\# 设置MySQL登录信息
mysql_user="username"
mysql_password="password"
\# 设置备份文件名
backup_file="${backup_dir}/$(date +%Y%m%d%H%M%S).sql"
\# 创建备份文件存储目录
mkdir -p "${backup_dir}"
\# 使用mysqldump命令备份数据库
mysqldump -u"${mysql_user}" -p"${mysql_password}" --all-databases > "${backup_file}"
\# 检查备份是否成功
if [ $? -eq 0 ]; then
echo "MySQL backup successfully created: ${backup_file}"
else
echo "MySQL backup failed"
fi
将上述脚本保存为一个文件(例如mysql_backup.sh
),然后使用chmod +x mysql_backup.sh
命令赋予执行权限。接下来,可以通过运行./mysql_backup.sh
命令来执行备份。
请注意,脚本中的/path/to/backup
应替换为实际的备份文件存储路径,username
和password
应替换为实际的MySQL登录信息。此外,脚本使用mysqldump
命令来备份所有数据库,因此确保系统中已安装MySQL并将其添加到系统路径中。
慢日志查询
慢日志查询是一种用于分析数据库中执行缓慢的SQL语句的方法。通过慢日志查询,可以找出执行时间较长的SQL语句,从而进行性能优化。
以下是慢日志查询的详细配置步骤:
如果找到了允许速度慢的SQL,可以采取以下解决方法:
总之,通过慢日志查询可以找出执行缓慢的SQL语句,并通过优化查询语句、调整数据库参数等方式进行性能优化,提高数据库的响应速度。
k8s
1.查看集群内所有podkubectl get pod -A -A查看所有命名空间下的2.查看pod的详细信息(落在哪个node节点)用什么命令-owide3.pod的状态不对如何排查a.kubectl get pod查看状态b.状态不对的话 kubectl describe/kubectl delete重建c.状态没问题的话 kubectl logs /或进入容器 exec -it4.扩缩容的命令kubectl scale deploy name –replicas=副本数5.去除污点kubectl taint node name-6.节点需要维护,确保在此期间node上不能调度上pod怎么办kubectl cordon node 打上不可调度标签7.如何去创建一个yaml文件?有什么区别?create/apply8.回滚rollout undo9.驱逐drain10.编辑一个yamledit11.拷贝文件kubectl cp12.k8s和docker的区别k8s容器编排工具docker容器平台13.k8smaster和node上有哪些组件?分别什么功能?apiserver etcd scheduler controller-manager kubelet kube-proxy14.k8s里面是用什么来做隔离的?命名空间15.什么是pod?pod和docker里面的容器一样吗?k8s最小的资源单位 不一样pod里可以包含多个容器16.pod的生产过程和生命周期?几个组件如何协调工作的/几种状态17.pod拉取镜像有哪些策略?重启有哪些策略?18.k8s里面有几种探针?分别起到什么作用?19.初始化容器是用来干嘛的?20.k8s里有哪些调度规则?资源限制、污点、标签、亲和性、反亲和性、nodename21.service与pod是如何关联的?22.什么是pv、pvc?23.k8s里有哪些资源类型?持久化是怎么做的(有状态无状态服务)?24.k8s提供service的几种方式?25.clusterIP和nodeport的区别?26.nodeport暴露端口的范围?27.k8s里node节点显示notready的原因及排查思路?28.如何查看kubelet的日志?pod显示pending的原因及排查?29.k8s的pod显示内存不足怎么办?30.deployment和daemonset的区别?
ansible
Ansible是一个自动化运维工具,提供了丰富的模块来管理和配置远程主机。常用的Ansible模块包括:
这些只是Ansible提供的一部分常用模块,还有很多其他模块可以根据具体需求进行使用。
通过vrrp协议,虚拟出vip,通过脚本检测相关服务可以起到高可用的作用部署,命令,管理都可以的集群的
其他问题
你日常主要工作是什么
我们负责解决部署过程中的问题 。。。
你们运维的流程是什么
如果是云平台
像我说的计算类平台类数据库网络中间件存储
公有云的话就直接测试上线评审,给客户
私有云的话就是具体的客户
和客户交流这个有别的1.5线部门负责
功能(就是页面交互),性能,高可用
网络并发量
前期需求会议我们参加评审
然后我们有部门做规划表
进场部署
部署完后验收测试
交维
功能web页面
如果是自己公司内部
那么就说一个会议,然后公司部门领导审核,然后备份,风险评估,紧急措施方案,发布。
你们公有云一般有多少机器
公有云的话我们一般几百上前台我们是按期的,每个人负责不同的池子就我一个人,每个省池不同的人搭建三到四周
你们的产品是哪家的
我们是外面的产品,不是自己的产品,产品我们和他们对接的不是外包的,就是承接下面他们的项目
你们的项目奖金是怎么发的
签的合同是固定的绩效按百分比的
面试记录通过chatgpt总结出来的一些方向。
总体来说,该人对于Kubernetes、Docker、中间件和云计算等方面有一定的了解和经验,同时也具备一定的项目管理和团队合作能力。对于工作内容和技术要求,该人表示自己有信心能够胜任,并且愿意不断学习和提升自己的技能。
这段文字主要是关于作者在工作中使用的工具和技术,以及与客户的沟通和驻场经验的总结。以下是对文字的分层次总结:
排错问题
kafka,redis,mysql,zk,nginx,tomcat 的版本和端口号
redis的二种模式,你常用的模式,各有什么优点缺点
- redis的部署过程中为什么要奇数node
- redis的场景问题
- redis的热点失效问题,如何解决
- 存储方式有那些中 AOF/RDB,优缺点
- redis的场景存储格式
数据存储:Redis支持多种数据结构,如字符串、哈希、列表、集合和有序集合。它可以用来存储和处理各种类型的数据。
etcd的备份
etcdctl snapshot save命令可以将整个Etcd数据库快照备份到一个文件中。etcdctl snapshot restore命令可以将备份文件恢复到Etcd数据库中。
mysql主从复制,你用的是几个节点,几主几从。
mysql的慢查询怎么启用,什么时候需要用到
要在MySQL中开启慢查询日志,可以按照以下步骤操作:
打开MySQL配置文件(通常是my.cnf或my.ini),可以在MySQL安装目录下找到该文件。
在配置文件中找到或添加以下行:slow_query_log = 1,将该选项设置为1或true,表示开启慢查询日志。
可选步骤:设置慢查询日志的路径和文件名。可以在配置文件中找到或添加以下行:slow_query_log_file = /path/to/slow-query.log,将/path/to/slow-query.log替换为你希望保存慢查询日志的路径和文件名。
保存配置文件并重启MySQL服务,以使更改生效。
慢查询日志已经启用,MySQL会将执行时间超过long_query_time(默认为10秒)的SQL语句记录到慢查询日志文件中。
注意:为了避免慢查询日志文件过大,可以设置long_query_time为较小的值。同时,确保慢查询日志文件的路径有足够的空间来存储日志文件。
常见的k8s命令
- kubectl get logs
- kubectl get PO -owide -A
最后编辑:严锋 更新时间:2024-05-11 08:55