自拍偷在线精品自拍偷,亚洲欧美中文日韩v在线观看不卡

分布式系統(tǒng)的核心——日志

存儲(chǔ) 存儲(chǔ)軟件 分布式
日志就是按照時(shí)間順序追加的、完全有序的記錄序列,其實(shí)就是一種特殊的文件格式,文件是一個(gè)字節(jié)數(shù)組,而這里日志是一個(gè)記錄數(shù)據(jù),只是相對(duì)于文件來(lái)說(shuō),這里每條記錄都是按照時(shí)間的相對(duì)順序排列的,可以說(shuō)日志是最簡(jiǎn)單的一種存儲(chǔ)模型,讀取一般都是從左到右,例如消息隊(duì)列,一般是線性寫入log文件,消費(fèi)者順序從offset開(kāi)始讀取。

什么是日志?

日志就是按照時(shí)間順序追加的、完全有序的記錄序列,其實(shí)就是一種特殊的文件格式,文件是一個(gè)字節(jié)數(shù)組,而這里日志是一個(gè)記錄數(shù)據(jù),只是相對(duì)于文件來(lái)說(shuō),這里每條記錄都是按照時(shí)間的相對(duì)順序排列的,可以說(shuō)日志是最簡(jiǎn)單的一種存儲(chǔ)模型,讀取一般都是從左到右,例如消息隊(duì)列,一般是線性寫入log文件,消費(fèi)者順序從offset開(kāi)始讀取。

[[212153]]

由于日志本身固有的特性,記錄從左向右開(kāi)始順序插入,也就意味著左邊的記錄相較于右邊的記錄“更老”, 也就是說(shuō)我們可以不用依賴于系統(tǒng)時(shí)鐘,這個(gè)特性對(duì)于分布式系統(tǒng)來(lái)說(shuō)相當(dāng)重要。

日志的應(yīng)用

日志在數(shù)據(jù)庫(kù)中的應(yīng)用

日志是什么時(shí)候出現(xiàn)已經(jīng)無(wú)從得知,可能是概念上來(lái)講太簡(jiǎn)單。在數(shù)據(jù)庫(kù)領(lǐng)域中日志更多的是用于在系統(tǒng)crash的時(shí)候同步數(shù)據(jù)以及索引等,例如MySQL中的redo log,redo log是一種基于磁盤的數(shù)據(jù)結(jié)構(gòu),用于在系統(tǒng)掛掉的時(shí)候保證數(shù)據(jù)的正確性、完整性,也叫預(yù)寫日志,例如在一個(gè)事物的執(zhí)行過(guò)程中,首先會(huì)寫redo log,然后才會(huì)應(yīng)用實(shí)際的更改,這樣當(dāng)系統(tǒng)crash后恢復(fù)時(shí)就能夠根據(jù)redo log進(jìn)行重放從而恢復(fù)數(shù)據(jù)(在初始化的過(guò)程中,這個(gè)時(shí)候不會(huì)還沒(méi)有客戶端的連接)。日志也可以用于數(shù)據(jù)庫(kù)主從之間的同步,因?yàn)楸举|(zhì)上,數(shù)據(jù)庫(kù)所有的操作記錄都已經(jīng)寫入到了日志中,我們只要將日志同步到slave,并在slave重放就能夠?qū)崿F(xiàn)主從同步,這里也可以實(shí)現(xiàn)很多其他需要的組件,我們可以通過(guò)訂閱redo log 從而拿到數(shù)據(jù)庫(kù)所有的變更,從而實(shí)現(xiàn)個(gè)性化的業(yè)務(wù)邏輯,例如審計(jì)、緩存同步等等。

日志在分布式系統(tǒng)中的應(yīng)用

分布式系統(tǒng)服務(wù)本質(zhì)上就是關(guān)于狀態(tài)的變更,這里可以理解為狀態(tài)機(jī),兩個(gè)獨(dú)立的進(jìn)程(不依賴于外部環(huán)境,例如系統(tǒng)時(shí)鐘、外部接口等)給定一致的輸入將會(huì)產(chǎn)生一致的輸出并最終保持一致的狀態(tài),而日志由于其固有的順序性并不依賴系統(tǒng)時(shí)鐘,正好可以用來(lái)解決變更有序性的問(wèn)題。

