Redis的持久化設計

Redis 持久化設計

持久化的功能:Redis是內存數據庫,數據都是存儲在內存中的,為了避免進程退出導致數據的永久丟失,要定期將Redis中的數據以某種形式從內存保存到硬盤,當下次Reids重啟時,利用持久化文件實現數據恢復。

RDB:將當前數據保存到硬盤

AOF:將每次執行的寫命令保存到硬盤(類似MySQL的binlog)

1. RDB持久化

RDB持久化是將當前進程中的數據生成快照保存到硬盤(因此也稱作快照持久化),保存的文件後綴是rdb;當Redis重新啟動時,可以讀取快照文件恢複數據。

  1. 觸發條件

    • 手動觸發 save 命令和bgsave命令都可以生成RDB文件, save命令會阻塞Redis服務進程,知道RDB文件創建完畢,bgsave命令則是創建一個子進程,由子進程來負責創建RDB文件,父進程繼續處理請求,bgsave命令執行過程中,只有fork子進程時會阻塞服務器,而對於save命令,整個過程都會阻塞服務器,因此save已基本被廢棄,線上環境要杜絕save的使用;後文中也將只介紹bgsave命令。此外,在自動觸發RDB持久化時,Redis也會選擇bgsave而不是save來進行持久化

    SAVE 執行期間,AOF 寫入可以在後台線程進行,BGREWRITEAOF 可以在子進程進行,所以這三種操作可以同時進行 ,為了避免性能問題,BGSAVE 和 BGREWRITEAOF 不能同時執行

  2. 自動觸發

save m n

在配置文件中通過 save m n 命令,指定當前m秒內發生n次變化時,觸發bgsave。

​ 其中save 900 1的含義是:當時間到900秒時,如果redis數據發生了至少1次變化,則執行bgsave;save 300 10和save 60 10000同理。當三個save條件滿足任意一個時,都會引起bgsave的調用.

Redis的save m n,是通過serverCron函數、dirty計數器、和lastsave時間戳來實現的-

  • serverCron函數,是Redis服務器的周期性操作函數,默認每隔100ms執行一次,該函數對服務器的狀態進行維護,其中一項工作就是檢測save m n 配置是否滿足條件,如果滿足就執行bgsave.
  • dirty計數器 記錄服務器進行了多少起操作,修改,不是客戶端執行了多少修改數據的命令
  • lastsave時間戳也是Reids服務器維持的一個狀態,記錄上一次成功執行bgsave的時間

save m n的原理如下:每隔100ms,執行serverCron函數;在serverCron函數中,遍歷save m n配置的保存條件,只要有一個條件滿足,就進行bgsave。對於每一個save m n條件,只有下面兩條同時滿足時才算滿足:

  • 當前時間-lastsave > m

  • dirty >= n

在主從複製場景下,如果從節點執行全量複製操作,則主節點會執行bgsave命令,並將rdb文件發送給從節點。

在執行shutdown命令時,自動執行rdb持久化

1.2 RDB文件

設置存儲路徑

- 配置文件:dir配置指定目錄,dbfilename指定文件名。默認是Redis根目錄下的dump.rdb文件
- 動態設置: 

config set dir {newdir} /// config set dbfilename {newFileName}

RDB文件 是經過壓縮的二進制文件,默認採用LZF算法對RDB文件進行壓縮,雖然壓縮耗時,但是可以大大減小文件體積,默認是開啟的,可以通過命令關閉:

config set rdbcompression no

RDB文件的壓縮並不是針對整個文件進行的,而是對數據庫中的字符串進行的,且只有在字符串達到一定長度(20字節)時才會進行

格式:

字段說明:

  1. REDIS常量,保存‘REDIS’5個字符

  2. db_version RDB文件的版本號

  3. SELECTDB 表示一個完整的數據庫(0號數據庫),同理SELECTDB 3 pairs表示完整的3號數據庫;只有當數據庫中有鍵值對時,RDB文件中才會有該數據庫的信息(上圖所示的Redis中只有0號和3號數據庫有鍵值對);如果Redis中所有的數據庫都沒有鍵值對,則這一部分直接省略。其中:SELECTDB是一個常量,代表後面跟着的是數據庫號碼;0和3是數據庫號碼;

  4. KEY-VALUE-PAIRS: pairs則存儲了具體的鍵值對信息,包括key、value值,及其數據類型、內部編碼、過期時間、壓縮信息等等

  1. EOF 標志著數據庫內容的結尾(不是文件的結尾),值為 rdb.h/EDIS_RDB_OPCODE_EOF (255)

  2. CHECK-SUM RDB 文件所有內容的校驗和,一個 uint_64t 類型值, REDIS 在寫入 RDB 文件時將校驗和保存在 RDB 文件的末尾,當讀取時,根據它的值對內容進行校驗

。如果這個域的值為 0 ,那麼表示 Redis 關閉了校驗和功能。

1.3 啟動時加載

​ RDB文件的載入工作是在服務器啟動時自動執行的,並沒有專門的命令。但是由於AOF的優先級更高,因此當AOF開啟時,Redis會優先載入AOF文件來恢複數據;只有當AOF關閉時,才會在Redis服務器啟動時檢測RDB文件,並自動載入。服務器載入RDB文件期間處於阻塞狀態,直到載入完成為止

2. AOF持久化

AOF(Append Only File) 則以協議文本的方式,將所有對數據庫進行過寫入的命令(及其參數)記錄到 AOF
文件,以此達到記錄數據庫狀態的目的

2.1 開啟AOF

Redis服務器默認開啟RDB,關閉AOF;要開啟AOF,需要在配置文件中配置:

appendonly yes

