hbase 學習(十三)集群間備份原理

集群建備份,它是master/slaves結構式的備份,由master推送,這樣更容易跟蹤現在備份到哪里了,況且region server是都有自己的WAL 和HLog日志,它就像mysql的主從備份結構一樣,只有一個日志來跟蹤。一個master集群可以向多個slave集群推送,收到推送的集群會覆蓋它本地的edits日志。

這個備份操作是異步的,這意味著,有時候他們的連接可能是斷開的,master的變化不會馬上反應到slave當中。備份個格式在設計上是和mysql的statement-based replication是一樣的,全部的WALEdits(多種來自Delete和Put的Cell單元)為了保持原子性,會一次性提交。

HLogs是region server備份的基礎,當他們要進行備份時必須保存在hdfs上,每個region server從它需要的最老的日志開始進行備份,并且把當前的指針保存在zookeeper當中來簡化錯誤恢復,這個位置對于每一個slave 集群是不同的,但是對于同一個隊列的HLogs是相同的。

下面這個是設計的結構圖:

9f192e5d010323fe7b87347a576ad0dfd862dadb

下面我們了解一下master和一個slave節點的整個過程。

1)當客戶端通過api發送Put、Delete或者ICV到region server,這些KeyValue被轉換成WALEdit,這個過程會被replication檢測到,每一個設置了replication的列族,會把scope添加到edit的日志,然后追加到WAL中,并被應用到MemStore中。

2)在另一個線程當中,edit被從log當中讀取來,并且只有可以備份的KeyValues(列族為scoped為GLOBAL的,并且不是catalog,catalog指的是.META. 和 -ROOT-)

3-1)這個edit然后被打上master群集的UUID,當buffer寫滿的時候或者讀完文件,buffer會發到slave集群的隨機的一個region server同步的,收到他們的region server把edit分開,一個表一個buffer,當所有的edits被讀完之后,每一個buffer會通過HTable來flush,edits里面的master集群的UUID被應用到了備份節點,以此可以進行循環備份。

4-1)回到master的region server上,當前WAL的位移offset已經被注冊到了zookeeper上面。

3-2)這里面,如果slave的region server沒有響應,master的region server會停止等待,并且重試,如果目標的region server還是不可用,它會重新選擇別的slave的region server去發送那些buffer。

同時WALs會被回滾,并且保存一個隊列在zookeeper當中,那些被region server存檔的Logs會更新他們在復制線程中的內存中的queue的地址。

4-2)當目標集群可用了,master的region server會復制積壓的日志。

下面是一些具體的操作:

假設zookeeper當中的節點是/hbase/replication ,?它會有三個子節點。

/hbase/replication/state
/hbase/replication/peers
/hbase/replication/rs

The State znode

state節點是記錄是否可以進行備份的,它里面記錄這個一個boolean值,true或者false,它是由hbase.replication決定的,同事它會在ReplicationZookeeper當中緩存,它還會因為在shell中執行了stop_replication而改變

/hbase/replication/state [VALUE: true]

The Peers znode

這個節點下面記錄著所有需要備份的集群和他們當前的備份狀態,如下:

/hbase/replication/peers/1 [Value: zk1.host.com,zk2.host.com,zk3.host.com:2181:/hbase]/2 [Value: zk5.host.com,zk6.host.com,zk7.host.com:2181:/hbase]
peer的id是自己在add_peer時候,自己提供的,后面的value是slave集群所使用的zookeeper集群,最后是所在的znode的父節點。

在每一個peer節點的下面還有一個表示狀態的節點:

/hbase/replication/peers/1/peer-state [Value: ENABLED]/2/peer-state [Value: DISABLED]

The RS znode

rs的節點下面包括了復制的region server以及需求復制的HLog的隊列,看圖就知道啦!

第一層節點記錄著region server的機器名,端口號以及start code。

/hbase/replication/rs/hostname.example.org,6020,1234/hostname2.example.org,6020,2856

下一層是需求復制的HLog的隊列:

/hbase/replication/rs/hostname.example.org,6020,1234/1/2

隊列里面需要復制的HLog,值是已經被復制的最新的位置position。

/hbase/replication/rs/hostname.example.org,6020,1234/123522342.23422 [VALUE: 254]12340993.22342 [VALUE: 0]
過程是上述的過程,下面展開講一下具體的細節。

