mycat學習筆記1:HDFS

mycat是什麼?

  1.mycat是一個完全開源的,面向企業應用開發的大數據庫集羣,mysql

  2.支持事務、ACID、能夠替代MySQL的增強版數據庫,目前支持關係型數據庫以及非關係型數據庫sql

  3.能夠用來代替昂貴的oracle數據庫數據庫

  4.mycat是一個大數據(HDFS)的sql引擎服務器

  經過上面的介紹,咱們知道,mycat其實就是一個數據庫架構

爲何叫mycat?

  mycat再初期的時候,是爲了用來代替昂貴的oracle存在的,所以它支持的是免費的mysql數據庫,也只支持mysql數據庫,如今mycat已經能夠支持多種數據庫了,換句話說,mycat就是mysql的加強版。oracle

  再以前介紹架構,咱們知道當數據庫壓力大的時候,使用獨寫分離和分庫分表,可是mysql是不支持的,使用mycat來實現mysql獨寫分離和分庫分表。分佈式

什麼是HDFS?

  HDFS:大數據的分佈式文件存儲系統oop

  H:Hadoop(大數據),D:Distributed(分佈式的),F:File(文件),S:System(系統)。大數據

     在大數據中,數據量是很是大的,若是有1PB的數據(1PB=1024TB),沒有這麼大的硬盤,那麼數據應該如何存儲呢?blog

  將數據拆分爲塊,分別存儲進不一樣的磁盤中,假設將這1P的數據,分爲10份/20份,分別存儲在10/20個磁盤上,當須要讀取數據時,就從各個小的磁盤上來獲取數據。

  一樣的,若是想要在1PB中查詢一條數據,效率是很是低的,可是若是拆分爲小塊,查詢數據時,直接到相應的塊中查詢,效率就會變高。

好比說:

  1:在100條數據中查詢第58條數據

  2:將100條數拆分爲10份,每份存十條,查詢第58條數據,就到相應的塊中查詢數據,這就至關於在10條數據中查詢一條數據

  對比上面兩種方式,能夠看出第2種方式效率會比較高,固然這裏假設的數據量比較少若是多的話呢?

HDFS就是經過第二種方式實現的,將大數據切分爲塊,分別存儲到不一樣的服務器上,這個服務器稱爲數據節點DataNode(如下簡稱DN)。

那麼如今的問題就是:如何肯定要查詢的數據存放在哪兒個數據節點上呢?

  在以前寫架構時,提到了,使用一個節點,這個節點就存放每一個數據節點上存放的數據:

好比說,將1份很大的數據拆分爲10份,而後將這十份數據標上號:1,2,3,...10。而後使用一個服務器節點,節點內容就是一號服務器放第一份和第三份數據,2號服務器放第2份和第四份數據.....這個節點就稱爲命名節點NameNode(如下簡稱NN)。

  注意:在將數據拆分存儲時,要保證每份數據在服務器集羣中至少存在兩個節點上。

     NameNode是在內存中作計算的。(why?在內存中計算速度很是快,可是比較消耗內存資源)

  下面使用一張圖來幫助理解:

 從這裏能夠看出,NN是很是重要的,獲取數據都是經過NN來找數據的位置的,那麼若是NN宕機,就獲取不到一條數據了。

這裏有一個問題,NN是在內存中作計算的,若是NN宕機,那麼佔用的內存資源就會被釋放,NN中的數據就沒有了,即便重啓,也獲取不到數據,如何解決?

  NN每隔一個小時,就會將數據持久化到硬盤中,當NN重啓後會從硬盤中加載數據,這個過程大概20秒。

問題2:NN宕機重啓後,能夠從磁盤中獲取數據,可是NN宕機時並不工做,如何獲取數據,以及存儲新的數據節點,重啓後如何保證存儲的數據正確?

  其實除了NN以外,還有一個備用命名節點SecondaryNameNode(如下簡稱SN),DN中的數據會按期的向NN和SN中分別保存,SN負責監視NN,可是SN不是NN的從節點。

  SN會不定時的檢測NN的持久化硬盤中的數據,一旦發現本身有的數據,硬盤中沒有,就會向硬盤中存入數據,也就是說,SN和NN組合在一塊兒成爲一個新的硬盤,替換掉原來的NN的硬盤,當NN重啓後,會重新的硬盤中加載數據到內存。

  關於大數據時,總會問到的一個問題:如何在10G的數據中查詢兩條重複的數據?

  看到這個問題,正常想到的可能會是for循環,可是當數據量很是大的時候,不能這樣用,若是使用for循環,可能要查一個月,如何查找呢?

  在HDFS中,查詢兩條相同數據,由於是分塊查詢,所以會每一塊每一塊的查詢,並標記當前塊中,每條數據出現的次數,如:

 

 

 mycat就是使用的HDFS的方式實現的,不過這裏將F該成了D,mycat是HDDS(High Distributed Data System),

相關文章
相關標籤/搜索