精品福利视频一区二区三区,免费A级毛片无码无遮挡,偷窥目拍性综合图区,亚洲欧洲无码AV电影在线观看,超清无码熟妇人妻AV在线电影

認證培訓,h3c認證體系,網(wǎng)絡(luò )工程師
豐沃創(chuàng  )新

Get MySQL這5個(gè)優(yōu)化技巧,網(wǎng)絡(luò )工程師將如虎添翼!

  • 發(fā)布時(shí)間: 2018-5-19 8:26:59

一個(gè)成熟的數據庫架構并不是一開(kāi)始設計就具備高可用、高伸縮等特性的,它是隨著(zhù)用戶(hù)量的增加,基礎架構才逐漸完善。這篇文章主要談?wù)凪ySQL數據庫在發(fā)展周期中所面臨的問(wèn)題及優(yōu)化方案,暫且拋開(kāi)前端應用不說(shuō),大致分為以下五個(gè)階段:

階段一:數據庫表設計

項目立項后,開(kāi)發(fā)部門(mén)根據產(chǎn)品部門(mén)需求開(kāi)發(fā)項目。

開(kāi)發(fā)工程師在開(kāi)發(fā)項目初期會(huì )對表結構設計。對于數據庫來(lái)說(shuō),表結構設計很重要,如果設計不當,會(huì )直接影響到用戶(hù)訪(fǎng)問(wèn)網(wǎng)站速度,用戶(hù)體驗不好!這種情況具體影響因素有很多,例如慢查詢(xún)(低效的查詢(xún)語(yǔ)句)、沒(méi)有適當建立索引、數據庫堵塞(鎖)等。當然,有測試部門(mén)的團隊,會(huì )做產(chǎn)品測試,找Bug。

由于開(kāi)發(fā)工程師重視點(diǎn)不同,初期不會(huì )考慮太多數據庫設計是否合理,而是盡快完成功能實(shí)現和交付。等項目上線(xiàn)有一定訪(fǎng)問(wèn)量后,隱藏的問(wèn)題就會(huì )暴露,這時(shí)再去修改就不是這么容易的事了!

階段二:數據庫部署

是時(shí)候運維工程師出場(chǎng)了,項目上線(xiàn)。

項目初期訪(fǎng)問(wèn)量一般是寥寥無(wú)幾,此階段Web+數據庫單臺部署足以應對在1000左右的QPS(每秒查詢(xún)率)?紤]到單點(diǎn)故障,應做到高可用性,可采用MySQL主從復制+Keepalived實(shí)現雙機熱備。主流HA軟件有:Keepalived(推薦)、Heartbeat。

階段三:數據庫性能優(yōu)化

如果將MySQL部署到普通的X86服務(wù)器上,在不經(jīng)過(guò)任何優(yōu)化情況下,MySQL理論值正?梢蕴幚1500左右QPS,經(jīng)過(guò)優(yōu)化后,有可能會(huì )提升到2000左右QPS。否則,訪(fǎng)問(wèn)量當達到1500左右并發(fā)連接時(shí),數據庫處理性能可能響應就會(huì )慢,而且硬件資源還比較富裕,這時(shí)就該考慮性能優(yōu)化問(wèn)題了。那么怎樣能讓數據庫發(fā)揮最大性能呢?主要從硬件配置、數據庫配置、架構方面著(zhù)手,具體分為以下:

3.1 硬件配置

如果有條件一定要SSD固態(tài)硬盤(pán)代替SAS機械硬盤(pán),將RAID級別調整為RAID1+0,相對于RAID1和RAID5有更好的讀寫(xiě)性能,畢竟數據庫的壓力主要來(lái)自磁盤(pán)I/O方面。

Linux內核有一個(gè)特性,會(huì )從物理內存中劃分出緩存區(系統緩存和數據緩存)來(lái)存放熱數據,通過(guò)文件系統延遲寫(xiě)入機制,等滿(mǎn)足條件時(shí)(如緩存區大小到達一定百分比或者執行sync命令)才會(huì )同步到磁盤(pán)。也就是說(shuō)物理內存越大,分配緩存區越大,緩存數據越多。當然,服務(wù)器故障會(huì )丟失一定的緩存數據。建議物理內存至少富裕50%以上。

