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