Linux运维工程师工作手册
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
Linux运维工程师工作手册
释放内存:
sync
echo3>/proc/sys/vm/drop_caches
Linux查看Dell服务器型号
命令:
dmidecode|grep"ProductName"
查看系统负载:
cat/proc/loadavg
1/
意思是:前三个是系统负载,1/283中,1代表此时运行队伍中的进程个数,而283是代表此时的进程总数
10904到此为止,最后创建的一个进程ID;
系统装好后,要做的事如下:
关闭防火墙Selinux:
vim/etc/selinux/config
把SELINUX=enforcing改成SELINUX=disabled
更改主机名:
vim/etc/sysconfig/network
修改主机名,不要用localhost
添加hosts主机记录
vim/etc/hosts中,在后面,添加自己的主机名
创建0-9a-z目录
foriin`seq09`{a..z};domkdir-p$i;done:
测试硬盘性能工具:iozone
监视服务器每少上下文切换数次工具:Nmon很不错的性能监视工具
占用内存大小前10的进程
ps-eocomm,size--sort-size|head-10
占用cp u使用前10的进程
ps-eocomm,pcpu--sort-pcpu|head-10
一、Apache服务优化:2
1.配置cronolog进行日志轮询2
2.错误页面优雅显示2
文件压缩功能3
缓存功能4
5.更改apache的默认用户5
模式,提升并发数可以达到2000-50005
7.屏蔽apache版本等敏感信息6
目录文件权限设置root,目录755,文件6446 9.开启增加连接数6
防盗链功能8
11.禁止目录Index8
12.禁止用户覆盖重载8
13.关闭CGI9
14.避免使用.htaccess文件分布式配置文件9 的安全模块9
16.正确途径取得源代码,勤打apache补丁10 日志授予root700权限10
18.系统内核参数优化10
19.禁止PHP解析指定站点的目录10
20.使用tmpfs文件系统替代频繁访问的目录11 21尽可能减少HTTP请求数11
22使用CDN做网站加速12
查看你的服务器网络连接状态
netstat-n|awk'/^tcp/{++S$NF}END{forainSprinta,Sa}'
◆CLOSED:无连接是活动的或正在进行
◆LISTEN:服务器在等待进入呼叫
◆SYN_RECV:一个连接请求已经到达,等待确认
◆SYN_SENT:应用已经开始,打开一个连接
◆ESTABLISHED:正常数据传输状态
◆FIN_WAIT1:应用说它已经完成
◆FIN_WAIT2:另一边已同意释放
◆ITMED_WAIT:等待所有分组死掉
◆CLOSING:两边同时尝试关闭
◆TIME_WAIT:另一边已初始化一个释放
◆LAST_ACK:等待所有分组死掉
ESTABLISHED的值其实也是当前的并发数,这个可重点关注下;另外,可关注下TIME——WAIT这项的数值;Linux下高并发的Squid服务器,TCPTIME_WAIT套接字数量经常达到两、三万,服务器很容易被拖死;通过修改Linux内核参数,可以减少Squid服务器的TIME_WAIT套接字数量;
查看系统本地可用端口极限值
cat/proc/sys/net/ipv4/ip_local_port_range
寻找恶意IP并用iptables禁止掉
netstat-an|grep:80|grep-v|awk'{print$5}'|sort|awk-F:'{print$1,$4}'|uniq-
c|awk'$1>50{print$1,$2}'
备份单个数据库
mysqldump-u用户–p’密码’--default-character-set=latin1数据库名>备份文件名数据库默认编码是latin1
普通备份:
mysqldump-uroot-p'oldboy123'oldboy>/server/bak/
压缩备份:
mysqldump-uroot-p'oldboy123'oldboy|gzip>/server/bak/
设置字符集备份:
mysqldump-uroot-p'oldboy123'oldboy--default-character-
set=gbk|gzip>/server/bak/
执行结果:
rootoldboy~mkdir/server/bak-p
rootoldboy~mysqldump-uroot-p'oldboy123'oldboy>/server/ba
backup/bak/
rootoldboy~mysqldump-uroot-p'oldboy123'oldboy>/server/bak/
rootoldboy~mysqldump-uroot-p'oldboy123'oldboy|gzip>/server/bak/
rootoldboy~ls-l/server/bak/
total8
-rw-r--r--1rootroot1991Apr900:51
-rw-r--r--1rootroot801Apr900:51
mysqldump在做啥
mysqldump实际上就是把数据从mysql库里以逻辑的sql语句的形式导出;
备份的数据过滤掉注释:
rootoldboy~egrep-v"\|--|^$"/server/bak/
DROPTABLEIFEXISTS`test`;
CREATETABLE`test`
`id`int4NOTNULLAUTO_INCREMENT,
`name`char20NOTNULL,
PRIMARYKEY`id`
ENGINE=MyISAMAUTO_INCREMENT=12DEFAULTCHARSET=gbk;
LOCKTABLES`test`WRITE;
INSERTINTO`test`VALUES1,'zhaoyue',2,'jesse',4,'elain',5,'wodi',6,'yingsui',7,' zhangyang',8,'zaixiangpan',9,'',10,'钥佺敺瀛,11,'鎴;<==这里是乱码,是因为导出时的格式没加字符集,而系统当前字符集又是格式,一般恢复到数据库里会正常,只是系统外查看不正常而已;另外insert是批量插入的方式,这样在恢复时效率很高;
UNLOCKTABLES;
提示:看到了吧,就是我们曾经插入的表和数据;
rootoldboy~mysqldump-uroot-p'oldboy123'oldboy--default-character-
set=gbk>/server/bak/
rootoldboy~egrep-v"\|--|^$"/server/bak/
DROPTABLEIFEXISTS`test`;
CREATETABLE`test`
`id`int4NOTNULLAUTO_INCREMENT,
`name`char20NOTNULL,
PRIMARYKEY`id`
ENGINE=MyISAMAUTO_INCREMENT=12DEFAULTCHARSET=gbk;
LOCKTABLES`test`WRITE;
INSERTINTO`test`VALUES1,'zhaoyue',2,'jesse',4,'elain',5,'wodi',6,'yingsui',7,' zhangyang',8,'zaixiangpan',9,'',10,'老男孩',11,'我';<==;其他乱码是当初插入时就有问题的;
UNLOCKTABLES;
备份多个库
rootoldboy~mysqldump-uroot-p'oldboy123'-Boldboymysql--default-character-
set=gbk>/server/bak/
提示:-B参数是关键,表示接多个库;
※※※※※生产环境常用
-B,;
regardedasdatabasenames.'USEdb_name;'willbe
includedintheoutput.
参数说明:该参数用于导出若干个数据库,在备份结果中会加入USEdb_name和CREATEDATABASE`db_name`;
-B后的参数都将被作为数据库名;该参数比较常用;当-B后的数据库列全时同-A参数;请看-A的说明;
备份单个表
mysqldump-u用户名-p数据库名表名>备份的文件名
mysqldump-uroot-poldboytest>
执行结果:
rootoldboy~mysqldump-uroot-p'oldboy123'oldboytest--default-character-
set=gbk>/server/bak/
提示:无-B参数,库oldboy后面就是test表了;
备份多个表
rootoldboy~mysqldump-uroot-p'oldboy123'oldboytestett--default-character-
set=gbk>/server/bak/
rootoldboy~egrep-v"\|--|^$"/server/bak/
DROPTABLEIFEXISTS`test`;
CREATETABLE`test`
`id`int4NOTNULLAUTO_INCREMENT,
`name`char20NOTNULL,
PRIMARYKEY`id`
ENGINE=MyISAMAUTO_INCREMENT=12DEFAULTCHARSET=gbk;
LOCKTABLES`test`WRITE;
INSERTINTO`test`VALUES1,'zhaoyue',2,'jesse',4,'elain',5,'wodi',6,'yingsui',7,' zhangyang',8,'zaixiangpan',9,'',10,'老男孩',11,'我';
UNLOCKTABLES;
DROPTABLEIFEXISTS`ett`;
CREATETABLE`ett`
`id`int11DEFAULTNULL
ENGINE=MyISAMDEFAULTCHARSET=gbk;
LOCKTABLES`ett`WRITE;
UNLOCKTABLES;
备份数据库结构不包含数据
mysqldump-uroot-d-p'oldboy'oldboyoldboy>
-d只备份表结构
rootoldboy~mysqldump-uroot-p'oldboy123'-doldboy>/tmp/
rootoldboy~egrep-v"\|--|^$"/tmp/
DROPTABLEIFEXISTS`ett`;
CREATETABLE`ett`
`id`int11DEFAULTNULL
ENGINE=MyISAMDEFAULTCHARSET=gbk;
DROPTABLEIFEXISTS`test`;
CREATETABLE`test`
`id`int4NOTNULLAUTO_INCREMENT,
`name`char20NOTNULL,
PRIMARYKEY`id`
ENGINE=MyISAMAUTO_INCREMENT=12DEFAULTCHARSET=gbk;
更多用法可以执行mysqldump–help查询;有关mysql和mysqldump同学们要详细总结; 5恢复数据库
source命令恢复
进入mysql数据库控制台,mysql-uroot-p
mysql>use数据库
然后使用source命令,后面参数为脚本文件如这里用到的.sql
mysql>source这个文件是系统路径;
rootoldboybakmysql-uroot-p'oldboy123'
;or\g.
...skip...
Type'help;'or'\h''\c'toclearthecurrentinputstatement.
mysql>useoldboy
Databasechanged
mysql>showtables;
+------------------+
|Tables_in_oldboy|
+------------------+
|ett|
|test|
+------------------+
2rowsinsetsec
mysql>droptablestest;
QueryOK,0rowsaffectedsec
mysql>systemls.
mysql>source./<==还是用第一版没加字符集的备份,就是备份后查看乱码的备份; QueryOK,0rowsaffectedsec
...skip...
QueryOK,0rowsaffectedsec Q...skip...
QueryOK,0rowsaffectedsec
mysql>selectfromtest;
+----+-------------+
|id|name|
+----+-------------+
|1|zhaoyue|
|2|jesse|
|4|elain|
|5|wodi|
|6|yingsui|
|7|zhangyang|
|8|zaixiangpan|
|9||
|10||<==乱码
|11||
+----+-------------+
10rowsinsetsec
mysql>setnamesgbk;
QueryOK,0rowsaffectedsec
mysql>selectfromtest;
+----+-------------+
|id|name|
+----+-------------+
|1|zhaoyue|
|2|jesse|
|4|elain|
|5|wodi|
|6|yingsui|
|7|zhangyang|
|8|zaixiangpan|
|9||
|10|老男孩|<==仍然是正常的,就是说备份不加字符集导出,将来恢复不会影响恢复的数据,但是备份后查看文件会乱码;
|11|我|
+----+-------------+
10rowsinsetsec
mysql命令恢复标准
mysql-uoldboy-p'oldboy'oldboy<
mysql>systemmysql-uroot-p'oldboy123'oldboy<<==导入的是备份时加字符集的版本;
mysql>selectfromtest;
+----+-------------+
|id|name|
+----+-------------+
|1|zhaoyue|
|2|jesse|
|4|elain|
|5|wodi|
|6|yingsui|
|7|zhangyang|
|8|zaixiangpan|
|9||
|10|老男孩|<==因为上文source导入时已经setnamesgbk了,所以此处不是乱码;
|11|我|
+----+-------------+
10rowsinsetsec
MyISAM引擎备份
由于MyISAM引擎为表级锁,因此,在备份时需要防止在备份期间数据写入而导致不一致,所以,在备份时使用--lock-all-tables加上读锁
mysqldump-A-F-B--lock-all-tables|gzip>/data/backup/$date+%F.
特别提示:有关MyISAM和InnoDB引擎的差别和在工作中如何选择,在前面的文章已经详细讲解过了,这里就不在讲了;
InnoDB引擎备份
InnoDB引擎为行锁,因此,备份时可以不对数据库加锁的操作,可以加选项--single-transaction进行备份:
mysqldump-A-F-B--single-transaction|gzip>/data/backup/$date+%F.
特别注意:
1--single-transaction仅适用于InnoDB引擎;
生产环境mysqldump备份命令
mysqldump–uroot–p–S/data/3306/–default-character-set=gbk–single-transaction–F–Boldboy|gzip>/server/backup/mysql_$date+%F.
:注
-F:刷新bin-log参数,数据库备份完以后,会刷新bin-log
增量备份:
更新bin-log:
mysqladmin–uroot–p–S/data/3306/flush-logs
如生成文件
把生成的最新文件,CP到/var/backup/
把二进制的日志生成sql语句:
mysqlbinlog>
如果有多个库,我们应该用-d来指定恢复单个库
mysqlbinlog–doldboy>当然对于库也要分库备,否则恢复还是麻烦
还原数据:先还原全备,再还原增备
先还原全备:mysql–uroot–p<
还原增备:mysql–uroot–p<恢复增备的时候,需要把误操作的语句删掉后,再还原,否则,还原后,还是会和误操作后一样
基于时间点的增量恢复
mysqlbinlog–start-datetime=’2011-03-1902:58:54’—stop-datetime=’2011-03-1903:22:44’–r
上面语句将显示02:58:54-----2011-03-1903:22:44时间段的binlog,并输出到
拽定开始时间到文件结束
mysqlbinlog–start-datetime=’2011-03-1902:58:54’–doldboy–r
这个语句只有开始时间,那么就是从2011-03-1902:58:54时刻到日志结尾,lodboy数据库的binlog输出到
基于位置点的增量恢复
指定开始位置和结束位置
mysqlbinlog–start-position=510–stop-position=1312–r
输出初始位置510,结束位置1312的所有binlog日志到
注意:结尾的日志点细弱特殊不会被包含;即输出1312pos以前的binlog;
指定开始位置到文件结束
mysqlbinlog–start-position=510–r
输出初始位置510,结束位置到文件结尾的所有binlog到;当然,你也可以指定库名输出binlog;如:
mysqlbinlog--start-position=510–r–doldboy
从文件开头到指定结束位置
mysqlbinlog--stop-position=954-r
输出从文件开始位置,到954位置截止的所有binlog
掌握和查找打开的文件
lsof列出打开的文件实用程序会显示打开的文件名;其选项仅显示某些进程,只有一个进程的某些文件描述符,或只有某些网络连接网络连接使用文件描述符,就像普通文件一样,lsof也显示这些;使用ps–ef确定了可疑进程后,输入以下命令:
lsof-s-ppid
服务器最大设置的连接数:151
mysql>showvariableslike'max_connections';
+-----------------+-------+
|Variable_name|Value|
+-----------------+-------+
|max_connections|151|
+-----------------+-------+
1rowinsetsec
服务器响应的最大连接数:152
mysql>showglobalstatuslike'Max_used_connections';
|Variable_name|Value|
+----------------------+-------+
|Max_used_connections|152|
+----------------------+-------+
1rowinsetsec
查看服务器key_buffer_size数值:4
mysql>showvariableslike'key_buffer_size';
+-----------------+-----------+
|Variable_name|Value|
+-----------------+-----------+
|key_buffer_size|4|
+-----------------+-----------+
1rowinsetsec
查看服务器现在使用的key_buffer_size使用情况:key_read_requests:4
key-reads:830525
mysql>showglobalstatuslike'key_read%';
|Variable_name|Value|
+-------------------+-----------+
|Key_read_requests|4|
|Key_reads|830525|
+-------------------+-----------+
2rowsinsetsec
计算索引未命中的概率:
key_cache_miss_rate=key_reads/key_read_requests100%
达到%以下即每1000个请求有一个直接读硬盘以下都很好,如果key_cache_miss_rae在%以下的话,则说明key_buffer_size分配得过多,可以适当减少;
Key_blocks_unused表示未使用的缓存簇数,Key_blocks_used表示曾经用到的最大的blocks数,比如这台服务器,所有的缓存都用到了,要么增加key_buffer_size,要么就是过度索引,把缓存占满了;比较理想的设置是:
key_blocks_used/key_blocks_unused+key_blocks_used100%=80%
mysql>showglobalstatuslike'key_blocks_u%';
+-------------------+--------+
|Variable_name|Value|
+-------------------+--------+
|Key_blocks_unused|317003|
|Key_blocks_used|6439|
+-------------------+--------+
2rowsinsetsec
临时表:
当执行语句时,关于已经被创造了的隐含临时表的数量,我们可以用如下命令查询其具体情况:
mysql>showglobalstatuslike'created_tmp%';
+-------------------------+--------+
|Variable_name|Value|
+-------------------------+--------+
|Created_tmp_disk_tables|343326|
|Created_tmp_files|172|
|Created_tmp_tables|675795|
+-------------------------+--------+
3rowsinsetsec
每次创建临时表时,created_tmp_tables都会增加,如果是在磁盘上创建临时
表,created_tmp_disk_tables也会增加;created_tem_files表示MYSQL服务创建的临时文件数,比较理想的配置是:
Created_Tmp_disk_tables/Created_tmp_tables100%<=25%
比如上面服务器Created_Tmp_disk_tables/Created_tmp_tables100%=50%,比较差了;
我们再看一下MYSQL服务器对临时表的配置:
mysql>showvariableswhereVariable_namein'tmp_table_size','max_heap_table_size';
+---------------------+----------+
|Variable_name|Value|
+---------------------+----------+
|max_heap_table_size||
|tmp_table_size||
+---------------------+----------+
2rowsinsetsec
只有16M以下的临时表才能全部放在内存中,超过的就会用到硬盘临时表;
打开表的情况
Open_tables表示打开表的数量,Opend_tables表示打开过的表数量,我们可以用如下命令查看其具体情况:
mysql>showglobalstatuslike'open%tables%';
+---------------+--------+
|Variable_name|Value|
+---------------+--------+
|Open_tables|512|
|Opened_tables|234200|
+---------------+--------+
2rowsinsetsec
如果Opened_tables数量过大,说明配置中tables_cacehMYSQL之后这个值叫做table_open_cache的值可能太小;我们查询一下服务器table_cache值:
mysql>showvariableslike'table_open_cache';
+------------------+-------+
|Variable_name|Value|
+------------------+-------+
|table_open_cache|614|
+------------------+-------+
1rowinsetsec
比较合适的值为:
Open_tables/Opened_tables100%>=85%
Open_tables/table_open_cache100%<=95%
进程使用情况
如果我们在MYSQL服务器的配置文件中设置了thread-cache_size,当客户端断开之时,服务器处理此客户请求的线程将会缓存起来以响应下一个客户而不是销毁前提是缓存数未达上限;Threads_created表示创建过的线程数,我们可以用如下命令查看:
mysql>showglobalstatuslike'Thread%';
+-------------------+-------+
|Variable_name|Value|
+-------------------+-------+
|Threads_cached|7|
|Threads_connected|2|
|Threads_created|2124|
|Threads_running|2|
+-------------------+-------+
4rowsinsetsec
如果发现Threads_created的值过大的话,表明MYSQL服务器一直在创建线程,这也是比较耗费资源的,可以适当增大配置文件中的thread_cache_size的值;查询服务器
thread_cahce_size配置,如下所示:
mysql>showvariableslike'thread_cache_size';
+-------------------+-------+
|Variable_name|Value|
+-------------------+-------+
|thread_cache_size|8|
+-------------------+-------+
1rowinsetsec
查询缓存
它涉及的主要有两个参数,query_cache_size是设置MYSQL的Query_Cache大
小,query_cache_size是设置使用查询缓存的类型,我们可以用如下命令查看其具体情况:
mysql>showglobalstatuslike'qcache%';
+-------------------------+----------+
|Variable_name|Value|
+-------------------------+----------+
|Qcache_free_blocks|130|
|Qcache_free_memory||
|Qcache_hits||
|Qcache_inserts|2391041|
|Qcache_lowmem_prunes|0|
|Qcache_not_cached|671718|
|Qcache_queries_in_cache|676|
|Qcache_total_blocks|1798|
+-------------------------+----------+
8rowsinsetsec
我们再查询一下服务器上关于query-cache的配置命令如下:mysql>showvariableslike'query_cache%';
+------------------------------+----------+
|Variable_name|Value|
+------------------------------+----------+
|query_cache_limit|1048576|
|query_cache_min_res_unit|4096|
|query_cache_size||
|query_cache_type|ON|
|query_cache_wlock_invalidate|OFF|
+------------------------------+----------+
5rowsinsetsec
排序使用情况
它表示系统中对数据进行排序时所使用的Buffer,我们可以用如下命令查看:
mysql>showglobalstatuslike'sort%';
+-------------------+-----------+
|Variable_name|Value|
+-------------------+-----------+
|Sort_merge_passes|84|
|Sort_range|393425|
|Sort_rows|2|
|Sort_scan|324383|
+-------------------+-----------+
4rowsinsetsec
Sort_merge_passes包括如下步骤:MYSQL首先会尝试在内存中做排序,使用的内存大小由系统变量sort_buffer_size来决定,如果它不够大则把所有的记录都读到内存中,而MYSQl则会把每次在内存中排序的结果存到临时文件中,等MYSQL找到所有记录之后,再把临时文件中的记录做一次排序;这次再排序就会增加sort_merge_passes;实际上,MYSQL会用另一个临时文件来存储再次排序的结果,所以我们通常会看到sort_merge_passes增加的数值是建临时文件数的两倍;因为用到了临时文件,所以速度可能会比较慢,增大
sort_buffer_size会减少sort_merge_passes和创建临时文件的次数,但盲目地增加
sort_buffer_size并不一定能提高速度;
文件打开数open_files
我们在处理MYSQL故障时,发现当open_files大于open_files_limit值时,MYSQL数据库就会发生卡住的现象,导致APACHE服务器打不开相应页面;这个问题大家在工作中应注意,我们可以用如下命令查看其具体情况:
mysql>showglobalstatuslike'open_files';
+---------------+-------+
|Variable_name|Value|
+---------------+-------+
|Open_files|901|
+---------------+-------+
1rowinsetsec
mysql>showvariableslike'open_files_limit';
+------------------+-------+
|Variable_name|Value|
+------------------+-------+
|open_files_limit|1185|
+------------------+-------+
1rowinsetsec
比较适合的设置是:open_files/open_files_limit100%<=75%
带宽的大小
通常我们在架构网站的时候,会设定一些目标,比如网站每天要能承受千万PV的访问量,这时我们要估算一下大概需要多大的带宽;计算带宽大小主要的有2个主要指标峰值流量和页面大小,我们先做出必要的假设:
1.峰值流量是平均流量的3倍;
2.每次访问平均的页面大小是100KB左中;
如果1000万PV的访问量在一天内平均分布,每秒大约120次访问,如果按平均每次访问页面大小是100KB字节计算,120次访问总计大约就是12000KB;字节的单位是Byte,而带宽单位是bit,它们之间的关系是1Byte=8bit,所以12000kByte大致就相当于96000kbit,也就是90Mbps的样子;实际上,我们的网站必须能在峰值流量时保持正常运行状态,所以按照假设的峰值流量计算,真实带宽的需求应该在270Mbps左右;
当然,这个结论是根据前面提到的两点假设得出来的,具体值则需要根据公司实际情况来计算;
数据库服务器是重中之重,因为网站的瓶颈问题大多出在数据库身上;现在一般的中小网站多使用MYSQL数据库;一般而言,使用MYSQL数据库的时候,我们应该配置为一个主从一方多从结构,主数据库服务器使用InnoDB表结构,从数据服务器使用MyiSAM表结构;这样充分发挥它们各大自的优势,而且这样的方从分离了读写操作,降低了读操作的压力;我们还可以设定一个专门的从服务器作为备份服务器,有时候还需要借助
mc ached/'target='_blank'>Memcached之类的第三方软件,以便适应更大访问量的要求;
跟踪进程:
找其中一个CPU100%的php-cgi进程的PID,用以下命令跟踪一下:
strace-p10747
如果屏幕显示:
select7,6,6,,{15,0}=1out6,left{15,0}
poll{fd=6,events=POLLIN},1,0=0Timeout
select7,6,6,,{15,0}=1out6,left{15,0}
poll{fd=6,events=POLLIN},1,0=0Timeout
select7,6,6,,{15,0}=1out6,left{15,0}
poll{fd=6,events=POLLIN},1,0=0Timeout
select7,6,6,,{15,0}=1out6,left{15,0}
poll{fd=6,events=POLLIN},1,0=0Timeout
那么,就可以确定是file_get_contents导致的问题了;
lsof
lsof-i:80显示占用80端口的进程
lsof-p1457显示进程号为1457的进程所打开的文件
查看服务器型号:
dmidecode-ssystem-product-name。