详解Linux运维工程师

运维工程师是从一个呆逼进化为苦逼再成长为牛逼的过程,前提在于你要能忍能干能拼,还要具备敏锐的嗅觉感知前方潮流变化。如:今年大数据,人工智能比较火……(相对表示就是 Python 比较火)html

以前写过运维基础篇,发现对不少人收益挺大,接下来也写下关于这 4 年多的运维实践经验,从事了 2 年多游戏运维,1 年多安全运维,1 年大数据运维,相关行业信息不能算很是精通,可是熟悉和熟练仍是相对能够的。java

初级篇python

8 张 Linux 知识图谱,帮你读懂相关技术和性能linux

详解Linux运维工程师入门级必备技能:http://chenhao6.blog.51cto.com/6228054/1341458ios

01rsync工具面试

不少地方常常会用到 rsync 工具,实施几台服务器的同步效果。咱们公司就是使用这个工具完成服务器的游戏的服务端和客户端同步。正则表达式

有几个文章例子:sql

rsync 强化技术(手动修改端口开启防火墙的状况下)而且经过脚本只同步须要的服务器:http://chenhao6.blog.51cto.com/6228054/1322579shell

inotify+rsync+mutt+msmtp 实现 Linux 文件或者目录自动更新而且实现发邮件给管理员:http://chenhao6.blog.51cto.com/6228054/1298375数据库

02网络服务

服务有不少种,每间公司都会用到不一样的,但基础的服务确定要掌握,如 FTP、DNS、SAMBA、邮件,这几个大概学一下就行,LAMP 和 LNMP 是必需要熟练。

我所指的不是光会搭建,而是要很熟悉里面的至关配置才行,由于公司最关键的绝对是 Web 服务器,因此 Nginx 和 Apache 要熟悉,特别是 Nginx 必定要很熟悉才行,至少有些公司还会用 Tomcat,这个也最好学一下。

其实网络服务方面不用太担忧,通常公司的环境都已经搭建好,就算有新服务器或让你整改,公司会有相应的文档让你参照来弄,不会让你乱来的,但至少相关的配置必定要学熟,并且确定是编译安装多,那些模块要熟悉一下它的做用,特别是 PHP 那些模块。

上面两点只是基础,也是必要条件,不能说是工具,如下才是真正的要掌握的工具:

Samba 文件共享服务(共享脚本让你工做更轻松):

http://chenhao6.blog.51cto.com/6228054/1218028

Linux Web 服务安装 Apache 思路(源码编译,本身定义服务):

http://chenhao6.blog.51cto.com/6228054/1223484

FTP(持虚拟用户,而且每一个虚拟用户能够具备独立的属性配置):

http://chenhao6.blog.51cto.com/6228054/1219713

Linux 下构建 DHCP 服务器:

http://chenhao6.blog.51cto.com/6228054/1217232

03脚本语言

Shell 脚本和另外一个脚本语言,Shell 是运维人员必须具有的,不懂这个连入职都不行,至少也要写出一些系统管理脚本,最简单也得写个监控 CPU,内存比率的脚本吧,这是最最最基本了。

别觉得会写那些猜数字和计算什么数的,这些没什么做用,只做学习意义,写系统脚本才是最有意义,而另外一个脚本语言是可选的,通常是 3P,即 Python、Perl 和 PHP。

PHP 就不须要考虑了,除非你要作开发,我我的建议学 Python 会比较好,可实现自动化运维,Perl 是文本处理很强大,这两个学一个就好了。

Shell(一) 入门到复杂 本身作的各类脚本实例与解释:

http://chenhao6.blog.51cto.com/6228054/1230337

Shell(二)入门到复杂 脚本实例(计算器):

http://chenhao6.blog.51cto.com/6228054/1232070

04sed 和 awk 工具

这两个工具必需要掌握,同时还要掌握正则表达式,这个就痛苦了,正则是最难学的表达式,但结合到 sed 和 awk 中会很强大。

在处理文本内容和过滤 Web 内容时十分有用,不过在学 Shell 的同时通常会常常结合用到的,因此学第 3 点就会顺便学第 4 点。

