zabbix监控(监控mysql队列和mysql主从)
php的三种工作模式;用在apache和nginx上;
fast-cgi(nginx常用)
web模块模式(apache常用)
cli命令模式(命令行用的多)
fast-cgi模式:CGI通过网关接口,把网页和web服务器中的执行程序连接起来,用在html和web
服务器的通道,可以一直执行着;
(html---->web服务器执行程序) web服务器执行程序---->html;
fastcgi是以独立进程池来运行;
web模块模式,以mod_php5模块形式存在,作用是接受apapche传递的php文件请求,并处理请求,并
发送给apache,负责和mysql交互;
有动态和静态(编译进apache的核心里)两种编译方式;
常用fastcgi方式;独立运行的服务;
httpd+spawn-fcgi
nginx+php-fpm
结合模式的方式:apapche+mod_php5
apache的工作模式,
perfork 进程模式,占用资源多,稳定,并发一般;
worker 线程模式,占用资源少,稳定性差,并发,长连接问题;
event 解决长连接问题;
perfork 的修改并发数的值: MaxClient 150,
如果perfork修改了并发数的大小,也需要修改ServerLimit 1500(20000是最大值,还需要更大,
则重新编译)才可以,不然会报错;需要放在其他指令前面才生效;
/usr/local/apache/sbin/httpd -l
ServerLimit的大小等于每个进程用2M,内存总大小*80%/2M=
还可以调整maxspareservers(最大空闲)和minsparesserver(最小空闲)这两个参数;
在一台并发访问在2000的服务器,maxspareserver设置为200;
maxrequestsperchild 10000 可以防止内存泄露,表示每个子进程在其生命周期内处理的最大
请求数,超过后子进程被结束, 0表示永远不结束;
maxkeepalivedrequests 100 表示一个keepalived连接建立后允许发送的请求的个数,一旦
建立连接后,要么等连接数达到后断开,要么等keepalivedtimeout时间到断开;
keepalivedtimeout 如果超过时间还没有请求,就会被断开;
所以apache可设置参数有六个:
MaxClient ServerLImit maxspareserver
maxrequestsperchild maxkeepalivedreequests keepalivedtimout
nginx的正向代理和反向代理;
正向代理代理的是客户端;
反向代理代理的是服务器;nginx一台是代理,两台就是负载均衡了;
nginx的负载均衡模式四种;通过 upstream { }
轮询(默认) 把每个请求逐一分配到后端的服务器;
weight带权重的轮询;后跟weight 值;权重高的服务器请求多一点;
ip_hash 每个请求按访问IP的hash结果分配,通一个IP客户访问会固定在一台服务器上,解决
session问题;
url_heash 根据url的hash结果分配,是每个url定向到同一台服务器,后台服务器会缓存一些些
;
fair:可以按照服务器的响应时间来分配,响应时间短的的优先分配,nginx本身不支持fair,如
果需要使用这种调度算法,必须要下载nginx的upstream_fair模块;
也可以设置后端负载均衡服务器的状态;
当设置为其中一台为down,这表示这台server不参与负载;
upstream zrlog {
ip_hash;
server 192.168.118.160:80;
server 192.168.118.161:80 down;
Nginx主备配置
upstream zrlog {
ip_hash;
server 192.168.118.160:80;
server 192.168.118.161:80 backup;
}
设置一个节点为backup,一般情况下所有请求都会都访问server1,当server1挂掉或者忙的时候
才会访问server2; 并且backup不能和ip_hash一起使用,因为ip_hash会固定访问一台服务器,而
backup只有server挂后才能访问备server2,当设置为ip_hash后,服务器出现故障后,就无法请
求了;
tomcat的目录结构;
bin conf lib log NOTICE RELEASE-NOTES sim.pid webapps
BUILDING.txt CONTRIBUTING.md LICENSE temp work
backup:用来备份,和conf下的内容是一样子的;
bin:存在tomcat的启动startup.sh和关闭脚本(shutdown.sh)(bat表示windows下使用,sh表示
linux下的使用.) startup.bat shutdown.bat
conf:存放tomcat的全局配置文件,backup作为它的备份,其中catalina设置默认加载的项
目,catalina设置tomcat的内存大小,context.xml配置数据源的东西,
logging.properties记录tomcat服务器运行的日记记录,
server.xml用来设置域名\端口号\IP地址,网站目录等;
web.xml设置tomcat服务器支持的文件类型;
Catalina catalina.properties logging.properties web.xml context.xml
server.xml
lib:存放tomcat服务器所需要的所有jar包;用来给创建的项目共享jar包;
log:日记文件;
temp:运行过程中产生的临时文件;删除无影响;
webapps:tomcat默认部署路径,存放应用程序,应用程序可以以三种形式发布:
war包
jar包
普通文件
work:存放tomcat运行时编译后的文件,清空work目录,重启tomcat才能达到清除tomcat服务器缓
存的目的;
LICENSE NOTICE README.md RUNNING.txt存放签证 运行 安装的一些信息
2:修改tomcat的监听端口为80:
/usr/local/tomcat/conf/server.xml配置文件里的
<Connector port="80" protocol="HTTP/1.1">
3:设置toomcat内存大小;默认的是128兆;
当应用程序需要的内存超出最大值JVM就会提示内存溢出,需要修改内存大小;
/usr/local/tomcat/bin/catalina.bat文件:
JAVA_OPTS='-Xms256m -Xmx512'
集群:
lvs nginx haproxy的优缺点;
lvs:工作在四层,通过vrrp协议,对网络依赖较大,配置负载,但负载性能强,对硬件资源消耗少,
一般结合LVS+keepalived或者lvs+hearbeat,lvs对任何应用都可以负载均衡;
支持的模式有:NAT tunnel DR
支持的负载算法有:rr(轮询) wrr(加权轮询) lc(最小连接) wrlc(权重最小连接)
nginx:工作在七层,对网络依赖小,能ping通就可以,按照配置简单,支持高并发(一万次)和高
负载,缺点是只支持http https emali的协议,使用访问小;对后端服务器只能通过端口来检测
,不支持通过URL检测;
支持的负载均衡算法: rr(轮询) wrr(加权轮询) ip_hash(会话保持) fair(第三方模块
upstream_fair支持)
HAproxy:
支持负载四层(TCP)和七层(HTTP),支持负载mysql,支持虚拟主机;
支持url后端检测;
补充了nginx的会话(session)保持功能;
负载均衡策略: drr(动态加权轮询) wsh(加权源地址哈希) wph(加权url哈希)
负载均衡算法: rr(轮询) wrr(加权轮询) source(原地址保持) Rl(请求URL)
高可用:keepalived
工作流程:keepalived是以VRRP协议为基础的,虚拟路由冗余协议;
有N台工作功能相同的路由器组成一个路由器组,这个组里有一个master和多个backup,master上
有一个对外提供服务器的VIP地址,master会发送vrpp组播包,当backup收不到vrrp组播包,就会
认为master down了,这时候会根据VRRP的优先级来选举其中backup来当master,保证路由器的
高可用;
keepalived的三个模块;
core check vrrp
core模块: keepalived的核心,负责主进程的启动、维护以及全局配置文件的加载;
check模块: 负责健康检查; 心跳线;
vrrp: 用来实现vrrp协议;
脑裂的解决办法:
在一个高可用节点中,当连着两个阶段的之间的心跳线断开后,本来一个整体系统分割成两个独
立节点,这时两个节点就可以开始争抢共享资源,都是自己是master,导致系统混乱,数据损坏;
解决keepalived脑裂问题;
1、正常情况keepalived的VIP在主节点,如果从节点发现了VIP,就设置脚本告警;脚本部署咱从
节点上;
注释:如果在iptables不放行vrrp规则的话,也会出现脑裂;
2、可以写一个while死循环脚本,每次ping网关地址,累计失败次数一定后则关闭keepalived,如
果发现能ping通网关了,在重启keepalived服务,简历写到crontab里面;
脑裂脚本:
vim split-brainc_check.sh
#!/bin/bash
# 检查脑裂的脚本,在备节点上进行部署
LB01_VIP=192.168.1.229
LB01_IP=192.168.1.129
LB02_IP=192.168.1.130
while true
do
ping -c 2 -W 3 $LB01_VIP &>/dev/null
if [ $? -eq 0 -a `ip add|grep "$LB01_VIP"|wc -l` -eq 1 ];then
echo "ha is brain."
else
echo "ha is ok"
fi
sleep 5
done
mysql主从,多主,一主多从 mysql replication
原理:AB复制 多主已从从5.7开始支持的;
mysql主从是基于binlog日记,主必须开启binlog才能主从,设置log-bin
主从server-id不同
主从涉及到三个线程:主(dumplog) 从(I/O线程 SQL线程)
mysql的主从同步流程:
主master将更改操作记录到binlog中,通过线程dump log来和从的I/O线程建立通信,(slave请求从指定日记文件的指定位置之后的日记内容)从通过I/O线程收到binlog后写到reloay log(中继日记),并通过线程sql来按顺序执行reloaylog里的语句:
show slave status\G;
增insert 删delete 改update 查select
跨库查询:用navicat,在本地创建一个链接表,并指定用federated引擎(用来访问远程数据库的表中的数据); fai de rui ta
注意:本地表结构和远程表要完全一样,远程数据库仅限mysql,不支持事务和表结构修改,
主从: 读写分离 备份恢复 高可用
1、不停库不锁表在线对mysql做主从复制,使用xtrabackup实现全量 增量 单表备份和恢复; 2.3版本自从myisam
因为mysqldump对到处10G以下的数据库和表是没压力,大于后则力不从心;
无需停库进行innodb热备;增量备份mysql,比较容易创建主从同步;
复制类型:异步复制和半同步复制;
默认是异步复制:即每次主库执行完命令提交后,在主库写入binlog后则返回客户端,而不会等binlog日记传送给从库,一旦主库宕机,可能会丢失日记;
半同步复制:即每次主库执行完命令提交后,会等到从库收到binlog并写入到relaylog后,才返回给客户端;会在主从上分别保留两份日记记录;
下面开始配置主从:
主从版本一致—>主库授权复制帐号—>确保开启binlog及主从server_id唯一—>xtrabackup恢复到从库—>记录xtrabackup_binlog_info中binlog名称及偏移量—>从库change master to —>slave start—>检查两个yes
mysql主从复制出现的问题:
1、slave_SQL_Running值为NO,
可能是在slave上进行的写操作,也可能是slave机器重启造成的;
解决1:先stop slave; 再start slave;
解决2:先stop slave: 然后查看主服务器的当前bin_log日记名和偏移量;然后在从上执行手动同步,再开启start slave;
2、主库自己cp rm删除mysql数据库的表, rm /data/mysql/test
因为删除不是通过SQL语句,无法写入bin log,从上没有相关操作;
解决:在从上也手动操作此表,以后通过SQL语句来操作;
3、slave的中继日记relay-log损坏; 宕机 非法关机等
在主库上找到bin-log和POS点,重做同步;
同步延迟处理办法:表示master执行成功后到slave执行成功的时间差;
分析:一般是磁盘读写耗时,网络传输耗时,SQL执行耗时;
如何查看主从延迟?
通过在从上show slave status\G; 然后看Seconds_Behind_Master = 0 正值时延越大,
比如当主库的网络出问题时,从库的I/O线程不能复制bin-log时,而从上SQL线程一直能跟上I/O的脚步,这是也会显示0,实际上作为查看延迟并不准;
2:使用pt-heartbeat工具
主从延迟的影响: HA无法切换 读写分离失效 主备容灾失败
解决:优化索引 减弱主从延迟 在前端和数据之间增加缓存层,减弱数据库的压力,slave只数据备份,不分担访问流量;
flush tables with read lock; 主库要锁表
开启慢查询日记定位慢SQL;
show variables like 'slow_query%'; 查询是否开启
set global slow_query_log='ON'; 打开慢查询日记功能
/etc/my.cnf
[mysqld]
slow_query_log = ON
slow_query_log_file = /var/lib/mysql/test-10-226-slow.log
long_query_time = 1
为什么tomcat要结合nginx来使用;
nginx可以实现反向代理tomcat的8080端口,可以实现负载均衡的功能,tomcat处理静态内容不如nginx,所以静态交给nginx,tomcat负责动态的请求;
tomcat接受的最大并发数有限,需要利用nginx的高并发低消耗的特点和tomcat一起使用;
静态放在nginx服务中通过绝对路径访问,动态通过url拼接字符串的方式访问;
memcached
redis
zabbix: zabbix-server zabbix-agent zabbix-get
五个组件: zabbix-server zabbix-agent zabbix-proxy 数据库 web界面
cacti和nagios zabbix
cacti和somkping成图非常好看,适合监控网络设备,我们机房也有在用的这个;需要mysql保存有历史数据;
nagios不需要mysql支持,不能成图,不支持web,需要插件才可以,注重监控状态;
zabbix:需要mysql和php的支持,能成图,会把监控信息显示图形化,可以自定义监控节点;
报警预告等; 支持自动发现---->磁盘或者网卡
采用C/S架构;
主动模式和被动模式(对客户端而言) 客户端端口:10051 服务端端口:10050
客户端多个时候建议使用主动模式;
客户端在内网,但是可以通过nat来上网,建议使用主动模式;
也支持代理使用zabbix-proxy
zabbix客户端会定时收集本机的监控信息(cpu 内存 某个服务的状态值)
然后将这些信息上报给zabbix-server端,zabbix服务端收到信息后会存储在数据库里,并在web界面下显示处理,通过添加监控主机-配置监控项目-设置告警阀值,当触发告警条件时,则发邮件或者短信告警;
zabbix-get:服务端的一个工具,这个工具可以通过命令行获取客户端的监控项目的数据;
zabbix_get -s 192.168.149.130 -p 10050 -k 'my.estab.count'(-k在zabbix_agent中定义)
zabbix监控主从复制:
#!/bin/bash
mysql -uzabbix -e 'show slave status\G' |grep -E "Slave_IO_Running|Slave_SQL_Running"|awk '{print $2}'|grep -c Yes
监控mysql的连接数:
监控80端口的并发连接数:
#!/bin/bash
netstat -ant |grep ':80 ' |grep -c ESTABLISHED
首先在/usr/local/sbin/下写脚本如上,然后在客户端配置文件/etc/zabbix/zabbix_agentd.conf下添加脚本路径:
UnsafeUserParameters=1 #允许使用自定义脚本:开启脚本功能:
UserParameter=my.estab.count[*],/usr/local/sbin/estab.sh
脚本整理:
1、判断一个网段内IP地址在线情况:
#!/bin/bash
##
for i in `seq 1 254`
do
ping -c1 -w1 192.168.0.$i
if [ "$?" -eq 0 ]
then
echo "192.168.0.$i" >> 1.txt
fi
done
2、批量创建20个用户:
#!/bin/bash
groupadd users
for name in `seq -w 1 20`
do
useradd -g users user_$name
done
创建用户user01---user20:并自定义密码为user后跟5个随机字符?
#/bin/bash
groupadd users
for name in `seq -w 1 20`
do
pw=`echo $RANDOM|md5sum|cut -c 1-5`
echo "user$pw"|passwd --stdin user$name
echo "user$name user$pw" >> /root/pw.txt
done
监控mysql主从脚本:
#!/bin/bash
#
I=`netstat -tnlp|grep 3306|awk -F ":" '{print $4}'`
#echo $I
for T in $I ;do
SIO=`/usr/local/mysql/bin/mysql -uroot -p'nihao123!' -e 'show slave status\G' |egrep Slave_IO_Running |awk -F ":" '{print $2}'`
SSQL=`/usr/local/mysql/bin/mysql -uroot -p'nihao123!' -e 'show slave status\G' |egrep Slave_SQL_Running |awk -F ":" '{print $2}'`
if [[ $SIO == " Yes" && $SSQL == " Yes" ]];then
echo "slave $T is ok" >>/slave-ok.txt
else
echo "$T is none"
fi
done
备份mysql的脚本:
cat /usr/local/script/BackupDatabase
#!/bin/bash
user=root
password=nihao123!
database1=zblog
database2=zabbix
backup_dir=/data/backup/database/ #备份数据库文件的路径
logfile=/data/backup/database/data_backup.log #备份数据库脚本的日志文件
date=`date +%Y%m%d-%H%M -d -3minute` #获取当前系统时间-3分钟
dumpfile1=$data-zblog.sql #需要备份的数据库名称
dumpfile2=$data-zabbix.sql
tar_data1=$dumpfile1-tar.gz #备份的数据库压缩后的名称
tar_data2=$dumpfile2-tar.gz
if [ ! -d $backup_dir ]; #判断备份路径是否存在,若不存在则创建该路径
then
mkdir -p "$backup_dir"
fi
cd $backup_dir #跳到备份路径下
/usr/local/mysql/bin/mysqldump -u$user -p$password $databse1 > $dumpfile1 #使用mysqldump备份zalog数据库
if [ $? -eq 0 ]
then
tar czvf $tar_data1 $dumpfile1 >> /dev/null 2>&1
else
echo “$tar_data1 Backup Fail!” >> /tmp/mysqldump_error.$data
fi
/usr/local/mysql/bin/mysqldump -u$user -p$password $database2 > $dumpfile2
if [ $? -eq 0 ]; then
tar czvf $tar_data2 $dumpfile2 >> /dev/null 2>&1
else
echo “$tar_data2 Backup Fail!” >> /tmp/mysqldump.error.$data
fi
MySQL调优可以从几个方面来做:
1. 架构层:
做从库,实现读写分离;
2.系统层次:
增加内存;
给磁盘做raid0或者raid5以增加磁盘的读写速度;
可以重新挂载磁盘,并加上noatime参数,这样可以减少磁盘的i/o;
3. MySQL本身调优:
(1) 如果未配置主从同步,可以把bin-log功能关闭,减少磁盘i/o
(2) 在my.cnf中加上skip-name-resolve,这样可以避免由于解析主机名延迟造成mysql执行慢
(3) 调整几个关键的buffer和cache。调整的依据,主要根据数据库的状态来调试。如何调优可以参考5.
4. 应用层次:
查看慢查询日志,根据慢查询日志优化程序中的SQL语句,比如增加索引
5. 调整几个关键的buffer和cache
1) key_buffer_size 首先可以根据系统的内存大小设定它,大概的一个参考值:1G以下内存设定128M;2G/256M; 4G/384M;8G/1024M;16G/2048M.这个值可以通过检查状态值Key_read_requests和 Key_reads,可以知道key_buffer_size设置是否合理。比例key_reads / key_read_requests应该尽可能的低,至少是1:100,1:1000更好(上述状态值可以使用SHOW STATUS LIKE ‘key_read%’获得)。注意:该参数值设置的过大反而会是服务器整体效率降低!
2) table_open_cache 打开一个表的时候,会临时把表里面的数据放到这部分内存中,一般设置成1024就够了,它的大小我们可以通过这样的方法来衡量: 如果你发现 open_tables等于table_cache,并且opened_tables在不断增长,那么你就需要增加table_cache的值了(上述状态值可以使用SHOW STATUS LIKE ‘Open%tables’获得)。注意,不能盲目地把table_cache设置成很大的值。如果设置得太高,可能会造成文件描述符不足,从而造成性能不稳定或者连接失败。
3) sort_buffer_size 查询排序时所能使用的缓冲区大小,该参数对应的分配内存是每连接独占!如果有100个连接,那么实际分配的总共排序缓冲区大小为100 × 4 = 400MB。所以,对于内存在4GB左右的服务器推荐设置为4-8M。
4) read_buffer_size 读查询操作所能使用的缓冲区大小。和sort_buffer_size一样,该参数对应的分配内存也是每连接独享!
5) join_buffer_size 联合查询操作所能使用的缓冲区大小,和sort_buffer_size一样,该参数对应的分配内存也是每连接独享!
6) myisam_sort_buffer_size 这个缓冲区主要用于修复表过程中排序索引使用的内存或者是建立索引时排序索引用到的内存大小,一般4G内存给64M即可。
7) query_cache_size MySQL查询操作缓冲区的大小,通过以下做法调整:SHOW STATUS LIKE ‘Qcache%’; 如果Qcache_lowmem_prunes该参数记录有多少条查询因为内存不足而被移除出查询缓存。通过这个值,用户可以适当的调整缓存大小。如果该值非常大,则表明经常出现缓冲不够的情况,需要增加缓存大小;Qcache_free_memory:查询缓存的内存大小,通过这个参数可以很清晰的知道当前系统的查询内存是否够用,是多了,还是不够用,我们可以根据实际情况做出调整。一般情况下4G内存设置64M足够了。
8) thread_cache_size 表示可以重新利用保存在缓存中线程的数,参考如下值:1G —> 8 2G —> 16 3G —> 32 >3G —> 64
除此之外,还有几个比较关键的参数:
9) thread_concurrency 这个值设置为cpu核数的2倍即可
10) wait_timeout 表示空闲的连接超时时间,默认是28800s,这个参数是和interactive_timeout一起使用的,也就是说要想让wait_timeout 生效,必须同时设置interactive_timeout,建议他们两个都设置为10
11) max_connect_errors 是一个MySQL中与安全有关的计数器值,它负责阻止过多尝试失败的客户端以防止暴力破解密码的情况。与性能并无太大关系。为了避免一些错误我们一般都设置比较大,比如说10000
12) max_connections 最大的连接数,根据业务请求量适当调整,设置500足够
13) max_user_connections 是指同一个账号能够同时连接到mysql服务的最大连接数。设置为0表示不限制。通常我们设置为100足够
shell数组相关;
定义数组:
A=(a b c d e) echo ${A[@]} = echo ${A[*]}
echo ${A[@]}
echo ${A[2]} 第二个元素
echo ${#A[@]} 打印元素个数;
a[3]=aaa echo ${a[@]} 更改第三位数组;
unset A[3] 删除数组;
TCP三次握手
LVS的三个模式
apapche的三个工作模式及优缺点
打印tcp的连接
netstat -an | awk '/^tcp/ {++S[$NF]} END {for(a in S) print a, S[a]}'