由於日誌本身固有的特性,記錄從左向右開始順序插入,也就意味著左邊的記錄相較於右邊的記錄“更老”, 也就是說我們可以不用依賴於系統時鐘,這個特性對於分佈式系統來說相當重要。
日誌是何時出現已經無從得知,可能是概念上來講太簡單。在資料庫領域中日誌更多的是用於在系統crash的時候同步資料以及索引等,例如MySQL中的redo log,redo log是一種基於磁碟的資料結構,用於在系統掛掉的時候保證數據的正確性、完整性,也叫預寫日誌,例如在一個事物的執行過程中,首先會寫redo log,然後才會應用實際的更改,這樣當系統crash後恢復時就能夠根據redo log進行重放從而恢復資料(在初始化的過程中,這個時候不會還沒有客戶端的連線)。日誌也可以用於資料庫主從之間的同步,因為本質上,資料庫所有的操作記錄都已經寫入到了日誌中,我們只要將日誌同步到slave,並在slave重播就能夠實現主從同步,這裡也可以實現許多其他需要的元件,我們可以透過訂閱redo log 從而拿到資料庫所有的變更,從而實現個人化的業務邏輯,例如審計、快取同步等等。
分散式系統服務本質上就是關於狀態的變更,這裡可以理解為狀態機,兩個獨立的進程(不依賴於外部環境,例如係統時脈、外部介面等)給定一致的輸入將會產生一致的輸出並最終保持一致的狀態,而日誌由於其固有的順序性並不依賴系統時鐘,正好可以用來解決變更有序性的問題。
我們利用這個特性來實現解決分散式系統中遇到的許多問題。例如RocketMQ中的備節點,主broker接收客戶端的請求,並記錄日誌,然後即時同步到salve中,slave在本地重播,當master掛掉的時候,slave可以繼續處理請求,例如拒絕寫入請求並繼續處理讀取請求。日誌中不只可以記錄數據,也可以直接記錄操作,例如SQL語句。
日誌是解決一致性問題的關鍵資料結構,日誌就像是操作序列,每一條記錄代表一條指令,例如應用廣泛的Paxos、Raft協議,都是基於日誌建構的一致性協議。
日誌可以很方便的用於處理資料之間的流入流出,每一個資料來源都可以產生自己的日誌,這裡資料來源可以來自各個方面,例如某個事件流(頁面點擊、快取刷新提醒、資料庫binlog變更),我們可以將日誌集中儲存到一個叢集中,訂閱者可以根據offset來讀取日誌的每筆記錄,根據每筆記錄中的資料、操作套用自己的變更。
這裡的日誌可以理解為訊息佇列,訊息佇列可以起到非同步解耦、限流的作用。為什麼要說解耦呢?因為對消費者、生產者來說,兩個角色的職責都很清晰,就負責生產訊息、消費訊息,而不用關心下游、上游是誰,不管是來資料庫的變更日誌、某個事件也好,對於某一方來說我根本不需要關心,我只需要專注於自己感興趣的日誌以及日誌中的每筆記錄。
我們知道資料庫的QPS是一定的,而上層應用一般可以橫向擴容,這個時候如果到了雙11這種請求突然的場景,數據庫會吃不消,那麼我們就可以引入消息隊列,將每個隊數據庫的操作寫到日誌中,由另外一個應用程式專門負責消費這些日誌記錄並應用到資料庫中,而且就算資料庫掛了,當恢復的時候也可以從上次訊息的位置繼續處理(RocketMQ和Kafka都支援Exactly Once語義),這裡即使生產者的速度異於消費者的速度也不會有影響,日誌在這裡起到了緩衝的作用,它可以將所有的記錄存儲到日誌中,並定時同步到slave節點,這樣消息的積壓能力能夠得到很好的提升,因為寫日誌都是有master節點處理,讀請求這裡分為兩種,一種是tail-read,就是說消費速度能夠跟得上寫入速度的,這種讀可以直接走緩存,而另一種也就是落後於寫入請求的消費者,這種可以從slave節點讀取,這樣透過IO隔離以及作業系統自帶的一些檔案策略,例如pagecache、快取預讀等,性能可以得到很大的提升。
分散式系統中可橫向擴展是一個相當重要的特性,加機器能解決的問題都不是問題。那麼如何實現一個能夠實現橫向擴展的消息隊列呢? 假如我們有一個單機的消息隊列,隨著topic數目的上升,IO、CPU、頻寬等都會逐漸成為瓶頸,性能會慢慢下降,那麼這裡如何進行性能優化呢?
- topic/日誌分片,本質上topic寫入的訊息就是日誌的記錄,那麼隨著寫入的數量越多,單機會慢慢的成為瓶頸,這個時候我們可以將單個topic分為多個子topic,並將每個topic分配到不同的機器上,透過這種方式,對於那些訊息量極大的topic就可以透過加機器解決,而對於一些訊息量較少的可以分到到同一台機器或不進行分區
- group commit,例如Kafka的producer客戶端,寫入訊息的時候,是先寫入一個本地記憶體佇列,然後將訊息依照每個分區、節點匯總,進行批次提交,對於伺服器端或broker端,也可以利用這種方式,先寫入pagecache,再定時刷盤,刷盤的方式可以根據業務決定,例如金融業務可能會採取同步刷盤的方式。
- 規避無用的資料拷貝
- IO隔離
日誌在分散式系統中扮演了很重要的角色,是理解分散式系統各個組件的關鍵,隨著理解的深入,我們發現許多分散式中間件都是基於日誌進行構建的,例如Zookeeper、HDFS、 Kafka、RocketMQ、Google Spanner等等,甚至於資料庫,例如Redis、MySQL等等,其master-slave都是基於日誌同步的方式,依賴共享的日誌系統,我們可以實現許多系統: 節點間資料同步、並發更新資料順序問題(一致性問題)、持久性(系統crash時能夠透過其他節點繼續提供服務)、分散式鎖服務等等,相信慢慢的通過實踐、以及大量的論文閱讀之後,一定會有更深層次的理解。
以上是Linux下高效的日誌庫的應用的詳細內容。更多資訊請關注PHP中文網其他相關文章!