3.2 數據庫配置優(yōu)化

MySQL應用最廣泛的有兩種存儲引擎:一個(gè)是MyISAM,不支持事務(wù)處理,讀性能處理快,表級別鎖。另一個(gè)是InnoDB,支持事務(wù)處理(ACID屬性),設計目標是為大數據處理,行級別鎖。

表鎖:開(kāi)銷(xiāo)小,鎖定粒度大,發(fā)生死鎖概率高,相對并發(fā)也低。

行鎖:開(kāi)銷(xiāo)大,鎖定粒度小,發(fā)生死鎖概率低,相對并發(fā)也高。

為什么會(huì )出現表鎖和行鎖呢?主要為保證數據完整性。舉個(gè)例子,一個(gè)用戶(hù)在操作一張表,其他用戶(hù)也想操作這張表,那么就要等第一個(gè)用戶(hù)操作完,其他用戶(hù)才能操作,表鎖和行鎖就是這個(gè)作用。否則多個(gè)用戶(hù)同時(shí)操作一張表,肯定會(huì )數據產(chǎn)生沖突或者異常。

根據這些方面看,使用InnoDB存儲引擎是最好的選擇,也是MySQL5.5+版本默認存儲引擎。每個(gè)存儲引擎相關(guān)運行參數比較多,以下列出可能影響數據庫性能的參數。

公共參數默認值:

max_connections = 151 # 同時(shí)處理最大連接數,建議設置最大連接數是上限連接數的80%左右 sort_buffer_size = 2M # 查詢(xún)排序時(shí)緩沖區大小,只對orderby和groupby起作用,建議增大為16M open_files_limit = 1024  # 打開(kāi)文件數限制,如果show global status like'open_files'查看的值等于或者大于open_files_limit值時(shí),程序會(huì )無(wú)法連接數據庫或卡死 

MyISAM參數默認值:

key_buffer_size = 16M # 索引緩存區大小,一般設置物理內存的30-40% read_buffer_size = 128K   # 讀操作緩沖區大小,建議設置16M或32M query_cache_type = ON# 打開(kāi)查詢(xún)緩存功能 query_cache_limit = 1M  # 查詢(xún)緩存限制,只有1M以下查詢(xún)結果才會(huì )被緩存,以免結果數據較大把緩存池覆蓋 query_cache_size = 16M   # 查看緩沖區大小,用于緩存SELECT查詢(xún)結果,下一次有同樣SELECT查詢(xún)將直接從緩存池返回結果,可適當成倍增加此值 

InnoDB參數默認值:

innodb_buffer_pool_size = 128M # 索引和數據緩沖區大小,建議設置物理內存的70%左右 innodb_buffer_pool_instances = 1     # 緩沖池實(shí)例個(gè)數,推薦設置4個(gè)或8個(gè) innodb_flush_log_at_trx_commit = 1   # 關(guān)鍵參數,0代表大約每秒寫(xiě)入到日志并同步到磁盤(pán),數據庫故障會(huì )丟失1秒左右事務(wù)數據。1為每執行一條SQL后寫(xiě)入到日志并同步到磁盤(pán),I/O開(kāi)銷(xiāo)大,執行完SQL要等待日志讀寫(xiě),效率低。2代表只把日志寫(xiě)入到系統緩存區,再每秒同步到磁盤(pán),效率很高,如果服務(wù)器故障,才會(huì )丟失事務(wù)數據。對數據安全性要求不是很高的推薦設置2,性能高,修改后效果明顯。 innodb_file_per_table = OFF# 是否共享表空間,5.7+版本默認ON,共享表空間idbdata文件不斷增大,影響一定的I/O性能。建議開(kāi)啟獨立表空間模式,每個(gè)表的索引和數據都存在自己獨立的表空間中,可以實(shí)現單表在不同數據庫中移動(dòng)。innodb_log_buffer_size = 8M  # 日志緩沖區大小,由于日志最長(cháng)每秒鐘刷新一次,所以一般不用超過(guò)16M 