sed 简明教程:

https://coolshell.cn/articles/9104.html

05文本处理命令

sort 、tr、cut、paste、uniq、tee 等必学,也是结合第 3 点脚本语言时一并学习的。

06数据库

首选 MySQL,别问我为何不学 SQL Server 和 Oracle,由于 Linux 用得最多绝对是 MySQL,增删改查必学,特别要学熟查,其它方面可能不太须要,由于运维人员使用最多仍是查,哪些优化和开发语句不会让你弄的。

MySQL(手动编译详细思路,以及增删改查、受权、备份还原):

http://chenhao6.blog.51cto.com/6228054/1225129

07防火墙

防火墙也算是个难点,说难不难,说易不易,最重要弄懂规则,若是学过 CCNA 的朋友可能会比较好学,由于 iptables 也有 NAT 表,原理是同样的,而 FILTER 表用得最多,反正不学就确定不合格。

防火墙(一)主机型防火墙

http://chenhao6.blog.51cto.com/6228054/1239306

防火墙(二)SNAT和DNAT

http://chenhao6.blog.51cto.com/6228054/1240714

08监控工具

我我的建议,最好学这 3 个:Cacti,Nagios,Zabbix,企业用得最多应该是 Nagios 和 Zabbix,反正都学吧,但 Nagios 会有点难,由于会涉及到用脚本写自动监控,那个地方很难。

CentOS 6.2+Nginx+Nagios,手机短信和QQ邮箱提醒:

http://chenhao6.blog.51cto.com/6228054/1323192

服务器集中检测Cacti:

http://chenhao6.blog.51cto.com/6228054/1249302

09集群和热备

这个很重要,确定要懂的,但到了公司就不会让你去弄,由于新手基本不让你碰,集群工具备不少,最好学是 LVS,这是必学,最好也学 Nginx 集群、反向代理,还有热备,这个就有更多工具能实现了,像我公司是本身开发热备工具的。

MySQL 热备也要学,就是主从复制,这个要学懂整个流程一点也不容易,只照着作根本没意思。

MySQL主从同步,双主同步,若是服务器意外挂机,不一样步怎么办:

http://chenhao6.blog.51cto.com/6228054/1325247

MySQL高性能压力测试(总结了很久)

http://chenhao6.blog.51cto.com/6228054/1314418

Nginx 缓存配置及报错解决:

http://chenhao6.blog.51cto.com/6228054/1329106

10数据备份

工具备不少,但至少要把 RAID 的原理弄懂,特别是企业最经常使用的 1+0 或 0+1,本身作实验也要弄出来,备份工具备不少,如 tar、dump,最好多了解一下。

学会以上 10 点,应该能够入门了,有些技术会比较难学,例如 Apache 和 Nginx 中还有些很重要的技术,如系统调优、服务优化、程序优化,这些在没接触工做前很难学习到的。

因此先把这 10 点学了吧,估计要学熟至少 3 个月不止,脚本部分会以为很吃力了,我建议是先学熟 Shell,等工做后再学另外一门脚本语言,这样会比较好。

以上就是踏入 Linux 运维工程师须要掌握的工具,还有不少工具要掌握的,但在学习环境中是很难学到。

最后我再提醒一下,这里所指的工具至关于技能,而不是像 Windows 或 Ubuntu 的图形化工具,还有学 Linux 就别装图形界面,这样虚拟机就不用吃太多内存,并且绝对不建议在真机上装 Linux,根本达不到学习效果。

中级篇

这部分来自我本身的面试经历和面试别人的经历总结。先附上运维思路拓扑图:

有些人认为,运维就是部署某个软件,设置些基础功能,就算会运维了。

举个例子:安装 LAMP,LNMP,就感受部署方法我都掌握了。其实网上大多数都有一键安装脚本啥的根本没有啥技术含量,在面试官眼里,这些都不是你的亮点。

基本到了公司通常环境架构都是部署好的,不多须要你去变更环境架构。就算你安装好 LNMP 架构,你熟悉里面的原理吗?熟悉 Nginx 优化吗?熟悉 MySQL 优化吗?

再举个例子:我面试遇到的问题,面试官问你既然熟悉 LNMP 架构,那么 Nginx 反向代理的做用呢。

你应该不是说出懂这个软件和配置,你尽量的说怎么优化,怎么深刻提升网站性能:

  • 使用反向代理能够理解为 7 层应用层的负载均衡,使用负载均衡以后能够很是便捷的横向扩展服务器集群,实现集群总体并发能力、抗压能力的提升。
  • 一般反向代理服务器会带有本地 Cache 功能,经过静态资源的 Cache,有效的减小后端服务器所承载的压力,从而提升性能。

下面说说运维在工做中须要掌握的核心技术。须要注意的是,这是在工做中掌握的,在学习中很难掌握。

01第一条最主要的排错

  • 分析部分程序不能运行或没有按预想结果运行的缘由,对程序运行跟踪,查看系统调用的过程。
  • 较深刻的系统瓶颈点分析。

查看剩余内存:

  1. free -m 
  2. #-/+ buffers/cache:       6458       1649 
  3. #6458M为真实使用内存  1649M为真实剩余内存(剩余内存+缓存+缓冲器) 
  4. #linux会利用全部的剩余内存做为缓存,因此要保证linux运行速度,就须要保证内存的缓存大小 

系统信息:

  1. uname -a              # 查看Linux内核版本信息 
  2. cat /proc/version     # 查看内核版本 
  3. cat /etc/issue        # 查看系统版本 
  4. lsb_release -a        # 查看系统版本  需安装 centos-release 
  5. locale -a             # 列出全部语系 
  6. locale                # 当前环境变量中全部编码 
  7. hwclock               # 查看时间 
  8. who                   # 当前在线用户 
  9. w                     # 当前在线用户 
  10. whoami                # 查看当前用户名 
  11. logname               # 查看初始登录用户名 
  12. uptime                # 查看服务器启动时间 
  13. sar -n DEV 1 10       # 查看网卡网速流量 
  14. dmesg                 # 显示开机信息 
  15. lsmod                 # 查看内核模块 

硬件信息:

  1. more /proc/cpuinfo                                       # 查看cpu信息 
  2. lscpu                                                    # 查看cpu信息 
  3. cat /proc/cpuinfo | grep name | cut -f2 -d: | uniq -c    # 查看cpu型号和逻辑核心数 
  4. getconf LONG_BIT                                         # cpu运行的位数 
  5. cat /proc/cpuinfo | grep 'physical id' |sort| uniq -c    # 物理cpu个数 
  6. cat /proc/cpuinfo | grep flags | grep ' lm ' | wc -l     # 结果大于0支持64位 
  7. cat /proc/cpuinfo|grep flags                             # 查看cpu是否支持虚拟化   pae支持半虚拟化  IntelVT 支持全虚拟化 
  8. more /proc/meminfo                                       # 查看内存信息 
  9. dmidecode                                                # 查看全面硬件信息 
  10. dmidecode | grep "Product Name"                          # 查看服务器型号 
  11. dmidecode | grep -P -A5 "Memory\s+Device" | grep Size | grep -v Range       # 查看内存插槽 
  12. cat /proc/mdstat                                         # 查看软raid信息 
  13. cat /proc/scsi/scsi                                      # 查看Dell硬raid信息(IBM、HP须要官方检测工具) 
  14. lspci                                                    # 查看硬件信息 
  15. lspci|grep RAID                                          # 查看是否支持raid 
  16. lspci -vvv |grep Ethernet                                # 查看网卡型号 
  17. lspci -vvv |grep Kernel|grep driver                      # 查看驱动模块 
  18. modinfo tg2                                              # 查看驱动版本(驱动模块) 
  19. ethtool -i em1                                           # 查看网卡驱动版本 
  20. ethtool em1 
  • 使用分析系统分析 Web 日志(如逆火软件)
  • 分析系统性能瓶颈点(IO/Memory/CPU,经常使用工具,top 命令中 shift 组合键的特殊用 Sar/vmstat/iostat/ipcs)

