成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

分布式系統的核心——日志

存儲 存儲軟件 分布式
日志就是按照時間順序追加的、完全有序的記錄序列,其實就是一種特殊的文件格式,文件是一個字節數組,而這里日志是一個記錄數據,只是相對于文件來說,這里每條記錄都是按照時間的相對順序排列的,可以說日志是最簡單的一種存儲模型,讀取一般都是從左到右,例如消息隊列,一般是線性寫入log文件,消費者順序從offset開始讀取。

什么是日志?

日志就是按照時間順序追加的、完全有序的記錄序列,其實就是一種特殊的文件格式,文件是一個字節數組,而這里日志是一個記錄數據,只是相對于文件來說,這里每條記錄都是按照時間的相對順序排列的,可以說日志是最簡單的一種存儲模型,讀取一般都是從左到右,例如消息隊列,一般是線性寫入log文件,消費者順序從offset開始讀取。

[[212153]]

由于日志本身固有的特性,記錄從左向右開始順序插入,也就意味著左邊的記錄相較于右邊的記錄“更老”, 也就是說我們可以不用依賴于系統時鐘,這個特性對于分布式系統來說相當重要。

日志的應用

日志在數據庫中的應用

日志是什么時候出現已經無從得知,可能是概念上來講太簡單。在數據庫領域中日志更多的是用于在系統crash的時候同步數據以及索引等,例如MySQL中的redo log,redo log是一種基于磁盤的數據結構,用于在系統掛掉的時候保證數據的正確性、完整性,也叫預寫日志,例如在一個事物的執行過程中,首先會寫redo log,然后才會應用實際的更改,這樣當系統crash后恢復時就能夠根據redo log進行重放從而恢復數據(在初始化的過程中,這個時候不會還沒有客戶端的連接)。日志也可以用于數據庫主從之間的同步,因為本質上,數據庫所有的操作記錄都已經寫入到了日志中,我們只要將日志同步到slave,并在slave重放就能夠實現主從同步,這里也可以實現很多其他需要的組件,我們可以通過訂閱redo log 從而拿到數據庫所有的變更,從而實現個性化的業務邏輯,例如審計、緩存同步等等。

日志在分布式系統中的應用

分布式系統服務本質上就是關于狀態的變更,這里可以理解為狀態機,兩個獨立的進程(不依賴于外部環境,例如系統時鐘、外部接口等)給定一致的輸入將會產生一致的輸出并最終保持一致的狀態,而日志由于其固有的順序性并不依賴系統時鐘,正好可以用來解決變更有序性的問題。

我們利用這個特性實現解決分布式系統中遇到的很多問題。例如RocketMQ中的備節點,主broker接收客戶端的請求,并記錄日志,然后實時同步到salve中,slave在本地重放,當master掛掉的時候,slave可以繼續處理請求,例如拒絕寫請求并繼續處理讀請求。日志中不僅僅可以記錄數據,也可以直接記錄操作,例如SQL語句。

日志是解決一致性問題的關鍵數據結構,日志就像是操作序列,每一條記錄代表一條指令,例如應用廣泛的Paxos、Raft協議,都是基于日志構建起來的一致性協議。

日志在Message Queue中的應用

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

這里的日志可以理解為消息隊列,消息隊列可以起到異步解耦、限流的作用。為什么說解耦呢?因為對于消費者、生產者來說,兩個角色的職責都很清晰,就負責生產消息、消費消息,而不用關心下游、上游是誰,不管是來數據庫的變更日志、某個事件也好,對于某一方來說我根本不需要關心,我只需要關注自己感興趣的日志以及日志中的每條記錄。

我們知道數據庫的QPS是一定的,而上層應用一般可以橫向擴容,這個時候如果到了雙11這種請求突然的場景,數據庫會吃不消,那么我們就可以引入消息隊列,將每個隊數據庫的操作寫到日志中,由另外一個應用專門負責消費這些日志記錄并應用到數據庫中,而且就算數據庫掛了,當恢復的時候也可以從上次消息的位置繼續處理(RocketMQ和Kafka都支持Exactly Once語義),這里即使生產者的速度異于消費者的速度也不會有影響,日志在這里起到了緩沖的作用,它可以將所有的記錄存儲到日志中,并定時同步到slave節點,這樣消息的積壓能力能夠得到很好的提升,因為寫日志都是有master節點處理,讀請求這里分為兩種,一種是tail-read,就是說消費速度能夠跟得上寫入速度的,這種讀可以直接走緩存,而另一種也就是落后于寫入請求的消費者,這種可以從slave節點讀取,這樣通過IO隔離以及操作系統自帶的一些文件策略,例如pagecache、緩存預讀等,性能可以得到很大的提升。