3.3 系統內核參數優(yōu)化

大多數MySQL都部署在linux系統上,所以操作系統的一些參數也會(huì )影響到MySQL性能,以下對Linux內核參數進(jìn)行適當優(yōu)化

net.ipv4.tcp_fin_timeout = 30 # TIME_WAIT超時(shí)時(shí)間,默認是60s net.ipv4.tcp_tw_reuse = 1   # 1表示開(kāi)啟復用,允許TIME_WAIT socket重新用于新的TCP連接,0表示關(guān)閉 net.ipv4.tcp_tw_recycle = 1    # 1表示開(kāi)啟TIME_WAIT socket快速回收,0表示關(guān)閉 net.ipv4.tcp_max_tw_buckets = 4096    # 系統保持TIME_WAIT socket最大數量,如果超出這個(gè)數,系統將隨機清除一些TIME_WAIT并打印警告信息 net.ipv4.tcp_max_syn_backlog = 4096 # 進(jìn)入SYN隊列最大長(cháng)度,加大隊列長(cháng)度可容納更多的等待連接 

在Linux系統中,如果進(jìn)程打開(kāi)的文件句柄數量超過(guò)系統默認值1024,就會(huì )提示“too many files open”信息,所以要調整打開(kāi)文件句柄限制。

重啟永久生效:

# vi /etc/security/limits.conf   * soft nofile 65535 * hard nofile 65535 

當前用戶(hù)立即生效:

# ulimit -SHn 65535  

階段四:數據庫架構擴展

隨著(zhù)業(yè)務(wù)量越來(lái)越大,單臺數據庫服務(wù)器性能已無(wú)法滿(mǎn)足業(yè)務(wù)需求,該考慮增加服務(wù)器擴展架構了。主要思想是分解單臺數據庫負載,突破磁盤(pán)I/O性能,熱數據存放緩存中,降低磁盤(pán)I/O訪(fǎng)問(wèn)頻率。

4.1 增加緩存

給數據庫增加緩存系統,把熱數據緩存到內存中,如果緩存中有請求的數據就不再去請求MySQL,減少數據庫負載。緩存實(shí)現有本地緩存和分布式緩存,本地緩存是將數據緩存到本地服務(wù)器內存中或者文件中。分布式緩存可以緩存海量數據,擴展性好,主流的分布式緩存系統:memcached、redis,memcached性能穩定,數據緩存在內存中,速度很快,QPS理論可達8w左右。如果想數據持久化就選擇用redis,性能不低于memcached。

4.2 主從復制與讀寫(xiě)分離

在生產(chǎn)環(huán)境中,業(yè)務(wù)系統通常讀多寫(xiě)少,可部署一主多從架構,主數據庫負責寫(xiě)操作,并做雙機熱備,多臺從數據庫做負載均衡,負責讀操作。主流的負載均衡器:LVS、HAProxy、Nginx。

怎么來(lái)實(shí)現讀寫(xiě)分離呢?大多數企業(yè)是在代碼層面實(shí)現讀寫(xiě)分離,效率高。另一個(gè)種方式通過(guò)代理程序實(shí)現讀寫(xiě)分離,企業(yè)中應用較少,會(huì )增加中間件消耗。主流中間件代理系統有MyCat、Atlas等。

在這種MySQL主從復制拓撲架構中,分散單臺負載,大大提高數據庫并發(fā)能力。如果一臺從服務(wù)器能處理1500 QPS,那么3臺就能處理4500 QPS,而且容易橫向擴展。

有時(shí),面對大量寫(xiě)操作的應用時(shí),單臺寫(xiě)性能達不到業(yè)務(wù)需求。就可以做雙向復制(雙主),但有個(gè)問(wèn)題得注意:兩臺主服務(wù)器如果都對外提供讀寫(xiě)操作,就可能遇到數據不一致現象,產(chǎn)生這個(gè)原因是程序有同時(shí)操作兩臺數據庫幾率,同時(shí)的更新操作會(huì )造成兩臺數據庫數據發(fā)生沖突或者不一致。

