运维知识点

[root@server1 ~]# uptime
 10:10:01 up 6 min,  2 users,  load average: 0.00, 0.00, 0.00
uptime命令:能够打印系统总共运行了多长时间和系统的平均负载。uptime可以显示的信息依次为:现在时间,系统已经运行了多长时间,目前有多少个登录用户,系统在过去1,5,15分钟内的平均负载。

系统负载是处于可运行runnable或不可中断uninterruptable状态的进程的平均数。可运行状态的进程要么正在使用 CPU 要么在等待使用 CPU。 不可中断状态的进程则正在等待某些 I/O 访问,例如等待磁盘 IO。
有三个时间间隔的平均值。负载均值的意义根据系统中 CPU 的数量不同而不同,负载为 1 对于一个只有单 CPU 的系统来说意味着负载满了,而对于一个拥有 4 CPU 的系统来说则意味着 75% 的时间里都是空闲的。
[root@server1 ~]# free
             total       used       free     shared    buffers     cached
Mem:       1020376     167652     852724          0      15180      50892
-/+ buffers/cache:     101580     918796
Swap:      1015800          0    1015800
free命令查看的是内存占用情况,可以显示当前系统未使用的和已使用的内存数目,还可以显示被内核使用的内存缓冲区。
used=total-free 即 total=used+free
实际内存占用:used-buffers-cached 即 total-free-buffers-cached
实际可用内存:buffers+cached+free
 Cache:高速缓存,是位于CPU与主内存间的一种容量较小但速度很高的存储器。由于CPU的速度远高于内存,CPU直接从内存中存取数据要等待一定时间周期,Cache中保存着CPU刚用过或循环使用的一部分数据,当CPU再次使用该部分数据时可从Cache中直接调用,这样就减少了CPU的等待时间,提高了系统的效率。
 Buffer:缓冲区,一个用于存储速度不同步的设备或优先级不同的设备之间传输数据的区域。通过缓冲区,可以使进程之间的相互等待变少,从而使从速度慢的设备读入数据时,速度快的设备的操作进程不发生间断。

buffer是由各种进程分配的,被用在如输入队列等方面。一个简单的例子如某个进程要求有多个字段读入,在所有字段被读入完整之前,进程把先前读入的字段放在buffer中保存。

cache经常被用在磁盘的I/O请求上,如果有多个进程都要访问某个文件,于是该文件便被做成cache以方便下次被访问,这样可提高系统性能。

 top命令:系统进程动态信息,默认10s更新一次

PID:进程ID,进程的唯一标识符

USER:进程所有者的实际用户名。

PR:进程的调度优先级。这个字段的一些值是'rt'。这意味这这些进程运行在实时态。

NI:进程的nice值(优先级)。越小的值意味着越高的优先级。负值表示高优先级,正值表示低优先级

VIRT:进程使用的虚拟内存。进程使用的虚拟内存总量,单位kb。VIRT=SWAP+RES

RES:驻留内存大小。驻留内存是任务使用的非交换物理内存大小。进程使用的、未被换出的物理内存大小,单位kb。RES=CODE+DATA

SHR:SHR是进程使用的共享内存。共享内存大小,单位kb

S:这个是进程的状态。它有以下不同的值:

    D - 不可中断的睡眠态。
    R – 运行态
    S – 睡眠态
    T – 被跟踪或已停止
    Z – 僵尸态

%CPU:自从上一次更新时到现在任务所使用的CPU时间百分比。

%MEM:进程使用的可用物理内存百分比。

TIME+:任务启动后到现在所使用的全部CPU时间,精确到百分之一秒。

COMMAND:运行进程所使用的命令。进程名称(命令名/命令行)

s – 改变画面更新频率
l – 关闭或开启第一部分第一行 top 信息的表示
t – 关闭或开启第一部分第二行 Tasks 和第三行 Cpus 信息的表示
m – 关闭或开启第一部分第四行 Mem 和 第五行 Swap 信息的表示
N – 以 PID 的大小的顺序排列表示进程列表
P – 以 CPU 占用率大小的顺序排列进程列表
M – 以内存占用率大小的顺序排列进程列表

1.3% us — 用户空间占用CPU的百分比。
1.0% sy — 内核空间占用CPU的百分比。
0.0% ni — 改变过优先级的进程占用CPU的百分比
97.3% id — 空闲CPU百分比
0.0% wa — IO等待占用CPU的百分比,百分比可以大致的体现出当前的磁盘io请求是否频繁。如果 wa的数量比较大,说明等待输入输出的的io比较多。
0.3% hi — 硬中断(Hardware IRQ)占用CPU的百分比
0.0% si — 软中断(Software Interrupts)占用CPU的百分比
vmstat命令是最常见的Linux/Unix监控工具,可以展现给定时间间隔的服务器的状态值,包括服务器的CPU使用率,内存使用,虚拟内存交换情况,IO读写情况。这个命令是我查看Linux/Unix最喜爱的命令,一个是Linux/Unix都支持,二是相比top,我可以看到整个机器的CPU,内存,IO的使用情况,而不是单单看到各个进程的CPU使用率和内存使用率(使用场景不一样)
[root@server1 ~]# vmstat
procs -----------memory---------- ---swap-- -----io---- --system-- -----cpu-----
 r  b   swpd   free   buff  cache   si   so    bi    bo   in   cs us sy id wa st
 0  0      0 851844  15188  51088    0    0    19     2   12   13  0  0 99  0  0
r 表示运行队列(就是说多少个进程真的分配到CPU),当这个值超过了CPU数目,就会出现CPU瓶颈了
b 表示阻塞的进程
si  每秒从磁盘读入虚拟内存的大小,如果这个值大于0,表示物理内存不够用或者内存泄露了

so  每秒虚拟内存写入磁盘的大小,如果这个值大于0,同上。

bi  块设备每秒接收的块数量,这里的块设备是指系统上所有的磁盘和其他块设备,默认块大小是1024byte