我們利用這個(gè)特性實(shí)現(xiàn)解決分布式系統(tǒng)中遇到的很多問(wèn)題。例如RocketMQ中的備節(jié)點(diǎn),主broker接收客戶端的請(qǐng)求,并記錄日志,然后實(shí)時(shí)同步到salve中,slave在本地重放,當(dāng)master掛掉的時(shí)候,slave可以繼續(xù)處理請(qǐng)求,例如拒絕寫請(qǐng)求并繼續(xù)處理讀請(qǐng)求。日志中不僅僅可以記錄數(shù)據(jù),也可以直接記錄操作,例如SQL語(yǔ)句。

日志是解決一致性問(wèn)題的關(guān)鍵數(shù)據(jù)結(jié)構(gòu),日志就像是操作序列,每一條記錄代表一條指令,例如應(yīng)用廣泛的Paxos、Raft協(xié)議,都是基于日志構(gòu)建起來(lái)的一致性協(xié)議。

日志在Message Queue中的應(yīng)用

日志可以很方便的用于處理數(shù)據(jù)之間的流入流出,每一個(gè)數(shù)據(jù)源都可以產(chǎn)生自己的日志,這里數(shù)據(jù)源可以來(lái)自各個(gè)方面,例如某個(gè)事件流(頁(yè)面點(diǎn)擊、緩存刷新提醒、數(shù)據(jù)庫(kù)binlog變更),我們可以將日志集中存儲(chǔ)到一個(gè)集群中,訂閱者可以根據(jù)offset來(lái)讀取日志的每條記錄,根據(jù)每條記錄中的數(shù)據(jù)、操作應(yīng)用自己的變更。

這里的日志可以理解為消息隊(duì)列,消息隊(duì)列可以起到異步解耦、限流的作用。為什么說(shuō)解耦呢?因?yàn)閷?duì)于消費(fèi)者、生產(chǎn)者來(lái)說(shuō),兩個(gè)角色的職責(zé)都很清晰,就負(fù)責(zé)生產(chǎn)消息、消費(fèi)消息,而不用關(guān)心下游、上游是誰(shuí),不管是來(lái)數(shù)據(jù)庫(kù)的變更日志、某個(gè)事件也好,對(duì)于某一方來(lái)說(shuō)我根本不需要關(guān)心,我只需要關(guān)注自己感興趣的日志以及日志中的每條記錄。

我們知道數(shù)據(jù)庫(kù)的QPS是一定的,而上層應(yīng)用一般可以橫向擴(kuò)容,這個(gè)時(shí)候如果到了雙11這種請(qǐng)求突然的場(chǎng)景,數(shù)據(jù)庫(kù)會(huì)吃不消,那么我們就可以引入消息隊(duì)列,將每個(gè)隊(duì)數(shù)據(jù)庫(kù)的操作寫到日志中,由另外一個(gè)應(yīng)用專門負(fù)責(zé)消費(fèi)這些日志記錄并應(yīng)用到數(shù)據(jù)庫(kù)中,而且就算數(shù)據(jù)庫(kù)掛了,當(dāng)恢復(fù)的時(shí)候也可以從上次消息的位置繼續(xù)處理(RocketMQ和Kafka都支持Exactly Once語(yǔ)義),這里即使生產(chǎn)者的速度異于消費(fèi)者的速度也不會(huì)有影響,日志在這里起到了緩沖的作用,它可以將所有的記錄存儲(chǔ)到日志中,并定時(shí)同步到slave節(jié)點(diǎn),這樣消息的積壓能力能夠得到很好的提升,因?yàn)閷懭罩径际怯衜aster節(jié)點(diǎn)處理,讀請(qǐng)求這里分為兩種,一種是tail-read,就是說(shuō)消費(fèi)速度能夠跟得上寫入速度的,這種讀可以直接走緩存,而另一種也就是落后于寫入請(qǐng)求的消費(fèi)者,這種可以從slave節(jié)點(diǎn)讀取,這樣通過(guò)IO隔離以及操作系統(tǒng)自帶的一些文件策略,例如pagecache、緩存預(yù)讀等,性能可以得到很大的提升。

分布式系統(tǒng)中可橫向擴(kuò)展是一個(gè)相當(dāng)重要的特性,加機(jī)器能解決的問(wèn)題都不是問(wèn)題。那么如何實(shí)現(xiàn)一個(gè)能夠?qū)崿F(xiàn)橫向擴(kuò)展的消息隊(duì)列呢? 假如我們有一個(gè)單機(jī)的消息隊(duì)列,隨著topic數(shù)目的上升,IO、CPU、帶寬等都會(huì)逐漸成為瓶頸,性能會(huì)慢慢下降,那么這里如何進(jìn)行性能優(yōu)化呢?