2.2 執行流程

2.2.1 命令寫入緩衝區

//緩衝區的定義 是一個SDS, 可以兼容C語言的字符串
struct redisServer {
    // AOF緩衝區, 在進入事件loop之前寫入
    sds aof_buf;
};
  1. 命令傳播: Redis將執行完的命令、命令的參數、命令的參數個數等信息發送到 AOF 程序中

  2. 緩存追加: AOF程序根據接收到的命令命令數據,將命令轉換為網絡通訊協議的格式,然後將協議內容追加到服務器的 AOF 緩存中。

    • 將命令以文本協議格式保存在緩存中
    • 為什麼使用文本協議格式?兼容性,避免二次開銷,可讀性
    • 為什麼寫入緩存?這樣不會受制於磁盤的IO性能,避免每次有寫命令都直接寫入硬盤,導致硬盤IO成為Redis負載的瓶頸
  3. 文件寫入和保存:AOF 緩存中的內容被寫入到 AOF 文件末尾,如果設定的 AOF 保存
    條件被滿足的話,fsync 函數或者 fdatasync 函數會被調用,將寫入的內容真正地保存到磁盤中。

    為了提高文件寫入效率,在現代操作系統中,當用戶調用write函數將數據寫入文件時,操作系統通常會將數據暫存到一個內存緩衝區里,當緩衝區被填滿或超過了指定時限后,才真正將緩衝區的數據寫入到硬盤裡。這樣的操作雖然提高了效率,但也帶來了安全問題:如果計算機停機,內存緩衝區中的數據會丟失;因此系統同時提供了fsync、fdatasync等同步函數,可以強制操作系統立刻將緩衝區中的數據寫入到硬盤裡,從而確保數據的安全性。

    AOF保存模式:

    • AOF_FSYNC_ALWAYS: 命令寫入aof-buf后立即調用系統的fsync操作同步到AOF文件。因為 SAVE 是由 Redis 主進程執行的,所以在 SAVE 執行期間,主進程會被阻塞,不能接受命令請求。這種情況下,每次有寫命令都要同步到AOF文件,硬盤IO成為性能瓶頸,Redis只能支持大約幾百TPS寫入,嚴重降低了Redis的性能;即便是使用固態硬盤(SSD),每秒大約也只能處理幾萬個命令,而且會大大降低SSD的壽命。
    • AOF_FSYNC_NO: 命令寫入aof_buf后調用系統write操作,不對AOF文件做fsync同步;同步由操作系統負責,通常同步周期為30秒。這種情況下,文件同步的時間不可控,且緩衝區中堆積的數據會很多,數據安全性無法保證。
    • AOF_FSYNC_EVERYSEC: 每一秒鐘保存一次,命令寫入aof_buf后調用系統write操作, write完成后線程返回, fsync同步文件操作由專門線程每秒調用一次

2.2.2. 文件重寫

隨着命令不斷寫入AOF,文件會越來越大,為了解決這個問題,Redis引入AOF重寫機制壓縮文件體積,AOF文件重寫是把Redis進程內的數據轉化為寫命令同步到新AOF文件的過程。

重寫后的AOF文件為什麼可以變小?

  1. 進程內已經超時的數據不再寫入文件
  2. 舊的AOF文件含有無效命令 ,如有些數據被重複設值(set mykey v1, set mykey v2)、有些數據被刪除了(sadd myset v1, del myset)等等, 新的AOF文件只保留最終的數據寫入命令
  3. 多條寫入命令可以合併為一個,如:lpush list a、lpush list b可以轉化為:lpush list a b。為了防止單條命令過大造成客戶端緩衝區溢出,對於list、set、hash等類型操作,以64個元素為邊界拆分為多條

AOF重寫可以手動觸發也可以自動觸發:

  • 手動觸發: 直接調用bgrewriteaof命令
  • 自動觸發:根據auto-aof-rewrite-min-size和auto-aof-rewrite-percentage參數確定自動觸發時機。
    • auto-aof-rewrite-min-size:表示運行AOF重寫時文件最小體積,默認為64MB
    • auto-aof-rewrite-percentage:代表當前AOF文件空間(aof_current_size)和上一次重寫后AOF文件空間(aof_base_size)的比值

流程說明:

1)執行AOF重寫請求。

如果當前進程正在執行AOF重寫,請求不執行。

如果當前進程正在執行bgsave操作,重寫命令延遲到bgsave完成之後再執行。

2)父進程執行fork創建子進程,開銷等同於bgsave過程。

3.1)主進程fork操作完成后,繼續響應其它命令。

  所有修改命令依然寫入AOF文件緩衝區並根據appendfsync策略同步到磁盤,保證原有AOF機制正確性。

3.2)由於fork操作運用寫時複製技術,子進程只能共享fork操作時的內存數據

  由於父進程依然響應命令,Redis使用“AOF”重寫緩衝區保存這部分新數據,防止新的AOF文件生成期間丟失這部分數據。

4)子進程依據內存快照,按照命令合併規則寫入到新的AOF文件。

  每次批量寫入硬盤數據量由配置aof-rewrite-incremental-fsync控制,默認為32MB,防止單次刷盤數據過多造成硬盤阻塞。

5.1)新AOF文件寫入完成后,子進程發送信號給父進程,父進程調用一個信號處理函數,並執行以前操作更新統計信息。

5.2)父進程把AOF重寫緩衝區的數據寫入到新的AOF文件。這時新 AOF 文件所保存的數據庫狀態將和服務器當前的數據庫狀態一致。

5.3)對新的AOF文件進行改名,原子地(atomic)覆蓋現有的AOF文件,完成新舊文件的替換。

