1. 程式人生 > >高效能mysql第三版讀書筆記3

高效能mysql第三版讀書筆記3

innodb以前不支援高併發,在搞病房下就是悲劇,全部卡在mutex(緩衝池mutex)上,現在通過執行緒排程器控制執行緒怎麼進入核心訪問資料,引數為innodb_thread_concurrency,它有計算公式:CPU數量*磁碟數量*2。

如果無法進入核心會休眠innodb_thread_sleep_delay微妙。還有一個引數成為高併發瓶頸:innodb_commit_concurrency,就是提交的時候,如果設定太小,容易導致大量執行緒衝突,最後通過執行緒池(經驗值:thread_pool_size執行緒組數量,預設16,建議16-36,最好24-36,值的範圍1-64,執行緒組數量跟cpu相當。thread_pool_stall_limit意思是這個SQL佔用多長時間,該讓給其他人,較低的值允許執行緒更快啟動起來,避免死鎖,較高的值適合長時間執行的SQL語句)限制併發。

myisam設定concurrent_insert(0不允許,1允許預設值,只有表中沒有空洞,2強制併發插入到表的尾末尾)是否允許併發插入。

如果查詢涉及到blob或者text值,又需要使用臨時表,不管多小,都會在磁碟上建立臨時表,這樣效率很低,但是通過substring函式轉為varchar,或者讓臨時表更快一些(基於記憶體的檔案系統,在Linux上是tmpfs),或者調大innodb日誌緩衝大小。

影響MySQL排序的兩個值(max_length_for_sort_data為每行排序資料建立固定大小的緩衝跟定義的最大長度比較和max_sort_length必須用blob和text排序的時候,只使用字首)。

資料庫伺服器基本配置:tmp_table_size,max_heap_table_size,max_connections,thread_cache_size,table_cache_size。安全和穩定的設定:expire_logs_days,max_allowed_packet,max_connect_errors,sql_mode,sysdate_IS_now。

下面的選項控制負責複製行為,防止備庫出問題:read_only,skip_slave_start,slave_net_timeout,sync_master_info,sync_relay_log,sync_relay_log_info。innodb高階配置:innodb_buffer_pool_instances,innodb_autoinc_lock_mode,innodb_io_capacity,innodb_read_io_threads,innodb_write_io_threads,innodb-strict_mode。但是最重要是:innodb_buffer_pool_size和innodb_log_file_size。

順序io比隨機io快。

MySQL複製流程:在主庫上把資料更改記錄到二進位制日誌(binary log)中,備庫將主庫上的日誌複製到自己的中繼日誌(relay log)中,使用的是io執行緒,備庫讀取中繼日誌中的事件,將其重放到備庫資料庫中,使用的是SQL執行緒,實現獲取事件和回放事件解藕,允許兩個執行緒非同步進行,但是在主庫上併發執行的查詢,在備庫上只能序列執行,因為只有一個SQL執行緒重放中繼日誌事件。基於行的複製優於基於語句的複製。複製拓撲中的主動-被動模式下的主-主複製比較好用,執行alter table可能鎖住整個表,阻塞對錶的讀和寫,但是在主-主配置下,可以先停止主動伺服器上的備庫複製執行緒(這樣就不會在被動伺服器上執行任何更新),然後在被動伺服器上執行。alter操作,交換角色,最後在主動伺服器上啟動複製執行緒,這個伺服器讀取中繼日誌並執行alter語句,這可能花費很長時間,但是不要緊,因為該伺服器沒有為任何活躍查詢提供服務。在MySQL的叢集設計中,首先使用主從同步設計來構建資料庫叢集實現高併發的需求,一個可讀寫的主伺服器,兩個只讀的從伺服器,然後將叢集再以分組的形式通過主主同步實現高可用(通過設定互為主從實現主主同步)。而對資料庫的訪問,將使用oneproxy資料庫代理中介軟體(當然還有高效能,mycat比較優秀)來實現高效能的讀寫分離,最後還對oneproxy的呼叫實現雙機熱備份,並設計虛擬的廣播IP即VIP形式對外提供服務,實現oneproxy高可用性,以防單點故障。

怎麼配置:1確保兩臺伺服器有相同資料,2啟用二進位制日誌,選擇唯一的伺服器ID並建立複製賬號,3啟用備庫更新的日誌記錄,後面會看到,這是故障轉移和故障恢復的關鍵,4把被動伺服器配置成。只讀,防止可能與主動伺服器上的更新產生衝突,這一點可選,5啟動每個伺服器的MySQL例項,6將每個主庫設定為對方的備庫,使用新建立的二進位制日誌開始工作。還有一種複製拓撲叫擁有備庫的主主複製,優點是增加了冗餘,對應不同地理位置的複製拓撲,能夠消除站點單點失效的問題,像往常一樣將讀查詢分配到備庫上,當主庫失效時,備庫代替主庫還是可行的,或者把備庫指向一個不同的主庫,但是有點複雜。

系統變數show variables,伺服器變數的名字和值show status(二進位制日誌binlog_cache_use和binlog_cache_disk_use,臨時表和檔案的計數show global temporary tables;show status like 'creat%';,排序sort,table_locks_immediate和table_locks_waited)。大檔案傳輸:gzip -c /backup/mydb/mytable.MYD | ssh root@server2 "gunzip -c - /var/lib/mytable.MYD",也可以在gzip上增加選項-l,使其壓縮更快,如果想獲得更高的壓縮率而且速度很快用bzip代替gzip。如果不需要加密,可以使用nc代替ssh,還有其他複製方式如rsync。