bo 块设备每秒发送的块数量,例如我们读取文件,bo就要大于0。bi和bo一般都要接近0,不然就是IO过于频繁,需要调整。

in 每秒CPU的中断次数,包括时间中断

cs 每秒上下文切换次数,例如我们调用系统函数,就要进行上下文切换,线程的切换,也要进程上下文切换,这个值要越小越好,太大了,要考虑调低线程或者进程的数目。系统调用也是,每次调用系统函数,我们的代码就会进入内核空间,导致上下文切换,这个是很耗资源,也要尽量避免频繁调用系统函数。上下文切换次数过多表示你的CPU大部分浪费在上下文切换,导致CPU干正经事的时间少了,CPU没有充分利用,是不可取的。

us 用户空间占用CPU百分比

sy 内核空间占用CPU百分比,如果太高,表示系统调用时间长,例如是IO操作频繁。

id  空闲 CPU时间

wt 等待IO CPU时间。
如果r经常大于4,且id经常少于40,表示cpu的负荷很重。
[root@server1 ~]# iostat
Linux 2.6.32-431.el6.x86_64 (server1) 	01/17/2019 	_x86_64_	(1 CPU)

avg-cpu:  %user   %nice %system %iowait  %steal   %idle
           0.15    0.00    0.08    0.53    0.00   99.24

Device:            tps   Blk_read/s   Blk_wrtn/s   Blk_read   Blk_wrtn
vda               1.52        55.88         5.09     221964      20218
dm-0              2.33        53.75         5.08     213506      20160
dm-1              0.07         0.60         0.00       2376          0

注:如果%iowait的值过高,表示硬盘存在I/O瓶颈,%idle值高,表示CPU较空闲,如果%idle值高但系统响应慢时,有可能是CPU等待分配内存,此时应加大内存容量。%idle值如果持续低于10,那么系统的CPU处理能力相对较低,表明系统中最需要解决的资源是CPU。

tcpdump抓包工具

tcpdump -i eth1 host 172.25.66.1
tcpdump -i eth1 dst port 1234
tcpdump -i eth1 udp
tcpdump -i eth1 host 172.16.7.206 and port 80 -w /tmp/xxx.cap
tcpdump -i eth1 `tcp[tcpflags]=tcp-syn`
-c:指定要抓取的包数量
-i interface:指定tcpdump需要监听的接口

Linux内存

1:实际内存
实际内存是指一个系统中实际存在的物理内存,称为RAM。实际内存是存储临时数据最快最有效的方式,因此必须尽可能地分配给应用程序
2:交换空间(swap):在内存小于2G的情况下,交换分区应为内存的2倍,超过2G的话,交换分区为物理内存加上2G。交换空间是专门用于临时存储内存的一块磁盘空间,通常在页面调度和交换进程数据时使用

du和df

du:统计目录(或文件)所占磁盘空间的大小。
df:用于显示文件系统的磁盘使用情况。

Linux文件系统

Linux文件系统中的文件是数据的集合,文件系统不仅包含着文件中的数据而且还有文件系统的结构,所有Linux 用户和程序看到的文件、目录、软连接及文件保护信息等都存储在其中。
在Linux中普通文件和目录文件保存在称为块物理设备的磁盘或者磁带上。一套Linux系统支持若干物理盘,每个物理盘可定义一个或者多个文件系统。每个文件系统由逻辑块的序列组成,一个逻辑盘空间一般划分为几个用途各不相同的部分,即引导块、超级块、inode区以及数据区等。
引导块:在文件系统的开头,通常为一个扇区,其中存放引导程序,用于读入并启动操作系统;
超级块:用于记录文件系统的管理信息。特定的文件系统定义了特定的超级块;
inode区(索引节点):一个文件或目录占据一个索引节点。第一个索引节点是该文件系统的根节点。利用根节点,可以把一个文件系统挂在另一个文件系统的非叶节点上;
数据区:用于存放文件数据或者管理数据。

Linux 支持多种文件系统,包括ext2、ext3、vfat、ntfs、iso9660、jffs、romfs和nfs等,为了对各类文件系统进行统一管理,Linux引入了虚拟文件系统VFS(Virtual File System),为各类文件系统提供一个统一的操作界面和应用编程接口。

不同文件系统采用不同的方法来管理磁盘空间,各有优劣;文件系统是具体到分区的,所以格式化针对的是分区,分区格式化是指采用指定的文件系统类型对分区空间进行登记、索引并建立相应的管理表格的过程。
ext3   rhel5及之前的版本   最多支持32TB的文件系统和2t文件,实际2tb文件系统,16G文件
ext4   rhel6             1EB               16TB
xfs    rhel7            18EB              9eb    7G/s     4G/s  

一个ext3的文件分区,当使用touch命令创建一个新文件是报错,报错的信息显示是提示磁盘已满,但是使用df -h命令查看磁盘空间是,只使用了60%的磁盘空间,为什么会出现这种情况?
1.是inode耗尽,因为linux文件的inode是有数量限制的
2.磁盘配额问题

硬链接和软链接

硬链接:
1.只能对文件创建,不能对目录创建
2.不能跨文件系统
3.创建硬链接会增加文件被链接的次数
4.硬链接就是同一个文件使用了多个别名(他们有共同的 inode),删除一个硬链接文件并不影响其他有相同 inode 号的文件。

软链接:
1.可应用与目录
2.可以跨文件系统
3.其大小为指定的路径所包含的字符个数
4.删除软链接并不影响被指向的文件,但若被指向的原文件被删除,则相关软连接就变成了死链接。

硬链接等于cp -p加同步更新。 
软链接像快捷方式,方便我们打开源文件,这一点在windows中深有体会
硬链接节省了硬盘的空间,解决了文件的共享问题

Linux的开机启动过程:

⑴开机BIOS自检,加载硬盘。
⑵读取MBR,MBR引导。
⑶grub引导菜单(Boot Loader:446bytes,根据mbr中的分区表查找活动分区(操作系统所在分区))
⑷加载内核kernel。
⑸启动init进程,依据/etc/inittab文件设定运行级别
⑹init进程,执行rc.sysinit文件。执行的第一个用户层文件
⑺启动内核模块,执行不同级别的脚本程序。
⑻执行/etc/rc.d/rc.local
⑼启动mingetty,进入系统登陆界面。

0:关机
1:单用户
2:无网络的多用户
3:命令行模式
4:未用
5:GUI图形化模式
6:重启

内核的设计风格:
  单内核:工作逻辑简单,安全
     核心:动态加载各种外围内核模块
     模块:存放路径/lib/modules/内核版本号命令的目录/
  GRUB:Grand unified bootloader
    stage1:
    stage2:/boot/grub/
/boot/grub/grub.conf
default=0
timeout=5  #等待用户选择的超时时长,单位是秒
splashimg=   grub的背景图片
hiddenmenu  隐藏菜单
title Red Hat Enterprise    #内核标题或操作系统标题
   root(hd#,N)#内核文件所在的设备:对grub而言,所有类型的硬盘一律为hd,hd#表示第几个磁盘,最后的N表示对应磁盘的分区
   kernel /vmlinuz- #内核文件路径,及传递给内核的参数
   initrd  #ramdisk文件路径

运维的工作用途:

1.保障系统的正常用途。
2.保障数据的安全可靠。
3.负责服务的稳定性,确保服务可以7*24小时不间断的为用户提供服务。
4.确保系统架构的优化来节约成本。
5.确保自动化部署。

zabbix可监控的服务信息: 

1.nginx监控,zabbix配置相应的监控项和图形。
2.percona为数据库服务器进行了改进,提升了高负载下的Innodb性能,为DBA提供了非常有用诊断工具。
3.apache-tomcat(jsp配置jdk环境)部署监控,zabbix配置相应接口,模板,更新即可。

查看linux文件的命令

查看文件内容的命令:
cat     由第一行开始显示内容,并将所有内容输出
tac     从最后一行倒序显示内容,并将所有内容输出
more    根据窗口大小,一页一页的显示文件内容
less    和more类似,但其优点可以往前翻页,而且进行可以搜索字符
head    只显示头几行
tail    只显示最后几行
nl      类似于cat -n,显示时输出行号
tailf   类似于tail -f 

more的功能是将文件从第一行开始,根据输出窗口的大小,适当的输出文件内容。当一页无法全部输出时,可以用“回车键”向下翻行,用“空格键”向下翻页。退出查看页面,请按“q”键。另外,more还可以配合管道符“|”(pipe)使用,例如:ls -al | more

less的功能和more相似,但是使用more无法向前翻页,只能向后翻。less可以使用【pageup】和【pagedown】键进行前翻页和后翻页,这样看起来更方便。
less还有一个功能,可以在文件中进行搜索你想找的内容,假设你想在passwd文件中查找有没有weblogic字符串,输入:/weblogic

vim编辑器

①vi编辑器是linux系统下最最基本和最常用的标准文本编辑器。

②vi编辑器有三种工作模式:普通模式、编辑模式、命令模式。

③普通模式下的键盘输入任何字符都是当作命令来执行的,也可以输入命令进行光标的移动,字符、单词、行的复制、粘帖以及删除等操作。

④编辑模式主要用于文本的输入。在该模式下,用户输入的任何字符都被作为文件的内容保存起来。

⑤命令模式下,用户可以对文件进行一些如字符串查找、替换、显示行号等操作还是必须要进入命令模式的。

⑥在普通模式下输入冒号即可进入命令模式,此时vi窗口的状态行会显示出冒号,等待用户输入命令。“i”插入模式,即可以进行编辑。用户输入完成后,按【Esc】之后编辑器又返回到普通模式下,在命令模式下,保存退出,可以使用的命令为wq和x。前面加!表示强制退出,强制保存等

find命令:

find   path   -option   [   -print ]   [ -exec   -ok   command ]   {} \;
    -mtime -n +n 按照文件的更改时间来查找文件 【-7 7天之内 +7 7天前】
    -type  查找某一类型的文件,诸如:
         b - 块设备文件。
         d - 目录。
         c - 字符设备文件。
         p - 管道文件。
         l - 符号链接文件。
         f - 普通文件。
    -size
find命令删除指定大小的文件:
    find /var/mail/ -size +50M -exec rm -fr {} \;
    find命令查找最近修改的当前目录下的.php文件:
    find . -name '*.php' -mtime 0
    查找指定大小和类型
    find /etc -size +1M -type f
    找出并删除七天前的文件
    find  /tmp/   -type f  -mtime  +7 -print  -exec  rm   -f   {}   \;

文件的归档和压缩

tar   归档文件(把很多个文件变为一个文件)
    -c:创建
    -v:显示过程
    -f:指定归档文件名称
    -t:查看归档文件内容
    -r:添加文件到归档中
    --get:解档指定文件
    --delete:删除归档中的指定文件
tar cvf etc.tar /etc
tar rf etc.tar file
tar -f etc.tar --delete file
tar -f etc.tar --get file

zip(不能归档和压缩一块执行)
     压缩: zip -r xxx.tar.zip  xxx.tar
     解压: unzip xxx.tar.zip

 gz
     压缩:gzip  xxx.tar
     解压:gunzip xxx.tar.gz
     归档压缩:tar zcf xxx.tar.gz  /xxx
              tar zxf xxx.tar.gz
bz2
     压缩:bzip2  xxx.tar
     解压:bunzip2  xxx.tar.bz2
     归档压缩:
           tar jcf xxx.tar.bz2  /xxx
           tar jxf xxx.tar.bz2
 xz
     压缩:xz xxx.tar
     解压:unxz xxx.tar.xz
     归档压缩:
           tar Jcf xxx.tar.xz  /xxx
           tar Jxf xxx.tar.xz

定时任务:

* * * * * command表示格式
分钟 小时 天 月 周 命令
*/5 10,12 * 3-8 *  /usr/sbin/ntpdate 10.0.0.155  >/dev/null  2>&1
2>&1 的意思就是将标准错误重定向到标准输出。这里标准输出已经重定向到了/dev/null。那么标准错误也会输出到/dev/null

在这里插入图片描述

描述Linux下文件删除的原理
Linux系统是通过link的数量来控制文件删除的,只有当一个文件不存在任何link的时候,这个文件才会被删除。一般来说每个文件两个link计数器来控制i_count和i_nlink。当一个文件被一个程序占用的时候i_count就加1。当文件的硬链接多一个的时候i_nlink也加1。删除一个文件,就是让这个文件,没有进程占用,同时i_link数量为0。

磁盘空间不够用,删除一部分nignx日志后,磁盘空间依然不够用,为什么?
未释放磁盘空间的原因:在linux和unix系统中,通过rm或者文件管理器删除文件将会从文件系统的目录结构上解除链接,然而如果文件是被打开的(一个进程正在使用),那么仅承认那个仍然可以读取该文件,磁盘空间也一直被占用。而我删除的是nignx的kog文件,删除的时候文件应该正在被使用
解决方案:重启nginx服务,后者使用>/opt/nginx.log清空日志文件,而不是直接删除

Linux的cpu

运行的进程在内存中保存着相关的要使用的指令与数据

0环:运行内核,处理与硬件相关的操作,如清空缓存与寄存器

内核数据结构:

  task structure:PPID PID NAME

3环:运行用户控件,

1-2环:

当进程用完自己的时间片后,就会暂时退出,进程需要保护现场,保存自己退出时的状态,状态信息由内核进行管理维护,用纵向列表保存各个进程的进程号、父进程号、进程名以及上次结束时的指令------>恢复现场cpu的寄存器会装载task structure,按照其中记录的上次结束时的指令继续将指令加载进cpu进行执行---》进程执行完后退出,销毁进程

内存碎片:为了防止内存碎片及进行进程保护,提出了线性地址空间和物理地址空间的概念。每个进程都认为自己有4G内存空间可用,1G给内核。将内存划分为一个个的页面,固定大小的存储单元为4k,假如当一个进程需要10k的内存,则内核为其分配3个页面,可能是不连续的,但是在进程本身看来是连续的

堆内存

栈内存

MMU:内存管理单元

切换进程:进程上下文切换,也叫进程的环境切换

线程和进程

进程的5种状态:

停止态 
运行和就绪态  
僵尸态  
可中断睡眠  
不可中断睡眠:当一个进程在cpu上正运行时,需要进行I/O调用,则会转为不可中断睡眠

Linux 中的进程睡眠状态有两种:一种是可中断的睡眠状态,其状态标志位为TASK_INTERRUPTIBLE;另一种是不可中断的睡眠状态,其状态标志位为TASK_UNINTERRUPTIBLE。

可中断的睡眠状态的进程会睡眠直到某个条件变为真,如产生一个硬件中断、释放进程正在等待的系统资源或是传递一个信号都可以是唤醒进程的条件。

不可中断睡眠状态与可中断睡眠状态类似,但是它有一个例外,那就是把信号传递到这种睡眠状态的进程不能改变它的状态,也就是说它不响应信号的唤醒。

ftp的主动模式:

Port模式FTP客户端首先和FTP服务器的TCP 21端口建立连接,通过这个通道发送命令,客户端需要接收数据的时候在这个通道上发送PORT命令。 PORT命令包含了客户端用什么端口接收数据。在传送数据的时候,服务器端通过自己的TCP 20端口连接至客户端的指定端口发送数据。 FTP server必须和客户端建立一个新的连接用来传送数据。

主动方式FTP的主要问题实际上在于客户端。FTP的客户端并没有实际建立一个到服务器数据端口的连接,它只是简单的告诉服务器自己监听的端口号,服务器再回来连接客户端这个指定的端口。对于客户端的防火墙来说,这是从外部系统建立到内部客户端的连接,这是通常会被阻塞的

Passive模式在建立控制通道的时候和Standard模式类似,但建立连接后发送的不是Port命令,而是Pasv命令。FTP服务器收到Pasv命令后,随机打开一个临时端口(也叫自由端口,端口号大于1023小于65535)并且通知客户端在这个端口上传送数据的请求,客户端连接FTP服务器此端口,然后FTP服务器将通过这个端口进行数据的传送,这个时候FTP server不再需要建立一个新的和客户端之间的连接。

对于服务器端的防火墙来说,必须允许下面的通讯才能支持被动方式的FTP:
FTP服务器命令(21)端口接受客户端任意端口(客户端初始连接)
FTP服务器命令(21)端口到客户端端口(>1023)(服务器响应客户端命令)
FTP服务器数据端口(>1023)接受客户端端口(>1023)(客户端初始化数据连接到服务器指定的任意端口)
FTP服务器数据端口(>1023)到客户端端口(>1023)(服务器发送ACK响应和数据到客户端的数据端口)

LVS的基本工作原理:

1.当用户向负载均衡调度器(Director Server)发起请求,调度器将请求发往至内核空间。 
2.PREROUTING链首先会接收到用户请求,判断目标IP确定是本机IP,将数据包发往INPUT链. 
3.IPVS是工作在INPUT链上的,当用户请求到达INPUT时,IPVS会将用户请求和自己已定义好的
集群服务进行比对,如果用户请求的就是定义的集群服务,那么此时IPVS会强行修改数据包里的目
标IP地址及端口,并将新的数据包发往POSTROUTING链. 
4.POSTROUTING链接收数据包后发现目标IP地址刚好是自己的后端服务器,那么此时通过选路,将数据包最终发送给后端的服务器. 

LVS的四种模式:

lvs:
   ipvsadm:工作在用户空间,定义集群服务的命令行工具
   ipvs:工作在内核空间,监控在input链上的框架
当有数据请求到达调度器,会被input链上的定义的lvs规则勾住,将本该进入input链的规则转发到forward链再经过postrouting链转发至后端服务器

调度算法:
DR模式:
  DR模式是通过改写请求报文的目的MAC地址,将请求发送给真实服务器,服务器将响应消息直接发送给客户端。
  请求来时源ip为cip,目标ip为vip,由于后端的real server都配置了vip,所以在进行路由时,会通过arp广播将ip地址转换为mac地址,而此时real server的vip也会收到,我们需要在real server上进行配置,隐藏vip。在向后端real server进行转发时,对源地址和目标地址不进行修改,只需将源mac改为dmac,目标mac改为rmac进行转发
 1. 集群节点和direacter必须在同一个物理网络中
 2. rip可以使用公网地址
 3. directer只需处理入栈请求,响应报文则由后端服务
 5. 不支持端口映射

TUN模式:
  即IP隧道实现的虚拟服务器。在TUN模式中,调度器采用ip隧道技术将用户的请求转发到某个选中的Real server上,而这个real server将直接响应客户端的请求,不再经过前端调度器。此外,IP TUN技术对real server的地域位置没有要求,其既可以与lb位于同一网段,也可独立网络中

1.集群节点可以跨越互联网
2.rip必须是公网地址
3.director仅处理入栈请求,响应报文则由后端服务器直接发往客户端
4.只有支持隧道功能的os才能用于realserver

NAT模式:
  通过网络地址转换,调度器重写请求报文的目标地址,根据预设的调度算法,将请求分派给后端的真实服务器;真实服务器的响应报文通过调度器时,报文的源地址被重写,再返回给客户,完成整个负载调度过程。

1.集群节点跟director必须在同一个ip网络中
2.rip通常为私有地址,仅用于个集群节点间的通信
3.支持端口映射
4.realserver必须将网关指向dip
5.director负责处理进出的所有通信,易成为性能瓶颈
缺点:
因为在LVS/NAT 中请求和响应报文都需要通过负载调度器,伸缩能力有限, 当服务器结点数目升到 20 时,调度器本身有可能成为系统的新瓶颈。

LVS的四种模式的优缺点和应用场景: 

1.lVS/NAT的优缺点 
<1>优点: 
   对后端的操作系统没有要求; 
   只需要一个IP地址配置在调度器上,服务器组可以用私有IP地址; 
   支持端口映射; 
<2>缺点: 
   请求和响应都需要通过LB,伸缩能力有限(一般后面能连接10台左右服务器) 
   需要服务器和LB在同一个局域网中; 
   需要将服务器的默认网关设置为LB; 
2.lVS/TUN的优缺点 
<1>优点: 
   不需要调度应答报文,负载能力强; 
   服务器和调度器可以不在同一个VLAN中; 
   支持广域负载均衡; 
<2>缺点: 
   所有的服务器必须支持“IP Tunneling”协议,需安装内核模块,安装复杂; 
   建立IP隧道的开销大; 
   服务器需要联通外网,风险较大; 
   不支持端口映射; 
3.lVS/DR的优缺点 
<1>优点: 
   与TUN相比,没有IP隧道的开销,性能较高; 
<2>缺点: 
   要求LB和服务器都有一块网卡连在同一个物理网段中; 
   不支持端口映射; 
4.四种模式的使用场景: 
VS/NAT:小并发的实验性应用、mysql集群; 
VS/TUN:广域网负载; 
VS/DR:大众方式; 
VS/FULLNAT:人少钱多;

LVS三种模式的区别及负载均衡算法 - 旭日升 - 博客园

LVS的调度算法:

1.RR:轮叫调度,通过轮叫算法将外部请求按顺序分配到集群中的真实服务器。
2.WRR:加权轮叫,自动询问真实服务器情况,并动态调整权值。
3.DH:目标散列地址调度,从散列表中找出对应服务器,若该服务器可用且未超载,将请求发送到该服务器。
4.SH:源地址hash,根据源地址从散列表中找出对应服务器,若该服务器可用且未超载,将请求发送到该服务器。
5.LC:最小链接,将网络请求分配到链接数最小的服务器。
6.WLC:加权最小链接调度器,自动问询真实服务器情况动态调整其权值。

lvs,nginx,haproxy三种负载均衡软件:

LVS的特点:
1、抗负载能力强。抗负载能力强、性能高,能达到F5硬件的60%;对内存和cpu资源消耗比较低
2、工作在网络4层,通过vrrp协议转发(仅作分发之用),具体的流量由linux内核处理,因此没有流量的产生。
2、稳定性、可靠性好,自身有完美的热备方案;(如:LVS+Keepalived)
3、应用范围比较广,工作在四层,所以不用考虑要处理的具体应用,可以对所有应用做负载均衡;
4、不支持正则处理,不能做动静分离。
5、支持负载均衡算法:rr(轮循)、wrr(带权轮循)、lc(最小连接)、wlc(权重最小连接)
6、配置 复杂,对网络依赖比较大,稳定性很高。

Ngnix的特点:
1、工作在网络的7层之上,可以针对http应用做一些分流的策略,比如针对域名、目录结构;
2、Nginx对网络的依赖比较小,理论上能ping通就就能进行负载功能;
3、Nginx安装和配置比较简单,测试起来比较方便;
4、也可以承担高的负载压力且稳定,一般能支撑超过1万次的并发;
5、对后端服务器的健康检查,只支持通过端口来检测,不支持通过url来检测。
6、Nginx对请求的异步处理可以帮助节点服务器减轻负载;
7、Nginx仅能支持http、https和Email协议,这样就在适用范围较小。
8、不支持Session的直接保持,但能通过ip_hash来解决。
9、支持负载均衡算法:Round-robin(轮循)、Weight-round-robin(带权轮循)、Ip-hash(Ip哈希)
10、Nginx还能做Web服务器即Cache功能。

HAProxy的特点:
1、支持两种代理模式:TCP(四层)和HTTP(七层),支持虚拟主机;
2、能够补充Nginx的一些缺点比如Session的保持,Cookie的引导等工作
3、支持url检测后端的服务器出问题的检测会有很好的帮助。
4、更多的负载均衡策略比如:动态加权轮循(Dynamic Round Robin),加权源地址哈希(Weighted Source Hash),加权URL哈希和加权参数哈希(Weighted Parameter Hash)已经实现
5、单纯从效率上来讲HAProxy更会比Nginx有更出色的负载均衡速度。
6、HAProxy可以对Mysql进行负载均衡,对后端的DB节点进行检测和负载均衡。
9、支持负载均衡算法:Round-robin(轮循)、Weight-round-robin(带权轮循)、source(原地址保持)、RI(请求URL)、rdp-cookie(根据cookie)
10、不能做Web服务器即Cache

nginx的日志格式

定义日志格式(以下为常用的日志格式 可各自按需调整格式):

log_format main '$remote_addr - $remote_user [$time_local] "$request" '

'$status $body_bytes_sent "$http_referer" '

'"$http_user_agent" "$http_x_forwarded_for"';

参数明细表:

$remote_addr

客户端的ip地址(代理服务器,显示代理服务ip)

$remote_user

用于记录远程客户端的用户名称(一般为“-”)

$time_local

用于记录访问时间和时区

$request

用于记录请求的url以及请求方法

$status

响应状态码,例如:200成功、404页面找不到等。

$body_bytes_sent

给客户端发送的文件主体内容字节数

$http_user_agent

用户所使用的代理(一般为浏览器)

$http_x_forwarded_for

可以记录客户端IP,通过代理服务器来记录客户端的ip地址

$http_referer

可以记录用户是从哪个链接访问过来的

nginx日志切割

按天存放日志:随着时间的推移,日志量会越来越大,不方便编辑查看,为了让日志按天存放,可以做一些配置,设置一个定时任务,每天凌晨00:00开始备份昨天的日志,然后重新开启一个新的日志文件。具体实现如下:

vi /root/nginx_logback.sh

#!/bin/bash
YESTERDAY=$(date -d "yesterday" +"%Y-%m-%d")
LOGPATH=/usr/local/openresty/nginx/logs/
PID=${LOGPATH}nginx.pid
mv ${LOGPATH}access.log ${LOGPATH}access-${YESTERDAY}.log
mv ${LOGPATH}error.log ${LOGPATH}error-${YESTERDAY}.log

kill -USR1 `cat ${PID}`

变更脚本为可执行文件,并将脚本作为定时任务启动脚本,放入crontab中。
chmod +x nginx_logback.sh
crontab -e
 
#!/bin/bash
0 0 * * * /bin/bash /root/nginx_logback.sh

常见的http状态码

1**信息,服务器收到请求,需要请求者继续执行操作
2**成功,操作被成功接收并处理
3**重定向,需要进一步的操作以完成请求
4**客户端错误,请求包含语法错误或无法完成请求
5**服务器错误,服务器在处理请求的过程中发生了错误
301Moved Permanently永久移动。请求的资源已被永久的移动到新URI,返回信息会包括新的URI,浏览器会自动定向到新URI。今后任何新的请求都应使用新的URI代替
302Found临时移动。与301类似。但资源只是临时被移动。客户端应继续使用原有URI
403Forbidden服务器理解请求客户端的请求,但是拒绝执行此请求
404Not Found服务器无法根据客户端的请求找到资源(网页)。通过此代码,网站设计人员可设置"您所请求的资源无法找到"的个性页面
502Bad Gateway作为网关或者代理工作的服务器尝试执行请求时,从远程服务器接收到了一个无效的响应
503Service Unavailable由于超载或系统维护,服务器暂时的无法处理客户端的请求。延时的长度可包含在服务器的Retry-After头信息中
504Gateway Time-out

充当网关或代理的服务器,未及时从远端服务器获取请求

http的get和post方法

表单提交中get和post方式的区别有5点

1.get是从服务器上获取数据,post是向服务器传送数据。

2.get是把参数数据队列加到提交表单的ACTION属性所指的URL中,值和表单内各个字段一一对应,在URL中可以看到。post是通过HTTPpost机制,将表单内各个字段与其内容放置在HTML HEADER内一起传送到ACTION属性所指的URL地址。用户看不到这个过程。

3.对于get方式,服务器端用Request.QueryString获取变量的值,对于post方式,服务器端用Request.Form获取提交的数据。

4.get传送的数据量较小,不能大于2KB。post传送的数据量较大,一般被默认为不受限制。但理论上,IIS4中最大量为80KB,IIS5中为100KB。

5.get安全性非常低,post安全性较高。
https://www.cnblogs.com/huaxingtianxia/p/5895236.html
$0 这个程式的执行名字 
$n 这个程式的第n个参数值,n=1..9 $* 这个程式的所有参数,此选项参数可超过9个。 
$# 这个程式的参数个数 
$$ 这个程式的PID(脚本运行的当前进程ID号) 
$! 执行上一个背景指令的PID(后台运行的最后一个进程的进程ID号) 
$? 执行上一个指令的返回值 (显示最后命令的退出状态。0表示没有错误,其他任何值表明有错误) 
$- 显示shell使用的当前选项,与set命令功能相同 
$* 脚本后跟的所有字符串,模式为"1 2 3"一串字符
$@ 脚本后跟的所有字符串,模式为"1""2""3"三串字符

Linux设置最大文件打开数

在Linux下有时会遇到Socket/File : Can't open so many files的问题。其实Linux是有文件句柄限制的,而且Linux默认一般都是1024(阿里云主机默认是65535)。在生产环境中很容易到达这个值,因此这里就会成为系统的瓶颈。
查看进程允许打开的最大文件句柄数:ulimit -nHS
    -H和-S选项设定指定资源的硬限制和软限制
需要注意的是ulimit提供的是对特定shell可利用的资源的控制,而shell是与具体用户相关的。因此ulimit提供的是对单个用户的限制。

vim /etc/security/limits.conf
limits.conf文件是用于提供对系统中的用户所使用的资源进行控制和限制,对所有用户的资源设定限制是非常重要的,这可以防止用户发起针对处理器和内存数量等的拒绝服务攻击。

#*               soft    core            0
#*               hard    rss             10000
#@student        hard    nproc           20
limits.conf与ulimit的区别在于前者是针对所有用户的,而且在任何shell都是生效的,即与shell无关,而后者只是针对特定用户的当前shell的设定。在修改最大文件打开数时,最好使用limits.conf文件来修改,通过这个文件,可以定义用户,资源类型,软硬限制等。也可修改/etc/profile文件加上ulimit的设置语句来是的全局生效。

修改系统的总限制:
echo  6553560 > /proc/sys/fs/file-max
上面是临时生效方法,重启机器后会失效;

永久生效方法:
修改 /etc/sysctl.conf, 加入
s.file-max = 6553560 重启生效

其实在程序运行时,由于内存的管理方式是以页为单位的,而且程序使用的地址都是虚拟地址,当程序要使用内存时,操作系统再把虚拟地址映射到真实的物理内存的地址上。所以在程序中,以虚拟地址来看,数据或代码是一块块地存在于内存中的,通常我们称其为一个段。而且代码和数据是分开存放的,即不储存于同于一个段中,而且各种数据也是分开存放在不同的段中的。

Linux进程内存空间有以下几个部分:
以下的数据由上到下是从低地址向高地址

text段:text段就是代码段,用来存放程序的代码(如函数)和部分整数常量。text段是可以执行的,而且不被不同的进程共享。

data段:初始化过的全局变量数据段,该段用来保存初始化了的非0的全局变量。与bss段不同的是,data段中的变量既占程序运行时的内存空间,也占程序文件的储存空间。

BSS段:该段用来存放没有被初始化或初始化为0的全局变量,因为是全局变量,所以在程序运行的整个生命周期内都存在于内存中

heap段:heap(堆)是最自由的一种内存,它完全由程序来负责内存的管理,包括什么时候申请,什么时候释放,而且对它的使用也没有什么大小的限制。

stack段:栈段,用来保存临时变量和函数参数。程序中的函数调用就是以栈的方式来实现的,通常栈是向下(即向低地址)增长的,当向栈中push一个元素,栈顶指针就会向低地址移动,当从栈中pop一个元素,栈顶指针就会向高地址移动。栈中的数据只在当前函数或下一层函数中有效,当函数返回时,这些数据自动被释放,如果继续对这些数据进行访问,将发生未知的错误。
入栈的序列为e1,e2,e3,e4,e5,求出栈的序列有几种

f(n)=C(2n,n)/(n+1)

devops

DevOps(Development和Operations的组合词)是一组过程、方法与系统的统称,用于促进开发(应用程序/软件工程)、技术运营和质量保障(QA)部门之间的沟通、协作与整合。
它是一种重视“软件开发人员(Dev)”和“IT运维技术人员(Ops)”之间沟通合作的文化、运动或惯例。透过自动化“软件交付”和“架构变更”的流程,来使得构建、测试、发布软件能够更加地快捷、频繁和可靠。
它的出现是由于软件行业日益清晰地认识到:为了按时交付软件产品和服务,开发和运营工作必须紧密合作。

你是否了解运维岗位?在提倡devops的当下,运维岗位的工作是否可以完全被产品开发同事接手替代?

当网站流量比较大的时候,我们一般需要对网站进行流量均衡。请写出你所知道的在分布式环境下,服务器负载均衡的办法。

为何使用docker?docker的优点,docker网络,数据持久化

TCP和UDP的区别?它两各自适用的场景

(1)是否面向连接
TCP是面向连接的,即发送数据前需要与目标主机建立连接。
UDP面向无连接的,发送数据前不需要建立连接。
(2)是否提供可靠交付
TCP在传输数据之前,需要三次握手来建立连接,并且通过数据校验、拥塞控制、重传控制、滑动窗口和确认应答等机制来实现可靠交付。数据传输过程中,数据无丢失,无重复,无乱序。
UDP不提供可靠交付,只有通过检验和去丢弃那些不完整的报文,尽最大努力来保证交付的可靠性。
(3)工作效率
前面提到TCP传输数据的控制非常多,这也导致了TCP网络开销大,工作效率相对低下,对系统的资源要求也比较高。
UDP传输控制简单,因此工作效率相对高,对系统资源的要求偏低。
(4)实时性
TCP传输数据的控制程序较多,大幅度降低了数据传输的实时性。
UDP协议简单,数据实时性较高。
(5)安全性
TCP传输机制多,容易被利用,例如DOS、DDOS攻击,因此在安全性上,不如UDP。
UDP没有TCP这么多机制,被利用的机会就会少很多,但UDP不是绝对安全,也会被攻击。

TCP与UDP的适用场景
TCP:
对数据传输的质量有较高要求,但对实时性要求不高。比如HTTP,HTTPS,FTP等传输文件的协议以及POP,SMTP等邮件传输的协议,应选用TCP协议。
UDP:
只对数据传输的实时性要求较高,但不对传输质量有要求。比如视频传输、实时通信等,应选用UDP协议。

在第四次挥手时,为什么A要先进入TiME-WAIT状态,等待2MSL时间才进入closed状态?

为了保证B能收到A的确认应答,若A发送完应答直接进入CLOSED状态,如果该应答丢失,B等待超时后会重新发送释放请求,
但此时A已经关闭,不会有任何响应,因此B永远无法正常关闭。
TCP连接的11种状态:

1)、LISTEN:首先服务端需要打开一个socket进行监听,状态为LISTEN
2)、SYN_SENT:客户端通过应用程序调用connect进行active open.于是客户端tcp发送一个SYN以请求建立
一个连接.之后状态置为SYN_SENT
3)、SYN_RECV:服务端应发出ACK确认客户端的SYN,同时自己向客户端发送一个SYN. 之后状态置为SYN_RECV
4)、ESTABLISHED: 代表一个打开的连接,双方可以进行或已经在数据交互了。
5)、FIN_WAIT1:主动关闭(active close)端应用程序调用close,于是其TCP发出FIN请求主动关闭连接,之后
进入FIN_WAIT1状态
6)、CLOSE_WAIT:被动关闭(passive close)端TCP接到FIN后,就发出ACK以回应FIN请求,并进入CLOSE_WAIT. 
7)、FIN_WAIT2:主动关闭端接到ACK后,就进入了FIN-WAIT-2
8) 、LAST_ACK:被动关闭端一段时间后,接收到文件结束符的应用程序将调用CLOSE关闭连接。这导致它的TCP
也发送一个 FIN,等待对方的ACK.就进入了LAST-ACK
9)、TIME_WAIT:在主动关闭端接收到FIN后,TCP就发送ACK包,并进入TIME-WAIT状态。等待足够的时间以确
保远程TCP接收到连接中断请求的确认。
10)、CLOSING: 比较少见等待远程TCP对连接中断的确认
11)、CLOSED: 被动关闭端在接受到ACK包后,就进入了closed的状态。

