k3s之前的multi-master的支持 Mysql, PostgreSql, etcd 這3個(gè)方案,現(xiàn)在正在實(shí)驗(yàn)一個(gè)內(nèi)嵌的multi-master方案,使用一個(gè)sqlite的HA版本-dqlite,dqlite-顧名思義,distibution sqlite,以后穩(wěn)定的話,可能會(huì)成為官方推薦的HA方案。
Dqlite用主要做了幾個(gè)事情:
提供一個(gè)基于raft的解決方案,基于一個(gè)叫 c-raft 的 raft輕量級(jí)實(shí)現(xiàn),
把sqlite封裝起來,給它存儲(chǔ)層注冊(cè)一個(gè)定制driver來操作數(shù)據(jù)
CAP理論里,和絕大多分布式數(shù)據(jù)庫一樣,dqlite選擇了(CP without A), 就是選擇了Consistency(一致性)、Partition tolerance(分區(qū)容錯(cuò)性),而不保證 Availability(可用性),也即是:
保證了數(shù)據(jù)一致性
保持強(qiáng)一致性,用戶請(qǐng)求需要在服務(wù)器中所有的分區(qū)里面完成了一致性才返回
但是,不保證每個(gè)請(qǐng)求都能得到?jīng)]有報(bào)錯(cuò)的響應(yīng)
一般,我們用sqlite是這樣的:

應(yīng)用程序直接調(diào)用一個(gè)單節(jié)點(diǎn)的sqlite實(shí)例
使用dqlite,則是這樣的

應(yīng)用程序不直接操作sqlite的接口,調(diào)用的是dqlite提供的接口,dqlite通過c-raft來保證數(shù)據(jù)一致性和容錯(cuò)行
目前官方提供了一個(gè)go的binding, 可以直接在go里使用dqlite的接口
作者有一個(gè)demo的演講,演示了一個(gè)go寫的分布式氧飽和度檢測(cè)儀的例子

這段代碼很簡單,模擬插入氧飽和度的數(shù)據(jù),然后提供一個(gè)http接口查詢平均飽和度返回給調(diào)用者
其中g(shù)etDatabase方法,如果用單實(shí)例的sqlite,它是這樣的:

如果用dqlite變成這樣

startEngine實(shí)際上是調(diào)用dqlite的接口創(chuàng)建一個(gè)新的dqlite節(jié)點(diǎn)

然后調(diào)用dqlite client這個(gè)接口連到集群

往sqlite的存儲(chǔ)層注入一個(gè)dqlite定制的driver

可以看到,用go來使用這HA方案,還是挺方便易用。
目前k3s的dqlite HA版本目前還是實(shí)驗(yàn)狀態(tài),不要在生產(chǎn)環(huán)境使用,還有一些問題,比如:
cpu使用率高
第一個(gè)啟動(dòng)的節(jié)點(diǎn)如果崩潰了,leader選舉不出來
總的來講,這個(gè)k3s的嵌入式HA方案還是非常值得期待,畢竟在IOT這種蠅級(jí)設(shè)備里面包mysql或者etcd這種程序還是有點(diǎn)太重了
參考:
擴(kuò)展閱讀: