分散式 | 幾步快速擁有讀寫分離

愛可生雲資料庫 發表於 2022-07-01

作者:王娟

愛可生 dble 團隊測試成員,主要負責 dble 需求測試,自動化編寫和社群問題解答。人狠話不多。

本文來源:原創投稿

*愛可生開源社群出品,原創內容未經授權不得隨意使用,轉載請聯絡小編並註明來源。


dble 從 3.20.10 版本開始⽀持單純的讀寫分離功能,可以和分庫分表功能分開使⽤。

如何快速擁有讀寫分離呢?

第一步,準備好一組 mysql 實 例,並確保這組 mysql 例項的主從複製關係正常。如下使用一主二從的mysql:

主:172.100.9.6:3307

從:172.100.9.2:3307、172.100.9.3:3307

分別到2個從例項上執行 show slave status ,檢查複製關係是否正常。

分散式 | 幾步快速擁有讀寫分離

第二步,在 db.xml 配置 mysql 例項。如下:

<dbGroup rwSplitMode="1" name="ha_group1" delayThreshold="100">
    <heartbeat>show slave status</heartbeat>
    <dbInstance name="hostM1" password="******" url="172.100.9.6:3307" user="test" maxCon="1000" minCon="10" primary="true"/>
    <dbInstance name="hostS1" password="******" url="172.100.9.2:3307" user="test" maxCon="1000" minCon="10" readWeight="1"/>
    <dbInstance name="hostS2" password="******" url="172.100.9.3:3307" user="test" maxCon="1000" minCon="10" readWeight="1"/>
</dbGroup>


配置 dbGroup 時需要注意以下引數:

rwSplitMode: 讀操作的負載均衡模式,可選值 0/1/2/3
在進⾏讀負載均衡的時候會根據這個配置進⾏
0:不做均衡,直接分發到主例項,從例項將被忽略,不會嘗試建⽴連線池,但會有⼼跳連線
1:讀操作在所有從例項中均衡,當所有從例項都不可⽤時,下發語句會報錯。
2:讀操作在所有例項中均衡。
3:讀操作在所有從例項中均衡,當所有從例項都不可⽤時,將語句發往主例項。

delayThreshold:指定主從延遲閥值,單位秒,預設 -1 ,表⽰⽆延遲
在進⾏讀取負載均衡的時候會根據最近⼀次的⼼跳狀態以及讀庫和主庫的延遲進⾏判斷,如果主從複製不⼯作或者複製延遲超過 delayThreshold 配置,則認為此節點不適合進⾏讀取,依賴於⼼跳語句為 show slave status 。如果 delayThreshold=-1 那麼讀負載均衡選取的時候不會進⾏延遲檢測。

readWeight:節點權重(負載均衡時候使⽤)
負載均衡過程中會檢視所有節點的權重是否相等,如果不相等,那麼就會根據權重來配置壓⼒。該值需是⼤於等於 0 的整數。如果配為 0 表⽰該節點不參與讀。需注意,總權重(所有節點權重之和)必須⼤於 0。

如何區分讀節點與寫節點?

寫節點:primary="true"

讀節點:primary 沒配置或者 primary="false"

第三步,user.xml增加讀寫分離使用者。通過dbGroup指定到db.xml裡dbGroup的name。

<rwSplitUser name="rwSplit1" password="111111" dbGroup="ha_group1" />

第四步,到 dble 管理端執行 reload @@config_all ,使配置生效。這時就可以使用新建立的讀寫分離使用者 rwSplit1 登入 dble 了。

如何驗證讀寫分離配置是否生效呢?

分別到 3 個 mysql 例項執行:set global general_log = on ,開啟 general log 。

分散式 | 幾步快速擁有讀寫分離

使用 rwSplit1 使用者登入 dble 8066 埠,執行以下 sql :

insert into test_table values (1, 'name1'),(2, 'name2');

select * from test_table;

分散式 | 幾步快速擁有讀寫分離

檢視寫節點的 general log ,insert 語句發到寫節點上。

分散式 | 幾步快速擁有讀寫分離

分點檢視 2 個讀節點的 general log ,select 語句發到其中一個讀節點上。

分散式 | 幾步快速擁有讀寫分離

補充:

1、同時開啟 dble 讀寫分離和分庫分表的功能時,分庫分表引⽤的 dbGroup和 讀寫分離引⽤的 dbGroup 必須相互獨⽴。rwSplitUser 引⽤的 dbGroup ,僅需在 db.xml 中定義即可。

2、多個 rwSplitUser 可以引⽤同⼀個 dbGroup 。

3、dble 讀寫分離哪些語句發往主例項,哪些語句發往從例項呢?參考:https://github.com/actiontech...