日志管理经常使用命令:

  1. history                      # 历时命令默认1000条 
  2. HISTTIMEFORMAT="%Y-%m-%d %H:%M:%S "   # 让history命令显示具体时间 
  3. history  -c                  # 清除记录命令 
  4. cat $HOME/.bash_history      # 历史命令记录文件 
  5. lastb -a                     # 列出登陆系统失败的用户相关信息  清空二进制日志记录文件 echo > /var/log/btmp   
  6. last                         # 查看登录过的用户信息  清空二进制日志记录文件 echo > /var/log/wtmp   默认打开乱码 
  7. who /var/log/wtmp            # 查看登录过的用户信息 
  8. lastlog                      # 用户最后登陆的时间 
  9. tail -f /var/log/messages    # 系统日志 
  10. tail -f /var/log/secure      # ssh日志 

02优化

优化能够说是运维最吃香的技能,基本会优化的运维广泛工资很高,并且优化是要承担风险的,并非网上搜个文章改一下配置文件或者参数就叫优化了,这样很容易形成宕机。

优化是根据实际的现场环境硬件各个参数进行部分优化,提升软件性能和网站性能。这个我只能讲半知半解,当时优化 MySQL 和 Tomcat 参数也是根据网上文章和官网文档查找参数在虚拟机上测试而后查看性能。

成本优化,性能优化,这里我给出 Tomcat 优化 JVM 参数(作过相应测试才放到现场环境的):(记住无监控不调优)

  1. -标准参数,全部jvm都应该支持 
  2. -X 非标,每一个jvm实现都不一样 
  3. -XX 不稳定参数,下一版本可能会取消 
  4. serial collector 单线程 序列化 
  5. parallel collector 多线程 

启动 jvisualvm.exe 监控 dump 内存溢出:

  1. -Xms:初始堆大小 
  2. -Xmx:最大堆大小 
  3. -Xss:线程栈大小 
  4. -XX:NewSize=n:设置年轻代大小 
  5. -XX:NewRatio=n:设置年轻代和年老代的比值,如3, 标示年轻代:年老代比值1:3,年轻代占整个年轻代年老代和的1/4 
  6. -XX:SurvivorRatio=n:年轻代中的eden区与2个Survivor区的比值。 
  7. -XX:MaxPermSize=n:设置持久代大小 

收集器设置:

  1. -XX:+UseSerialGC:设置串行收集器 
  2. -XX:+UseParallelGC:设置并行收集器 
  3. -XX:+UseConcMarkSweepGC:设置并发收集器 

回收统计信息:

  1. -XX:+PrintGC 
  2. -XX:+PrintGCDetails 
  3. -Xloggc:filename 

Tocmat 优化,确认有几个 JVM 虚拟机:

  1. set JAVA_OPTS= 
  2. -Xms4g 
  3. -Xmx4g 
  4. -Xss512k 
  5. -XX:+AggressiveOpts 进攻型的优化选项,全部优化项都加上 
  6. -XX:+UseBiasedLocking 优化锁,基本都要选上,偏执锁 
  7. -XX:permSize=64m 原始区大小,最大300m 类多就设置大一点 
  8. -XX:MaxPermSize=300m   
  9. -XX:+DisableExplicitGC //System.gc() 不显示调用gc 
  10. -XX:+UseConcMarkSweepGC 使用cms缩短相应时间,并发收集,低停顿 
  11. -XX:+UseParNewGC   并行收集新生代的垃圾 
  12. -XX:+CMSParallelRemarkEnabled 在使用UseParNewGC的状况下,尽可能减小mark的时间 
  13. -XX:+UseCMSCompactAtFullCollection 使用并发收集器时,开启对年老代的压缩,使碎片减小 
  14. -XX:LargePageSizelnBytes=128m 内存分页大小对性能的提高 
  15. -XX:+UseFastAccessorMethods get/set方法转成本地代码 
  16. -Djava awt headless=true  修复linux下tomcat处理图标时可能产生的bug 

