Hbase的备份和群集复制

2018-03-03 23:25
网络安全和信息化 2018年3期
关键词:群集日志命令

Hbase的备份方式

Hbase的备份分为冷备和热备,前者称为离线备份,需要将Hbase数据库整体停掉,通过Distcp分布式复制命令,实现高效率的备份。对于后者来说,不需要停止Hbase数据库运行,适合于一些需要不间断运行服务的场合。

热备可以实现增量备份,其缺点是可能丢失部分数据,因为在热备的过程中,相关业务可能正在运行,数据正在进行读写操作,造成数据无法全部备份出来,导致丢失部分数据。

热备包括集群复制,CopyTable和Export等方式。当然,也可以使用特定的参数,将其导出到其他的集群中,这就需要使用集群复制技术,使用到两个Hbase集群,便于实现跨集群的数据实时异步复制功能。

两个集群之间的数据复制,通过Write-ahead log日志可以实现,类似于MySQL的 主 从 复 制,Oracle的DataGuard之类的功能。使用集群复制,可以实现数据备份和灾难恢复,数据集成,跨地域的数据分布以及读写分离功能。

实现Hbase的冷备份

对于Hbase的备份来说,一般是通过Distcp分布式复制来实现的。该命令位于Hadoop tools包中,可以实现在一个集群内部内部快速复制数据,或者在多个HDFS集群之间来复制数据,很适合于针对Hbase进行冷备份操作,但前提是必须停止Hbase数据库的运行。这里以实际的例子,来说明如何实现冷备。

在某台Hadoop服务器 上 执 行“cd/hadoop/hbase-x.x.x.x/bin”,“./hbase shell” 命 令, 进入Hbase操作界面。在其中 执 行“create 'test','cf'”,“put'test','row1','cf:a','value1'”命令,创建名为“test”的表,其中包含名为“cf”的列族。执行“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”等为列的值。

执行“scan'test'”命令,检查指定表的插入情况。执行“quit”,“./stop-hbase.sh”命令,停止Hbase数据库的运行。

要想进行备份,必须先了解Hbase数据库的存放位置。进 入“/hadoop/hbase-x.x.x.x/connf$”命令,执行“cat hbase-site.xml” 命令,打开Hbase的配置文件,在其中的“” 栏 中显 示Hbase在Hadoop中的根路径信息,例如其内容 为“”,就可以知晓其数据库的位置。执行“cd/hadoop/hadoop-x.x.x/bin”,“./hdfs dfs-ls/hbase”命令,显示和Hbase相关的文件存储路径信息。

执行“jps”命令,看到和Hbase相关的Jave进程消失,说明其已经被停掉。执行“./hadoop distcp/hbase/hbasebackup”命令,执行备份操作,将“/hbase”下的所有数据备份到指定的“/hbasebackup”路径下。在实际备份时,可以看到启动了MapReduce任务进行复制。

注意:其备份过程可能较长,这是因为Hbase中文件较多的原因。

备份完成后,执行“./hdfs dfs-ls/hbasebackup”命令,查看备份的具体内容。 执 行“cd/hadoop/hbase-x.x.x.x/bin”,“./start-hbase.sh”,“./hbase shell”命令,启动Hbase数据库。进入Hbsse shell操作台。执行“list”命令,显示上述“test”表信息。

为了测试备份效果执行“disable'test'”,“drop'test'”命令,将该表删除。然后执行“quit”,“./stophbase.sh”命令,停止Hbase数据库。在执行Hbase恢复时,实际上是执行了两步操作,先要将覆盖的Hbase路径进行备份操作,防止因为恢复失败导致数据丢失的情况。执行“./hdfs dfs-mv /hbase /hbase_data”命令,将原Hbase数据移动 到“/hbase_data”目 录中。再使用备份数据覆盖原有的Hbase数据,执行“./hadoop distcp-overwrite/hbasebackup/hbase” 命令,使用“distcp”命令的“-overwrite”参数,将上述备份的内容覆盖到Habse路径下。完成后按照上述方法启动Hbase,在HaseShell中执行“list”命令,显示“test”表示已经恢复成功。

实现Hbase的热备份

