漫游Kafka设计篇之数据持久化
生活随笔
收集整理的這篇文章主要介紹了
漫游Kafka设计篇之数据持久化
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
轉載注明出處:http://blog.csdn.net/honglei915/article/details/37564595
Kafka視頻教程同步首發,歡迎觀看!
不要畏懼文件系統!
Kafka大量依賴文件系統去存儲和緩存消息。對于硬盤有個傳統的觀念是硬盤總是很慢,這使很多人懷疑基于文件系統的架構能否提供優異的性能。實際上硬盤的快慢完全取決于使用它的方式。設計良好的硬盤架構可以和內存一樣快。在6塊7200轉的SATA RAID-5磁盤陣列的線性寫速度差不多是600MB/s,但是隨即寫的速度卻是100k/s,差了差不多6000倍。現代的操作系統都對次做了大量的優化,使用了 read-ahead 和 write-behind的技巧,讀取的時候成塊的預讀取數據,寫的時候將各種微小瑣碎的邏輯寫入組織合并成一次較大的物理寫入。對此的深入討論可以查看這里,它們發現線性的訪問磁盤,很多時候比隨機的內存訪問快得多。
為了提高性能,現代操作系統往往使用內存作為磁盤的緩存,現代操作系統樂于把所有空閑內存用作磁盤緩存,雖然這可能在緩存回收和重新分配時犧牲一些性能。所有的磁盤讀寫操作都會經過這個緩存,這不太可能被繞開除非直接使用I/O。所以雖然每個程序都在自己的線程里只緩存了一份數據,但在操作系統的緩存里還有一份,這等于存了兩份數據。
另外再來討論一下JVM,以下兩個事實是眾所周知的:
- Java對象占用空間是非常大的,差不多是要存儲的數據的兩倍甚至更高。
- 隨著堆中數據量的增加,垃圾回收回變的越來越困難。
所以與傳統的將數據緩存在內存中然后刷到硬盤的設計不同,Kafka直接將數據寫到了文件系統的日志中。
常量時間的操作效率
在大多數的消息系統中,數據持久化的機制往往是為每個cosumer提供一個B樹或者其他的隨機讀寫的數據結構。B樹當然是很棒的,但是也帶了一些代價:比如B樹的復雜度是O(log N),O(log N)通常被認為就是常量復雜度了,但對于硬盤操作來說并非如此。磁盤進行一次搜索需要10ms,每個硬盤在同一時間只能進行一次搜索,這樣并發處理就成了問題。雖然存儲系統使用緩存進行了大量優化,但是對于樹結構的性能的觀察結果卻表明,它的性能往往隨著數據的增長而線性下降,數據增長一倍,速度就會降低一倍。直觀的講,對于主要用于日志處理的消息系統,數據的持久化可以簡單的通過將數據追加到文件中實現,讀的時候從文件中讀就好了。這樣做的好處是讀和寫都是 O(1) 的,并且讀操作不會阻塞寫操作和其他操作。這樣帶來的性能優勢是很明顯的,因為性能和數據的大小沒有關系了。
既然可以使用幾乎沒有容量限制(相對于內存來說)的硬盤空間建立消息系統,就可以在沒有性能損失的情況下提供一些一般消息系統不具備的特性。比如,一般的消息系統都是在消息被消費后立即刪除,Kafka卻可以將消息保存一段時間(比如一星期),這給consumer提供了很好的機動性和靈活性,這點在今后的文章中會有詳述。 超強干貨來襲 云風專訪:近40年碼齡,通宵達旦的技術人生
總結
以上是生活随笔為你收集整理的漫游Kafka设计篇之数据持久化的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 漫游kafka实战篇之搭建Kafka开发
- 下一篇: 漫游Kafka设计篇之消息传输的事务定义