待安装的HBase集群有3个节点,分别为:ecs21,ecs22,ecs23
,规划待安装的角色如下:
节点 | 角色 |
---|---|
ecs21 | HMaster, HRegionServer |
ecs22 | HMaster, HRegionServer |
ecs23 | HRegionServer |
在HBase中,HMaster是集群的管理节点,HRegionServer是具体执行数据存储和查询的工作节点,为了高可用性这里配置两个HMaster,当集群启动时分别运行主Master和备用的Master,当主Master出现故障则备用Master会完成切换,不影响集群的使用,在大型的生产环境集群下,可以配置3~5个HMaster,以保证更高的可用性,同时可以将HMaster和HRegionServer分离。
当前配置以三台服务器组成HBase高可用集群为例,至于其他不同规模的集群配置过程都是一致的。
为了方便接下来的配置,我们先进行必要配置项的梳理,后面直接进行配置替换即可,变量名称和变量值采用yaml格式来表示:
# 变量名: 变量值
# 当前java安装目录 如果是OpenJDK,请按照基础环境中配置的方法确定其所在的路径
java_home: /usr/lib/jvm/java-8-openjdk-amd64/
# 当前Hadoop的配置文件目录,也就是$HADOOP_HOME/etc/hadoop,目前Hadoop的安装目录是: /opt/hadoop-3.2.3
hadoop_conf_dir: /opt/hadoop-3.2.3/etc/hadoop
# HBase的安装目录
hbase_home: /opt/hbase-2.4.13
在安装HBase集群前要保证ZooKeeper和Hadoop服务正常运行,HBase需要通过HDFS存储和访问数据因此数据目录是必要的,相关的配置为:
# HDFS集群名称 之前配置过正常为: hdfscluster
hdfs_cluster_name: hdfscluster
# ZooKeeper集群
zookeeper_hosts: ecs21:2181,ecs22:2181,ecs23:2181
HBase需要修改的必要配置项不多,当前默认配置所需的最低内存为128GB,在配置时请务必细心检查,以保证整个过程顺利无误。为便于表示变量全都写成{{ 变量名 }}
的形式,替换时也请替换掉变量包裹的{{ }}
符号。
我们首先在1个节点完成配置,然后等配置完成后再发送到其他节点即可,当前选择在ecs21
节点上配置,首先解压安装包到指定的目录下:
# 解压之后的安装目录正好为: /opt/hbase-2.4.13
tar -zxf hbase-2.4.13.tar.gz -C /opt/
然后进入配置文件所在目录:
cd /opt/hbase-2.4.13/conf
接下来的配置修改都基于当前工作目录进行。
编辑hbase-env.sh
配置文件,默认配置应为:
# 设置堆内存
export HBASE_HEAPSIZE=30G
# 设置堆外内存
export HBASE_OFFHEAPSIZE=70G
export HBASE_MANAGES_ZK=false
export JAVA_HOME={{ java_home }}
export HBASE_CLASSPATH={{ hadoop_conf_dir }}
重点说一下内存使用要根据具体的硬件修改,当前堆内存设置大小为30G,堆外内存大小为70G,适配的内存是128GB的情况,其他硬件配置需要根据情况修改,特别注意堆外内存部分后面还会有bucketcache的配置会涉及到。
另外就是按照既定配置替换java_home
和hadoop_conf_dir
这两个变量即可:
# 设置堆内存
export HBASE_HEAPSIZE=30G
# 设置堆外内存
export HBASE_OFFHEAPSIZE=70G
export HBASE_MANAGES_ZK=false
export JAVA_HOME=/usr/lib/jvm/java-8-openjdk-amd64/
export HBASE_CLASSPATH=/opt/hadoop-3.2.3/etc/hadoop/
然后保存配置文件。
编辑hbase-site.xml
配置文件,默认配置模板如下:
<configuration>
<property>
<name>hbase.cluster.distributed</name>
<value>true</value>
</property>
<property>
<name>hbase.rootdir</name>
<value>hdfs://{{ hdfs_cluster_name }}/hbase</value>
</property>
<property>
<name>hbase.zookeeper.quorum</name>
<value>{{ zookeeper_hosts }}</value>
</property>
<property>
<name>zookeeper.session.timeout</name>
<value>180000</value>
</property>
<property>
<name>hbase.regionserver.handler.count</name>
<value>100</value>
</property>
<property>
<name>hbase.bucketcache.ioengine</name>
<value>offheap</value>
</property>
<property>
<name>hbase.bucketcache.size</name>
<value>65536</value>
</property>
<property>
<name>hbase.regionserver.global.memstore.size</name>
<value>0.4</value>
</property>
<property>
<name>hfile.block.cache.size</name>
<value>0.4</value>
</property>
<property>
<name>hbase.hregion.majorcompaction</name>
<value>604800000</value>
</property>
<property>
<name>hbase.hstore.blockingStoreFiles</name>
<value>128</value>
</property>
<property>
<name>hbase.hregion.memstore.block.multiplier</name>
<value>16</value>
</property>
<property>
<name>hbase.hstore.blockingwaittime</name>
<value>90000</value>
</property>
<property>
<name>hbase.hstore.flusher.count</name>
<value>4</value>
</property>
<property>
<name>hbase.wal.provider</name>
<value>multiwal</value>
</property>
</configuration>
然后替换其中既定的变量hdfs_cluster_name
以及zookeeper_hosts
如下:
<configuration>
<property>
<name>hbase.cluster.distributed</name>
<value>true</value>
</property>
<property>
<name>hbase.rootdir</name>
<value>hdfs://hdfscluster/hbase</value>
</property>
<property>
<name>hbase.zookeeper.quorum</name>
<value>ecs21:2181,ecs22:2181,ecs23:2181</value>
</property>
<property>
<name>zookeeper.session.timeout</name>
<value>180000</value>
</property>
<property>
<name>hbase.regionserver.handler.count</name>
<value>100</value>
</property>
<property>
<name>hbase.bucketcache.ioengine</name>
<value>offheap</value>
</property>
<property>
<name>hbase.bucketcache.size</name>
<value>65536</value>
</property>
<property>
<name>hbase.regionserver.global.memstore.size</name>
<value>0.4</value>
</property>
<property>
<name>hfile.block.cache.size</name>
<value>0.4</value>
</property>
<property>
<name>hbase.hregion.majorcompaction</name>
<value>604800000</value>
</property>
<property>
<name>hbase.hstore.blockingStoreFiles</name>
<value>128</value>
</property>
<property>
<name>hbase.hregion.memstore.block.multiplier</name>
<value>16</value>
</property>
<property>
<name>hbase.hstore.blockingwaittime</name>
<value>90000</value>
</property>
<property>
<name>hbase.hstore.flusher.count</name>
<value>4</value>
</property>
<property>
<name>hbase.wal.provider</name>
<value>multiwal</value>
</property>
</configuration>
然后保存配置文件,需要注意的是hbase.bucketcache.size
配置项,当前配置的是65536
也就是64GB,但是之前设置的大小是70GB,原因就是除了缓存之外,HBase本身还要占用一部分,这部分一定要留出来,所以这个配置项不能大于或者等于堆外内存的总大小,否则在启动时直接会出现OOM的错误。
编辑文件backup-masters
,写入内容如下:
ecs21
ecs22
这个前面提到过,我们配置两个HMaster
来实现高可用性,这样脚本在启动时就会按照我们配置的自动启动了。
编辑文件regionservers
,写入内容如下:
ecs21
ecs22
ecs23
我们这里3个节点都充当HRegionServer
的角色。
为了方便使用systemd来管理HBase的角色进程,程序包中提供了hbase@.service
配置文件,默认内容如下:
[Unit]
Description=hbase
After=network.target
[Service]
User=root
Group=root
Type=forking
ExecStartPre=/bin/echo $PATH
ExecStart={{ hbase_home }}/bin/hbase-daemon.sh start %i
ExecStop={{ hbase_home }}/bin/hbase-daemon.sh stop %i
TimeoutSec=90s
RestartSec=30s
Restart=always
SuccessExitStatus=143
LimitNOFILE=infinity
[Install]
WantedBy=multi-user.target
我们仅需要替换其中的hbase_home
变量即可:
[Unit]
Description=hbase
After=network.target
[Service]
User=root
Group=root
Type=forking
ExecStartPre=/bin/echo $PATH
ExecStart=/opt/hbase-2.4.13/bin/hbase-daemon.sh start %i
ExecStop=/opt/hbase-2.4.13/bin/hbase-daemon.sh stop %i
TimeoutSec=90s
RestartSec=30s
Restart=always
SuccessExitStatus=143
LimitNOFILE=infinity
[Install]
WantedBy=multi-user.target
然后保存服务文件。
当前已经在ecs21
节点上完成配置,需要分发安装文件到其他的节点上,也就是剩余的ecs22,ecs23
这两个节点,这里使用rsync
工具进行分发,要注意前面的路径后不要包含/
,命令如下:
# 在ecs21节点上执行, 路径后切勿包含斜杠'/'
rsync -av /opt/hbase-2.4.13 ecs22:/opt
rsync -av /opt/hbase-2.4.13 ecs23:/opt
为了启用表的LZ4压缩能力,需要添加Hadoop native库的链接到HBase中,这样HBase就可以使用Hadoop的native库了,命令如下:
# 所有安装HBase的节点都需要执行
mkdir /opt/hbase-2.4.13/lib/native
ln -s /opt/hadoop-3.2.3/lib/native /opt/hbase-2.4.13/lib/native/Linux-amd64-64
注意上面软链接的名字为Linux-amd64-64
不要写错。
本文假定每个HBase节点都必须安装Hadoop,因此才有对应的二进制文件和配置文件,如果不是这样的话需要手动在本地同步一份配置文件和安装文件来提供HBase使用。
为了后续的方便,可以将HBase有关的命令配置到环境变量中,例如编辑环境变量配置/etc/profile
:
export PATH=$PATH:/opt/hbase-2.4.13/bin
上面环境变量所有节点都要配置一下,配置完成保存后使变量生效:
source /etc/profile
如果想使用systemd接管HBase服务,需要在所有节点上安装一下HBase服务文件:
# 所有节点都需要执行
cd /opt/hbase-2.4.13/conf
cp hbase@.service /usr/lib/systemd/system
在任意1个节点可以启动集群:
start-hbase.sh
然后可以使用jps
查看进程,其中ecs21,ecs22
应该同时存在HMaster
和HRegionServer
进程,在ecs23
上只有HRegionServer进程
。
可以访问Web页面查看状态,端口号默认是16010,所有的HMaster
页面均可访问,只是看到的结果会有不同,下面分别是访问http://ecs21:16010
和http://ecs22:16010
看到的结果:
可以看到当前Master
是ecs21
,而Backup Master
是ecs22
,其实从ZooKeeper中也可以看出当前的状态。
可以尝试手动杀掉ecs21
的HMaster
来测试故障转移是否可用,具体过程就不再详细叙述了。
进入控制台命令为:
hbase shell
使用status
指令同样可以看到当前HBase的状态:
另外停止集群可以执行:
stop-hbase.sh
在启动HBase集群时可以添加自动重启参数,这样就算进程崩溃也可以自动拉起来:
start-hbase.sh autostart
除了启动集群时设置崩溃自动拉起来,还可以使用systemd接管服务,启动前首先停止掉集群:
# 在ecs21,ecs22上分别启动HMaster
systemctl start hbase@master.service
# 在ecs21,ecs22,ecs23所有节点上启动HRegionServer
systemctl start hbase@regionserver.service
# 查看服务状态
systemctl status hbase@master
systemctl status hbase@regionserver
如果需要配置开机自动启用服务,分别进行enable
即可:
# 在ecs21,ecs22上分别设置HMaster开机自动启动
systemctl enable hbase@master.service
# 在ecs21,ecs22,ecs23所有节点上设置HRegionServer自动启动
systemctl enable hbase@regionserver.service
这样之后开机后HBase服务就可以随系统启动了。