内存调优:

  1. "C:\Program Files\Java\jdk1.8.0_31\bin\java" -XX:+DoEscapeAnalysis -XX:+EliminateAllocations -XX:+UseTLAB -XX:+PrintGCDetails -Didea.launcher.port=7540 "-Didea.launcher.bin.path=E:\java\IntelliJ IDEA 2016.3\bin" -Dfile.encoding=UTF-8 -classpath "C:\Program Files\Java\jdk1.8.0_31\jre\lib\charsets.jar;C:\Program Files\Java\jdk1.8.0_31\jre\lib\deploy.jar;C:\Program Files\Java\jdk1.8.0_31\jre\lib\ext\access-bridge-64.jar;C:\Program Files\Java\jdk1.8.0_31\jre\lib\ext\cldrdata.jar;C:\Program Files\Java\jdk1.8.0_31\jre\lib\ext\dnsns.jar;C:\Program Files\Java\jdk1.8.0_31\jre\lib\ext\jaccess.jar;C:\Program Files\Java\jdk1.8.0_31\jre\lib\ext\jfxrt.jar;C:\Program Files\Java\jdk1.8.0_31\jre\lib\ext\localedata.jar;C:\Program Files\Java\jdk1.8.0_31\jre\lib\ext\nashorn.jar;C:\Program Files\Java\jdk1.8.0_31\jre\lib\ext\sunec.jar;C:\Program Files\Java\jdk1.8.0_31\jre\lib\ext\sunjce_provider.jar;C:\Program Files\Java\jdk1.8.0_31\jre\lib\ext\sunmscapi.jar;C:\Program Files\Java\jdk1.8.0_31\jre\lib\ext\sunpkcs11.jar;C:\Program Files\Java\jdk1.8.0_31\jre\lib\ext\zipfs.jar;C:\Program Files\Java\jdk1.8.0_31\jre\lib\javaws.jar;C:\Program Files\Java\jdk1.8.0_31\jre\lib\jce.jar;C:\Program Files\Java\jdk1.8.0_31\jre\lib\jfr.jar;C:\Program Files\Java\jdk1.8.0_31\jre\lib\jfxswt.jar;C:\Program Files\Java\jdk1.8.0_31\jre\lib\jsse.jar;C:\Program Files\Java\jdk1.8.0_31\jre\lib\management-agent.jar;C:\Program Files\Java\jdk1.8.0_31\jre\lib\plugin.jar;C:\Program Files\Java\jdk1.8.0_31\jre\lib\resources.jar;C:\Program Files\Java\jdk1.8.0_31\jre\lib\rt.jar;E:\java\new\out\production\new;E:\java\IntelliJ IDEA 2016.3\lib\idea_rt.jar" com.intellij.rt.execution.application.AppMain aa.T02 
  2. Heap 
  3.  PSYoungGen      total 38400K, used 3994K [0x00000000d5d80000, 0x00000000d8800000, 0x0000000100000000) 
  4.   eden space 33280K, 12% used [0x00000000d5d80000,0x00000000d61668b8,0x00000000d7e00000) 
  5.   from space 5120K, 0% used [0x00000000d8300000,0x00000000d8300000,0x00000000d8800000) 
  6.   to   space 5120K, 0% used [0x00000000d7e00000,0x00000000d7e00000,0x00000000d8300000) 
  7.  ParOldGen       total 87552K, used 0K [0x0000000081800000, 0x0000000086d80000, 0x00000000d5d80000) 
  8.   object space 87552K, 0% used [0x0000000081800000,0x0000000081800000,0x0000000086d80000) 
  9.  Metaspace       used 3072K, capacity 4494K, committed 4864K, reserved 1056768K 
  10.   class space    used 329K, capacity 386K, committed 512K, reserved 1048576K 
  11. Heap 
  12.  PSYoungGen      total 38400K, used 1147K [0x00000000d5d80000, 0x00000000d8800000, 0x0000000100000000) 
  13.   eden space 33280K, 3% used [0x00000000d5d80000,0x00000000d5e9ecb8,0x00000000d7e00000) 
  14.   from space 5120K, 0% used [0x00000000d8300000,0x00000000d8300000,0x00000000d8800000) 
  15.   to   space 5120K, 0% used [0x00000000d7e00000,0x00000000d7e00000,0x00000000d8300000) 
  16.  ParOldGen       total 87552K, used 0K [0x0000000081800000, 0x0000000086d80000, 0x00000000d5d80000) 
  17.   object space 87552K, 0% used [0x0000000081800000,0x0000000081800000,0x0000000086d80000) 
  18.  Metaspace       used 3072K, capacity 4494K, committed 4864K, reserved 1056768K 
  19.   class space    used 330K, capacity 386K, committed 512K, reserved 1048576K 
  20.   线程本地缓存使用eden的,开启就会使用更多 

