搭建企业级高可用HBase
1 HBase介绍
HBase是一个分布式的、面向列的开源数据库,就像Bigtable利用了Google文件系统(File System)所提供的分布式数据存储一样,HBase在Hadoop之上提供了类似于Bigtable的能力。HBase是Apache的Hadoop项目的子项目。HBase不同于一般的关系数据库,它是一个适合于非结构化数据存储的数据库。另一个不同的是HBase基于列的而不是基于行的模式。它是一个高可靠性、高性能、面向列、可伸缩的分布式存储系统,利用HBase技术可在廉价PC Server上搭建起大规模结构化存储集群。
HBase的常见使用场景如下:
1、大数据量(100s TB级数据)且有快速随机访问的需求。例如淘宝的交易历史记录,数据量巨大无容置疑,面向普通用户的请求必然要即时响应。
2、容量的优雅扩展。大数据驱使下的动态扩展系统容量是必须的。
3、业务场景简单,不需要关系数据库中很多特性(例如交叉列、交叉表,事务,连接等等)。
4、合理设计rowkey。因为hbase的查询用rowkey是最高效的,也几乎是生产环境下唯一可行的方式。
2 集群规划
在搭建HBase高可用集群时,将HBase的RegionServer部署在HDFS的3个DataNode节点上,HBase的HMaster服务部署在HDFS的2个NameNode(Active和Standby)节点上,部署2个HMaster保证集群的高可用性,防止单点问题。这里使用了独立的ZooKeeper集群,未使用HBase自带的ZooKeeper。下面给出HBase的集群搭建架构图:
搭建HBase HA集群需要首先搭建Hadoop HA集群,其方法可参考我的上一篇文章《Hadoop2.0 HA高可用集群配置详解》。在其基础上加入HBaseHA,规划整个集群由5台主机组成,具体情况如下表所示:
主机名 |
IP地址 |
安装的软件 |
JPS |
hadoop-master1 |
172.16.20.81 |
Jdk/hadoop/hbase |
Namenode/ZKFC/ResourceManager/ JobHistoryServer/HMaster |
hadoop-master2 |
172.16.20.82 |
Jdk/hadoop/hbase |
Namenode/ZKFC/ResourceManager/ WebProxyServer/HMaster |
hadoop-slave1 |
172.16.20.83 |
Jkd/hadoop/hbase/zookeepe |
Datanode/JournalNode/NodeManager/ quorumPeerMain/HRegionServer |
hadoop-slave2 |
172.16.20.84 |
Jkd/hadoop/hbase/zookeeper |
Datanode/JournalNode/NodeManager/ quorumPeerMain/HRegionServer |
hadoop-slave3 |
172.16.20.85 |
Jkd/hadoop/hbase/zookeeper |
Datanode/JournalNode/NodeManager/ quorumPeerMain/HRegionServer |
3 企业级系统参数配置
// 查看linux系统最大进程数和最大文件打开数
$ ulimit-a
// 设置linux系统最大进程数和最大文件打开数(设置完重新登录shell)
$ suroot
# vim/etc/security/limits.conf
root soft nproc 50000
root hard nproc 50000
root soft nofile 25535
root hard nofile 25535
hadoop soft nproc 50000
hadoop hard nproc 50000
hadoop soft nofile 25535
hadoop hard nofile 25535
// 调整linux内核参数
# vim/etc/sysctl.conf
net.ipv4.ip_forward= 0
net.ipv4.conf.default.rp_filter= 1
net.ipv4.conf.default.accept_source_route= 0
kernel.core_users_pid= 1
net.ipv4.tcp_syncookies= 1
net.bridge.bridge-nf-call-ip6tables= 0
net.bridge.bridge-nf-call-iptables= 0
net.bridge.bridge-nf-call-arptables= 0
kernel.mggmnb= 65536
kernel.mggmax= 65536
kernel.shmmax= 68719476736
kernel.shmall= 268435456
net.ipv4.tcp_max_syn_backlog= 65000
net.core.netdev_max_backlog= 32768
net.core.somaxconn= 32768
fs.file-max= 65000
net.core.wmem_default= 8388608
net.core.rmem_default= 8388608
net.core.rmem_max= 16777216
net.core.wmem_max= 16777216
net.ipv4.tcp_timestamps= 1
net.ipv4.tcp_synack_retries= 2
net.ipv4.tcp_syn_retries= 2
net.ipv4.tcp_mem= 94500000 915000000 927000000
net.ipv4.tcp_max_orphans= 3276800
net.ipv4.tcp_tw_reuse= 1
net.ipv4.tcp_tw_recycle= 1
net.ipv4.tcp_keepalive_time= 1200
net.ipv4.tcp_syncookies= 1
net.ipv4.tcp_fin_timeout= 10
net.ipv4.tcp_keepalive_intvl= 15
net.ipv4.tcp_keepalive_probes= 3
net.ipv4.ip_local_port_range= 1024 65535
net.ipv4.conf.eml.send_redirects= 0
net.ipv4.conf.lo.send_redirects= 0
net.ipv4.conf.default.send_redirects= 0
net.ipv4.conf.all.send_redirects= 0
net.ipv4.icmp_echo_ignore_broadcasts= 1
net.ipv4.conf.eml.accept_source_route= 0
net.ipv4.conf.lo.accept_source_route= 0
net.ipv4.conf.default.accept_source_route= 0
net.ipv4.conf.all.accept_source_route= 0
net.ipv4.icmp_ignore_bogus_error_responses= 1
kernel.core_pattern= /tmp/core
vm.overcommit_memory= 1
#sysctl -p
4 HBase HA配置
// 在hadoop-master1节点解压hadoop安装包
$ tar-xvf hbase-1.2.0-cdh5.7.1.tar.gz -C /home/hadoop/app/cdh/
// 删除安装包
$ rmhbase-1.2.0-cdh5.7.1.tar.gz
// 进入hbase的conf目录
$ cd/home/hadoop/app/cdh/hbase-1.2.0-cdh5.7.1/conf/
// 修改hbase-env.sh
$ vimhbase-env.sh
# 配置JDK安装路径
exportJAVA_HOME=/home/hadoop/app/jdk1.7.0_79
# 配置Hadoop安装路径
exportHADOOP_HOME=/home/hadoop/app/cdh/hadoop-2.6.0-cdh5.7.1
# 设置HBase的日志目录
exportHBASE_LOG_DIR=${HBASE_HOME}/logs
# 设置HBase的pid目录
exportHBASE_PID_DIR=${HBASE_HOME}/pids
# 使用独立的ZooKeeper集群
exportHBASE_MANAGES_ZK=false
# 优化配置项
# 设置HBase内存堆的大小
exportHBASE_HEAPSIZE=1024
# 设置HMaster最大可用内存
exportHBASE_MASTER_OPTS="-Xmx512m"
# 设置HRegionServer最大可用内存
exportHBASE_REGIONSERVER_OPTS="-Xmx1024m"
// 配置hbase-site.xml
$ vim hbase-site.xml
// 配置regionservers
$ vimregionservers
hadoop-slave1
hadoop-slave2
hadoop-slave3
// 新建backup-masters文件并配置
$ vimbackup-masters
hadoop-master2
// 创建hbase的缓存文件目录
$ cd/home/hadoop/app/cdh/hbase-1.2.0-cdh5.7.1/
$ mkdirtmp
// 创建hbase的日志文件目录
$ mkdirlogs
// 创建hbase的pid文件目录
$ mkdirpids
// 将hbase工作目录同步到集群其它节点
$ scp-r /home/hadoop/app/cdh/hbase-1.2.0-cdh5.7.1/hadoop-master2:/home/hadoop/app/cdh/
$ scp-r /home/hadoop/app/cdh/hbase-1.2.0-cdh5.7.1/ hadoop-slave1:/home/hadoop/app/cdh/
$ scp-r /home/hadoop/app/cdh/hbase-1.2.0-cdh5.7.1/ hadoop-slave2:/home/hadoop/app/cdh/
$ scp-r /home/hadoop/app/cdh/hbase-1.2.0-cdh5.7.1/ hadoop-slave3:/home/hadoop/app/cdh/
// 在集群各节点上修改用户环境变量
$ vim .bash_profile
export HBASE_HOME=/home/hadoop/app/cdh/hbase-1.2.0-cdh5.7.1
export PATH=$PATH:$HBASE_HOME/bin
$ source.bash_profile
// 删除hbase的slf4j-log4j12-1.7.5.jar,解决hbase和hadoop的LSF4J包冲突
$ cd /home/hadoop/app/cdh/hbase-1.2.0-cdh5.7.1/lib
$ mvslf4j-log4j12-1.7.5.jar slf4j-log4j12-1.7.5.jar.bk
5 集群启动
// 启动zookeeper集群(分别在slave1、slave2和slave3上执行)
$ zkServer.shstart
备注:此命令分别在slave1/slave2/slave3节点启动了QuorumPeerMain。
// 启动HDFS(在master1执行)
$ start-dfs.sh
备注:此命令分别在master1/master2节点启动了NameNode和ZKFC,分别在slave1/slave2/slave3节点启动了DataNode和JournalNode。
// 启动YARN(在master2执行)
$ start-yarn.sh
备注:此命令在master2节点启动了ResourceManager,分别在slave1/slave2/slave3节点启动了NodeManager。
// 启动YARN的另一个ResourceManager(在master1执行,用于容灾)
$ yarn-daemon.sh start resourcemanager
备注:此命令在master1节点启动了ResourceManager。
// 启动HBase(在master1执行)
$ start-hbase.sh
备注:此命令分别在master1/master2节点启动了HMaster,分别在slave1/slave2/slave3节点启动了HRegionServer。
6 功能测试
6.1 Web UI
下图为http://hadoop-master1:16010,可看到主Master状态:
下图为http://hadoop-master2:50070,可看到备份Master状态:
6.2 Shell操作
// 连接hbase客户端
$ hbase shell
// 创建表,表名为employee,列族为info
> create 'employee','info'
// 显示hbase已创建的表,验证表employee是否创建成功
> list
// 在表employee中插入测试数据
> put'employee','rowkey01','info:id','1001'
> put'employee','rowkey01','info:name','Henry'
> put 'employee','rowkey01','info:address','Bangalore'
> put'employee','rowkey02','info:id','1002'
> put'employee','rowkey02','info:name','Messi'
// 检索表employee中的所有记录
> scan 'employee'
// 检索表employee中行键为rowkey01的记录
> get 'employee','rowkey01'
// 禁用表employee并删除
> disable 'employee'
> drop 'employee'
7 动态替换节点
7.1 Hadoop动态添加节点
(一)设置新节点与集群NameNode的SSH无密码登录
(二)在hosts文件中添加主机名和IP地址,并将该文件同步到集群其它节点
(三)修改hadoop配置文件slaves,加入新节点的主机名
(四)在新节点通过命令hadoop-daemon.shstart datanode和yarn-daemon.sh start nodemanager启动datanode和nodemanager进程
(五)在新节点中通过命令start-balancer.sh均衡当前的HDFS块,在执行前可通过命令Hdfs dfsadmin -setBalancerBandwidth字节数 设置带宽
7.2 Hadoop动态删除节点
(一)在hadoop配置文件hdfs-site.xml中配置如下:
<property>
<name>dfs.hosts.exclude</name>
<value>/home/hadoop/app/cdh/hadoop-2.6.0-cdh5.7.1/etc/hadoop/exclude</value>
</property>
(二)在配置文件exclude中添加需要删除的节点主机名
(三)通过命令hdfsafsadmin -refreshNodes执行节点刷新操作
(四)通过命令hdfsafsadmin -report可查看该节点状况
7.3 HBase动态添加节点
(一)在HBase的配置文件regionserver中添加新节点的主机名
(二)在新节点通过命令hbase-daemon.shstart regionserver启动HRegionServer
(三)进入hbaseshell,通过命令balance_switch true进行region平衡
7.4 HBase动态删除节点
(一)通过命令graceful_stop.sh主机名 停止需要删除的节点
(二)在HBase的配置文件regionserver中移除删除节点的主机名
上一篇: 搭建企业级高可用HBase
下一篇: 不同语言中类的继承和多态
推荐阅读
-
详解MySQL高可用MMM搭建方案及架构原理
-
基于haproxy的redis高可用环境搭建 redis haproxy
-
基于haproxy的redis高可用环境搭建 redis haproxy
-
搭建MySQL负载均衡及高可用环境
-
Nginx+Keepalived(双机热备)搭建高可用负载均衡环境(HA)
-
聊聊Nginx+Keepalived(双机热备)搭建高可用负载均衡环境(HA) 的技术
-
mysql高可用集群之MHA详细搭建过程
-
SpringCloud学习系列之一 ----- 搭建一个高可用的注册中心(Eureka)
-
CentOS搭建MysqlMMM高可用架构_MySQL
-
keepalived+haproxy+mycat+mysql高可用搭建配制