可設置每個(gè)表ID字段自增唯一:auto_increment_increment和auto_increment_offset,也可以寫(xiě)算法生成隨機唯一。

官方近兩年推出的MGR(多主復制)集群也可以考慮下。

4.3 分庫

分庫是根據業(yè)務(wù)將數據庫中相關(guān)的表分離到不同的數據庫中,例如web、bbs、blog等庫。如果業(yè)務(wù)量很大,還可將分離后的數據庫做主從復制架構,進(jìn)一步避免單庫壓力過(guò)大。

4.4 分表

數據量的日劇增加,數據庫中某個(gè)表有幾百萬(wàn)條數據,導致查詢(xún)和插入耗時(shí)太長(cháng),怎么能解決單表壓力呢?你應該考慮把這個(gè)表拆分成多個(gè)小表,來(lái)減輕單個(gè)表的壓力,提高處理效率,此方式稱(chēng)為分表。

分表技術(shù)比較麻煩,要修改程序代碼里的SQL語(yǔ)句,還要手動(dòng)去創(chuàng )建其他表,也可以用merge存儲引擎實(shí)現分表,相對簡(jiǎn)單許多。分表后,程序是對一個(gè)總表進(jìn)行操作,這個(gè)總表不存放數據,只有一些分表的關(guān)系,以及更新數據的方式,總表會(huì )根據不同的查詢(xún),將壓力分到不同的小表上,因此提高并發(fā)能力和磁盤(pán)I/O性能。

分表分為垂直拆分和水平拆分:

垂直拆分:把原來(lái)的一個(gè)很多字段的表拆分多個(gè)表,解決表的寬度問(wèn)題。你可以把不常用的字段單獨放到一個(gè)表中,也可以把大字段獨立放一個(gè)表中,或者把關(guān)聯(lián)密切的字段放一個(gè)表中。水平拆分:把原來(lái)一個(gè)表拆分成多個(gè)表,每個(gè)表的結構都一樣,解決單表數據量大的問(wèn)題。

4.5 分區

分區就是把一張表的數據根據表結構中的字段(如range、list、hash等)分成多個(gè)區塊,這些區塊可以在一個(gè)磁盤(pán)上,也可以在不同的磁盤(pán)上,分區后,表面上還是一張表,但數據散列在多個(gè)位置,這樣一來(lái),多塊硬盤(pán)同時(shí)處理不同的請求,從而提高磁盤(pán)I/O讀寫(xiě)性能。

注:增加緩存、分庫、分表和分區主要由程序猿或DBA來(lái)實(shí)現。

階段五:數據庫維護

數據庫維護是數據庫工程師或運維工程師的工作,包括系統監控、性能分析、性能調優(yōu)、數據庫備份和恢復等主要工作。

5.1 性能狀態(tài)關(guān)鍵指標

專(zhuān)業(yè)術(shù)語(yǔ):QPS(Queries Per Second,每秒查詢(xún)書(shū))和TPS(Transactions Per Second)

通過(guò)show status查看運行狀態(tài),會(huì )有300多條狀態(tài)信息記錄,其中有幾個(gè)值幫可以我們計算出QPS和TPS,如下:

Uptime:服務(wù)器已經(jīng)運行的實(shí)際,單位秒

Questions:已經(jīng)發(fā)送給數據庫查詢(xún)數

Com_select:查詢(xún)次數,實(shí)際操作數據庫的

Com_insert:插入次數

Com_delete:刪除次數

Com_update:更新次數

Com_commit:事務(wù)次數

Com_rollback:回滾次數

那么,計算方法來(lái)了,基于Questions計算出QPS

mysql> show global status like'Questions'; mysql> show global status like'Uptime'; QPS = Questions / Uptime 

基于Com_commit和Com_rollback計算出TPS:

mysql> show global status like'Com_commit'; mysql> show global status like'Com_rollback'; mysql> show global status like'Uptime'; TPS = (Com_commit + Com_rollback) / Uptime 

另一計算方式:

基于Com_select、Com_insert、Com_delete、Com_update計算出QPS:   

