运维相关问题总结
*监控zabbix 1、什么是zabbix zabbix是一个开源的网络监控、告警和分析的软件,可以监控服务器、网络设备、应用程序等,并提供实时的性能和健康状态数据,同时支持自定义的告警和通知 2、zabbix的主要特点 实时监控、自动发现、灵活的报警机制、数据收集和分析、分布式监控、自定义模板 3、zabix的监控原理 zabbix使用代理和被动方式进行监控,他通过zabbix客户端定期收集监控数据发给server端,server端将数据存储到数据库中,进行报警分析和可视化 4、如何设置zabbix报警 创建触发器,设置触发条件,关联告警动作,邮件、webhook,进行报警 5、如何监控一个网络设备和网络服务器 先在机器上安装zabbix agent,在server端创建host,添加监控项,一般添加监控的模板即可,然后创建触发器和报警 *prometheus+grafana+cmdb 1、什么是Prometheus 2、什么是grafana 3、什么是cmdb 4、Prometheus如何工作的 Prometheus 服务器定期向配置的目标发送 HTTP 请求,获取指标数据,然后存储在本地时间序列数据库中。用户可以使用 PromQL 查询语言来检索和分析这些数据。 5、grafana的主要功能 数据可视化、可定制性、多数据源支持 6、如何在grafana中创建仪表盘 7、如何在Prometheus中设置监控指标 修改 Prometheus 配置文件 prometheus.yml。 在 scrape_configs 部分添加一个 job,指定目标对象的信息,如 IP 地址和端口。 配置 metrics_path 来指定指标路径。 配置 relabel_configs 来调整标签和标签值,以便正确识别目标对象。 保存并重新启动 Prometheus 服务器。 8、什么是Prometheus数据模型 他的数据模型是基于时间序列的,每个时间序列代表一个指标的时间序列数据流,时间序列由指标名称和一组标签的唯一标识,p使用这些时间序列数据来存储和查询监控数据 9、什么是PromQL的聚合函数 PromQL是Prometheus的查询语言,支持多种聚合函数,sum avg min max count等等,这些函数可以对时序数据进行操作,以便查询和监控报警 10、如何设置Prometheus的持久化存储 配置Prometheus.yml文件,找到storage设置local.path,输入存储的绝对路径,启动Prometheus时加上 --storage.tsdb.path来指定永久存储的路径。也可以在path下面添加参数retention来指定天数,30d。 11、如何创建自定义的PromQL函数 可以通过定义 Recording Rule 来创建自定义的 PromQL 函数。Recording Rule 是一种将查询结果存储为新时间序列的方式。通过定义 Recording Rule,可以在查询中使用自定义函数 12、如何实现Prometheus的高可用 多实例部署、数据持久化存储、使用远程写入数据thanos、分布式查询、监控集群状态、自动发现和配置、水平扩展、容器化部署、定期备份和恢复 13、Prometheus的数据清理备份和恢复如何操作 tsdb wal是用来数据清理的,用法promtool tsdb wal cleanup --dir=/path/ tsdb snapshot是用来数据备份和恢复的,备份用法,创建数据快照 promtool tsdb snaoshot create --dir=/path/data,恢复promtool tsdb snapshot restore --dir=/path/data --snapshot=/path/snapshot/file *Ansible 1、如何快速创建roles 适用ansible-galaxy快速生成,ansible-galaxy init zhoujt,会创建对应的目录结构 2、ansible常用模块及功能 文件操作:copy复制文件到目标主机,template适用jinjia2模板生成文件,file管理文件属性,lineinfile在文件中添加修改或删除指定行 包管理:apt管理Debian/Ubuntu的软件包,yum管理Centos/Redhat软件包,dnf管理最新的Fedora软件包,win_chocolatey管理Windows的软件包 服务管理:systemd管理centos7以上服务,service管理centos6以下服务,win_service管理Windows服务 用户和组:user管理用户账户,group管理用户组 远程执行:shell在目标主机执行shell命令,command在目标主机执行命令,win_shell在目标主机执行cmd、powershell命令 模板处理:template在目标主机使用jinja2模板生成文件 3、如何实现 Ansible 的动态清单 Dynamic Inventory 在ansible.cfg中指定inventory为脚本的绝对路径,可以动态获取到例如cmdb或自运维资产列表 4、如何在 Ansible Playbook 中处理错误和失败 适用failed_when关键字在任务达到一定条件时,满足条件时会标记失败 适用ignore_errors: yes 在执行任务的时候忽略错误,进行下一个任务的执行 5、如何在ansible中实现循环 使用with_items关键字在任务级别执行循环,用于遍历列表 使用register来保存循环变量的结果 6、如何在 Ansible 中处理敏感数据,例如密码和密钥 使用ansible-vault命令创建和管理加密的变量文件 在playbook中使用vars_prompt关键字从用户输入中获取敏感数据 在任务中使用no_log: true 禁止记录任务输出到日志中 7、如何在ansible中进行条件判断 when指定条件,failed_when制定失败条件,assert进行断言判断 8、在优化 Ansible 的运行效果方面,你是否熟悉不同的任务执行方式或者其他的建议 并行执行 forks:50 比如说每台机器都需要更新软件包,可以让50台机器同步执行 串行执行 serial:1 -1 -5 -7 第一次执行1二次5三次7 30%主机比,比如说升级步骤中要按照顺序依次执行任务的重启,需要限制机器同时stop的数量 异步执行 async:300 # 异步执行,返回任务 ID poll: 10 # 每 10 秒轮询一次任务状态 比如创建虚拟机需要很长时间,然后还需要进行初始化 max_fail_percentage: 20 # 允许最多 20% 的主机失败 gather_facts: no # 不收集主机事实信息 *MySQL 1、数据库响应变慢,如何诊断和优化? 场景:一个电商平台的用户在进行商品搜索时,发现搜索结果返回速度较慢。 答案:通过使用MySQL的慢查询日志,定位并分析慢查询语句,检查是否需要优化查询、添加索引或重构表结构。使用EXPLAIN来查看查询计划,确定是否正确使用了索引。可以考虑使用缓存技术,如Memcached或Redis,来缓存热门查询结果,从而提高响应速度。 2、数据库数据丢失,如何进行备份和恢复? 场景:一个在线学习平台的课程信息数据意外被删除,需要进行紧急恢复。 答案:设置定期的数据库备份任务,将数据备份到不同的存储介质,如磁盘或云存储。可以使用物理备份或逻辑备份,根据恢复的需求选择合适的备份策略。在数据丢失时,可以使用备份文件进行恢复,确保业务数据的安全性。 3、如何实现数据库的高可用性和故障恢复? 场景:一个金融交易系统的数据库宕机会导致交易中断,需要确保数据库高可用性。 答案:通过MySQL的主从复制或者主从同步,将主数据库的数据同步到一个或多个从数据库,实现高可用性。在主数据库宕机时,可以将其中一台从数据库提升为主数据库,保障系统的持续运行。同时,设置自动故障检测和切换,以便在发生故障时自动切换到备用节点。 4、如何进行数据库并发控制和事务管理? 场景:一个社交媒体平台上,多个用户同时进行点赞和评论操作,需要避免数据不一致或死锁问题。 答案:使用数据库事务来确保一组操作要么全部成功,要么全部失败。可以使用InnoDB引擎,它支持事务和行级锁。在代码中使用BEGIN、COMMIT和ROLLBACK语句来管理事务,确保数据的一致性。使用合适的锁机制,如共享锁和排他锁,来控制并发操作,避免数据冲突。 5、如何优化查询性能和索引使用? 场景:一个在线新闻网站的文章页面加载速度较慢,需要优化数据库查询性能。 答案:通过使用合适的索引来加速查询,可以在WHERE子句中使用列的索引,避免全表扫描。使用EXPLAIN命令来分析查询计划,确认是否正确使用了索引。可以考虑使用数据库分区来优化查询性能,将大表分割成小的分区,提高查询效率。 6、如何进行数据库的内存和磁盘管理? 场景:一个电子商务网站的数据库服务器磁盘空间不足,影响数据存储。 答案:定期监控数据库的磁盘空间使用情况,使用工具如du命令或文件系统的磁盘监控工具。删除不再需要的备份文件或日志文件,释放磁盘空间。使用合适的数据库配置参数,控制内存的使用,避免内存泄漏或过度使用。 7、如何保护数据库的安全性和权限控制? 场景:一个医疗保健应用需要保护患者的隐私数据,防止未授权访问。 答案:设置严格的数据库访问权限,只允许授权用户进行访问,可以使用GRANT和REVOKE语句进行权限管理。启用SSL/TLS来保护数据在传输过程中的安全性。定期审计数据库访问日志,监控异常活动。可以考虑使用数据库审计工具,如MySQL Enterprise Audit插件,记录数据库的操作和变更。 *SQLite 1、什么是 SQLite?在什么情况下适合使用 SQLite? 场景:开发一个小型的离线笔记应用,需要一个轻量级的本地数据库来存储用户的笔记内容。 答案:SQLite 是一款嵌入式关系型数据库管理系统,它以库的形式存在,无需独立的数据库服务器。适合用于小型项目、移动应用和原型开发,特别是在不需要复杂的数据库管理系统的情况下。在上述场景中,SQLite 是一个合适的选择,因为它可以在本地存储用户的笔记内容,并提供简单的查询和管理功能。 2、如何在 Python 中使用 SQLite 进行数据库操作? 场景:开发一个简单的待办事项列表应用,需要使用 Python 来管理用户的任务列表。 答案:可以使用 Python 的内置模块 sqlite3 来与 SQLite 数据库进行交互。您可以使用该模块连接到数据库、执行 SQL 查询和更新操作,并处理返回的结果。例如,您可以使用以下代码来创建连接、插入任务并查询任务列表: import sqlite3 # 连接到数据库(如果不存在则创建) conn = sqlite3.connect('tasks.db') # 创建游标对象 cursor = conn.cursor() # 插入任务 cursor.execute("INSERT INTO tasks (title, completed) VALUES (?, ?)", ('完成作业', 0)) # 查询任务列表 cursor.execute("SELECT * FROM tasks") tasks = cursor.fetchall() # 打印结果 for task in tasks: print(task) # 提交更改并关闭连接 conn.commit() conn.close() 3、如何使用事务来确保数据的完整性? 场景:开发一个简单的用户注册应用,需要确保用户注册信息的插入操作要么全部成功,要么全部失败。 答案:使用事务可以确保一组数据库操作要么全部成功,要么全部失败。在 Python 中,您可以使用 conn.commit() 来提交事务,或使用 conn.rollback() 来回滚事务。例如,以下代码演示了如何使用事务来插入用户注册信息: import sqlite3 def register_user(conn, user_info): try: cursor = conn.cursor() # 开始事务 cursor.execute("BEGIN") # 插入用户信息 cursor.execute("INSERT INTO users (username, email) VALUES (?, ?)", user_info) # 提交事务 conn.commit() print("用户注册成功!") except Exception as e: print("用户注册失败:", e) # 回滚事务 conn.rollback() conn = sqlite3.connect('users.db') user_data = ('john_doe', 'john@example.com') register_user(conn, user_data) conn.close() 4、如何优化 SQLite 数据库的查询性能? 场景:开发一个博客平台,用户在浏览博客列表时查询速度较慢。 答案:以下是优化查询性能的几个方法: 使用索引: 在经常查询的字段上创建索引,例如在博客标题和标签字段上创建索引,以加快查询速度。CREATE INDEX idx_name ON products (name); 合理编写查询: 避免使用过于复杂的查询,使用适当的 WHERE 子句和 JOIN 条件来过滤结果集。WHERE city = '{city}'/ JOIN orders ON customers.customer_id = orders.customer_id 分页查询: 对于长列表,使用分页查询来限制返回的结果数量,减少查询开销。SELECT * FROM employees LIMIT {page_size} OFFSET {offset} 5、如何优化 SQLite 数据库的插入性能? 场景:开发一个日志记录应用,需要高效地插入大量的日志数据。 答案: 以下是优化插入性能的几个方法: 使用事务: 将多个插入操作包装在事务中,可以显著提高插入性能。conn.execute('BEGIN') conn.execute('COMMIT') conn.execute('ROLLBACK') 批量插入: 使用 INSERT INTO ... VALUES (), (), ... 的方式插入多行数据,减少插入开销。cursor.executemany 关闭自动提交: 关闭自动提交模式,手动控制事务的提交,可以降低提交频率,提高性能。 sqlite3.connect('database.db', isolation_level=None) 6、如何优化 SQLite 数据库的存储空间? 场景:移动应用需要在设备上存储大量的用户数据,但存储空间有限。 答案:以下是优化存储空间的几个方法: 使用整数类型: 使用整数类型存储数字数据,而不是文本类型,以减少存储空间。 id INTEGER PRIMARY KEY, value INTEGER 压缩数据: 使用压缩算法对文本或二进制数据进行压缩,可以显著减少存储空间。 zlib.compress("压缩") zlib.decompress("解压缩") 清理不必要的数据: 定期清理过期或不必要的数据,以避免数据库膨胀。 DELETE FROM TABLE WHERE CREATEED_AT < 2023-07-14 *Tomcat 1、日常优化会接触哪些 ·调增连接池的配置 打开 Tomcat 的 conf/context.xml 文件。 在 <Context> 标签中添加以下配置,根据需要调整参数值: <Resource name="jdbc/Database" auth="Container" type="javax.sql.DataSource" maxTotal="100" maxIdle="20" maxWaitMillis="10000" username="Username" password="Password" driverClassName="com.mysql.jdbc.Driver" url="jdbc:mysql://DBServer:3306/DatabaseName" /> ·启动GZIP压缩 在 <Connector> 标签中的 compression 属性中添加以下配置: <Connector ... compression="on" compressionMinSize="2048" compressableMimeType="text/html,text/xml,text/plain,text/css,text/javascript,application/javascript,application/json" /> ·启用缓存 在 <Context> 标签中添加以下配置,根据需要调整参数值: <Resources cachingAllowed="true" cacheMaxSize="100000" /> ·使用cdn ·定期清理日志 #!/bin/bash TOMCAT_LOG_DIR="/path/to/tomcat/logs" # 清理 catalina.out 日志文件 find $TOMCAT_LOG_DIR -name "catalina.out.*" -mtime +7 -exec rm -f {} \; # 清理其他日志文件 find $TOMCAT_LOG_DIR -name "*.log" -mtime +7 -exec rm -f {} \; chmod +x cleanup_logs.sh 0 3 * * * /data/cleanup_logs.sh ·调优jvm参数启用JMX参数 打开 Tomcat 的 catalina.sh(或 catalina.bat)文件。 在文件开头添加以下行,根据需要调整参数值: export CATALINA_OPTS="-Dcom.sun.management.jmxremote -Dcom.sun.management.jmxremote.port=12345 -Dcom.sun.management.jmxremote.authenticate=false -Dcom.sun.management.jmxremote.ssl=false" 2、如何使用Prometheus 来监控Tomcat的性能 修改 prometheus.yml 配置文件 scrape_configs: - job_name: 'tomcat' static_configs: - targets: ['localhost:9090'] # Tomcat 的地址和端口 重载Prometheus curl -X POST http://localhost:9090/-/reload 配置catalina.sh export CATALINA_OPTS="-Dcom.sun.management.jmxremote \ -Dcom.sun.management.jmxremote.port=12345 \ -Dcom.sun.management.jmxremote.authenticate=false \ -Dcom.sun.management.jmxremote.ssl=false" 下载 JMX Exporter,并配置涉及到的端口 *Nginx 1、如何优化 配置负载均衡 upstream backend { server 1.1.1.1; server 1.1.1.2; } 禁用不必要的模块 ./configure --without-http_gzip_module 优化ssl/tls配置 使用 ssl_session_cache 指令启用会话缓存 日志切割 #!/bin/bash #此脚本用于自动分割Nginx的日志,access.log #每天00:00执行此脚本 将前一天的access.log重命名为access-xxxx-xx-xx.log格式,并重新打开日志文件 #Nginx日志文件所在目录 LOG_PATH=/var/opt/nginx/log/nginx/ backup_path=/var/log/nginx/logs/ #获取昨天的日期 YESTERDAY=$(date -d "yesterday" +%Y-%m-%d) #获取pid文件路径 PID=/var/opt/nginx/run/nginx/nginx.pid #分割日志 mv ${LOG_PATH}access.log ${LOG_PATH}access-${YESTERDAY}.log #向Nginx主进程发送USR1信号,重新打开日志文件 kill -USR1 `cat ${PID}` #定时删除7天前的log find ${LOG_PATH}access.log -name "*.log" -type f -mtime +7 -exec rm -rf {} \; 2、Nginx 和 Apache 有什么区别? 两种常见的 Web 服务器,但在某些方面有所不同。Nginx 在高并发环境下具有更好的性能和资源利用率,适用于静态内容的服务和反向代理。Apache 则更适合动态内容和模块化配置。 3、如何实现静态内容缓存? 可以在 Nginx 配置中使用 location 块来匹配特定的 URL 路径,并使用 proxy_cache 指令配置缓存设置。 4、如何重定向 HTTP 到 HTTPS? 在 HTTP server 块中添加一个 server 块来监听 80 端口,并使用 return 301 https://$host$request_uri; 进行重定向。 *Django 如何使用Python调用ansible来执行剧本 from ansible.playbook.play import Play from ansible.vars.manager import VariableManager from ansible.parsing.dataloader import DataLoader from ansible.inventory.manager import InventoryManager from ansible.executor.playbook_executor import PlaybookExecutor from ansible.module_utils.common.collections import ImmutableDict # 创建 DataLoader 对象,用于加载 Ansible 配置和剧本文件 loader = DataLoader() # 创建 InventoryManager 对象,用于管理主机清单 inventory = InventoryManager(loader=loader, sources='{}/ansible/hosts'.format(ASB_DIR)) # 创建 VariableManager 对象,用于管理变量 variable_manager = VariableManager(loader=loader, inventory=inventory) # 创建 PlaybookExecutor 对象,用于执行剧本 playbook_path = '{}/ansible/playbook.yml'.format(ASB_DIR) playbook = PlaybookExecutor( playbooks=[playbook_path], inventory=inventory, variable_manager=variable_manager, loader=loader, options=ImmutableDict(tags={}, listtags=False, listtasks=False, listhosts=False, syntax=False, connection='ssh', module_path=None, forks=100, private_key_file=None, ssh_common_args=None, ssh_extra_args=None, sftp_extra_args=None, scp_extra_args=None, become=None, become_method=None, become_user=None, verbosity=4, check=False, start_at_task=None) ) # 执行剧本并获取结果 results = playbook.run() # 处理执行结果 for result in results: print(result) *Flask from flask import Flask, request, jsonify app = Flask(__name__) @app.route('/hello', methods=['GET']) def hello(): return jsonify(message='Hello, World!') if __name__ == '__main__': app.run(host='0.0.0.0', port=5000)