对于Hbase的热备来说,不需要停掉Hbase数据库,它常用的工具是Export和Import,前者可以将指定的表导出到HDFS或者本地文件系统中,数据会被导出到指定的目录中,一般情况下为一个Region对应一个文件。默认采用的是Sequence格式的文件形式,在导出过程中可以对数据进行压缩处理。因为在Hbase中存储的数据体积较大,所以启用压缩功能可以有效节省磁盘的空间。

例如,在Hbase Shell控制台中执行“scan'test'”命令,来查看“test”表中的内容。在Linux命令行下执行“./hbase org.apache.hadoop.hbase.mapreduce.Export test/data/bak”命令,将该表的内容导出到本地磁盘中的“/data/bak”目录中。当然,也可以将其导出到HDFS文件系统中。执行“./hbase org.apache.hadoop.hbase.mapreduce.Export test hdfs://master:9000/backup”之 类的命令,来实现该要求。

注意:在导出路径中如果直接查看对应文件的话,是无法显示其内容的。

在Hbase Shell控制台中 执 行“disable'test'”,“drop'test'”命令,将该表删除。

当想恢复该表时,必须首先在Hbase中创建该表,执行“create'test','cf'”,“p u t'test','row1','cf:a','value1'” 命令,创建该“test”的表。 在Hadoop的“bin”路径下执行“./hbase org.apache.hadoop.hbase.mapreduce.Import test/data/bak”命令,即可将上述备份的数据恢复到该表中。

除此之外,还可以使用CopyTable工具实现热备,它可以将所有的表数据或者表中的部分数据复制到同一个集群或者不同集群的另外一张表中,在此期间,可以通过指定导入数据的时间戳实现增量导出操作。

例如,在Hbase Shell下执行“create'test1','c f'”,“p u t'test','row1','cf:a','value1'”命令,创建该“test1”的表。然后在Linux下执行“./hbase org.apache.hadoop.hbase.mapreduce.CopyTable--new.name=newtb test”命令,可以将“test”表中的内容复制到“newtb”中。

以上测试涉及的“test”和“test1”均处于同一个Hbase数据库中。

集群复制的原理

实现Hbase集群复制,离不开Write-ahead log日志,在其中存储一些关于Hbase的记录修改操作信息。利用网络连接将一个集群中将该日志传送到另外的集群中,这样该集群就可以利用该日志,将相关的操作重做一遍,来实现数据的复制操作。

在主从集群之间,采用的是异步同步的方式。在Hbase集群中,使用到了日志机制,数据的变化操作就被记录在日志中,只有当日志落盘后,才认为数据的更改操作已经完成。日志存储在HDFS中。在主从复制过程中,主集群会主动将数据的修改信息通过日志传送给从节点,当然这必须依靠ZooKeeper来实现。

实例配置Hbase集群复制

在实现Hbase集群复制前,需要准备两个Hbase集群。当然,也可以在同一Hadoop集群中配置两套Hbase集群来实现。这里以前者为例进行说明。

注意:两套Hbase集群的版本最好保持一致。

执行“./hbase version”命令,来查看其版本信息。而且主从节点之间的网络连接必须打通,两者的主机名不能相同。执行“cat/etc/hosts”命令,可以查看主机名信息。在主集群中在 Hbase的“conf”路径下对“hbase-site.xml”文件进行修改,将其中的“”栏中的值设置为“”,激活集群复制功能。

注意:在所有的从节点上也必须执行同样的修改操作。

接着在主集群节点中添加复制点,配置主从集群的复制关系。具体的命令格式为“add_peer”,其 中 的“ID”参数是复制所需的唯一的字符串。

注意:不要包含特殊字符。

“CLUSTER_KEY”参数指定群集键,该参数的格式为“hbase.zookeeper.quorum:hbase.zookeeper.property.clientPort:zookeeper.znode.parent”,可以看出其实际上由三个部分组成,其中的“hbase.zookeeper.quorum”参数为Zookeeper集群的地址列表。

注意:因为是在主集群上添加从集群的对应关系,所以这里的Zookeeper指的是从集群上的quorum节点的地址列表。

例如,在某从节点Slave1上 进 入“/hadoop/hbase-x.x.x.x/conf”路径下,执 行“cat hbasesite.xml”命令,在其中找到“”行,在其下显示“”, 表明这里使用了两个从节点。“hbase.zookeeper.property.clientPort:”参数指定Zookeeper客户端连接Zookeeper服务器的端口号,这里的客户端指的是主集群的客户端,端口号为从集群的Zookeeper服务器端口号。在该从节点上进入“/hadoop/zookeeper-x.x.x/conf” 目录下,执行“cat zoo.cfg|grep-i port”命令,在返回信息中的“ClientPort”栏中显示端口号,默认为2181。