mysql> show global status where Variable_name in('com_select','com_insert','com_delete','com_update'); 

等待1秒再執行,獲取間隔差值,第二次每個(gè)變量值減去第一次對應的變量值,就是QPS。

TPS計算方法:

mysql> show global status where Variable_name in('com_insert','com_delete','com_update'); 

計算TPS,就不算查詢(xún)操作了,計算出插入、刪除、更新四個(gè)值即可。

經(jīng)網(wǎng)友對這兩個(gè)計算方式的測試得出,當數據庫中myisam表比較多時(shí),使用Questions計算比較準確。當數據庫中innodb表比較多時(shí),則以Com_*計算比較準確。

5.2 開(kāi)啟慢查詢(xún)日志

MySQL開(kāi)啟慢查詢(xún)日志,分析出哪條SQL語(yǔ)句比較慢,支持動(dòng)態(tài)開(kāi)啟:

mysql> setglobal slow-query-log=on# 開(kāi)啟慢查詢(xún)日志  mysql> setglobal slow_query_log_file='/var/log/mysql/mysql-slow.log';  # 指定慢查詢(xún)日志文件位置  mysql> setglobal log_queries_not_using_indexes=on;   # 記錄沒(méi)有使用索引的查詢(xún)  mysql> setglobal long_query_time=1; # 只記錄處理時(shí)間1s以上的慢查詢(xún) 

分析慢查詢(xún)日志,可以使用MySQL自帶的mysqldumpslow工具,分析的日志較為簡(jiǎn)單。  

mysqldumpslow -t 3 /var/log/mysql/mysql-slow.log    # 查看最慢的前三個(gè)查詢(xún)  

也可以使用percona公司的pt-query-digest工具,日志分析功能全面,可分析slow log、binlog、general log。

分析慢查詢(xún)日志:pt-query-digest /var/log/mysql/mysql-slow.log

分析binlog日志:mysqlbinlog mysql-bin.000001 >mysql-bin.000001.sql

pt-query-digest --type=binlog mysql-bin.000001.sql

分析普通日志:pt-query-digest --type=genlog localhost.log

5.3 數據庫備份

備份數據庫是最基本的工作,也是最重要的,否則后果很?chē)乐,你懂得!高頻率的備份策略,選用一個(gè)穩定快速的工具至關(guān)重要。數據庫大小在2G以?xún),建議使用官方的邏輯備份工具mysqldump。超過(guò)2G以上,建議使用percona公司的物理備份工具xtrabackup,否則慢的跟蝸牛似得。這兩個(gè)工具都支持InnoDB存儲引擎下熱備,不影響業(yè)務(wù)讀寫(xiě)操作。

5.4 數據庫修復

有時(shí)候MySQL服務(wù)器突然斷電、異常關(guān)閉,會(huì )導致表?yè)p壞,無(wú)法讀取表數據。這時(shí)就可以用到MySQL自帶的兩個(gè)工具進(jìn)行修復,myisamchk和mysqlcheck。前者只能修復MyISAM表,并且停止數據庫,后者M(jìn)yISAM和InnoDB都可以,在線(xiàn)修復。

注意:修復前最好先備份數據庫。

myisamchk常用參數:

-f --force    強制修復,覆蓋老的臨時(shí)文件,一般不使用

-r --recover  恢復模式

-q --quik     快速恢復

-a --analyze  分析表

-o --safe-recover 老的恢復模式,如果-r無(wú)法修復,可以使用此參數試試

-F --fast     只檢查沒(méi)有正常關(guān)閉的表

例如:myisamchk -r -q *.MYI

mysqlcheck常用參數:

-a  --all-databases  檢查所有的庫

-r  --repair   修復表

-c  --check    檢查表,默認選項

-a  --analyze  分析表

-o  --optimize 優(yōu)化表

-q  --quik   最快檢查或修復表

-F  --fast   只檢查沒(méi)有正常關(guān)閉的表


精品福利视频一区二区三区,免费A级毛片无码无遮挡,偷窥目拍性综合图区,亚洲欧洲无码AV电影在线观看,超清无码熟妇人妻AV在线电影