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