1.topic/日志分片,本質(zhì)上topic寫入的消息就是日志的記錄,那么隨著寫入的數(shù)量越多,單機(jī)會(huì)慢慢的成為瓶頸,這個(gè)時(shí)候我們可以將單個(gè)topic分為多個(gè)子topic,并將每個(gè)topic分配到不同的機(jī)器上,通過(guò)這種方式,對(duì)于那些消息量極大的topic就可以通過(guò)加機(jī)器解決,而對(duì)于一些消息量較少的可以分到到同一臺(tái)機(jī)器或不進(jìn)行分區(qū)

2.group commit,例如Kafka的producer客戶端,寫入消息的時(shí)候,是先寫入一個(gè)本地內(nèi)存隊(duì)列,然后將消息按照每個(gè)分區(qū)、節(jié)點(diǎn)匯總,進(jìn)行批量提交,對(duì)于服務(wù)器端或者broker端,也可以利用這種方式,先寫入pagecache,再定時(shí)刷盤,刷盤的方式可以根據(jù)業(yè)務(wù)決定,例如金融業(yè)務(wù)可能會(huì)采取同步刷盤的方式。

3.規(guī)避無(wú)用的數(shù)據(jù)拷貝

4.IO隔離

結(jié)語(yǔ)

日志在分布式系統(tǒng)中扮演了很重要的角色,是理解分布式系統(tǒng)各個(gè)組件的關(guān)鍵,隨著理解的深入,我們發(fā)現(xiàn)很多分布式中間件都是基于日志進(jìn)行構(gòu)建的,例如Zookeeper、HDFS、Kafka、RocketMQ、Google Spanner等等,甚至于數(shù)據(jù)庫(kù),例如Redis、MySQL等等,其master-slave都是基于日志同步的方式,依賴共享的日志系統(tǒng),我們可以實(shí)現(xiàn)很多系統(tǒng): 節(jié)點(diǎn)間數(shù)據(jù)同步、并發(fā)更新數(shù)據(jù)順序問(wèn)題(一致性問(wèn)題)、持久性(系統(tǒng)crash時(shí)能夠通過(guò)其他節(jié)點(diǎn)繼續(xù)提供服務(wù))、分布式鎖服務(wù)等等,相信慢慢的通過(guò)實(shí)踐、以及大量的論文閱讀之后,一定會(huì)有更深層次的理解。

責(zé)任編輯:武曉燕 來(lái)源: Linux就該這么學(xué)
相關(guān)推薦

2017-10-16 10:24:47

LogDevice存儲(chǔ)系統(tǒng)

2023-05-12 08:23:03

分布式系統(tǒng)網(wǎng)絡(luò)

2022-06-21 08:27:22

Seata分布式事務(wù)

2023-02-11 00:04:17

分布式系統(tǒng)安全

2023-05-29 14:07:00

Zuul網(wǎng)關(guān)系統(tǒng)

2017-10-27 08:40:44

分布式存儲(chǔ)剪枝系統(tǒng)

2023-10-26 18:10:43

分布式并行技術(shù)系統(tǒng)

2023-04-26 08:01:09

分布式編譯系統(tǒng)

2019-07-17 22:23:01

分布式系統(tǒng)負(fù)載均衡架構(gòu)

2017-10-17 08:33:31

存儲(chǔ)系統(tǒng)分布式

2019-06-19 15:40:06

分布式鎖RedisJava

2023-10-08 10:49:16

搜索系統(tǒng)分布式系統(tǒng)

2018-12-14 10:06:22

緩存分布式系統(tǒng)

2011-04-18 14:43:23

分布式測(cè)試分布式測(cè)試

2010-03-24 17:07:52

無(wú)線分布式系統(tǒng)

2019-08-05 07:58:01

分布式架構(gòu)系統(tǒng)

2010-11-01 05:50:46

分布式文件系統(tǒng)

2023-02-23 07:55:41

2017-12-20 16:15:30

分布式系統(tǒng)架構(gòu)

2024-10-18 08:00:00

分布式系統(tǒng)背壓數(shù)據(jù)庫(kù)
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號(hào)