上述“znode.parent”参数用来设置Zookeeper中的 Hbase的根 ZNode,默 认值 为“:/hbase”。在主集群节点中进入“/hadoop/zookeeper-x.x.x/conf”目录,执行“./zkCli.sh-server 172.16.1.10:port 2181”命令,利用主集群的客户端连接从集群节点的Zookeeper Server,这里的“172.16.1.10”为从集群节点的IP。

在其控制台下执行“ls/”命令,显示“[hbase,zookeeper]”。执行“ls /hbase”命令,显示从集群根目录信息。在某从节点上进入“/hadoop/hbase-x.x.x.x/bin”目录下,执行“./hbase shell”命令,在控制台下执执行“add_peer'1'"master,slave1,slave2,:2 181:/hbase"”命令,配置主从复制关系。

执 行“list_peers”命令,显示已经存在的主从复制关系信息,包括其ID、群集键和状态等。在测试时可先在主界面上创建一张表,按照上述配置,可以将其复制到所有的从节点上。在主节点上进入Hbase Shell控制台,执行“create'replat',{NAME=>'cf1',REPLICATI ON_SCOPE=>1}”命令,创建名为“replat”的表,其中“Name”参数指定列族名称,“REPLICATION_SCOPE”参数指定复制所需的唯一的ID信息。

在所有的从节点的Hbase Shell控 制台中分别执行“create'replat',{NAME=>'cf1’}”命令,来创建同名的表。然后在主节点上执行“put'replat','row1','cf1:v1','foo‘”命令,向该表中添加数据。接着在主从节点上分别执行“scan‘replat’”命令,都可以显示该表的内容,说明已经实现。

管理HBase群集复制

要想用好Hbase的群集复制功能,必须熟悉与之相关的命令。例如使用“add_peer”命令,可以配置主从复制关系,利用“list_peers”命令,可以查看群集复制配置信息。使用“disable_peer ”命令,可以暂停指定ID的集群复制,但是主节点会继续跟踪数据的改变日志信息。例如,执行“disable_peer 1”命令,可暂停ID为1的群集复制操作。对应地使用“enable_peer ”命令,可指定ID的集群复制,执行“remove_peer”命令,可彻底删除主从节点的复制关系,主节点不会跟踪数据的改变日志信息。执行“enable_table_replication ”命令,可将指定表中的所有列族全部复制到从节点上。

执 行“disable_table_replication ”命令,可以关闭指定表中的所有列族的复制功能,使用“append_peer_tableCFs”命令,可以将某张表中原先没有做集群复制的列族添加到复制之列。使用“list_replicated_table”命令,可以查看当前处于复制状态的所有表信息。使用“remove_peer_tableCFs”命令,指定需要删除的某张表需要复制的列族。执行“set_peer_tableCFs”命令,指定哪些表可以进行复制。使用“show_peer_tableCFs”命令,可查看某张表的哪些列族处于复制的状态。

监控和优化集群复制

在主节点上使用“status'replication‘” 命 令,可以查看集群复制的状态。也可以在Linux命令行下执行“./hbase org.apache.hadoop.hbase.mapreduce.replication.VerifyReplication 1 reptable1”命令,可以对指定ID的集群复制中指定表的复制操作进行校验,这里针对的是ID为1群集复制中名为“reptable1”的表进行校验。

当主集群要将大量的数据同步到从集群时,从集群的压力会比较大,导致整个群集复制的性能变得比较差。解决的方法是将主集群的和复制相关的默认配置值设置的小一些,可以考虑适当减少每次同步数据的大小。例如打开“hbase-site.xml”文件,对“replication.source.size.capacity”的值进行修改,来设置主集群每次向从集群发送的Entry的包的最大值。对“replication.source.nb.capacity”参数进行修改,来设置主集群每次向从集群发送的Entry最大的个数。

猜你喜欢
群集日志命令
只听主人的命令
一名老党员的工作日志
Cecilia Chiang, pioneer of Chinese cuisine
扶贫日志
雅皮的心情日志
移防命令下达后
配置vCenter Server
游学日志
高稳定被动群集车联网连通性研究
这是人民的命令