<kbd id="afajh"><form id="afajh"></form></kbd>
<strong id="afajh"><dl id="afajh"></dl></strong>
    <del id="afajh"><form id="afajh"></form></del>
        1. <th id="afajh"><progress id="afajh"></progress></th>
          <b id="afajh"><abbr id="afajh"></abbr></b>
          <th id="afajh"><progress id="afajh"></progress></th>

          22.神說:Kafka其實(shí)是個(gè)數(shù)據(jù)庫

          共 2121字,需瀏覽 5分鐘

           ·

          2021-03-26 16:13

          1 楔子

          中國人都知道,自古馬家出神人。在互聯(lián)網(wǎng)領(lǐng)域,凡是姓馬的,必須要禮讓三分,什么馬云、馬化騰、馬斯克。而Martin Kleppmann就是分布式系統(tǒng)領(lǐng)域的活著的神人,最近一直看他的書。。。主要是為了陶冶情操。

          上周看了他在Kafka Summit 2018上的一場演講《Is Kafka a Database》,介紹了怎么把Kafka當(dāng)作數(shù)據(jù)庫使用的一些探索。

          Kafka一直是MQ領(lǐng)域的事實(shí)標(biāo)準(zhǔn),但我還是頭一次聽說Kafka的隱藏身份竟然是數(shù)據(jù)庫,難道我家MySQL要失寵了嘛?嚇得我趕緊搬來小板凳,擺好姿勢。

          Martin從AICD的角度講述怎么使用Kafka,觀點(diǎn)比較有趣,不少想法值得進(jìn)一步探討:


          2 Atomicty

          原子性的核心是容錯(cuò),當(dāng)發(fā)生錯(cuò)誤(宕機(jī)、崩潰、斷網(wǎng))時(shí),保證事務(wù)中多個(gè)寫操作要么全部生效要么全部回滾。在單機(jī)時(shí)代,通常使用undo log以回滾未提交操作的方式來保證事務(wù)原子性。

          然而,如果涉及到分布式事務(wù)呢?比如用戶在一次操作中想同時(shí)更新DB, Cache和Index中的數(shù)據(jù),該如何保證分布式事務(wù)的原子性呢?我們以前聊過兩階段提交《19.分布式事務(wù)之2PC:兩階段結(jié)婚》,但2PC的性能和可靠性實(shí)際上是比較感人的。

          事件流(event stream)提供了一種新的思路。以Kafka為例,應(yīng)用server將操作以事件的方式追加log到消息隊(duì)列中,待修改的DB, Cache和Index分別在不同的消費(fèi)組內(nèi)消費(fèi)相同的event log。如果在消費(fèi)過程中,其中某一個(gè)進(jìn)程crash了,則等待進(jìn)程重啟后,從最后一次消費(fèi)的offset處繼續(xù)消費(fèi)就可以了。

          跟單機(jī)的undo方式不同,這里通過redo的方式來達(dá)到多對象事務(wù)一致性的目的,同樣滿足原子性要求。


          3 Consistency

          一致性的核心是約束,保持?jǐn)?shù)據(jù)滿足邏輯一致性。這個(gè)特性在ACID中是打醬油的,連正經(jīng)的數(shù)據(jù)庫也沒有正經(jīng)對待的,全靠程序員撐著,所以不聊也罷,就當(dāng)Kafka實(shí)現(xiàn)了。


          4 Isolation

          隔離性的核心是并發(fā),單機(jī)事務(wù)通過定義隔離級別,來平衡高并發(fā)與隔離性。Kafka使用分區(qū)解決并發(fā)問題:單分區(qū)內(nèi)嚴(yán)格按先后順序處理,不同分區(qū)之間則互不干擾,就像結(jié)婚多年的夫妻一樣,坐在床頭各看各的手機(jī)。同一個(gè)分區(qū)內(nèi),同一時(shí)刻只允許單個(gè)線程消費(fèi),因此,在恰當(dāng)使用的前提下,Kafak可以做到最高級別的隔離性:Serializable(可串行化)。

          以注冊唯一名為例。假定有兩個(gè)玩家都想在Touch游戲中注冊名字為jane,應(yīng)用server以jane為partition key將消息投遞到kafka的同一個(gè)分區(qū)中,這樣同一個(gè)分區(qū)內(nèi)的兩條消息無論如何都會有一個(gè)先后順序。排在前面的消息會處理成功,插入到數(shù)據(jù)庫中,而排在后面的消息會處理失敗,因?yàn)樗鼤l(fā)現(xiàn)數(shù)據(jù)庫中已經(jīng)存在一條名字為jane的數(shù)據(jù)了。

          Touch是多年前我參與研制的一款舞蹈游戲,那時(shí)候我還有顏值

          同樣的例子,在DB的流程中,Martin使用Serializable隔離級別來襯托Kafka事務(wù)的優(yōu)越性。對于這一點(diǎn),我是不太認(rèn)同的,因?yàn)槲覀兛梢允褂孟鄬^低的隔離級別(比如RC),配合unique index,然后在事務(wù)開始的時(shí)候執(zhí)行insert into user(name) values('jane'),減少鎖的粒度,從而獲得比Searializable隔離級別高得多的并發(fā)性。

          但即便如此,這仍然是一件非常amazing的事情,因?yàn)?/span>Kafka的分區(qū)是天然多線程+無鎖的,甚至也不需要DB配合創(chuàng)建unique index以確保唯一性,這可以極大提高事務(wù)的并發(fā)能力,讓應(yīng)用可以在事務(wù)前期就可以通過無鎖的plain select做一些預(yù)判之類的事情,同時(shí)幾乎不消耗DB性能。


          5 Durability

          持久性的核心是數(shù)據(jù)安全。單機(jī)時(shí)代,DB通過WAL落盤的方式實(shí)現(xiàn)持久性;分布式時(shí)代,集群通過副本的方式實(shí)現(xiàn)持久性。

          Kafka的ISR方式,可以兼顧集群高性能與高可用的目標(biāo)。其持久能力一直有口皆碑,用過的都直呼好棒。

          MySQL集群通常使用一主二從三副本的方式達(dá)到類似的目標(biāo)。


          6 等等,還不到拋棄MySQL的時(shí)候

          在中國傳統(tǒng)文化里,愚公是能移山的,精衛(wèi)是能填海的,曹沖是能稱象的,男人是靠不住的。。。但這些都是個(gè)別現(xiàn)象。

          說出來你們可能不信,愚公和精衛(wèi)其實(shí)偷偷合作多年


          雖然Kafka在一些方面做的還不錯(cuò),但還遠(yuǎn)未到完全代替關(guān)系型DB的時(shí)候,比如實(shí)時(shí)在線查詢方面,Kafka就不是MySQL的一合之?dāng)场_@么看的話,MySQL老是老了一點(diǎn)兒,但老夫老妻嘛,在一起這么多年了,知根知底的,還不到拋棄的時(shí)候。。。想啥呢?我可是堅(jiān)定的一夫一妻制支持者,我上網(wǎng)學(xué)習(xí)的時(shí)候,連美女照片都從來不看,像什么蒼井空,武藤蘭,小澤瑪利亞我一個(gè)也不認(rèn)識。


          7 再稍等一下

          客官,才藝都展示完了,你好歹點(diǎn)個(gè)贊再走嘛?


          瀏覽 91
          點(diǎn)贊
          評論
          收藏
          分享

          手機(jī)掃一掃分享

          分享
          舉報(bào)
          評論
          圖片
          表情
          推薦
          點(diǎn)贊
          評論
          收藏
          分享

          手機(jī)掃一掃分享

          分享
          舉報(bào)
          <kbd id="afajh"><form id="afajh"></form></kbd>
          <strong id="afajh"><dl id="afajh"></dl></strong>
            <del id="afajh"><form id="afajh"></form></del>
                1. <th id="afajh"><progress id="afajh"></progress></th>
                  <b id="afajh"><abbr id="afajh"></abbr></b>
                  <th id="afajh"><progress id="afajh"></progress></th>
                  在线播放日韩 | 永久官看美女裸体网站 | 欧洲熟妇的性久久久久久 | 精品视频一区二区三区四区 | 亚洲爱爱电影 |