Linux运维人员必知必会工具汇总

Linux运维人员必知必会工具汇总,第1张

领域 :工具名称

*** 作系统 :CentOS、Ubuntu、Redhat、suse、Freebsd

网站服务: nginx、apache、lighttpd、php、tomcat、resin

数据库: MySQL、MariaDB、PostgreSQL

DB中间件 :maxscale、MyCat、atlas、cobar、amoeba、MySQL-proxy

代理相关: lvs、keepalived、haproxy、nginx、heartbeat

网站缓存: squid、nginx、varnish

NoSQL库: Redis、CacheCloud、Memcached、MongoDB、HBase、Cassandra、CouchDB

存储相关 :Nfs、FastDFS、Moosefs(mfs)、Ceph 、Hadoop、glusterfs、lustre

版本管理 :svn、git、gitlab、gogs

监控报警 :nagios、cacti、zabbix、munin、hyperic、mrtg、graphite

域名解析: bind、powerdns、dnsmasq

同步软件: scp、rsync、inotify、sersync、drbd

批量管理: SSH、Ansible、Saltstack、expect、puppet

虚拟化: kvm、xen

云计算: openstack、docker、k8s

内网软件: iptables、zebra、iftraf、ntop、tc、iftop

邮件软件: qmail、posfix、sendmail、zimbra

远程拨号: openvpn、pptp、openswan、ipip

统一认证: openldap

队列工具: ActiveMQ、RabbitMQ、Metaq、MemcacheQ、Zeromq、kafka

打包发布: mvn、ants、Jenkins、Walle

测试软件: ab、JMeter、Webbench、LoadRunner、http_load、tcpcopy

带宽测试 :smokeping

性能测试 ;dd、 fio(IOPS测试)、iozone(磁盘测试)

日志相关: rsyslog、Awstats、flume、storm、ELK(Elasticsearch+Logstash+Kibana)

搜索软件: Sphinx、Xapian、Solr

无人值守: rpm、yum(设计rpm包定制及yum仓库构建)

大数据: HDFS、Hive、Hbase、Zookeeper、Pig、Spark、Mahout、flume、sqoop

项目管理: Jira、Redmine

linux管理: 宝塔Linux面板

渗透测试工具: SQLMap、Webscan

开源邮箱: iRedmail、extmail、Zimbra

软件开发 :Sublime Text、Eclipse、Jetbrains

远程连接: putty、Xshell、SecureCRT、MobaXterm、TeamViewer、向日葵

在此为服务器运维人员推荐使用:宝塔面板 www.bt.cn

宝塔面板,近200个免费应用提供使用,如:网站管理、系统安全、系统监控、计划任务、文件管理、软件管理、一键部署等为服务器运维人员提供安全高效的完成服务器运维工作。

Java基础语法

· 分支结构if/switch

· 循环结构for/while/do while

· 方法声明和调用

· 方法重载

· 数组的使用

· 命令行参数、可变参数

IDEA

· IDEA常用设置、常用快捷键

· 自定义模板

· 关联Tomcat

· Web项目案例实 ***

面向对象编程

· 封装、继承、多态、构造器、包

· 异常处理机制

· 抽象类、接口、内部类

· 常有基础API、集合List/Set/Map

· 泛型、线程的创建和启动

· 深入集合源码分析、常见数据结构解析

· 线程的安全、同步和通信、IO流体系

· 反射、类的加载机制、网络编程

Java8/9/10/11新特性

· Lambda表达式、方法引用

· 构造器引用、StreamAPI

· jShell(JShell)命令

· 接口的私有方法、Optional加强

· 局部变量的类型推断

· 更简化的编译运行程序等

MySQL

· DML语言、DDL语言、DCL语言

· 分组查询、Join查询、子查询、Union查询、函数

· 流程控制语句、事务的特点、事务的隔离级别等

JDBC

· 使用JDBC完成数据库增删改查 *** 作

· 批处理的 *** 作

· 数据库连接池的原理及应用

· 常见数据库连接池C3P0、DBCP、Druid等

Maven

· Maven环境搭建

· 本地仓库&中央仓库

· 创建Web工程

· 自动部署

· 持续继承

· 持续部署

Linux

· VI/VIM编辑器

· 系统管理 *** 作&远程登录

· 常用命令

· 软件包管理&企业真题

Shell编程

· 自定义变量与特殊变量

· 运算符

· 条件判断

· 流程控制

· 系统函数&自定义函数

· 常用工具命令

· 面试真题

Hadoop

· Hadoop生态介绍

· Hadoop运行模式

· 源码编译

· HDFS文件系统底层详解

· DN&NN工作机制

· HDFS的API *** 作

· MapReduce框架原理

· 数据压缩

· Yarn工作机制

· MapReduce案例详解

· Hadoop参数调优

· HDFS存储多目录

· 多磁盘数据均衡

· LZO压缩

· Hadoop基准测试

Zookeeper

· Zookeeper数据结果

· 内部原理

· 选举机制

· Stat结构体

· 监听器

· 分布式安装部署

· API *** 作

· 实战案例

· 面试真题

· 启动停止脚本

HA+新特性

