咱們如今處理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" ;