分布式系統中可橫向擴展是一個相當重要的特性,加機器能解決的問題都不是問題。那么如何實現一個能夠實現橫向擴展的消息隊列呢? 假如我們有一個單機的消息隊列,隨著topic數目的上升,IO、CPU、帶寬等都會逐漸成為瓶頸,性能會慢慢下降,那么這里如何進行性能優化呢?

1.topic/日志分片,本質上topic寫入的消息就是日志的記錄,那么隨著寫入的數量越多,單機會慢慢的成為瓶頸,這個時候我們可以將單個topic分為多個子topic,并將每個topic分配到不同的機器上,通過這種方式,對于那些消息量極大的topic就可以通過加機器解決,而對于一些消息量較少的可以分到到同一臺機器或不進行分區

2.group commit,例如Kafka的producer客戶端,寫入消息的時候,是先寫入一個本地內存隊列,然后將消息按照每個分區、節點匯總,進行批量提交,對于服務器端或者broker端,也可以利用這種方式,先寫入pagecache,再定時刷盤,刷盤的方式可以根據業務決定,例如金融業務可能會采取同步刷盤的方式。

3.規避無用的數據拷貝

4.IO隔離

結語

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

責任編輯:武曉燕 來源: Linux就該這么學
相關推薦

2023-05-12 08:23:03

分布式系統網絡

2017-10-16 10:24:47

LogDevice存儲系統

2023-02-11 00:04:17

分布式系統安全

2022-06-21 08:27:22

Seata分布式事務

2023-05-29 14:07:00

Zuul網關系統

2025-05-15 08:05:00

2017-10-27 08:40:44

分布式存儲剪枝系統

2023-10-26 18:10:43

分布式并行技術系統

2019-07-17 22:23:01

分布式系統負載均衡架構

2023-04-26 08:01:09

分布式編譯系統

2017-10-17 08:33:31

存儲系統分布式

2023-10-08 10:49:16

搜索系統分布式系統

2019-06-19 15:40:06

分布式鎖RedisJava

2011-04-18 14:43:23

分布式測試分布式測試

2010-03-24 17:07:52

無線分布式系統

2018-12-14 10:06:22

緩存分布式系統

2010-11-01 05:50:46

分布式文件系統

2019-08-05 07:58:01

分布式架構系統

2017-12-20 16:15:30

分布式系統架構

2020-09-17 11:12:03

分布式系統代碼檢代碼檢視
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 欧美中文字幕 | 在线日韩欧美 | 在线观看免费av网 | 美女午夜影院 | 成人国产a | 欧美狠狠操 | 欧美成人猛片aaaaaaa | 国内精品99 | 亚洲第一中文字幕 | 国产精品永久久久久 | 国内精品视频 | 一区二区三区日韩精品 | 中文字幕第十五页 | 久久久久中文字幕 | 欧美一卡二卡在线 | 欧美日韩精品免费 | 国产精品激情小视频 | 91精品国产综合久久精品图片 | av在线播放免费 | 青春草91| 三级在线视频 | 亚洲欧美中文日韩在线v日本 | 一区视频在线 | 97caoporn国产免费人人 | 欧美三级成人理伦 | 欧美久久久久久 | 99精品久久 | 欧美在线一级 | 欧美最猛黑人xxxx黑人 | 欧美一区二区三区大片 | 日韩欧美一区二区三区四区 | 色伊人网| 国产精品1区 | 中文字幕在线观看一区 | 欧美精品一区在线发布 | 欧美一级黄色网 | 欧美亚洲一区二区三区 | 国产成人一区二区三区 | 免费在线一区二区 | 91精品国产综合久久久久久蜜臀 | 亚洲永久 |