原文地址:www.awebone.com/posts/440e5…
原文作者::Awebone
高可用HBase搭建全流程
通过搭建 ZooKeeper 分布式集群,以感知服务器上下线,接着基于 ZooKeeper 搭建 Hadoop HA 集群,保证 HDFS 文件系统高可用,再在高可用分布式 HDFS 文件系统的基础上搭建高可用分布式 HBase 数据库。
完整实现这个过程,学习到分布式系统中关于数据一致性的知识,在系统中,均可保证最终一致性。掌握了 ZooKeeper、Hadoop、HBase 高可用集群的搭建部署,学习了在分布式文件系统 HDFS 之上,数据库的应用场景。
系统介绍
系统基于 ZooKeeper 搭建 Hadoop HA 集群,在高可用分布式 HDFS 文件系统的基础上,搭建高可用分布式 HBase 数据库集群。
Hadoop 分布式集群采用主从架构,在 Hadoop HA 集群中,ZooKeeper 用来解决 SPOF 单点故障问题。如果 active namenod 宕机,就从剩下的 standby namenodes 中选举出来一个新的 active namenode,并且做到瞬时切换,使得在需求增长的前提下,分布式集群仍然可以向外提供服务。
同样的,分布式 HBase 数据库也采用主从架构,在 master server 宕机的情况下,瞬时切换到 backup master,使得 HBase 高可用。分布式 HBase 数据库的底层存储采用 HDFS 文件系统。
环境要求和版本选择
(1)四台 Linux 服务器,分别为 Hadoop01、Hadoop02、Hadoop03、Hadoop04,采用 Centos 6.8 版本;
(2)Java 采用 JDK 1.8 版本;
(3)ZooKeeper 采用 3.4.10 版本;
(4)Hadoop 采用 2.7.6 版本;
(5)HBase 采用 1.2.6 版本;
集群规划和架构设计
Hadoop 和 HBase 均采用主从架构模式,其系统内部均使用自己提供的负载均衡器。系统的集群规划如下表所示。
| Hadoop01 | Hadoop02 | Hadoop03 | Hadoop04 | |
|---|---|---|---|---|
| NameNode | √ | √ | ||
| DataNode | √ | √ | √ | √ |
| ResourceManager | √ | √ | ||
| NodeManager | √ | √ | √ | √ |
| JobHistoryServer | √ | |||
| ZooKeeper | √ | √ | √ | |
| JournalNode | √ | √ | √ | |
| Zkfc | √ | √ | ||
| HMaster | √ | √ | ||
| HRegionServer | √ | √ | √ | √ |
ZooKeeper 集群安装
配置安排
安装 ZooKeeper 集群时需要注意集群的节点个数必须是奇数,因为奇数个数是为了方便进行选举 leader。这里将 Hadoop01、Hadoop02、Hadoop03 和 Hadoop04 均作为 ZooKeeper 集群的节点,但是将 Hadoop04 节点中的角色固定设置为 observer,observer 其实跟 follower 类似,只不过是为了给 ZooKeeper 进行扩充之使用,不会改变原来集群的主从所属关系,仅仅只是接受请求,然后进行处理,没有投票的权利,也没有被选举成为 leader 的权利。
配置步骤
-
获取安装包
zookeeper-3.4.10.tar.gz -
解压
tar -zxvf zookeeper-3.4.10.tar.gz -C ~/apps/ -
修改配置文件
vim zoo.cfg// znode数据存储系统中的所有节点的数据存储目录 dataDir=/home/hadoop/data/zkdata/ server.1=hadoop01:2888:3888 server.2=hadoop02:2888:3888 server.3=hadoop03:2888:3888 server.4=hadoop04:2888:3888:observer -
在每个节点的 / home/hadoop/data/zkdata / 目录下创建一个 myid 的文件, 该文件中直接存储一个 id 值即可
hadoop01:echo 1 > myid hadoop02:echo 2 > myid hadoop03:echo 3 > myid -
配置环境变量
vim .bashrcexport ZOOKEEPER_HOME=/home/hadoop/apps/zookeeper-3.4.10 export PATH=$PATH:$ZOOKEEPER_HOME/bin -
启动
在每个节点上都执行:
zkServer.sh start -
客户端连接与 shell 操作
客户端连接:
zkCli.sh -server hostname:2181
Hadoop HA 集群安装
HA设计和配置安排
使用共享存储和 ZooKeeper 实现 Hadoop HA。这里将 Hadoop01 作为 NameNode 的 active 节点,将 Hadoop02 作为 NameNode 的 standby 节点,Hadoop02 是 Hadoop01 的热备,NameNode 的元数据都存储在 qjournal 日志系统这个共享存储中,Hadoop01、Hadoop02、Hadoop03、Hadoop04 都作为 DataNode 的节点,定时向 NameNode 发送报告和心跳。ZooKeeper 中的 zkfc 进程监控 NameNode 的情况,当 NameNode active 节点失去心跳,即宕机时,自动切换,将 standby 节点激活,实现 Hadoop 集群的高可用。
配置步骤
-
获取安装包
hadoop-2.7.6.tar.gz -
解压
tar -zxvf hadoop-2.7.6.tar.gz -C ~/apps/ -
修改配置文件
hadoop-env.sh 文件:
export JAVA_HOME=/home/hadoop/apps/jdk1.8.0_73core-site.xml 文件:
<configuration> <!-- 指定hdfs的nameservice为myha01 --> <property> <name>fs.defaultFS</name> <value>hdfs://myha/</value> </property> <!-- 指定hadoop临时目录 --> <property> <name>hadoop.tmp.dir</name> <value>/home/hadoop/data/hadoopdata/</value> </property> <!-- 指定zookeeper地址 --> <property> <name>ha.zookeeper.quorum</name> <value>hadoop01:2181,hadoop02:2181,hadoop03:2181,hadoop04:2181</value> </property> <!-- hadoop链接zookeeper的超时时长设置 --> <property> <name>ha.zookeeper.session-timeout.ms</name> <value>1000</value> <description>ms</description> </property> </configuration>hdfs-site.xml 文件:
<configuration> <!-- 指定副本数 --> <property> <name>dfs.replication</name> <value>2</value> </property> <!-- 配置namenode和datanode的工作目录-数据存储目录 --> <property> <name>dfs.namenode.name.dir</name> <value>/home/hadoop/data/hadoopdata/dfs/name</value> </property> <property> <name>dfs.datanode.data.dir</name> <value>/home/hadoop/data/hadoopdata/dfs/data</value> </property> <!-- 启用webhdfs --> <property> <name>dfs.webhdfs.enabled</name> <value>true</value> </property> <property> <name>dfs.nameservices</name> <value>myha</value> </property> <!-- myha01下面有两个NameNode,分别是nn1,nn2 --> <property> <name>dfs.ha.namenodes.myha</name> <value>nn1,nn2</value> </property> <!-- nn1的RPC通信地址 --> <property> <name>dfs.namenode.rpc-address.myha.nn1</name> <value>hadoop01:9000</value> </property> <!-- nn1的http通信地址 --> <property> <name>dfs.namenode.http-address.myha.nn1</name> <value>hadoop01:50070</value> </property> <!-- nn2的RPC通信地址 --> <property> <name>dfs.namenode.rpc-address.myha.nn2</name> <value>hadoop02:9000</value> </property> <!-- nn2的http通信地址 --> <property> <name>dfs.namenode.http-address.myha.nn2</name> <value>hadoop02:50070</value> </property> <property> <name>dfs.namenode.shared.edits.dir</name> <value>qjournal://hadoop01:8485;hadoop02:8485;hadoop03:8485/myha</value> </property> <!-- 指定JournalNode在本地磁盘存放数据的位置 --> <property> <name>dfs.journalnode.edits.dir</name> <value>/home/hadoop/data/journaldata</value> </property> <!-- 开启NameNode失败自动切换 --> <property> <name>dfs.ha.automatic-failover.enabled</name> <value>true</value> </property> <!-- 配置失败自动切换实现方式 --> <property> <name>dfs.client.failover.proxy.provider.myha</name> <value>org.apache.hadoop.hdfs.server.namenode.ha.ConfiguredFailoverProxyProvider</value> </property> <!-- 配置隔离机制方法,多个机制用换行分割,即每个机制暂用一行 --> <property> <name>dfs.ha.fencing.methods</name> <value> sshfence shell(/bin/true) </value> </property> <!-- 使用sshfence隔离机制时需要ssh免登陆 --> <property> <name>dfs.ha.fencing.ssh.private-key-files</name> <value>/home/hadoop/.ssh/id_rsa</value> </property> <!-- 配置sshfence隔离机制超时时间 --> <property> <name>dfs.ha.fencing.ssh.connect-timeout</name> <value>30000</value> </property> <property> <name>ha.failover-controller.cli-check.rpc-timeout.ms</name> <value>60000</value> </property> </configuration>
mapred-site.xml 文件:
<configuration>
<!-- 指定mr框架为yarn方式 -->
<property>
<name>mapreduce.framework.name</name>
<value>yarn</value>
</property>
<!-- 指定mapreduce jobhistory地址 -->
<property>
<name>mapreduce.jobhistory.address</name>
<value>hadoop01:10020</value>
</property>
<!-- 任务历史服务器的web地址 -->
<property>
<name>mapreduce.jobhistory.webapp.address</name>
<value>hadoop01:19888</value>
</property>
</configuration>
yarn-sitem.xml 文件:
<configuration>
<!-- 开启RM高可用 -->
<property>
<name>yarn.resourcemanager.ha.enabled</name>
<value>true</value>
</property>
<!-- 指定RM的cluster id -->
<property>
<name>yarn.resourcemanager.cluster-id</name>
<value>yrc</value>
</property>
<!-- 指定RM的名字 -->
<property>
<name>yarn.resourcemanager.ha.rm-ids</name>
<value>rm1,rm2</value>
</property>
<!-- 分别指定RM的地址 -->
<property>
<name>yarn.resourcemanager.hostname.rm1</name>
<value>hadoop03</value>
</property>
<property>
<name>yarn.resourcemanager.hostname.rm2</name>
<value>hadoop04</value>
</property>
<!-- 指定zk集群地址 -->
<property>
<name>yarn.resourcemanager.zk-address</name>
<value>hadoop01:2181,hadoop02:2181,hadoop03:2181</value>
</property>
<property>
<name>yarn.nodemanager.aux-services</name>
<value>mapreduce_shuffle</value>
</property>
<property>
<name>yarn.log-aggregation-enable</name>
<value>true</value>
</property>
<property>
<name>yarn.log-aggregation.retain-seconds</name>
<value>86400</value>
</property>
<!-- 启用自动恢复 -->
<property>
<name>yarn.resourcemanager.recovery.enabled</name>
<value>true</value>
</property>
<!-- 制定resourcemanager的状态信息存储在zookeeper集群上 -->
<property>
<name>yarn.resourcemanager.store.class</name>
<value>org.apache.hadoop.yarn.server.resourcemanager.recovery.ZKRMStateStore</value>
</property>
</configuration>
slaves 文件:
hadoop01
hadoop02
hadoop03
hadoop04
-
分发,在一个节点上配置,分发到其他节点,配置信息全部一致
scp -r hadoop-2.7.6 hadoop02:~/apps/scp -r hadoop-2.7.6 hadoop03:~/apps/scp -r hadoop-2.7.6 hadoop04:~/apps/ -
配置环境变量. bashrc
export HADOOP_HOME=/home/hadoop/apps/hadoop-2.7.6export PATH=$PATH:$HADOOP_HOME/bin:$HADOOP_HOME/sbin -
第一次启动
Hadoop HA 集群启动前,需要先启动 ZooKeeper 集群。需要找到 qjournal 系统的所有节点执行:
hadoop-daemon.sh start journalnode,找到其中的一个 HDFS 主节点执行初始化:hadoop namenode -format。把当前初始化成功的那个 namenode 节点的工作目录中的数据文件全部拷贝到剩下的其他 namenode 节点中的对应目录:scp -r hadoopdata/ hadoop02:~/data/,选择其中的一个 namenode 节点然后执行命令去进行 zkfc 的初始化:hdfs zkfc –formatZK -
正式启动
启动 hdfs:
start-dfs.sh启动 yarn 集群:
start-yarn.sh启动 mr 历史服务器:
mr-jobhistory-daemon.sh start historyserver
HBase HA集群安装
配置安排
HBase分布式数据库底层数据存储采用刚刚搭建的HDFS分布式文件系统,使用 ZooKeeper 来作为 HMaster 和 Backup HMaster 的协调,在 HMaster 失去心跳宕机时,Backup HMaster 自动切换成 active 状态,实现高可用分布式数据库。
这里将 Hadoop01 和 Hadoop04 作为 HMaster 节点,将 Hadoop01、Hadoop02、Hadoop03、Hadoop04 作为 HRegionServer 节点。
配置步骤
-
安装包
hbase-1.2.6.tar.gz -
解压
tar -zxvf hbase-1.2.6.tar.gz -C ~/apps/ -
修改配置文件
hbase-env.sh 文件:
export JAVA_HOME=/home/hadoop/jdk1.8.0_73export HBASE_MANAGES_ZK=falsehbase-site.xml 文件:
<property> <!-- 指定 hbase 在 HDFS 上存储的路径 --> <name>hbase.rootdir</name> <value>hdfs://myha/myhbase</value> </property> <property> <!-- 指定 hbase 是分布式的 --> <name>hbase.cluster.distributed</name> <value>true</value> </property> <property> <!-- 指定 zk 的地址,多个用“,”分割 --> <name>hbase.zookeeper.quorum</name> <value>hadoop01:2181,hadoop02:2181,hadoop03:2181</value> </property>
regionservers 文件:
hadoop01
hadoop02
hadoop03
hadoop04
backup-masters 文件:
hadoop01
-
将 hadoop 的 hdfs-site.xml、core-site.xml 放在 hbase 的 conf 下
cp /home/hadoop/hadoop-2.7.6/etc/hadoop/core-site.xml .cp /home/hadoop/hadoop-2.7.6/etc/hadoop/hdfs-site.xml . -
将 hbase 的安装包发送到其他节点
scp -r hbase-1.2.6 hadoop01:$PWDscp -r hbase-1.2.6 hadoop02:$PWDscp -r hbase-1.2.6 hadoop03:$PWDscp -r hbase-1.2.6 hadoop04:$PWD -
启动
start-hbase.sh
系统测试
在四台机器上运行jps命令,查看相关进程是否启动。
ZooKeeper状态查看
在四台机器上使用zkServer.sh status命令查看 ZooKeeper 的状态。
Hadoop HA展示
HDFS 启动过程:
YARN 启动过程:
机架感知状态查看:
Web 页面查看:
HBase HA展示
HBase 启动过程:
Web 页面查看:
HBase 底层存储情况:
系统根据需求,进行架构设计,确定一主多从的架构,接着根据系统环境和版本兼容性的选择,确定最终系统中安装包的版本,然后在仅有的四台服务器上进行集群规划,尽量使得各个节点负载均衡。















