描述和解決
- 環(huán)境
Distributed + MergeTree, 2分片2副本, 4節(jié)點(diǎn) - 問(wèn)題
數(shù)據(jù)插入到ck, 每次查詢結(jié)果不大一樣 - 步驟
- 查看所有時(shí)鐘是否同步, 經(jīng)排查有一天機(jī)器的時(shí)間在2020年, 修正后重啟, 問(wèn)題依舊存在
- 檢查/etc/metrika.xml配置, internal_replication是否設(shè)置為false, 改完后數(shù)據(jù)查詢正常
從官方文檔來(lái)看這個(gè)值的意思是是否啟用內(nèi)部布置, 如果配置了true, 那么寫(xiě)入數(shù)據(jù)時(shí)只會(huì)同步到第一個(gè)健康的副本, 不會(huì)同步所有副本, 那么就會(huì)可能導(dǎo)致數(shù)據(jù)不一致
配置詳解
- 非復(fù)制表镰吆,internal_replication=false琳疏。寫(xiě)入單機(jī)表時(shí),不同服務(wù)器查詢結(jié)果不同辆布;插入到分布式表中的數(shù)據(jù)被插入到兩個(gè)本地表中,如果在插入期間沒(méi)有問(wèn)題握牧,則兩個(gè)本地表上的數(shù)據(jù)保持同步纪铺。我們稱之為“窮人的復(fù)制”钻哩,因?yàn)閺?fù)制在網(wǎng)絡(luò)出現(xiàn)問(wèn)題的情況下容易發(fā)生分歧,沒(méi)有一個(gè)簡(jiǎn)單的方法來(lái)確定哪一個(gè)是正確的復(fù)制肛冶。
- 非復(fù)制表街氢,internal_replication=true。數(shù)據(jù)只被插入到一個(gè)本地表中睦袖,但沒(méi)有任何機(jī)制可以將它轉(zhuǎn)移到另一個(gè)表中珊肃。因此,在不同主機(jī)上的本地表看到了不同的數(shù)據(jù)馅笙,查詢分布式表時(shí)會(huì)出現(xiàn)非預(yù)期的數(shù)據(jù)伦乔。顯然,這是配置ClickHouse集群的一種不正確的方法董习。
- 復(fù)制表烈和,internal_replication=true。插入到分布式表中的數(shù)據(jù)僅插入到其中一個(gè)本地表中皿淋,但通過(guò)復(fù)制機(jī)制傳輸?shù)搅硪粋€(gè)主機(jī)上的表中招刹。因此兩個(gè)本地表上的數(shù)據(jù)保持同步。這是官方推薦配置沥匈。
- 復(fù)制表蔗喂,internal_replication=false。數(shù)據(jù)被插入到兩個(gè)本地表中高帖,但同時(shí)復(fù)制表的機(jī)制保證重復(fù)數(shù)據(jù)會(huì)被刪除缰儿。數(shù)據(jù)會(huì)從插入的第一個(gè)節(jié)點(diǎn)復(fù)制到其它的節(jié)點(diǎn)。其它節(jié)點(diǎn)拿到數(shù)據(jù)后如果發(fā)現(xiàn)數(shù)據(jù)重復(fù)散址,數(shù)據(jù)會(huì)被丟棄乖阵。這種情況下,雖然復(fù)制保持同步预麸,沒(méi)有錯(cuò)誤發(fā)生瞪浸。但由于不斷的重復(fù)復(fù)制流,會(huì)導(dǎo)致寫(xiě)入性能明顯的下降吏祸。所以這種配置實(shí)際應(yīng)該是避免的对蒲。