號外:Citus發(fā)布了8.x版本匿沛,支持PostgreSQL11。
Citus適合存放數(shù)據(jù)量較大的情形,不上億都不好意思往Citus中放动壤,或者說更適合放單節(jié)點,存儲如此大量的數(shù)據(jù)淮逻,如果不做好數(shù)據(jù)備份或高可用琼懊,數(shù)據(jù)丟失損失不會小,所以我們就來看看Citus是怎么保護(hù)數(shù)據(jù)的爬早。Citus集群中節(jié)點分為兩種角色:Worker節(jié)點和Coordinator節(jié)點哼丈,我們分別展開來看,如何實現(xiàn)Worker節(jié)點和Coordinator節(jié)點的高可用筛严。
worker節(jié)點故障
Citus處理worker節(jié)點宕掉的方法是保存一份數(shù)據(jù)的多個副本醉旦,Citus支持兩種形式的備份:PostgreSQL的流式復(fù)制(Stream Replication)、Citus的分片復(fù)制(Shard Replication)。
PostgreSQL的流式復(fù)制
流式復(fù)制是指持續(xù)的發(fā)送WAL XLOG到一個或多個備份服務(wù)器车胡,讓它們的數(shù)據(jù)始終保持同步最新檬输,在9.0版本加入的功能。
配置流式復(fù)制賬戶
在備份服務(wù)器上創(chuàng)建用于接收WAL XLOG的用戶匈棘,該用戶需要具有“REPLICATION”權(quán)限丧慈,但最好不要給與過高權(quán)限,如“SUPERUSER”羹饰,該權(quán)限允許用戶修改主服務(wù)器的數(shù)據(jù)伊滋,可能會引發(fā)不必要的安全問題。
CREATE USER sr_user WITH REPLICATION;
允許備份服務(wù)器訪問主服務(wù)器
pg_hba.conf中添加一行队秩,允許備份服務(wù)器訪問(假設(shè)備份服務(wù)器IP是192.168.0.17):
# TYPE??? DATABASE???? USER??? ADDRESS??? METHOD
host??? replication??? sr_user??? 192.168.0.17/32??? md5
配置備份服務(wù)器訪問主服務(wù)器
修改備份服務(wù)器的revovery.conf笑旺,添加主服務(wù)器連接信息(假設(shè)主服務(wù)器IP為192.168.0.1,數(shù)據(jù)庫端口5432馍资,用戶名是p_user筒主,密碼是p_user_pass)。
primary_conninfo = 'host=192.168.1.50 port=5432 user=p_user password=p_user_pass'
OK鸟蟹,現(xiàn)在重啟主服務(wù)器和你的備份服務(wù)器乌妙,觀察數(shù)據(jù)是否同步。
TODO
Citus的分片復(fù)制
Citus將每個數(shù)據(jù)分片復(fù)制兩份或多份建钥,分布到不同的worker節(jié)點上藤韵,如果其中存儲相同分片的一個worker節(jié)點宕掉,Coordinator節(jié)點會將查詢路由到有相同分片的正常worker節(jié)點熊经。要使用Citus的分片復(fù)制功能泽艘,需要創(chuàng)建分布式表之前設(shè)置啟用分片復(fù)制功能,將“shard_replication_factor”镐依,也就是每個分片的副本數(shù)量匹涮,設(shè)置為2或者更高,以支持更好的容錯性槐壳。
SET citus.shard_replication_factor = 2;
如果沒有開啟分片復(fù)制功能然低,每個分片默認(rèn)只有一個副本,也就是說务唐,如果某個node節(jié)點宕掉雳攘,那么數(shù)據(jù)肯定會不完整,查詢將會失敺愕选:
relation "test_shard_replication_102182" does not exist
relation "test_shard_replication_102185" does not exist
······
relation "test_shard_replication_102189" does not exist
Coordinator節(jié)點故障
Coordinator節(jié)點作用主要是維護(hù)元數(shù)據(jù)来农,這些元數(shù)據(jù)記錄著各個節(jié)點地址、狀態(tài)崇堰,以及數(shù)據(jù)的各個分片副本在各個worker節(jié)點的分布情況沃于,并不會實際存儲業(yè)務(wù)數(shù)據(jù)涩咖,所以其維護(hù)的數(shù)據(jù)的總體積不大,較為容易備份和恢復(fù)繁莹,所以Citus本身并沒有存儲其副本檩互,沒有給出高可用的方案,但我們還是可以利用PostgreSQL的流式復(fù)制實現(xiàn)Coordinator節(jié)點的高可用咨演,當(dāng)然也有一些其它的備份方法闸昨,但需要手動進(jìn)行數(shù)據(jù)和Coordinator節(jié)點的恢復(fù)。
總結(jié)
無論是Worker節(jié)點故障還是Coordinator節(jié)點故障薄风,我們都可以利用PostgreSQL本身的流式復(fù)制(Stream Replication)來實現(xiàn)一定程度的高可用饵较,由于所有的業(yè)務(wù)數(shù)據(jù)都會存放在Worker節(jié)點,Citus還提供了分片副本的方式來實現(xiàn)單點故障的高可用遭赂。