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