Linux的发行版:
ubantu、centos、debian、Redhat、fedura、suse

cat /dev/urandom | head -1 | md5sum | head -c 32 >> /pass

假设你是一个 小型网站的管理员。周末的时候,你在自己家里发现网站打不开了,请问你能做哪些操作或方法,来确定是什么问题?

 1. 用自己的电脑访问百度网站,以检查是否自己电脑问题; 2. 联系自己朋友,看看其他人能否打开网站; 3. 使用ping 命令 ping 网站服务器地址,检查服务器是否正常; 4. 登陆服务器,使用netstat 命令检查80端口是否打开; 5. 登陆服务器,使用 ps 命令检查 http 进程是否存在; 6. 登陆服务器,检查网站日志;
Linux的fork()使用写时拷贝(copy-on-write)页实现。写时拷贝是一种可以推迟甚至避免拷贝数据
的技术。内核此时并不复制整个进程的地址空间,而是让父子进程共享同一个地址空间。只用在需要写
入的时候才会复制地址空间,从而使各个进行拥有各自的地址空间。也就是说,资源的复制是在需要写
入的时候才会进行,在此之前,只有以只读方式共享。这种技术使地址空间上的页的拷贝被推迟到实际
发生写入的时候。

1.你为什么要投递蚂蚁金服?你说蚂蚁开源了一些中间件,具体有什么你了解过吗?

