Hbase的備份分為冷備和熱備,前者稱為離線備份,需要將Hbase數(shù)據(jù)庫整體停掉,通過Distcp分布式復(fù)制命令,實(shí)現(xiàn)高效率的備份。對(duì)于后者來說,不需要停止Hbase數(shù)據(jù)庫運(yùn)行,適合于一些需要不間斷運(yùn)行服務(wù)的場合。
熱備可以實(shí)現(xiàn)增量備份,其缺點(diǎn)是可能丟失部分?jǐn)?shù)據(jù),因?yàn)樵跓醾涞倪^程中,相關(guān)業(yè)務(wù)可能正在運(yùn)行,數(shù)據(jù)正在進(jìn)行讀寫操作,造成數(shù)據(jù)無法全部備份出來,導(dǎo)致丟失部分?jǐn)?shù)據(jù)。
熱備包括集群復(fù)制,CopyTable和Export等方式。當(dāng)然,也可以使用特定的參數(shù),將其導(dǎo)出到其他的集群中,這就需要使用集群復(fù)制技術(shù),使用到兩個(gè)Hbase集群,便于實(shí)現(xiàn)跨集群的數(shù)據(jù)實(shí)時(shí)異步復(fù)制功能。
兩個(gè)集群之間的數(shù)據(jù)復(fù)制,通過Write-ahead log日志可以實(shí)現(xiàn),類似于MySQL的 主 從 復(fù) 制,Oracle的DataGuard之類的功能。使用集群復(fù)制,可以實(shí)現(xiàn)數(shù)據(jù)備份和災(zāi)難恢復(fù),數(shù)據(jù)集成,跨地域的數(shù)據(jù)分布以及讀寫分離功能。
對(duì)于Hbase的備份來說,一般是通過Distcp分布式復(fù)制來實(shí)現(xiàn)的。該命令位于Hadoop tools包中,可以實(shí)現(xiàn)在一個(gè)集群內(nèi)部內(nèi)部快速復(fù)制數(shù)據(jù),或者在多個(gè)HDFS集群之間來復(fù)制數(shù)據(jù),很適合于針對(duì)Hbase進(jìn)行冷備份操作,但前提是必須停止Hbase數(shù)據(jù)庫的運(yùn)行。這里以實(shí)際的例子,來說明如何實(shí)現(xiàn)冷備。
在某臺(tái)Hadoop服務(wù)器 上 執(zhí) 行“cd/hadoop/hbase-x.x.x.x/bin”,“./hbase shell” 命 令, 進(jìn)入Hbase操作界面。在其中 執(zhí) 行“create 'test','cf'”,“put'test','row1','cf:a','value1'”命令,創(chuàng)建名為“test”的表,其中包含名為“cf”的列族。執(zhí)行“put'test','row1','cf:a','value1'”,“put'test','row2','cf:b','value2'”,“put'test','row3', 'cf:c', 'value3'”命令,向“test”表中插入三行數(shù)據(jù)。其中的“row1”等成為 Row Key,“'cf:a”等稱為列,“value1”等為列的值。
執(zhí)行“scan'test'”命令,檢查指定表的插入情況。執(zhí)行“quit”,“./stop-hbase.sh”命令,停止Hbase數(shù)據(jù)庫的運(yùn)行。
要想進(jìn)行備份,必須先了解Hbase數(shù)據(jù)庫的存放位置。進(jìn) 入“/hadoop/hbase-x.x.x.x/connf$”命令,執(zhí)行“cat hbase-site.xml” 命令,打開Hbase的配置文件,在其中的“” 欄 中顯 示Hbase在Hadoop中的根路徑信息,例如其內(nèi)容 為“”,就可以知曉其數(shù)據(jù)庫的位置。執(zhí)行“cd/hadoop/hadoop-x.x.x/bin”,“./hdfs dfs-ls/hbase”命令,顯示和Hbase相關(guān)的文件存儲(chǔ)路徑信息。
執(zhí)行“jps”命令,看到和Hbase相關(guān)的Jave進(jìn)程消失,說明其已經(jīng)被停掉。執(zhí)行“./hadoop distcp/hbase/hbasebackup”命令,執(zhí)行備份操作,將“/hbase”下的所有數(shù)據(jù)備份到指定的“/hbasebackup”路徑下。在實(shí)際備份時(shí),可以看到啟動(dòng)了MapReduce任務(wù)進(jìn)行復(fù)制。
注意:其備份過程可能較長,這是因?yàn)镠base中文件較多的原因。
備份完成后,執(zhí)行“./hdfs dfs-ls/hbasebackup”命令,查看備份的具體內(nèi)容。 執(zhí) 行“cd/hadoop/hbase-x.x.x.x/bin”,“./start-hbase.sh”,“./hbase shell”命令,啟動(dòng)Hbase數(shù)據(jù)庫。進(jìn)入Hbsse shell操作臺(tái)。執(zhí)行“l(fā)ist”命令,顯示上述“test”表信息。
為了測試備份效果執(zhí)行“disable'test'”,“drop'test'”命令,將該表刪除。然后執(zhí)行“quit”,“./stophbase.sh”命令,停止Hbase數(shù)據(jù)庫。在執(zhí)行Hbase恢復(fù)時(shí),實(shí)際上是執(zhí)行了兩步操作,先要將覆蓋的Hbase路徑進(jìn)行備份操作,防止因?yàn)榛謴?fù)失敗導(dǎo)致數(shù)據(jù)丟失的情況。執(zhí)行“./hdfs dfs-mv /hbase /hbase_data”命令,將原Hbase數(shù)據(jù)移動(dòng) 到“/hbase_data”目 錄中。再使用備份數(shù)據(jù)覆蓋原有的Hbase數(shù)據(jù),執(zhí)行“./hadoop distcp-overwrite/hbasebackup/hbase” 命令,使用“distcp”命令的“-overwrite”參數(shù),將上述備份的內(nèi)容覆蓋到Habse路徑下。完成后按照上述方法啟動(dòng)Hbase,在HaseShell中執(zhí)行“l(fā)ist”命令,顯示“test”表示已經(jīng)恢復(fù)成功。
對(duì)于Hbase的熱備來說,不需要停掉Hbase數(shù)據(jù)庫,它常用的工具是Export和Import,前者可以將指定的表導(dǎo)出到HDFS或者本地文件系統(tǒng)中,數(shù)據(jù)會(huì)被導(dǎo)出到指定的目錄中,一般情況下為一個(gè)Region對(duì)應(yīng)一個(gè)文件。默認(rèn)采用的是Sequence格式的文件形式,在導(dǎo)出過程中可以對(duì)數(shù)據(jù)進(jìn)行壓縮處理。因?yàn)樵贖base中存儲(chǔ)的數(shù)據(jù)體積較大,所以啟用壓縮功能可以有效節(jié)省磁盤的空間。
例如,在Hbase Shell控制臺(tái)中執(zhí)行“scan'test'”命令,來查看“test”表中的內(nèi)容。在Linux命令行下執(zhí)行“./hbase org.apache.hadoop.hbase.mapreduce.Export test/data/bak”命令,將該表的內(nèi)容導(dǎo)出到本地磁盤中的“/data/bak”目錄中。當(dāng)然,也可以將其導(dǎo)出到HDFS文件系統(tǒng)中。執(zhí)行“./hbase org.apache.hadoop.hbase.mapreduce.Export test hdfs://master:9000/backup”之 類的命令,來實(shí)現(xiàn)該要求。
注意:在導(dǎo)出路徑中如果直接查看對(duì)應(yīng)文件的話,是無法顯示其內(nèi)容的。
在Hbase Shell控制臺(tái)中 執(zhí) 行“disable'test'”,“drop'test'”命令,將該表刪除。
當(dāng)想恢復(fù)該表時(shí),必須首先在Hbase中創(chuàng)建該表,執(zhí)行“create'test','cf'”,“p u t'test','row1','cf:a','value1'” 命令,創(chuàng)建該“test”的表。 在Hadoop的“bin”路徑下執(zhí)行“./hbase org.apache.hadoop.hbase.mapreduce.Import test/data/bak”命令,即可將上述備份的數(shù)據(jù)恢復(fù)到該表中。
除此之外,還可以使用CopyTable工具實(shí)現(xiàn)熱備,它可以將所有的表數(shù)據(jù)或者表中的部分?jǐn)?shù)據(jù)復(fù)制到同一個(gè)集群或者不同集群的另外一張表中,在此期間,可以通過指定導(dǎo)入數(shù)據(jù)的時(shí)間戳實(shí)現(xiàn)增量導(dǎo)出操作。
例如,在Hbase Shell下執(zhí)行“create'test1','c f'”,“p u t'test','row1','cf:a','value1'”命令,創(chuàng)建該“test1”的表。然后在Linux下執(zhí)行“./hbase org.apache.hadoop.hbase.mapreduce.CopyTable--new.name=newtb test”命令,可以將“test”表中的內(nèi)容復(fù)制到“newtb”中。
以上測試涉及的“test”和“test1”均處于同一個(gè)Hbase數(shù)據(jù)庫中。
實(shí)現(xiàn)Hbase集群復(fù)制,離不開Write-ahead log日志,在其中存儲(chǔ)一些關(guān)于Hbase的記錄修改操作信息。利用網(wǎng)絡(luò)連接將一個(gè)集群中將該日志傳送到另外的集群中,這樣該集群就可以利用該日志,將相關(guān)的操作重做一遍,來實(shí)現(xiàn)數(shù)據(jù)的復(fù)制操作。
在主從集群之間,采用的是異步同步的方式。在Hbase集群中,使用到了日志機(jī)制,數(shù)據(jù)的變化操作就被記錄在日志中,只有當(dāng)日志落盤后,才認(rèn)為數(shù)據(jù)的更改操作已經(jīng)完成。日志存儲(chǔ)在HDFS中。在主從復(fù)制過程中,主集群會(huì)主動(dòng)將數(shù)據(jù)的修改信息通過日志傳送給從節(jié)點(diǎn),當(dāng)然這必須依靠ZooKeeper來實(shí)現(xiàn)。
在實(shí)現(xiàn)Hbase集群復(fù)制前,需要準(zhǔn)備兩個(gè)Hbase集群。當(dāng)然,也可以在同一Hadoop集群中配置兩套Hbase集群來實(shí)現(xiàn)。這里以前者為例進(jìn)行說明。
注意:兩套Hbase集群的版本最好保持一致。
執(zhí)行“./hbase version”命令,來查看其版本信息。而且主從節(jié)點(diǎn)之間的網(wǎng)絡(luò)連接必須打通,兩者的主機(jī)名不能相同。執(zhí)行“cat/etc/hosts”命令,可以查看主機(jī)名信息。在主集群中在 Hbase的“conf”路徑下對(duì)“hbase-site.xml”文件進(jìn)行修改,將其中的“”欄中的值設(shè)置為“”,激活集群復(fù)制功能。
注意:在所有的從節(jié)點(diǎn)上也必須執(zhí)行同樣的修改操作。
接著在主集群節(jié)點(diǎn)中添加復(fù)制點(diǎn),配置主從集群的復(fù)制關(guān)系。具體的命令格式為“add_peer
注意:不要包含特殊字符。
“CLUSTER_KEY”參數(shù)指定群集鍵,該參數(shù)的格式為“hbase.zookeeper.quorum:hbase.zookeeper.property.clientPort:zookeeper.znode.parent”,可以看出其實(shí)際上由三個(gè)部分組成,其中的“hbase.zookeeper.quorum”參數(shù)為Zookeeper集群的地址列表。
注意:因?yàn)槭窃谥骷荷咸砑訌募旱膶?duì)應(yīng)關(guān)系,所以這里的Zookeeper指的是從集群上的quorum節(jié)點(diǎn)的地址列表。
例如,在某從節(jié)點(diǎn)Slave1上 進(jìn) 入“/hadoop/hbase-x.x.x.x/conf”路徑下,執(zhí) 行“cat hbasesite.xml”命令,在其中找到“”行,在其下顯示“”, 表明這里使用了兩個(gè)從節(jié)點(diǎn)?!癶base.zookeeper.property.clientPort:”參數(shù)指定Zookeeper客戶端連接Zookeeper服務(wù)器的端口號(hào),這里的客戶端指的是主集群的客戶端,端口號(hào)為從集群的Zookeeper服務(wù)器端口號(hào)。在該從節(jié)點(diǎn)上進(jìn)入“/hadoop/zookeeper-x.x.x/conf” 目錄下,執(zhí)行“cat zoo.cfg|grep-i port”命令,在返回信息中的“ClientPort”欄中顯示端口號(hào),默認(rèn)為2181。
上述“znode.parent”參數(shù)用來設(shè)置Zookeeper中的 Hbase的根 ZNode,默 認(rèn)值 為“:/hbase”。在主集群節(jié)點(diǎn)中進(jìn)入“/hadoop/zookeeper-x.x.x/conf”目錄,執(zhí)行“./zkCli.sh-server 172.16.1.10:port 2181”命令,利用主集群的客戶端連接從集群節(jié)點(diǎn)的Zookeeper Server,這里的“172.16.1.10”為從集群節(jié)點(diǎn)的IP。
在其控制臺(tái)下執(zhí)行“l(fā)s/”命令,顯示“[hbase,zookeeper]”。執(zhí)行“l(fā)s /hbase”命令,顯示從集群根目錄信息。在某從節(jié)點(diǎn)上進(jìn)入“/hadoop/hbase-x.x.x.x/bin”目錄下,執(zhí)行“./hbase shell”命令,在控制臺(tái)下執(zhí)執(zhí)行“add_peer'1'"master,slave1,slave2,:2 181:/hbase"”命令,配置主從復(fù)制關(guān)系。
執(zhí) 行“l(fā)ist_peers”命令,顯示已經(jīng)存在的主從復(fù)制關(guān)系信息,包括其ID、群集鍵和狀態(tài)等。在測試時(shí)可先在主界面上創(chuàng)建一張表,按照上述配置,可以將其復(fù)制到所有的從節(jié)點(diǎn)上。在主節(jié)點(diǎn)上進(jìn)入Hbase Shell控制臺(tái),執(zhí)行“create'replat',{NAME=>'cf1',REPLICATI ON_SCOPE=>1}”命令,創(chuàng)建名為“replat”的表,其中“Name”參數(shù)指定列族名稱,“REPLICATION_SCOPE”參數(shù)指定復(fù)制所需的唯一的ID信息。
在所有的從節(jié)點(diǎn)的Hbase Shell控 制臺(tái)中分別執(zhí)行“create'replat',{NAME=>'cf1’}”命令,來創(chuàng)建同名的表。然后在主節(jié)點(diǎn)上執(zhí)行“put'replat','row1','cf1:v1','foo‘”命令,向該表中添加數(shù)據(jù)。接著在主從節(jié)點(diǎn)上分別執(zhí)行“scan‘replat’”命令,都可以顯示該表的內(nèi)容,說明已經(jīng)實(shí)現(xiàn)。
要想用好Hbase的群集復(fù)制功能,必須熟悉與之相關(guān)的命令。例如使用“add_peer”命令,可以配置主從復(fù)制關(guān)系,利用“l(fā)ist_peers”命令,可以查看群集復(fù)制配置信息。使用“disable_peer
執(zhí) 行“disable_table_replication
在主節(jié)點(diǎn)上使用“status'replication‘” 命 令,可以查看集群復(fù)制的狀態(tài)。也可以在Linux命令行下執(zhí)行“./hbase org.apache.hadoop.hbase.mapreduce.replication.VerifyReplication 1 reptable1”命令,可以對(duì)指定ID的集群復(fù)制中指定表的復(fù)制操作進(jìn)行校驗(yàn),這里針對(duì)的是ID為1群集復(fù)制中名為“reptable1”的表進(jìn)行校驗(yàn)。
當(dāng)主集群要將大量的數(shù)據(jù)同步到從集群時(shí),從集群的壓力會(huì)比較大,導(dǎo)致整個(gè)群集復(fù)制的性能變得比較差。解決的方法是將主集群的和復(fù)制相關(guān)的默認(rèn)配置值設(shè)置的小一些,可以考慮適當(dāng)減少每次同步數(shù)據(jù)的大小。例如打開“hbase-site.xml”文件,對(duì)“replication.source.size.capacity”的值進(jìn)行修改,來設(shè)置主集群每次向從集群發(fā)送的Entry的包的最大值。對(duì)“replication.source.nb.capacity”參數(shù)進(jìn)行修改,來設(shè)置主集群每次向從集群發(fā)送的Entry最大的個(gè)數(shù)。