Tomcat 前任何参数没参加大概每秒 605,调优后大概每秒 435,接近 3 倍的结果。

03开发技能

优选 Shell 和 Python,如今 Shell 没法知足你的需求或者效率很低,那么选择自动化 Python 是最好的选择。如今广泛招聘需求要求,会写 Shell 或者 Python、Perl 脚本,我的选择仍是选 Python。

Python 这门语言上手比较快,容易理解。在服务器管理工具上很是丰富,配置管理(Saltstack) 批量执行(Fabric、Saltstack) 监控(Zenoss、Nagios 插件) 虚拟化管理( python-libvirt) 进程管理 (Supervisor) 云计算(OpenStack) ......

还有大部分系统 C 库都有 Python 绑定。

对于流程肯定的事情,最终必定是归入系统管理的体系,写成程序,成为系统的一部分。而不是没法复用游离与总体的各类脚本。

随着云计算时代的来临,中小型公司不须要运维了,大型公司没有工程开发能力的运维,是没有竞争力的。

最重要的学好 Python 能够涨工资,能够涨工资,能够涨工资。(重要的事情说三遍~)目前本人也是在学 Python,正在把之前 Shell 脚本的实例转换成 Python 脚本。

推荐《Python 实例手册》下载连接:

http://down.51cto.com/data/2329173

意识篇

01安全意识

运维人员的权限很大,因此必定要保证账号/私钥的安全:

  • 最好使用加密工具存储。好比 Truecrypt、lpassword。
  • 基于本地存储。切勿用网盘,也不建议用 lastpass 等。
  • SSH 私钥添加密码。

02磨刀意识

关于任何操做配置,最好先搞明白操做或配置的原理,而后再去操做。应一句话叫作“磨刀不误砍柴功”,并且对于相似的操做能够触类旁通。

03计划意识

复杂的变动操做好比多台主机以及牵涉到 san 存储,最好先做操做计划,写计划文档,详细到每条命令,而后请高手帮忙审核。

这样能最大程度使整个操做过程安全。若是是重要的客户业务系统,操做最好有回退方案,而一旦变动失败,客户能够在短期内将业务回退。

04记录分享意识

遇到本身认为较特殊的案例时,记得要写案例过程及分析的文档。也方便本身之后翻看,或者和其余兄弟分享,做知识的传播以便于你们之后都能少走弯路。

05监控意识

对运维来讲,监控是很是重要的,监控是发现系统各类异常的眼睛,因此运维应该和监控紧密配合。

06业务意识

尽可能了解维护的各主机上的业务类型,以及各主机业务之间的关联性,由于任何维护工做都是为主机能提供业务服务的。

当某业务中断,能最快的知道与此业务相关的主机群,从而缩小故障排查范围,最快定位故障。

并非你技术很牛,学的技术不少很熟,就不表明你不须要运维意识,其实领导很看重运维意识的。

例若有没有作好备份、权限分配问题、平台测试状况、故障响应时间等,这些都是意识,而不是你学了不少技术自认大牛了,平台发现故障你觉得很简单的问题喜欢处理就处理,不须要向其它部门反馈等。

领导不是看你的技术如何,而是看你的运维意识如何,你没运维意识,技术再牛也没用,只会让其它部门的人跟你不协调。

要知道作 IT 这行是苦逼的,须要无尽的学习,不学习只会被淘汰,不想被年轻的淘汰,就只能不断增值本身,否则不是你工资没法提高,而是你没法再从事这行。

这个世界,在悄悄惩罚不改变的人……

相关文章
相关标签/搜索