咱们如今处理MySQL故障时,发现当Open_files大于open_files_limit值时,MySQL数据库就会发生卡住的现象,致使Nginx服务器打不开相应页面。这个问题你们在工做中应注意,咱们能够用以下命令查看其具体状况:php
比较合适的设置是:Open_files / Open_files_limit * 100% < = 75%java
不少时候咱们会发现,经过参数设置进行性能优化所带来的性能提高,并不如许多人想象的那样会产生质的飞跃,除非是以前的设置存在严重不合理的状况。咱们不能将性能调优彻底依托与经过DBA在数据库上线后进行参数调整,而应该在系统设计和开发阶段就尽量减小性能问题。(重点在于前期架构合理的设计及开发的程序合理)。mysql
MySQL愈来愈被更多企业接受,随着企业发展,MySQL存储数据日益膨胀,MySQL的性能分析、监控预警、容量扩展议题愈来愈多。“工欲善其事,必先利其器”,那么咱们如何在进行MySQL性能分析、监控预警、容量扩展问题上获得更好的解决方案,就要利用各类工具来对MySQL各类指标进行分析。本文是读书笔记,下面说起的工具,读者可能都用过,或打算准备是使用。
MySQL服务器的发布包没有包含那些能完成许多常见任务的工具,例如监控服务器的工具、比较服务器间数据的工具。咱们把这些工具分红如下几类:界面、监控、分析和辅助工具。
linux
这些工具均可以避免费使用:
a、MySQL查询浏览器(MySQL Query Browser):这个不用说了…
b、MySQL管理员(MySQL Administrator):功能集中在服务器管理上,因此它最适合DBA使用,而不是开发人员和分析人员。它能够帮助DBA把建立备份 、建立用户并分配权限、显示服务器日志和状态信息等过程进行自动化处理。它还包括了一些基本的监控功能,例如图形化的状态变量显示,可是它没有下文里会提到的交互式监控工具那么灵活。
c、MySQL迁移工具箱(MySQL Migration Tookit):能够帮你把数据从别的数据库系统迁移到MySQL里。
d、MySQL工做台(MySQL Workbench):MySQL的建模工具。
ios
SQLyog是最经常使用的MySQL可视化工具,只能用于win下。
nginx
phpMyAdmin是一款很流行的管理工具,它基于Web界面来管理MySQL服务器。有不少支持者,但反对者也很多。
git
Nagiosgithub
监控界流行一句话:只要用顺了Nagios,你就永远不会再想到其它监控系统。
对于Nagios本blog会持续推出相关文章,如今只是引用Nagios官方的介绍:
Nagios是一款用于系统和网络监控的应用程序。它能够在你设定的条件下对主机和服务进行监控,在状态变差和变好的时候给出告警信息。
Nagios最初被设计为在Linux系统之上运行,然而它一样能够在类Unix的系统之上运行。
Nagios更进一步的特征包括:监控网络服务(SMTP、POP三、HTTP、NNTP、PING等);
监控主机资源(处理器负荷、磁盘利用率等);
简单地插件设计使得用户能够方便地扩展本身服务的检测方法;
并行服务检查机制;
具有定义网络分层结构的能力,用”parent”主机定义来表达网络主机间的关系,这种关系可被用来发现和明晰主机宕机或不可达状态;
当服务或主机问题产生与解决时将告警发送给联系人(经过EMail、短信、用户定义方式);
具有定义事件句柄功能,它能够在主机或服务的事件发生时获取更多问题定位;
自动的日志回滚;能够支持并实现对主机的冗余监控;可选的WEB界面用于查看当前的网络状态、通知和故障历史、日志文件等;
下面是可代替Nagios的工具:
web
Zenosssql
Zenoss是用Python编写的,拥有基于浏览器的用户界面,并使用了Ajax使操做更加快捷而富有效率。它将监控、报警、趋势显示、图表显示和记录历史数据等功能合成在一个统一的工具里,它还能在网上自动发现资源,在默认状况下,Zenoss使用SNMP从远程机器上收集数据,但它也可使用SSH,而且支持Nagios插件。
Hyperic HQ
Hyperic HQ是一款基于Java的监控系统,它的目标跟其余同类别的软件不太同样,它要成为企业级的监控系统。跟Zenoss同样,它也能自动发现资源,支持Nagios插件,可是它的逻辑组织和架构很不同,显得有点庞大。至于它是否是合适你的需求,那要看你的参数设置和监控的方式了。
OpenNMS
OpenNMS是由Java编写的,拥有一个活跃的开发者社区。它具有了常规的功能,例如监控和报警,也加入了图表和趋势显示的功能。它的目标是高性能、伸缩性、自动化以及良好的兼容性。跟Hyperic同样,它也企图成为一款企业级的监控软件,能够用于大型的关键系统上。
Groundwork Open Source
Groundwork Open Source其实是基于Nagios的,它把Nagios和其余几个工具集成为一个系统,并安上一个统一的门户界面。描述它的最好方法可能就是:若是你对Nagios、Cacti及其余工具很熟悉,而且可以花大量的时间把它们无缝地集成在一块儿的话,你也能在家庭做坊里作一个出来。
Zabbix
Zabbix是一个开源监控系统,在许多方面跟Nagios很相像,可是也有一些关键的不一样点。例如:它把全部配置信息和其余数据都存放在一个数据库里,而不是放在配置文件里;它比Nagios存储了更多类型的数据,这样能够生成更好的趋势图和历史报告。它的网络图表和可视化功能也优于Nagios。不少使用它的人发现它更易配置,更具备兼容性。提及来它也能比Nagios少,它的报警功能也不够高级。
严格地说,RRDTool不算是一个监控系统,可是,它很重要,有必要在此提到一下。不少组织里都是使用几种脚本或程序–这些通常都是自制的–从服务器那里读取信息,而后再保存到循环数据库(Round-robin database,RRD)文件里。在许多要获取记录生成图表的环境下,RRD文件是一个很合适的解决方案。它们能聚合输入的数据,若是输入数据值没有定期在随后提交进行时,还能在随后插入这些丢失的数据。它们还都带有强大的图表工具,可以生成漂亮的不同凡响的图表。如今已经有一些基于RRDTOOL的系统可供使用了。
a、Muti Router Traffic Grapher,或者叫MRTG就是一款典型的基于RRDTOOL的系统。它真正的设计初衷是记录网络数据流,可是它也被扩展用来记录和图表化表示其余一些东西。
b、Munin是一个能为你采集数据的系统,将它放入RRDTool后,就会根据数据生成不一样粒度的图表。它能从配置信息里生成静态的HTML文件,这样你就能够轻松地浏览,查看趋势状况。
c、Cacti是另一个经常使用的图表和趋势显示系统。它的工做方式是:从系统里获取数据,而后保存在RRD文件里,而后用PHP Web界面的形式,使用RRDTool把数据以图表的形式展现出来。这个显示界面也是配置和管理界面(配置信息存储在一个MySQL服务器里)。它是模板驱动的,所以,你能够本身定义模板,并放到你的系统里使用。
d、Cricket是一个用Perl编写的跟Cacti相似的系统,使用的是基于文件的配置系统。Ganglia也跟Cacti相似,但它的设计初衷是永远监控群集和系统网络,所以,你能够查看到由许多服务器信息聚合获得的结果,也能够按照你的意愿,查看单独某台服务器的信息。(Cacti和Cricket没法显示聚合数据。)
以上这些系统均可以被用做MySQL系统信息的收集、记录、图表化数据和报告,它们在用途方面差别较小,都具有了不一样程度的兼容性。可是,它们缺少真正意义上的兼容性,好比当某些东西出错时,它要可以有针对性地发送报警信息给某些人。它们中的一些甚至没有“错误”的概念。因此,有些人把这一点看做是此类系统的一大缺点,以为最好仍是把记录、图表化表示、报警这几项功能都独立开来。事实上,Munin特意设计了使用Nagios来做为它的报警系统。然而,对于其余几个来讲,这的确是缺点。另外还有一个缺点就是安装和配置这样一个系统,使其能彻底知足你需求,须投入不少时间和努力,不过,这一点也并非这样。
最后,RRD文件没法让你使用SQL或其余标准方法来查询它里面的数据。并且,在默认状况下,它永远会以一种刚好的粒度来存储数据,许多MySQL管理员就不肯意接受这种限制,转而选择一个关系数据库来存储这些历史数据。
一、Mysqlreport
二、Mysqlsla
三、Maatkit分析工具
MySQL里有几个工具是为了消除MySQL提供的功能与它自带的命令行工具之间的隔阂。
a、MySQL Proxy
b、Dormando的MySQL代理
Nginx须要依赖下面3个包
1. gzip 模块须要 zlib 库 ( 下载: http://www.zlib.net/ ) zlib-1.2.8.tar.gz
2. rewrite 模块须要 pcre 库 ( 下载: http://www.pcre.org/ ) pcre-8.21.tar.gz
3. ssl 功能须要 openssl 库 ( 下载: http://www.openssl.org/ ) openssl-1.0.1.tar.gz
注意:
若是用源码安装的话,后面nginx安装的时候须要指定 --with-pcre 对应的压缩包路径,若是用二进制包安装则不需指定
依赖包一键安装: yum -y install zlib zlib-devel openssl openssl--devel pcre pcre-devel
openssl: tar -xzvf openssl-1.0.1.tar.gz cd openssl-1.0.1 ./config(注意) && make && make install pcre: tar -xzvf pcre-8.21.tar.gz cd pcre-8.21 ./configure && make && make install zlib: tar -xzvf zlib-1.2.8.tar.gz cd zlib-1.2.8 ./configure && make && make install
./configure --sbin-path=/usr/local/nginx/nginx --conf-path=/usr/local/nginx/nginx.conf --pid-path=/usr/local/nginx/nginx.pid --with-http_ssl_module --with-pcre=../pcre-8.38 --with-zlib=../zlib-1.2.8 --with-openssl=../openssl-1.0.2g --with-http_stub_status_module --user=nginx --group=nginx
本文主要讲mySQL对于nginx的优化和基本操做不做描述,读者能够自行参考相关文档。
按照上述过程nginx会被安装在 /usr/local/nginx目录。
所以在更改了nginx的核心配置文件nginx.conf后可使用以下命令进行启动
/usr/local/nginx/nginx –c /usr/local/nignx/nginx.conf
Nginx不像apache,默认支持php功能具备php相关的模块。
Nginx是经过fcgi套件结合php来实现支持解析php功能的。
yum install –y spawn-fcgi fcgi-devel fcgi
spawn-fcgi
这个东西特别有意思,由于nginx默认是不支持cgi的,而gitweb是用cgi写的,所以咱们才安装fastcgi,而fastcgi又要经过spawn-fcgi来启动。。。所以。。。必需要装spawn-fcgi。
fcgi-devel 和 fcgi
它们都属于fastcgi运行时的lib库。
从如下网址下载该组件:
https://codeload.github.com/gnosek/fcgiwrap/legacy.tar.gz/master
运行如下命令
cd fcgiwrap autoreconf –I configure make make install
# You must set some working options before the "spawn-fcgi" service will work. # If SOCKET points to a file, then this file is cleaned up by the init script. # # See spawn-fcgi(1) for all possible options. # # Example : #SOCKET=/var/run/php-fcgi.sock #OPTIONS="-u apache -g apache -s $SOCKET -S -M 0600 -C 32 -F 1 -P /var/run/spawn-fcgi.pid -- /usr/bin/php-cgi"
以上是原来文件的内容
修改后的内容以下显示:
# You must set some working options before the "spawn-fcgi" service will work. # If SOCKET points to a file, then this file is cleaned up by the init script. # # See spawn-fcgi(1) for all possible options. # # Example : #SOCKET=/var/run/php-fcgi.sock #OPTIONS="-u apache -g apache -s $SOCKET -S -M 0600 -C 32 -F 1 -P /var/run/spawn-fcgi.pid -- /usr/bin/php-cgi" FCGI_SOCKET=/var/run/fcgiwrap.socket FCGI_PROGRAM=/usr/local/sbin/fcgiwrap FCGI_USER=nginx FCGI_GROUP=nginx FCGI_EXTRA_OPTIONS="-M 0700" OPTIONS="-u $FCGI_USER -g $FCGI_GROUP -s $FCGI_SOCKET -S $FCGI_EXTRA_OPTIONS -F 1 -P /var/run/spawn-fcgi.pid -- $FCGI_PROGRAM"
chkconfig --levels 2345 spawn-fcgi on chkconfig --levels 2345 php-fpm on /etc/init.d/spawn-fcgi start service php-fpm start
把spawn-fcgi设为开机启动,并启动该服务,该服务成功启动后会在:
/var/run目录下生成一个fcgiwrap.socket文件。
我这边使用的是php-5.6.2,下载地址为:
http://cn2.php.net/distributions/php-5.6.2.tar.gz
使用命令:
wget http://cn2.php.net/distributions/php-5.6.2.tar.gz
yum install php-mcrypt libmcrypt libmcrypt-devel
./configure --prefix=/usr/local/php --with-config-file-path=/usr/local/php/etc --enable-fpm --with-fpm-user=php-fpm --with-fpm-group=php-fpm --with-mysql=mysqlnd --with-mysql-sock=/var/lib/mysql/mysql.sock --with-libxml-dir --with-gd --with-jpeg-dir --with-png-dir --with-freetype-dir --with-iconv-dir --with-zlib-dir --with-mcrypt --enable-soap --enable-gd-native-ttf --enable-ftp --enable-mbstring --enable-exif --disable-ipv6 --with-pear --with-curl --with-openssl Make && make install
编写一个测试php文件为test.php,内容以下:
<?php phpinfo(); ?>
server { error_log logs/php.error.log; access_log logs/php.access.log; listen 82; server_name 192.168.0.101; root /var/www/php; index index.php; location ~ .php$ { gzip off; #fastcgi_pass unix:/var/run/fcgiwrap.socket; fastcgi_pass 127.0.0.1:9000; fastcgi_index index.php; fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name; include fastcgi_params; fastcgi_connect_timeout 300; fastcgi_send_timeout 300; fastcgi_read_timeout 300; } location = /favicon.ico { log_not_found off; access_log off; } location ~ /\.ht { deny all; } }
咱们打开一个ie使用如:http://192.168.0.101:82/test.php来访问咱们的测试页,若是你获得下面相似的界面,那就说明你的php已经和nginx结合成功了,若是你遇到下面这几个错误,本文将给出解决方法(网上的基本都是不对的)。
nginx出现502有不少缘由,但大部分缘由能够归结为资源数量不够用,也就是说后端php-fpm处理有问题,nginx将正确的客户端请求发给了后端的php-fpm进程,可是由于php-fpm进程的问题致使不能正确解析php代码,最终返回给了客户端502错误。
服务器出现502的缘由是链接超时 咱们向服务器发送请求 因为服务器当前连接太多,致使服务器方面没法给于正常的响应,产生此类报错
所以若是你服务器并发量很是大,那只能先增长机器,而后按如下方式优化会取得更好效果;但若是你并发不大却出现502,通常均可以归结为配置问题,脚本超时问题。
php-fpm进程数不够用
使用 netstat -napo |grep "php-fpm" | wc -l 查看一下当前fastcgi进程个数,若是个数接近conf里配置的上限,就须要调高进程数。
但也不能无休止调高,能够根据服务器内存状况,能够把php-fpm子进程数调到100或以上,在4G内存的服务器上200就能够。
咱们的php是安装在/usr/local/php目录下,更改/usr/local/php/php-fpm.conf文件,找到下面这一行。
pm.max_children = 10
pm.max_children = 100
echo 'ulimit -HSn 65536' >> /etc/profile echo 'ulimit -HSn 65536' >> /etc/rc.local source /etc/profile
若是脚本由于某种缘由长时间等待不返回 ,致使新来的请求不能获得处理,能够适当调小以下配置。
nginx.conf里面主要是以下
fastcgi_connect_timeout 300; fastcgi_send_timeout 300; fastcgi_read_timeout 300;
request_terminate_timeout = 10s
proxy_buffer_size 64k; proxy_buffers 512k; proxy_busy_buffers_size 128k;
修改php的配制文件(此例咱们在/usr/local/php/etc/目录下的php-fpm.conf文件)
user = php-fpm group = php-fpm
注:
phpMyAdmin版本和mySql版本有对应关系,目前较高版的phpMyAdmin支持的是mySql5.x及以上版本。
由于我安装的是mySQL5.1.x,所以我只能用phpMyAdmin4.0.x。
咱们把phpMyAdmin-4.0.4.2-all-languages.zip解压后的内容所有copy进/var/www/php/目录下的/myadmin目录内。
$cfg['Servers'][$i]['host'] $cfg['Servers'][$i]['port'] $cfg['Servers'][$i]['user'] $cfg['Servers'][$i]['password']
$cfg['blowfish_secret'] = '';
若是认证方法设置为cookie,就须要设置短语密码,置于设置为何密码,由您本身决定 ,可是不能留空,不然会在登陆phpmyadmin时提示错误,如:我设置的就是secret。
一切就绪后你可使用http://192.168.0.101:82/myadmin/这样的网址登陆你的phpMyAdmin了,第一次登陆会要求你输入“短语密码”,咱们输入事先配置好的secret,而后在用户名和密码处输入你要管理的mysql实例的root用户名和密码便可以经过phpMyAdmin来管理你的mySQL实例了。
经过phpMyAdmin你能够感觉到至关强大的图形化mySQL管理功能。
使用 jdbc的批量操做,就是PreparedStatement 类上的addBatch(),executeBatch()方法。
在这里要提醒一下你们,MySql的JDBC驱动,是不支持批量操做的,就算你在代码中调用了批量操做的方法,MySql的JDBC驱动,也是按通常insert操做来处理的。
一样Fetch Size特性MySql的JDBC驱动也不支持。而Oracle的JDBC驱动是都支持的。
若是你之前使用的是Mysql数据库, 不要期望经过批处理来提升性能了。所以这才有了rewriteBatchedStatements参数的用法。
MySql的JDBC链接的url中要加rewriteBatchedStatements参数,并保证5.1.13以上版本的驱动,才能实现高性能的批量插入。
例如:
String connectionUrl="jdbc:mysql://192.168.1.100:3306/test?rewriteBatchedStatements=true" ;
try { PreparedStatement prest = conn.prepareStatement(sql); long a=System.currentTimeMillis(); for(int x = 1; x <= count; x++){ prest.setInt(1, x); prest.setString(2, "张三"); prest.execute(); if(x%point==0){ conn.commit(); } } long b=System.currentTimeMillis(); print("MySql非批量插入10万条记录",a,b,point); } catch (Exception ex) { ex.printStackTrace(); }finally{ close(conn); }
try { PreparedStatement prest = conn.prepareStatement(sql); long a=System.currentTimeMillis(); for(int x = 1; x <= count; x++){ prest.setInt(1, x); prest.setString(2, "张三"); prest.addBatch(); if(x%point==0){ prest.executeBatch(); conn.commit(); } } long b=System.currentTimeMillis(); print("MySql批量插入10万条记录",a,b,point); } catch (Exception ex) { ex.printStackTrace(); }finally{ close(conn); }
这里经过一个点也能够看出来:
String connectionUrl="jdbc:mysql://192.168.1.100:3306/test?rewriteBatchedStatements=true" ;