1)選擇哪個region server去復制

當master節點準備好備份之后,它首先要通過slave集群的zookeeper,然后查看他們的rs的節點下面有多少可用的rs,然后隨機選擇他們中的一部分,默認是10%,如果有150個機器的話,會選擇15個機器去發送。這個時候是有一個watcher在監視著slave集群的rs下面的變化,如果節點發生了變化,它會通知master節點的region server重發。

2)錯誤恢復,直接來個實際的例子

一個有3個region server集群正在和一個peer id為2的集群進行備份,每個region server下面都有一個隊列

隊列中的每個znode都是hdfs上的真實的文件名,“地址,端口.時間戳”。

/hbase/replication/rs/1.1.1.1,60020,123456780/2/1.1.1.1,60020.1234  (Contains a position)1.1.1.1,60020.12651.1.1.2,60020,123456790/2/1.1.1.2,60020.1214  (Contains a position)1.1.1.2,60020.12481.1.1.2,60020.13121.1.1.3,60020,    123456630/2/1.1.1.3,60020.1280  (Contains a position)

現在讓1.1.1.2的zookeeper丟失session,觀察者會創建一個lock,這個時候1.1.1.3完成了,它會把1.1.1.2的給接手過來,在自己的znode下面創建一個新的znode,并且加上dead的server的名稱,就像下面這樣子,原來的1.1.1.2的下面多了一層lock,1.1.1.3下面多了一個,和它原始的狀態也不一樣,前面多了個2。

/hbase/replication/rs/1.1.1.1,60020,123456780/2/1.1.1.1,60020.1234  (Contains a position)1.1.1.1,60020.12651.1.1.2,60020,123456790/lock2/1.1.1.2,60020.1214  (Contains a position)1.1.1.2,60020.12481.1.1.2,60020.13121.1.1.3,60020,123456630/2/1.1.1.3,60020.1280  (Contains a position)2-1.1.1.2,60020,123456790/1.1.1.2,60020.1214  (Contains a position)1.1.1.2,60020.12481.1.1.2,60020.1312
然后1.1.1.3又自己倒騰了一會兒,假設它也掛了,最后的形態會是這樣

1.1.1.1把1.1.1.3的未完成事業給接過了過來,所以我們看到1.1.1.1下面有個三手貨和幾個二手貨。。。

/hbase/replication/rs/1.1.1.1,60020,123456780/2/1.1.1.1,60020.1378  (Contains a position)2-1.1.1.3,60020,123456630/1.1.1.3,60020.1325  (Contains a position)1.1.1.3,60020.14012-1.1.1.2,60020,123456790-1.1.1.3,60020,123456630/1.1.1.2,60020.1312  (Contains a position)1.1.1.3,60020,123456630/lock2/1.1.1.3,60020.1325  (Contains a position)1.1.1.3,60020.14012-1.1.1.2,60020,123456790/1.1.1.2,60020.1312  (Contains a position)
原理說完了,從下面說說進行這個備份操作是哪些要求吧

(1)hbase的大的版本要一致

0.90.1 可以向0.90.0推送但是0.90.1不可以向0.89.20100725推送

(2)獨立部署的zookeeper集群

(3)集群間的備份的表名和列族都要一致

(4)多個slave集群的話,要0.92以上版本

(5)集群間可以互相訪問

(6)集群間的zookeeper.znode.parent不能相同

?要使用這個集群建備份的功能需要先進行以下的設置:

1、修改hbase-site.xml文件

<property><name>hbase.replication</name><value>true</value>
</property>

2、add_peer

輸入這個命令,查看它的具體用法,然后添加

3、修改表的REPLICATION_SCOPE

disable 'your_table'
alter 'your_table', {NAME => 'family_name', REPLICATION_SCOPE => '1'}
enable 'your_table'

4、list_peers 查看一下狀態

5、備份完成之后如何進行數據校驗,VerifyReplication就是專門來處理這個校驗的。我們需要提供peer的id還有表名,verifyrep是它的簡稱,要用hadoop jar來運行。

集群之間備份的網址,說明他們是怎么工作的:

http://hbase.apache.org/replication.html

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/542606.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/542606.shtml
英文地址,請注明出處:http://en.pswp.cn/news/542606.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