Linux和Windows的安全模型各有優勢。 Linux提供靈活性和可定制性,通過用戶權限、文件系統權限和SELinux/AppArmor實現安全。 Windows則注重用戶友好性,依賴WindowsDefender、UAC、防火牆和BitLocker保障安全。

Linux和Windows在硬件兼容性上不同:Windows有廣泛的驅動程序支持,Linux依賴社區和廠商。解決Linux兼容性問題可通過手動編譯驅動,如克隆RTL8188EU驅動倉庫、編譯和安裝;Windows用戶需管理驅動程序以優化性能。

Linux和Windows在虛擬化支持上的主要區別在於:1)Linux提供KVM和Xen,性能和靈活性突出,適合高定制環境;2)Windows通過Hyper-V支持虛擬化,界面友好,與Microsoft生態系統緊密集成,適合依賴Microsoft軟件的企業。

Linux系統管理員的主要任務包括系統監控與性能調優、用戶管理、軟件包管理、安全管理與備份、故障排查與解決、性能優化與最佳實踐。 1.使用top、htop等工具監控系統性能,並進行調優。 2.通過useradd等命令管理用戶賬戶和權限。 3.利用apt、yum管理軟件包,確保系統更新和安全。 4.配置防火牆、監控日誌、進行數據備份以確保系統安全。 5.通過日誌分析和工具使用進行故障排查和解決。 6.優化內核參數和應用配置,遵循最佳實踐提升系統性能和穩定性。

學習Linux並不難。 1.Linux是一個開源操作系統,基於Unix,廣泛應用於服務器、嵌入式系統和個人電腦。 2.理解文件系統和權限管理是關鍵,文件系統是層次化的,權限包括讀、寫和執行。 3.包管理系統如apt和dnf使得軟件管理方便。 4.進程管理通過ps和top命令實現。 5.從基本命令如mkdir、cd、touch和nano開始學習,再嘗試高級用法如shell腳本和文本處理。 6.常見錯誤如權限問題可以通過sudo和chmod解決。 7.性能優化建議包括使用htop監控資源、清理不必要文件和使用sy

Linux管理員的平均年薪在美國為75,000至95,000美元,歐洲為40,000至60,000歐元。提升薪資可以通過:1.持續學習新技術,如雲計算和容器技術;2.積累項目經驗並建立Portfolio;3.建立職業網絡,拓展人脈。

Linux的主要用途包括:1.服務器操作系統,2.嵌入式系統,3.桌面操作系統,4.開發和測試環境。 Linux在這些領域表現出色,提供了穩定性、安全性和高效的開發工具。

互聯網運行不依賴單一操作系統,但Linux在其中扮演重要角色。 Linux廣泛應用於服務器和網絡設備,因其穩定性、安全性和可擴展性受歡迎。


熱AI工具

Undresser.AI Undress
人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover
用於從照片中去除衣服的線上人工智慧工具。

Undress AI Tool
免費脫衣圖片

Clothoff.io
AI脫衣器

Video Face Swap
使用我們完全免費的人工智慧換臉工具,輕鬆在任何影片中換臉!

熱門文章

熱工具

VSCode Windows 64位元 下載
微軟推出的免費、功能強大的一款IDE編輯器

ZendStudio 13.5.1 Mac
強大的PHP整合開發環境

MantisBT
Mantis是一個易於部署的基於Web的缺陷追蹤工具,用於幫助產品缺陷追蹤。它需要PHP、MySQL和一個Web伺服器。請查看我們的演示和託管服務。

記事本++7.3.1
好用且免費的程式碼編輯器

mPDF
mPDF是一個PHP庫,可以從UTF-8編碼的HTML產生PDF檔案。原作者Ian Back編寫mPDF以從他的網站上「即時」輸出PDF文件,並處理不同的語言。與原始腳本如HTML2FPDF相比,它的速度較慢,並且在使用Unicode字體時產生的檔案較大,但支援CSS樣式等,並進行了大量增強。支援幾乎所有語言,包括RTL(阿拉伯語和希伯來語)和CJK(中日韓)。支援嵌套的區塊級元素(如P、DIV),