· HDFS-HA集群配置

Hive

· Hive架构原理

· 安装部署

· 远程连接

· 常见命令及基本数据类型

· DML数据 *** 作

· 查询语句

· Join&排序

· 分桶&函数

· 压缩&存储

· 企业级调优

· 实战案例

· 面试真题

Flume

· Flume架构

· Agent内部原理

· 事务

· 安装部署

· 实战案例

· 自定义Source

· 自定义Sink

· Ganglia监控

Kafka

· 消息队列

· Kafka架构

· 集群部署

· 命令行 *** 作

· 工作流程分析

· 分区分配策略

· 数据写入流程

· 存储策略

· 高阶API

· 低级API

· 拦截器

· 监控

· 高可靠性存储

· 数据可靠性和持久性保证

· ISR机制

· Kafka压测

· 机器数量计算

· 分区数计算

· 启动停止脚本

DataX

· 安装

· 原理

· 数据一致性

· 空值处理

· LZO压缩处理

Scala

· Scala基础入门

· 函数式编程

· 数据结构

· 面向对象编程

· 模式匹配

· 高阶函数

· 特质

· 注解&类型参数

· 隐式转换

· 高级类型

· 案例实 ***

Spark Core

· 安装部署

· RDD概述

· 编程模型

· 持久化&检查点机制

· DAG

· 算子详解

· RDD编程进阶

· 累加器&广播变量

Spark SQL

· SparkSQL

· DataFrame

· DataSet

· 自定义UDF&UDAF函数

Spark Streaming

· SparkStreaming

· 背压机制原理

· Receiver和Direct模式原理

· Window原理及案例实 ***

· 7x24 不间断运行&性能考量

Spark内核&优化

· 内核源码详解

· 优化详解

Hbase

· Hbase原理及架构

· 数据读写流程

· API使用

· 与Hive和Sqoop集成

· 企业级调优

Presto

· Presto的安装部署

· 使用Presto执行数仓项目的即席查询模块

Ranger2.0

· 权限管理工具Ranger的安装和使用

Azkaban3.0

· 任务调度工具Azkaban3.0的安装部署

· 使用Azkaban进行项目任务调度,实现电话邮件报警

Kylin3.0

· Kylin的安装部署

· Kylin核心思想

· 使用Kylin对接数据源构建模型

Atlas2.0

· 元数据管理工具Atlas的安装部署

Zabbix

· 集群监控工具Zabbix的安装部署

DolphinScheduler

· 任务调度工具DolphinScheduler的安装部署

· 实现数仓项目任务的自动化调度、配置邮件报警

Superset

· 使用SuperSet对数仓项目的计算结果进行可视化展示

Echarts

· 使用Echarts对数仓项目的计算结果进行可视化展示

Redis

· Redis安装部署

· 五大数据类型

· 总体配置

· 持久化

· 事务

· 发布订阅

· 主从复制

Canal

· 使用Canal实时监控MySQL数据变化采集至实时项目

Flink

· 运行时架构

· 数据源Source

· Window API

· Water Mark

· 状态编程

· CEP复杂事件处理

Flink SQL

· Flink SQL和Table API详细解读

Flink 内核

· Flink内核源码讲解

· 经典面试题讲解

Git&GitHub

· 安装配置

· 本地库搭建

· 基本 *** 作

· 工作流

· 集中式

ClickHouse

· ClickHouse的安装部署

· 读写机制

· 数据类型

· 执行引擎

DataV

· 使用DataV对实时项目需求计算结果进行可视化展示

sugar

· 结合Springboot对接百度sugar实现数据可视化大屏展示

Maxwell

· 使用Maxwell实时监控MySQL数据变化采集至实时项目

ElasticSearch

· ElasticSearch索引基本 *** 作、案例实 ***

Kibana

· 通过Kibana配置可视化分析

Springboot

· 利用Springboot开发可视化接口程序

一、背景

近期,公司RDS云产品的MySQL Server版本进行升级,由目前使用的5.7.26版本升级到最新版本5.7.31;升级后测试同学发现:在MySQL创建用户后,5.7.31版本重新启动集群会出现启动失败的现象;而5.7.26版本在相同测试场景下是正常启动的。这到底是为什么呢?

二、问题复现

2.1 实验环境

2.2 *** 作步骤

按照测试同学的测试步骤,首先创建一个用户:

然后关闭mysqld;这里需要介绍一下,我们集群的关闭方式是如下方式:

这种方式的内部实现类似于kill -9模式。所以我在线下环境使用kill -9的方式来复现, *** 作如下:

然后重启mysqld, *** 作如下:

此时问题复现了,mysqld启动失败,我们查看了下error日志,信息如下:

根据报错信息可以看出:MySQL的权限系统表发生了损坏,导致了mysqld启动失败;由于在MySQL 5.7及其之前版本该表是MyISAM引擎,且该引擎不支持事务,所以在mysqld异常崩溃会导致该类型引擎表的损坏但在mysqld启动时是有参数控制MyISAM引擎的恢复模式,且该参数在我们产品中也配置到了my.cnf中,如下所示:

2.3 参数解析

对于该参数的官方文档的解释如下:

设置MyISAM存储引擎恢复模式。选项值是OFF、DEFAULT、BACKUP、FORCE或QUICK的值的任意组合。如果指定多个值,请用逗号分隔。指定不带参数的选项与指定DEFAULT相同,指定显式值" "将禁用恢复(与OFF值相同)。如果启用了恢复,则mysqld每次打开MyISAM表时,都会检查该表是否标记为已崩溃或未正确关闭。(只有在禁用外部锁定的情况下运行,最后一个选项才起作用。)在这种情况下,mysqld在表上运行检查。如果表已损坏,mysqld将尝试对其进行修复。

服务器自动修复表之前,它将有关修复的注释写到错误日志中。如果您希望能够在无需用户干预的情况下从大多数问题中恢复,则应使用选项BACKUP,FORCE。即使某些行将被删除,这也会强制修复表,但是它将旧的数据文件保留为备份,以便您以后可以检查发生了什么。

全局变量,只读变量,默认为OFF。

三、问题修复

这类MySQL用户表损耗的问题解决方式也是有多种,我这里列举其中一种:

(1)my.cnf中的[mysqld]标签下添加skip_grant_tables,启动时跳过加载系统字典。

(2)重启mysqld,然后修复mysql schema下的所有表。

(3)在[mysqld]标签下注释或删除掉skip_grant_tables,然后重启mysqld。

此时mysqld是可以正常启动的,无异常。

四、深入排查

在产品化中,以上修复方式很不优雅,只是作为临时的解决方案并且也存在一些令人疑惑的点:

带着这些疑问,我们继续排查出现该现象的原因;此时Google也没有找到一些有效的信息,那么只能通过MySQL源代码来寻找一些答案。

首先需要下载mysql 5.7.31版本的源代码,并搭建mysql debug环境;具体步骤可以自动Google搜索一下,本文就不再赘述了。

在源代码中搜索一下关键词,用于打断点的位置,然后进行调试:

定位到相关代码,大概是sql/mysqld.cc的4958行,且存在if条件判断,此时我们开始调试:

通过以上调试信息,可以判断出acl_init函数返回的值为真此时我们查看该函数的代码 (sql/auth/sql_auth_cache.cc:1365):

根据该函数的注释发现:该函数是初始化负责用户/数据库级特权检查的结构,并从mysql schema中的表中为其加载特权信息;且return值为1代表的是初始化权限失败。

此后开始逐步调试,观察return相关信息,当调试到lock_table_names函数时,我们发现在Phase 3时return值为true,且根据代码注释发现true代表是Failure;具体代码如下(sql/sql_base.cc:5549):

调试信息如下:

可以看到flags的值为0,而MYSQL_OPEN_SKIP_SCOPED_MDL_LOCK为宏定义值0x1000,与flags的值 做按位与 *** 作,结果自然也是0,当然MYSQL_LOCK_IGNORE_GLOBAL_READ_ONLY也是如此need_global_read_lock_protection是bool类型值,代表是否需要全局读锁的保护,这个值是在table- >mdl_request.type不为MDL_SHARED_READ_ONLY发生改变check_readonly函数相关信息 下面概述。

此时也查看了下MySQL 5.7.26版本代码作为对比,发现lock_table_names函数下的Phase 3后的部分代 码是在5.7.29版本后新增的。如果是git clone的MySQL代码可以用git blame命令查询文件变化的信息:

上述展示的信息中,最左侧的列值为commit id为05824063和0405ebee,有兴趣的同学可以详细看下。

此功能解决的问题是BUG#28438114: SET READ_ONLY=1 SOMETIMES DOESN'T BLOCK CONCURRENT DDL.;当然这个代码的变更功能也在5.7 Release Notes中有所体现,如下所示( https://dev.mysql.co m/doc/relnotes/mysql/5.7/en/news-5-7-29.html ):

最后我们再查看下check_readonly函数,该函数是基于read_only和super_read_only状态执行标准化检查,是禁止(TRUE)还是允许(FALSE) *** 作。代码如下(sql/auth/sql_authorization.cc:489):

此时第一反应就是去检查my.cnf中是否包含read_only相关参数,检查之后发现确实是使用了该参数, 如下:

此时注释掉该参数,然后再次启动mysqld,发现MyISAM表可以自动修复,且正常启动;error log信息如下:

由于docker一些限制,我们在mysqld启动会涉及两次所以解决该问题的方式为:第一次mysqld的启动时先关闭read_only参数,第二次启动时开启read_only参数。之所以选择默认开启read_only参数, 是为了避免在mysqld启动后,选主逻辑未完成时的保护措施;当然选主完成后,会自动对master执行 set global read_only=0 *** 作。

五、总结

六、附录

调试的栈帧信息如下,有兴趣的小伙伴可以研究下:

熟悉MySQL体系结构和innodb存储引擎工作原理;以及MySQL备份恢复、复制、数据迁移等技术;专注于MySQL、MariaDB开源数据库,喜好开源技术。

原文链接:https://www.heapdump.cn/articles


欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/zaji/8332672.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-04-15
下一篇 2023-04-15

发表评论

登录后才能评论

评论列表(0条)

保存