2.你投了哪些别的公司?手上有哪些Offer?

3.相比于别人,你有哪些优势呢?

4.你觉得你自己哪些方面还有不足呢?你觉得自己以后要进步还有啥可以提升的地方?

6.我看系统中你的简历投递是八月初,为什么到八月才投递简历呢(我说我想抽时间复习一些基础知识)?你复习的内容包括什么呢?

8.你对地点有什么要求呢?

9.你有什么想问我的呢?(我说前面面试已经了解得差不多了,没有想问的)

二、运维工程师必要的软技能

运维工程师这个行业并不是所有人都适合做的,你最好能需要有如下品质:

1.安全意识:作为运维工程师的你必须要有安全意识,保障你系统的安全性、稳定性,堤防系统被入侵,保障账号密码/私钥的安全极其重要。

2.责任心:不多说,任何职位都需要。

3.细心:运维工程师通常权限很大,你的任何一个操作或不经意的失误可能导致重大灾难。比如错敲命令、误删数据库等。因此,细心极为重要。

4.抗压能力:重大灾难发生时,你会面临这样的情况:客户催你解决、应用催你解决、老板紧盯你…,这时,你需要有一颗冷静的头脑,分析出最快解决问题的方案并加以实施。如若压力一来,你方寸大乱,然问题迟迟不能解矣。