在整個 AOF 後台重寫過程中,只有信號處理函數執行時會對服務器進程(父進程)造成阻塞,其他時候,AOF 後台重寫都不會阻塞父進程,這將 AOF 重寫對服務器性能造成的影響降到了最低

參考《Redis-設計與實現:AOF-持久化》

2.2.3 重啟加載

流程說明:

1)AOF持久化開啟且存在AOF文件時,優先加載AOF文件。

2)AOF關閉或者AOF文件不存在時,加載RDB文件。

3)加載AOF/RDB文件成功后,Redis啟動成功。

4)AOF/RDB文件存在錯誤時,Redis啟動失敗並打印錯誤信息。

數據還原的詳細步驟:

  1. 創建一個不帶網絡連接的偽客戶端(fake client): 因為 Redis 的命令只能在客戶端上下文中執行,而載入 AOF 文件時所使用的命令直接來源於 AOF 文件而不是網絡連接,所以服務器使用了一個沒有網絡連接的偽客戶端來執行 AOF 文件保存的寫命令,偽客戶端執行命令的效果和帶網絡連接的客戶端執行命令的效果完全一樣。
  2. 從AOF文件中分析並讀取出一條寫命令,使用偽客戶端執行被讀出的寫命令,重複此操作,直到AOF文件中的所有寫命令都被處理完畢為止。

2.2.4 文件校驗

加載損壞的AOF文件會拒絕啟動,並打印錯誤信息。

注意:對於錯誤格式的AOF文件,先進性備份,然後採用redis-check-aof --fix命令進行修復,修復后使用diff -u對比數據差異,找到丟失的數據,有些可以進行人工補全。

AOF文件可能存在結尾不完整的情況,比如機器突然掉電導致AOF尾部文件命令寫入不全。

Redis為我們提高了aof-load-truncated配置來兼容這種情況,默認開啟

3. 了解MySQL中的binlog

mysql binlog應用場景與原理深度剖析

