讀寫分離的主要目標就是分攤主庫的壓力
兩種方案
1.客戶端(client)主動做負載均 衡,這種模式下一般會把資料庫的連線資訊放在客戶端的連線層。由客戶端來選 擇後端資料庫進行查詢
客戶端直連方案,因為少了一層 proxy **,所以查詢效能稍微好一點兒,並且整體架 構簡單,排查問題更方便。但是這種方案,由於要了解後端部署細節,所以在出現主備切換、庫遷移等操作的時候,客戶端都會感知到,並且需要調整資料庫連線資訊。 你可能會覺得這樣客戶端也太麻煩了,資訊大量冗餘,架構很醜。其實也未必,一般採 用這樣的架構,一定會伴隨乙個負責管理後端的元件,比如 zookeeper,盡量讓業務端 只專注於業務邏輯開發。
由於主從可能存在延遲,客戶端執行完乙個更新事務後馬上發起查詢,如果查詢選擇的是從庫的話,就有可能讀到剛剛
的事務更新之前的狀態。也就是在從庫上會讀到系統的乙個過期狀態
因此查詢從庫 必定會出現和主庫延遲。
解決方案:
1.強制走主庫方案;
將查詢請求做分類。
對於必須要拿到最新結果的請求,強制將其發到主庫上
對於可以讀到舊資料的請求,才將其發到從庫上。
2.sleep 方案;
查詢的時候 select sleep一下 場景小 不精確
3.判斷主備無延遲方案;
每次從庫執行查詢請求前,先判斷 seconds_behind_master 是否已經等於 0。如果還不等於 0 ,那就必須等到這個引數變為 0 才能執行查詢請求。
或者判斷同步位點,或者判斷同步gtid 這樣比較精確
4.配合 semi-sync 方案(半同步複製);
事務提交的時候,主庫把 binlog 發給從庫;
從庫收到 binlog 以後,發回給主庫乙個 ack,表示收到了;
主庫收到這個 ack 以後,才能給客戶端返回「事務完成」的確認。
也就是說,如果啟用了 semi-sync,就表示所有給客戶端傳送過確認的事務,都確保了備庫已經收到了這個日誌。
缺點就是
一主多從的時候,在某些從庫執行查詢請求會存在過期讀的現象;
在持續延遲的情況下,可能出現過度等待的問題。
5.等主庫位點方案;
select master_pos_wait(file, pos[, timeout]);
當主庫執行乙個更新之後,立馬用show master status得到file 和pos
然後去從庫中執行select master_pos_wait(file, pos[, timeout]) ,如果返回大於等於0 ,說明這個從庫已經執行了這個事務。
那麼就去這個從庫中讀。 否則就去主庫中讀。
select master_pos_wait(file, pos[, timeout]);的邏輯:
它是在從庫執行的;
引數 file 和 pos 指的是主庫上的檔名和位置;
timeout 可選,設定為正整數 n 表示這個函式最多等待 n 秒。
這個命令正常返回的結果是乙個正整數 m,表示從命令開始執行,到應用完 file 和 pos 表 示的 binlog 位置,執行了多少事務。
當然,除了正常返回乙個正整數 m 外,這條命令還會返回一些其他結果,包括:
如果執行期間,備庫同步執行緒發生異常,則返回 null;
如果等待超過 n 秒,就返回 -1;
如果剛開始執行的時候,就發現已經執行過這個位置了,則返回 0。
6.等 gtid 方案。
select wait_for_executed_gtid_set(gtid_set, 1)
這條命令的邏輯是:
等待,直到這個庫執行的事務中包含傳入的 gtid_set,返回 0; 2. 超時返回 1。
流程如下:
trx1 事務更新完成後,從返回包直接獲取這個事務的 gtid,記為 gtid1; 2. 選定乙個從庫執行查詢語句;
在從庫上執行 select wait_for_executed_gtid_set(gtid1, 1);
如果返回值是 0,則在這個從庫執行查詢語句;
否則,到主庫執行查詢語句。
筆記(二十一) 安全
威脅 定義對應安全屬性 spoofing 偽裝 冒充他人身份 認證tampering 篡改 修改資料或 完整性repudiation 抵賴 否認做過的事情 不可抵賴性 information disclosure 資訊洩露 機密資訊洩露 機密性denial of service 拒絕服務 拒絕服務 ...
Nginx系列(二十一) HTTP Cache機制
指令 含義proxy cache path data nginx tmp test levels 1 2 keys zone tmp test 100m inactive 7d max size 1000g proxy cache path 快取檔案路徑 levels 設定快取檔案目錄層次 leve...
python 學習筆記(二十一)
coding utf8 author liwei windows平台多程序匯入multiprocessing模組 from multiprocessing import process,queue from multiprocessing import pool import os,time,ran...