RAID阵列

磁盘阵列(Redundant Arrays of Independent Drives,RAID),有“独立磁盘构成的具有冗余能力的阵列”之意。磁盘阵列是由很多块独立的磁盘,组合成一个容量巨大的磁盘组,利用个别磁盘提供数据所产生加成效果提升整个磁盘系统效能。
作用:保证数据的安全以及增强读写能力,高性能、可靠性、容错能力、扩展性

Raid0模式:最少需要两块盘, 没用冗余数据,不做备份,任何一块磁盘损坏都无法运行。n块磁盘(同类型)
的阵列理论上读写速度是单块磁盘的n倍(实际达不到),风险性也是单一n倍(实际更高),是磁盘阵列中
存储性能最好的。适用于安全性不高,要求比较高性能的图形工作站或者个人站。

RAID1模式:此模式下,两块硬盘互为镜像。当一个硬盘受损时,换上一块全新硬盘(大于或等于原硬盘容量)替代原硬盘即可自动恢复资料和继续使用,移动硬盘的实际容量等于较小一块硬盘的容量,存储速度与单块硬盘相同。RAID 1的优势在于任何一块硬盘出现故障是,所存储的数据都不会丢失。
缺点:该模式可使用的硬盘实际容量比较小,仅仅为两颗硬盘中最小硬盘的容量。
备注:非常重要的资料,如数据库,个人资料,是万无一失的存储方案。

RAID5模式:RAID5不对存储的数据进行备份,而是把数据和相对应的奇偶校验信息存储到组成RAID5的各
个磁盘上,并且奇偶校验信息和相对应的数据分别存储于不同的磁盘上。当RAID5的一个磁盘数据发生损坏
后,利用剩下的数据和相应的奇偶校验信息去恢复被损坏的数据。

1、RAID10的情况

这种情况中,我们假设当DISK0损坏时,在剩下的3块盘中,只有当DISK1一个盘发生故障时,才会导致整个RAID失效,我们可简单计算故障率为1/3。

2、RAID01的情况

这种情况下,我们仍然假设DISK0损坏,这时左边的条带将无法读取。在剩下的3块盘中,只要DISK2,DISK3两个盘中任何一个损坏,都会导致整个RAID失效,我们可简单计算故障率为2/3。
因此RAID10比RAID01在安全性方面要强。

  • 1
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值