參考博文與書籍:

  1. 《redis設計與實現》
  2. Redis持久化
  3. [徐劉根-Redis實戰和核心原理詳解(8)使用快照RDB和AOF將Redis數據持久化到硬盤中](https://blog.csdn.net/xlgen157387/article/details/61925524

本站聲明:網站內容來源於博客園,如有侵權,請聯繫我們,我們將及時處理

【其他文章推薦】

※為什麼 USB CONNECTOR 是電子產業重要的元件?

網頁設計一頭霧水該從何著手呢? 台北網頁設計公司幫您輕鬆架站!

※台北網頁設計公司全省服務真心推薦

※想知道最厲害的網頁設計公司"嚨底家"!

※推薦評價好的iphone維修中心

一文入門Kafka,必知必會的概念通通搞定

Kakfa在大數據消息引擎領域,絕對是沒有爭議的國民老公。

這是kafka系列的第一篇文章。預計共出20篇系列文章,全部原創,從0到1,跟你一起死磕kafka。

本文盤點了 Kafka 的各種術語並且進行解讀,術語可能比較枯燥,但真的是精髓中的精髓!

了解Kafka之前我們必須先掌握它的相關概念和術語,這對於後面深入學習 Kafka 各種功能將大有裨益。所以,枯燥你也得給我看完!

大概是有這麼些東西要掌握,不多不多,預計20分鐘可以吃透:

主題層

主題層有三個兒子,分別叫做:Topic、Partition、Replica。既然我說是三個兒子,那你懂了,是不可分割的整體。

Topic(主題)

Kafka 是分佈式的消息引擎系統,它的主要功能是提供一套完備的消息(Message)發布與訂閱解決方案。

在 Kafka 中,發布訂閱的對象是主題(Topic),你可以為每個業務、每個應用甚至是每類數據都創建專屬的主題。

一個Topic是對一組消息的歸納。也可以理解成傳統數據庫里的表,或者文件系統里的一個目錄。

Partition(分區)

一個Topic通常都是由多個partition組成的,創建topic時候可以指定partition數量。

分區優勢

為什麼需要將Topic分區呢?如果你了解其他分佈式系統,你可能聽說過分片、分區域等說法,比如 MongoDB 和 Elasticsearch 中的 Sharding、HBase 中的 Region,其實它們都是相同的原理。

試想,如果一個Topic積累了太多的數據以至於單台 Broker 機器都無法容納了,此時應該怎麼辦呢?

一個很自然的想法就是,能否把數據分割成多份保存在不同的機器上?這不就是分區的作用嗎?其實就是解決伸縮性的問題,每個partition都可以放在獨立的服務器上。

當然優勢不僅於此,也可以提高吞吐量。kafka只允許單個partition的數據被一個consumer線程消費。因此,在consumer端,consumer并行度完全依賴於被消費的分區數量。綜上所述,通常情況下,在一個Kafka集群中,partition的數量越多,意味着可以到達的吞吐量越大。

partition結構

每個partition對應於一個文件夾,該文件夾下存儲該partition的數據和索引文件。

如圖所示,可以看到兩個文件夾,都對應着一個叫做asd的topic,在該台服務器上有兩個分區,0和2,那麼1呢?在其他服務器上啦!畢竟是分佈式分佈的!

我們進去asd-0目錄中看看是什麼?有後綴為.index和.log的文件,他們就是該partition的數據和索引文件:

現在先不管它們是何方神聖,因為我會在【分區機制原理】這篇文章中詳細描述。

partition順序性

現在,我需要你睜大眼睛看看關於分區非常重要的一點:

【每個partition內部保證消息的順序。但是分區之間是不保證順序的】

這一點很重要,例如kafka中的消息是某個業務庫的數據,mysql binlog是有先後順序的,10:01分我沒有付款,所以pay_date為null,而10:02分我付款了,pay_date被更新了。

但到了kafka那,由於是分佈式的,多分區的,可就不一定能保證順序了,也許10:02分那條先來,這樣可就會引發嚴重生產問題了。因此,一般我們需要按表+主鍵來分區。保證同一主鍵的數據發送到同一個分區中。

如果你想要 kafka 中的所有數據都按照時間的先後順序進行存儲,那麼可以設置分區數為 1。

Replica (副本)

每個partition可以配置若干個副本。Kafka 定義了兩類副本:領導者副本(Leader Replica)和追隨者副本(Follower Replica)。只能有 1 個領導者副本和 N-1 個追隨者副本。

為啥要用副本?也很好理解,反問下自己為什麼重要的文件需要備份多份呢?備份機制(Replication)是實現高可用的一個手段。

需要注意的是:僅Leader Replica對外提供服務,與客戶端程序進行交互,生產者總是向領導者副本寫消息,而消費者總是從領導者副本讀消息。而Follower Replica不能與外界進行交互,它只做一件事:向領導者副本發送請求,請求領導者把最新生產的消息發給它,保持與領導者的同步。

如果對於剛剛所說的主題、分區、副本還有疑惑,那麼結合下面這張圖再思考一下,我相信你就可以玩轉它了:

下圖所示,TopicA,具有三個partition,每個partion都有1 個leader副本和 1 個follower者副本。為了保證高可用性,一台機器宕機不會有影響,因此leader副本和follower副本必然分佈在不同的機器上。

消息層

Kafka的官方定義是message system,由此我們可以知道Kafka 中最基本的數據單元無疑是消息message,它可理解成數據庫里的一條行或者一條記錄。消息是由字符數組組成。關於消息你必須知道這幾件事:

消息key

發送消息的時候指定 key,這個 key 也是個字符數組。key 用來確定消息寫入分區時,進入哪一個分區。你可以用有明確業務含義的字段作為key,比如用戶號,這樣就可以保證同一個用戶號進入同一個分區。

批量寫入

為了提高效率, Kafka 以批量batch的方式寫入。

一個 batch 就是一組消息的集合, 這一組的數據都會進入同一個 topic 和 partition(這個是根據 producer 的配置來定的) 。

每一個消息都進行一次網絡傳輸會很消耗性能,因此把消息收集到一起再同時處理就高效的多。

當然,這樣會引入更高的延遲以及吞吐量:batch 越大,同一時間處理的消息就越多。batch 通常都會進行壓縮,這樣在傳輸以及存儲的時候效率都更高一些。

位移
生產者向分區寫入消息,每條消息在分區中的位置信息由一個叫位移(Offset)的數據來表徵。分區位移總是從 0 開始,假設一個生產者向一個空分區寫入了 10 條消息,那麼這 10 條消息的位移依次是 0、1、2、…、9。

服務端

Kafka 的服務器端由被稱為 Broker 的服務進程構成,即一個 Kafka 集群由多個 Broker 組成,Kafka支持水平擴展,broker數量越多,集群吞吐量越高。在集群中每個broker都有一個唯一brokerid,不得重複。Broker 負責接收和處理客戶端發送過來的請求,以及對消息進行持久化。

一般會將不同的 Broker 分散運行在不同的機器上,這樣如果集群中某一台機器宕機,kafka可以自動選舉出其他機器上的 Broker 繼續對外提供服務。這其實就是 Kafka 提供高可用的手段之一。

controller

Kafka集群中會有一個或者多個broker,其中有且僅有一個broker會被選舉為控制器(Kafka Controller),它負責管理整個集群中所有分區和副本的狀態。

當某個分區的leader副本出現故障時,由控制器負責為該分區選舉新的leader副本。當檢測到某個分區的ISR集合發生變化時,由控制器負責通知所有broker更新其元數據信息。當為某個topic增加分區數量時,同樣還是由控制器負責分區的重新分配。

這幾句話可能會讓你覺得困惑不要方 只是突出下控制器的職能很多,而這些功能的具體細節會在後面的文章中做具體的介紹。

Kafka中的控制器選舉的工作依賴於Zookeeper,成功競選為控制器的broker會在Zookeeper中創建/controller這個臨時(EPHEMERAL)節點,此臨時節點的內容參考如下:

其中version在目前版本中固定為1,brokerid表示稱為控制器的broker的id編號,timestamp表示競選稱為控制器時的時間戳。

兩種客戶端

Kafka有兩種客戶端。生產者和消費者。我們把生產者和消費者統稱為客戶端(Clients)。

向主題Topic發布消息Message的客戶端應用程序稱為生產者(Producer),生產者程序通常持續不斷地向一個或多個主題發送消息。

而訂閱這些主題消息的客戶端應用程序就被稱為消費者(Consumer)。和生產者類似,消費者也能夠同時訂閱多個主題的消息。

Producer

Producer 用來創建Message。在發布訂閱系統中,他們也被叫做 Publisher 發布者或 writer 寫作者。

通常情況下,會發布到特定的Topic,並負責決定發布到哪個分區(通常簡單的由負載均衡機制隨機選擇,或者通過key,或者通過特定的分區函數選擇分區。)
Producer分為Sync Producer 和 Aync Producer。

Sync Producer同步的生產者,即一定要某條消息成功才會發送下一條。所以它是低吞吐率、一般不會出現數據丟失。

Aync Producer異步的生產者,有個隊列的概念,是直接發送到隊列裏面,批量發送。高吞吐率、可能有數據丟失的。

Consumer 和 Consumer Group

消費者

Consumer 讀取消息。在發布訂閱系統中,也叫做 subscriber 訂閱者或者 reader 閱讀者。消費者訂閱一個或者多個主題,然後按照順序讀取主題中的數據。

消費位移

消費者需要記錄消費進度,即消費到了哪個分區的哪個位置上,這是消費者位移(Consumer Offset)。注意,這和上面所說的消息在分區上的位移完全不是一個概念。上面的“位移”表徵的是分區內的消息位置,它是不變的,即一旦消息被成功寫入到一個分區上,它的位移值就是固定的了。

而消費者位移則不同,它可能是隨時變化的,畢竟它是消費者消費進度的指示器嘛。通過存儲最後消費的 Offset,消費者應用在重啟或者停止之後,還可以繼續從之前的位置讀取。保存的機制可以是 zookeeper,或者 kafka 自己。

消費者組

ConsumerGroup:消費者組,指的是多個消費者實例組成一個組來消費一組主題,分區只能被消費者組中的其中一個消費者去消費,組員之間不能重複消費。

為什麼要引入消費者組呢?主要是為了提升消費者端的吞吐量。多個消費者實例同時消費,加速整個消費端的吞吐量(TPS)。

當然它的作用不僅僅是瓜分訂閱主題的數據,加速消費。它們還能彼此協助。假設組內某個實例掛掉了,Kafka 能夠自動檢測到,然後把這個 Failed 實例之前負責的分區轉移給其他活着的消費者,這個過程稱之為重平衡(Rebalance)。

你務必先把這個詞記住,它是kafka大名鼎鼎的重平衡機制,生產出現的異常問題很多都是由於它導致的。後續我會在【kafka大名鼎鼎又臭名昭著的重平衡】文章中詳細分析。

Zookeeper

zookeeper目前在kafka中扮演着舉重輕重的角色和作用~是kafka不可缺少的一個組件。

目前,Apache Kafka 使用 Apache ZooKeeper 來存儲它的元數據,比如brokers信息、分區的位置和主題的配置等數據就是存儲在 ZooKeeper 集群中。

注意我的用詞,我只說是目前。why?在 2019 年社區提出了一個計劃,以打破這種依賴關係,並將元數據管理引入 Kafka 本身。因為擁有兩個系統會導致大量的重複。

在之前的設計中,我們至少需要運行三個額外的 Java 進程,有時甚至更多。事實上,我們經常看到具有與 Kafka 節點一樣多的 ZooKeeper 節點的 Kafka 集群!此外,ZooKeeper 中的數據還需要緩存在 Kafka 控制器上,這導致了雙重緩存。

更糟糕的是,在外部存儲元數據限制了 Kafka 的可伸縮性。當 Kafka 集群啟動時,或者一個新的控制器被選中時,控制器必須從 ZooKeeper 加載集群的完整狀態。隨着元數據數量的增加,加載過程需要的時間也會增加,這限制了 Kafka 可以存儲的分區數量。

最後,將元數據存儲在外部會增加控制器的內存狀態與外部狀態不同步的可能性。

因此,未來,Kafka 的元數據將存儲在 Kafka 本身中,而不是存儲在 ZooKeeper 之類的外部系統中。可以持續關注kafka社區動態哦!

總結

一個典型的kafka集群包含若干個producer(向主題發布新消息),若干consumer(從主題訂閱新消息,用Consumer Offset表徵消費者消費進度),cousumergroup(多個消費者實例共同組成的一個組,共同消費多個分區),若干broker(服務器端進程)。還有zookeeper。

kafka發布訂閱的對象叫主題,每個Topic下可以有多個Partition,Partition中每條消息的位置信息又叫做消息位移(Offset),Partition有副本機制,使得同一條消息能夠被拷貝到多個地方以提供數據冗餘,副本分為領導者副本和追隨者副本。

可以用下面這張圖來形象表達kafka的組成:

另外,再po一張思維導圖助你回顧本文所述的術語。

重要!!關注【胖滾豬學編程】公眾號發送”kafka”。獲取本文所有架構圖以及Kafka全系列思維導圖!

本文來源於公眾號:【胖滾豬學編程】。一枚集顏值與才華於一身,不算聰明卻足夠努力的女程序媛。用漫畫形式讓編程so easy and interesting!求關注!

本站聲明:網站內容來源於博客園,如有侵權,請聯繫我們,我們將及時處理

【其他文章推薦】

網頁設計一頭霧水該從何著手呢? 台北網頁設計公司幫您輕鬆架站!

網頁設計公司推薦不同的風格,搶佔消費者視覺第一線

※想知道購買電動車哪裡補助最多?台中電動車補助資訊懶人包彙整

南投搬家公司費用,距離,噸數怎麼算?達人教你簡易估價知識!

※教你寫出一流的銷售文案?

※超省錢租車方案

8分之1的歐洲人口死於環境污染 空污、噪音通通上榜

摘錄自2020年9月15日自由時報報導

根據歐洲環境署的一項調查研究報告,歐盟人口大約有8分之1的死與環境污染有關;對此,歐洲環境署負責人建議,優先保護社會上最受威脅的族群,解決貧困問題。

歐洲環境署補充,化學物質、過量使用抗生素後對病原體造成的抗藥性以及被污染的飲用水,上述也是導致人們過早死亡的因素,而在許多東歐國家,環境因素導致的過早死亡率比西歐高得多。

根據世衛組織的數據,歐盟國家過早死亡的比例大約為13%,相當於每年有63萬人過早死亡,不幸的是,環境因素(例如:癌症、心臟病和中風)造成的死亡原本是可以避免。

歐洲環境署負責人漢斯.布魯尼克斯(Hans Bruyninckx)建議,必須採取措施來保護社會上最受威脅的族群,而貧困通常是主要問題,因為它會帶來惡劣的環境和影響健康狀況,因此為來歐洲未來可以在此多著墨,如此一來才能真正解決環境與健康的問題。

污染治理
國際新聞
歐洲
空污
噪音

本站聲明:網站內容來源環境資訊中心https://e-info.org.tw/,如有侵權,請聯繫我們,我們將及時處理

【其他文章推薦】

※為什麼 USB CONNECTOR 是電子產業重要的元件?

網頁設計一頭霧水該從何著手呢? 台北網頁設計公司幫您輕鬆架站!

※台北網頁設計公司全省服務真心推薦

※想知道最厲害的網頁設計公司"嚨底家"!

※推薦評價好的iphone維修中心

聯合國生物多樣性報告:10年愛知目標 沒有一項完全達成

環境資訊中心綜合外電;姜唯 編譯;林大利 審校

本站聲明:網站內容來源環境資訊中心https://e-info.org.tw/,如有侵權,請聯繫我們,我們將及時處理

【其他文章推薦】

網頁設計一頭霧水該從何著手呢? 台北網頁設計公司幫您輕鬆架站!

網頁設計公司推薦不同的風格,搶佔消費者視覺第一線

※想知道購買電動車哪裡補助最多?台中電動車補助資訊懶人包彙整

南投搬家公司費用,距離,噸數怎麼算?達人教你簡易估價知識!

※教你寫出一流的銷售文案?

※超省錢租車方案

波蘭擬立法禁止生產皮草 引發業者抗議

摘錄自2020年9月17日中央社報導

波蘭動物皮草農場主人和猶太潔食肉品製造業者今(16日)在首都華沙抗議一項正在國會闖關的新法,這項法案受到動物維權團體支持。

法新社報導,根據動物維權人士說法,波蘭是全球第3大皮草生產國,僅次於中國和丹麥,此外,波蘭也是將猶太潔食肉品外銷到以色列和歐洲猶太社區的重要出口國。

這項立法將禁止業者透過畜養動物來獲取皮草,並禁止出口按伊斯蘭教律法及猶太律法處理的肉品。

這項立法上週首度遭到擱置時,執政法律正義黨黨魁卡臣斯基(Jaroslaw Kaczynski)表示:「波蘭對於動物的標準應該不比西方國家差,甚至應該更好。」

生物多樣性
國際新聞
波蘭
動物皮草
立法

本站聲明:網站內容來源環境資訊中心https://e-info.org.tw/,如有侵權,請聯繫我們,我們將及時處理

【其他文章推薦】

網頁設計一頭霧水該從何著手呢? 台北網頁設計公司幫您輕鬆架站!

網頁設計公司推薦不同的風格,搶佔消費者視覺第一線

※Google地圖已可更新顯示潭子電動車充電站設置地點!!

※廣告預算用在刀口上,台北網頁設計公司幫您達到更多曝光效益

※別再煩惱如何寫文案,掌握八大原則!

網頁設計最專業,超強功能平台可客製化

德東又發現非洲豬瘟 布蘭登堡邦5野豬染疫

摘錄自2020年9月17日中央社報導

德國政府今天表示,15日確認東部布蘭登堡邦又有5隻野豬感染非洲豬瘟(ASF)。繼上週發現首例野豬感染非洲豬瘟後,德國目前為止已累計6例。

布蘭登堡邦(Brandenburg)衛生廳表示,疫病是在死去野豬身上發現,並非農場畜養的豬隻;發現地點靠近上週發現的確認首例。

聯邦農業部表示,在布蘭登堡邦實驗室初步檢驗結果呈陽性反應後,德國聯邦動物防疫研究院(Friedrich-Loeffler-Institut) 確認那些野豬感染非洲豬瘟。

過去數月在靠近德國邊界的波蘭,一再傳出並確認有野豬感染非洲豬瘟;根據德國聯邦動物防疫研究院網站資料,波蘭今年以來大約有3100隻野豬感染非洲豬瘟。

國際新聞
德國
非洲豬瘟

本站聲明:網站內容來源環境資訊中心https://e-info.org.tw/,如有侵權,請聯繫我們,我們將及時處理

【其他文章推薦】

網頁設計公司推薦不同的風格,搶佔消費者視覺第一線

※廣告預算用在刀口上,台北網頁設計公司幫您達到更多曝光效益

※自行創業缺乏曝光? 網頁設計幫您第一時間規劃公司的形象門面

南投搬家公司費用需注意的眉眉角角,別等搬了再說!

※教你寫出一流的銷售文案?

露營亂丟垃圾 泰國政府出奇招:打包好寄回給遊客!

摘錄自2020年9月17日ETtoday報導

一群旅客在泰國考艾國家公園(Khao Yai National Park)露營後,沒有將垃圾妥善處理,反而將它們全都留在營地四周,為其他露營者造成困擾,也破壞環境生態。自然資源與環境部長沃拉兀(Varawut Silpa-archa)想出了新辦法,將這些垃圾寄還原主人,並依《國家公園法》提出訴訟。

據《Thai PBS World》報導,沃拉兀這週以來在他的臉書粉專發文,警告在公園露營的遊客在離開營地前,一定要將自己的垃圾清理乾淨。他指出,若旅客未將垃圾妥善處理,管理員將把它們都收集起來,郵寄給原主人。

沃拉兀提醒,隨意丟棄垃圾將導致野生動物在無意間吃下塑膠袋而死,不止弄髒公園,還破壞環境生態,是極度不可取的。他表示,這些亂丟垃圾的旅客將因違反泰國的《國家公園法》而面對長達5年監禁和高達50萬泰銖(約新台幣40萬元)的罰款,而違反公園規則者將被罰款10萬泰銖(約新台幣9萬元)。

污染治理
國際新聞
泰國
露營
亂丟垃圾

本站聲明:網站內容來源環境資訊中心https://e-info.org.tw/,如有侵權,請聯繫我們,我們將及時處理

【其他文章推薦】

※自行創業缺乏曝光? 網頁設計幫您第一時間規劃公司的形象門面

網頁設計一頭霧水該從何著手呢? 台北網頁設計公司幫您輕鬆架站!

※想知道最厲害的網頁設計公司"嚨底家"!

※別再煩惱如何寫文案,掌握八大原則!

※產品缺大量曝光嗎?你需要的是一流包裝設計!

美國再現罕見蚊類媒介致死傳染病 衛生當局呼籲:夜間勿出門

摘錄自2020年09月19日蘋果日報美國報導

新冠肺炎(武漢肺炎)疫情未見趨緩,美國部分地區又傳出現罕見的蚊媒傳染病,且已造成數人死亡。《CNN》報導,密西根州衛生與公共服務部(MDHHS)15日宣布,該州西南部又確認4起民眾感染「東部馬腦炎」(EEE,Eastern Equine Encephalitis)病例,其中2人已經死亡,目前密西根州已有7明確診案例,其中3人死亡。

東部馬腦炎是一種以蚊子作為媒介的人畜共通傳染病,雖然罕見,但卻可能致死。CDC去年接獲的通報病例與死亡人數就已出現了不尋常的增加,達到38例。

密西根州10個郡的22匹馬,也被驗出感染了EEE,是去年此時通報動物感染數量的兩倍,當局正在多個高風險地區礤取空中行動滅蚊,以降低傳播病毒媒介的蚊子數量。

 

生物多樣性
國際新聞
蚊子
CDC
人畜共通傳染病

本站聲明:網站內容來源環境資訊中心https://e-info.org.tw/,如有侵權,請聯繫我們,我們將及時處理

【其他文章推薦】

※別再煩惱如何寫文案,掌握八大原則!

網頁設計一頭霧水該從何著手呢? 台北網頁設計公司幫您輕鬆架站!

※超省錢租車方案

※教你寫出一流的銷售文案?

網頁設計最專業,超強功能平台可客製化

※產品缺大量曝光嗎?你需要的是一流包裝設計!

除了思域,這3款10來萬的轎車也能讓你爽到停不下來

但速度上去之後還是很有感覺的,特別是當你跑高速時,沉穩的底盤精準的轉向能給予你足夠的信心,可能不經意間你的時速就上百了,如果你覺得普通版的高爾夫不夠過癮,那就上GTI或R-Line吧,畢竟小鋼炮是不會浪得虛名的。說到這可能很多朋友糊塗了,操控都是它們的主旋律,那到底要選哪款呀。

最近不少網友諮詢想要一輛具有駕駛樂趣的緊湊型轎車該買哪款好,小雅腦中第一個冒出來的當然是思域啦,但是仔細想想思域太火了、等車實在太煎熬,所以今天我推薦另外三款,快來看看有沒有對你口味的:

一、外觀與內飾

如果你說思域是日繫緊湊型轎車的顏值擔當,馬自達車主可要表示不服了,瞧瞧這輛昂克賽拉,我保證在車流中你能一眼就找出來,魂動設計賦予了它獨特的韻律美,盾型進氣格柵、翼型鍍鉻飾條、犀利的前大燈、偏長的引擎蓋、再加上動感的線條,說不驚艷那還真是騙人的。

第二個要介紹的是福克斯,它有着一張略顯囂張的前臉,獠牙狀進氣格柵顯露出十足的攻擊性,鷹眼大燈看上去炯炯有神,車身線條力量感十足,果然很有運動氣息。

相比之下,小雅覺得高爾夫看起來要低調很多,沒有昂克賽拉那嫵媚多姿的車身線條,也沒有福克斯那搶眼的馬丁臉,可偏偏是這樣的大眾家族式設計風格依舊能討得不少人的喜愛,畢竟每個人的審美不一樣。

我們接着來看內飾:

昂克賽拉與福克斯的用料都中規中矩,不過昂克賽拉的中控面板上按鍵比較少,看起來十分簡潔,並且懸浮式的中控显示屏提升不少檔次感。福克斯的中控台佔用空間較多,讓我覺得有點壓迫感,並且做工要粗糙一些。

高爾夫的內飾設計是三車中最有質感的,雖然看起來並沒什麼新鮮味道,但它摸起來軟、做工細緻,而且中控面板的設計整體偏向駕駛席一側,方便駕駛員在行車時進行操作。

二、駕駛感受

關於造型設計就先說到這了,畢竟我們今天的主題是駕駛樂趣 ,那麼三者中誰的駕控最好呢?

昂克賽拉最大的優點主要有兩個,首先自然吸氣發動機動力輸出很線性,變速箱降擋平順,還有一點是轉向特別靈敏。雖然小雅覺得人車合一這個口號略顯誇張,但不可否認它開起來確實很靈活輕快。

對了,補充一點,昂克賽拉還加上了GVC扭矩分配系統,用於改善過彎時車輛的動態表現,集這麼多亮點於一身,我想這也是廣大車迷朋友們喜歡它的主要原因。

再來看看福克斯,這位運動健將近年來慢慢朝舒適性方向有所靠攏了。以前的福克斯動力很猛,還可謂是指哪打哪,但現在略偏舒適的調校讓它變得不那麼純粹了。

但它依舊是這個級別裏面不可忽視的,它的1.5T發動機功率在同排量渦輪增壓發動機中最出色的,最大馬力高達181匹,儘管油耗有點讓人心疼,但是它加速暢快啊。總的來說儘管整體質量口碑一般,但這並不影響年輕人將其作為人生第一部車的首選。

很多高爾夫車主被稱為“神車黨”,不過你要知道高爾夫有很多種,分為普通版、R-Line、GTI,動力的選擇也是多種多樣,其中的1.4T發動機匹配7擋雙離合變速箱可以說是黃金組合了,變速箱換擋快,動力的話初段加速不會太給力,需要你踩深一點油門。

但速度上去之後還是很有感覺的,特別是當你跑高速時,沉穩的底盤精準的轉向能給予你足夠的信心,可能不經意間你的時速就上百了,如果你覺得普通版的高爾夫不夠過癮,那就上GTI或R-Line吧,畢竟小鋼炮是不會浪得虛名的。

說到這可能很多朋友糊塗了,操控都是它們的主旋律,那到底要選哪款呀!別急,我們接着來看它們的配置:

三、裝備率

1、福克斯全系標配前後排頭部氣囊/氣簾,氣囊的重要性想必大家也都知道,所以說福克斯這點做的很厚道,而高爾夫要在指導價為14.49萬的2018款 1.6L 自動舒適型上才開始配備,昂克賽拉就更讓小雅失望了,只有頂配車型才配備有。

2、福克斯與昂克賽拉的頂配車型帶有主動安全系統,高爾夫全系沒有這一配置,而是多出疲勞駕駛提示功能,但小雅覺得有點華而不實。

3、再來看看倒車視頻影像,福克斯又給我了驚喜,做到了全系標配,昂克賽拉要在指導價為12.89萬的2017款 三廂 1.5L 手動豪華型才開始配備,而2018款的高爾夫只有GTI與280TSI 自動旗艦型上才帶有。

4、在燈光配置方面,昂克賽拉的LED大燈普及率高,在12.89萬的2017款 三廂 1.5L 手動豪華型上便可獲得,高爾夫要在15.79萬的2018款 280TSI 手動R-Line型才能買到,福克斯則全系都找不到LED大燈的影子。

5、另外,昂克賽拉全系標配多功能方向盤,福克斯全系標配8英寸中控屏,高爾夫全系支持全車車窗一鍵升降。

小雅覺得三車中福克斯的價格不算高,但配置的普及率卻非常高,再結合上面的表現來看是三車中性價比最高的。

四、結語

當然車無完車,三者最大的不足是空間都不太理想,畢竟這不是它們主攻的方面,另外高爾夫的價格比較高,特別是售價高達20多萬的GTI令不少人望而卻步。

但不管怎樣,手握住它們三中間任何一輛的方向盤,你都會忍不住多跑一會,難道不是嗎?本站聲明:網站內容來源於http://www.auto6s.com/,如有侵權,請聯繫我們,我們將及時處理

【其他文章推薦】

※為什麼 USB CONNECTOR 是電子產業重要的元件?

網頁設計一頭霧水該從何著手呢? 台北網頁設計公司幫您輕鬆架站!

※台北網頁設計公司全省服務真心推薦

※想知道最厲害的網頁設計公司"嚨底家"!

※推薦評價好的iphone維修中心

男人最愛的這項熱血汽車運動,真的很爽!

除了可以感受到賽車的熱烈氣氛以外,還可以近距離看到不同賽車的結構和技術亮點。當然了,還可以去了解一下賽車手究竟都是怎樣的人,究竟真的是“超人么”。這次的視頻,我們還特別找到了珠海高卡車隊的老闆兼車手王遠先生,去了解一下賽車究竟是怎麼一回事如。

對於喜歡汽車的朋友來說,總會看過一點關於賽車的東西。不過對於大部分對汽車不太熟悉的朋友,賽車貌似離我們非常遙遠,簡直好像是另外一個星球的事情。而賽車往往也是很高深莫測的精密机械,有超凡的性能,連駕駛賽車的車手也好像需要類似飛行員的體質和能力,才能駕馭這種可怕的機器!

真的是這樣么?

為了探尋這個秘密,我們到了珠海國際賽車場ZIC,去觀看泛珠三角賽車節春季賽(簡稱泛珠春季賽)。泛珠春季賽基本集合了大部分常見的賽車類別,包括方程式、prototype、GT、TCR、漂移賽車和改裝房車等等。除了可以感受到賽車的熱烈氣氛以外,還可以近距離看到不同賽車的結構和技術亮點。當然了,還可以去了解一下賽車手究竟都是怎樣的人,究竟真的是“超人么”。

這次的視頻,我們還特別找到了珠海高卡車隊的老闆兼車手王遠先生,去了解一下賽車究竟是怎麼一回事如。如果想體驗賽車,又有什麼門檻。當然了,我們也對他們車隊一台GK5賽車進行剖析,看看它究竟和我們一般街道行駛的飛度又有什麼相同和不同的地方。

如果你對賽車好奇,又想了解一下賽車究竟是怎麼回事,或者已經是一個熱血賽車迷的話,就不要錯過本期的視頻了。

本站聲明:網站內容來源於http://www.auto6s.com/,如有侵權,請聯繫我們,我們將及時處理

【其他文章推薦】

網頁設計一頭霧水該從何著手呢? 台北網頁設計公司幫您輕鬆架站!

網頁設計公司推薦不同的風格,搶佔消費者視覺第一線

※想知道購買電動車哪裡補助最多?台中電動車補助資訊懶人包彙整

南投搬家公司費用,距離,噸數怎麼算?達人教你簡易估價知識!

※教你寫出一流的銷售文案?

※超省錢租車方案