python expect模塊_Python基礎教程:用Python怎么telnet到網絡設備

Python基礎教程&#xff1a;用Python怎么telnet到網絡設備0.前言Telnet協議屬于TCP/IP協議族里的一種&#xff0c;對于我們這些網絡攻城獅來說&#xff0c;再熟悉不過了&#xff0c;常用于遠程登陸到網絡設備進行操作&#xff0c;但是&#xff0c;它的缺陷太明顯了&#xff0c;…

Java實現動態加載頁面_[Java教程]動態加載頁面數據的小工具 javascript + jQuery (持續更新)...

[Java教程]動態加載頁面數據的小工具 javascript jQuery (持續更新)0 2014-05-07 18:00:06使用該控件&#xff0c;可以根據url&#xff0c;參數&#xff0c;加載html記錄模板(包含json參數對應&#xff0c;以及具體記錄位置Index根據參數描述加載對應的屬性&#xff0c;并可以…

馬哥linux第六周作業

1、復制/etc/rc.d/rc.sysinit文件至/tmp目錄&#xff0c;將/tmp/rc.sysinit文件中的以至少一個空白字符開頭的行的行首加#&#xff1b;[rootmageedu tmp]# cp /etc/rc.d/rc.sysinit . [rootmageedu tmp]# vim rc.sysinit :% s/^[[:space:]]/#&/ #按Esc進入vi…

Java ObjectInputStream enableResolveObject()方法與示例

ObjectInputStream類enableResolveObject()方法 (ObjectInputStream Class enableResolveObject() method) enableResolveObject() method is available in java.io package. enableResolveObject()方法在java.io包中可用。 enableResolveObject() method is used to enable th…

pygame render怎么顯示中文_PyGame開發游戲(2D)02.基礎圖元

這節將介紹PyGame的基礎架構。并學習如何在PyGame里繪制各種幾何圖形和顯示加載圖片。01.應用框架上一節的示例程序里&#xff0c;我們用到一個PyGame的應用程序框架。這是一個基礎框架&#xff0c;利用它我們可以很輕松的添加各類圖型繪制&#xff0c;鍵盤鼠標輸入處理和各類邏…

word+增加水印+java_為Word2019文檔添加水印的兩種方法

水印的類型包括文字水印和圖片水印兩種。在Word文檔中添加文字水印時&#xff0c;可以使用程序中預設的水印效果&#xff0c;而圖片水印則需要自定義添加。一、使用程序預設的文字水印Word 2019中預設了機密、緊急、免責聲明三種類型的文字水印&#xff0c;用戶可根據文件的類型…

如何設置CentOS 7獲取動態及靜態IP地址

自動獲取動態IP地址1.輸入“ip addr”并按回車鍵確定&#xff0c;發現無法獲取IP(CentOS 7默認沒有ifconfig命令)&#xff0c;記錄下網卡名稱&#xff08;本例中為ens33&#xff09;。2.輸入“cd /etc/sysconfig/network-scripts/”按回車鍵確定&#xff0c;繼續輸入“ls”按回…

請求列出指定服務器上的可用功能失敗_濫用 ESI 詳解(上)

在進行安全性評估時&#xff0c;我們注意到了標記語言 Edge Side Includes (ESI)中的一個意外行為&#xff0c;這種語言用于許多流行的 HTTP 代理(反向代理、負載平衡器、緩存服務器、代理服務器)。我們發現成功的 ESI 攻擊可以導致服務器端請求偽造(SSRF)、各種繞過 HTTPOnly …

Java ClassLoader setPackageAssertionStatus()方法與示例

ClassLoader類setPackageAssertionStatus()方法 (ClassLoader Class setPackageAssertionStatus() method) setPackageAssertionStatus() method is available in java.lang package. setPackageAssertionStatus()方法在java.lang包中可用。 setPackageAssertionStatus() metho…

java上傳kafka的方法_哪種方法是將所有數據從Kafka主題復制到接收器(文件或Hive表)的最佳方法?...

我正在使用Kafka Consumer API將所有數據從Kafka主題復制到Hive表 . 為此&#xff0c;我使用HDFS作為中間步驟 . 我使用唯一的組ID并將偏移重置為“最早”&#xff0c;以便從頭開始獲取所有數據&#xff0c;并在執行后忽略提交 . 然后我遍歷Kafka主題中的記錄&#xff0c;并將每…

