(九)臨時提公升效能,資料可靠性

2021-10-08 20:37:41 字數 2766 閱讀 8224

如果使用的是短連線,在業務高峰期的時候,就可能出現連線數突然暴漲的情況

解決方案:

先處理掉那些佔著連線但是不工作的執行緒,並且應該優先斷開事務外空閒的連線

步驟:

1.先用show processlist找到處於sleep狀態的連線

2.在information_schema 庫的 innodb_trx 表中找到事務內的連線

3.用kill connection + id命令來斷開事務外的連線

減少連線過程的消耗

重啟資料庫,並使用–skip-grant-tables 引數啟動。這樣,整個 mysql 會跳過所有的許可權驗證階段,包括連線過程和語句執行過程在內。但是有一定的安全風險。

索引沒設計好

需要通過alter table緊急新增索引

步驟:

在備庫 b 上執行 set sql_log_bin=off,也就是不寫 binlog,然後執行 alter table 語句加上索引;

執行主備切換;這時候主庫是 b,備庫是 a。

在 a 上執行 set sql_log_bin=off,然後執行 alter table 語句加上索引。

平時在做變更的時候,你應該考慮類似 gh-ost 這樣的方案,更加穩妥。但是在需要緊急處理時,上面這個方案的效率是最高的。

語句沒寫好

通過query_rewrite 功能,可以把輸入的一種語句改寫成另外一種模式。

mysql> insert into query_rewrite.rewrite_rules(pattern, replacement, pattern_database) values ("select * from t where id + 1 = ?", "select * from t where id = ? - 1", "db1");

call query_rewrite.flush_rewrite_rules();

選錯了索引

應急方案就是給這個語句加上 force index

有時候由於業務突然出現高峰,或者應用程式 bug,導致某個語句的 qps 突然暴漲,也可能導致 mysql 壓力過大,影響服務。

最理想的情況是讓業務把這個功能下掉,服務自然就會恢復。

事務執行過程中,先把日誌寫到 binlog cache,事務提交的時候,再把 binlog cache 寫到 binlog 檔案中。

sync_binlog=0 的時候,表示每次提交事務都只 write,不 fsync;

sync_binlog=1 的時候,表示每次提交事務都會執行 fsync;

sync_binlog=n(n>1) 的時候,表示每次提交事務都 write,但累積 n 個事務後才 fsync。

先寫到redo log buffer ,再wirte 到 page cache ,最後持久化到磁碟。

為了控制 redo log 的寫入策略,innodb 提供了 innodb_flush_log_at_trx_commit 引數,它有三種可能取值:

設定為 0 的時候,表示每次事務提交時都只是把 redo log 留在 redo log buffer 中 ;

設定為 1 的時候,表示每次事務提交時都將 redo log 直接持久化到磁碟;

設定為 2 的時候,表示每次事務提交時都只是把 redo log 寫到 page cache。

innodb 有乙個後台執行緒,每隔 1 秒,就會把 redo log buffer 中的日誌,呼叫 write 寫到檔案系統的 page cache,然後呼叫 fsync 持久化到磁碟。

事務執行中間過程的 redo log 也是直接寫在 redo log buffer 中的,這些 redo log 也會被後台執行緒一起持久化到磁碟。也就是說,乙個沒有提交的事務的 redo log,也是可能已經持久化到磁碟的。

通常我們說 mysql 的「雙 1」配置,指的就是 sync_binlog 和 innodb_flush_log_at_trx_commit 都設定成 1。也就是說,乙個事務完整提交前,需要等待兩次刷盤,一次是 redo log(prepare 階段),一次是 binlog。

為了減少io次數,採用**組提交(group commit)**機制:一次 fsync會順便把其他事務的日誌進行fsync

如果你想提公升 binlog 組提交的效果,可以通過設定 binlog_group_commit_sync_delay 和 binlog_group_commit_sync_no_delay_count 來實現。

binlog_group_commit_sync_delay 引數,表示延遲多少微秒後才呼叫 fsync;

binlog_group_commit_sync_no_delay_count 引數,表示累積多少次以後才呼叫 fsync。

wal 機制主要得益於兩個方面:

redo log 和 binlog 都是順序寫,磁碟的順序寫比隨機寫速度要快;

組提交機制,可以大幅度降低磁碟的 iops 消耗。

設定 binlog_group_commit_sync_delay 和 binlog_group_commit_sync_no_delay_count 引數,減少 binlog 的寫盤次數。這個方法是基於「額外的故意等待」來實現的,因此可能會增加語句的響應時間,但沒有丟失資料的風險。

將 sync_binlog 設定為大於 1 的值(比較常見是 100~1000)。這樣做的風險是,主機掉電時會丟 binlog 日誌。

將innodb_flush_log_at_trx_commit 設定為 2。這樣做的風險是,主機掉電的時候會丟資料。

效能和可靠性模式

效能和可靠性模式 本頁內容 滿足執行要求 模式概述 效能和可靠性模式 效能 可伸縮性和可靠性是所有企業應用程式的重要特性。儘管可通過多種方法來改善效能和可靠性,但是此模式群集強調如何將為任意數量的應用程式或使用者提供服 務的系統組合起來,以獲得更好的可伸縮性和可用性。本章中的模式為有效地適應負載和高...

kafka 九 Kafka訊息的可靠性

沒有乙個中介軟體能夠做到百分之百的完全可靠,可靠性更多的還是基於幾個9的衡量指標,比如4個9 5 個9.軟體系統的可靠性只能夠無限去接近100 但不可能達到100 所以kafka如何是實現最大可能的可靠性呢?你可以建立更多的分割槽來提公升可靠性,但是分割槽數過多也會帶來效能上的開銷,一般來說,3個副...

Spark Streaming的資料可靠性和一致性

spark streaming自發布起就得到了廣泛的關注,然而作為乙個年輕的專案,需要提公升的地方同樣很多,比如1.2之前版本driver掛掉可能會丟失資料。這裡將分析它的可靠性機制。眼下大資料領域最熱門的詞彙之一便是流計算了,其中最耀眼的專案無疑是來自spark社群的spark streaming...