openstack nova-network 的小bug的排錯經歷

環境是 nova-network vmwareflatdhcp錯誤表現為 開出來的虛擬機有一定幾率獲取不到dhcp地址&#xff0c;手工賦予ip則正常&#xff0c;用flat模式注入的ip正常&#xff0c;下面是排錯過程1首先找網絡防火墻已經把 dnsmasq對應的端口已經打開抓包結果&#xff1a;可以看到虛擬機…

anaconda base環境_anaconda中安裝packages:pip還是conda install?

conda install我就不說了&#xff0c;這都不會別學了就。Using command:$ which -a pip, the terminal will return:This indicates two different pip path to install packages[1].在tf23環境中pip install在base環境中pip install在windows下powershell內&#xff0c;進入到…

Java ClassLoader setDefaultAssertionStatus()方法與示例

ClassLoader類setDefaultAssertionStatus()方法 (ClassLoader Class setDefaultAssertionStatus() method) setDefaultAssertionStatus() method is available in java.lang package. setDefaultAssertionStatus()方法在java.lang包中可用。 setDefaultAssertionStatus() metho…

【風馬一族_xml】xmlp之dtd1

什么是XML約束&#xff1f;在xml技術里&#xff0c;可以編寫一個文檔來約束一個xml文檔的寫法&#xff0c;這稱之為xml約束 2. 為什么要使用xml約束&#xff1f; 參看提示欄 3. xml約束的作用&#xff1f; 約束xml的寫法對xml進行校驗4. 常見的xml約束技術 xml dtdxml Schema…

java ssm框架 緩存_SSM框架之MyBatis3專題4:查詢緩存

查詢緩存的使用&#xff0c;主要是為了提高查詢訪問速度。將用戶對同一數據的重復查詢過程簡化&#xff0c;不再每次均從數據庫中查詢獲取結果數據&#xff0c;從而提高訪問速度。MyBatis的查詢緩存機制&#xff0c;根據緩存區的作用域(聲明周期)可劃分為兩種&#xff1a;一級查…

matplotlib畫圖_漂亮,超詳細的matplotlib畫圖基礎

來自 | 逐夢erhttps://zhumenger.blog.csdn.net/article/details/106530281本文僅作技術交流&#xff0c;如有侵權&#xff0c;請聯系后臺刪除。數據可視化非常重要&#xff0c;因為錯誤或不充分的數據表示方法可能會毀掉原本很出色的數據分析工作。matplotlib 庫是專門用于開發…

c# 2維數組 取一維_C#| 不同類型的一維數組聲明

c# 2維數組 取一維In the below example, we are declaring an integer array (one dimensional) with following styles: 在下面的示例中&#xff0c;我們聲明具有以下樣式的整數數組(一維) &#xff1a; 1) One dimensional Array declaration with initialization (without…

Java編程經典10道_Java經典編程題50道之十二

企業發放的獎金根據利潤提成&#xff1a;利潤(I)低于或等于10萬元時&#xff0c;獎金可提10%&#xff1b;利潤高于10萬元&#xff0c;低于20萬元時&#xff0c;低于10萬元的部分按10%提成&#xff0c; 高于10萬元的部分 &#xff0c;可提成7.5%&#xff1b;20萬到40萬之間時&am…

RHEL7 單獨安裝圖形 X11

RHEL7 默認是最小化安裝&#xff08;Minimal Install&#xff09;&#xff0c;沒有圖形界面&#xff0c; 我們應該選擇Server with GUI。若已錯過此步驟&#xff0c;我們采用以下方式補充安裝GUI界面。 先配置yum源可以參考我的這篇文章http://blog.itpub.net/27771627/viewspa…

android recycleview長按多選_UI設計中Android和IOS設計差異總結

由于設計師、產品經理使用的移動設備大部分是iPhone&#xff0c;所以在做設計時&#xff0c;容易忽略Android和iOS的差異&#xff0c;按照iOS的規范進行設計&#xff0c;兩端只做一套。只做一套的會存在兩個問題&#xff1a;1、安卓用戶的使用習慣不太適應iOS的設計&#xff0c…