最近集群要迁移,本来想在网上找到个相对完整的HBase生产环境部署教程来参考一下,无奈,网上基本上都是教你搭建测试环境的,一些常识性的问题都不曾提及。对于搭建生产环境的文章没找到一个让人满意和省心的。算了,刚好最近在做HBase集群的跨IDC迁移,那就自己写一个吧,里面也许不会将详细的命令列出来,但是会将对应的大致步骤,需要做的事情列出来。依照这个指南,只要你稍微有点学习能力,搭建出一个生产环境的HBase一点都不是问题。因为就是google一把的事情。
一、节点分布列表
备注:如果集群规模不大的,以上的节点都可以混部署。
先申明一下:本文主要是用来部署生产环境,一般是几十到几百个节点不等,部署步骤非常多,建议做成自动化脚本或者工具,推荐Asinble,我们现在使用Asinble来进行自动化部署和扩容,非常方便。
二、初始化
设备初始化主要包括如下几项:
(一)、基础初始化
1、通用初始化
针对各个节点都做的初始化有哪些:
a、文件描述符数量
修改/etc/security/limits.conf文件,将限制调整为65535,如下图:
b、设置swappiness、dirty_background_ratio、dirty_ratio
echo "vm.swappiness=0" >> /etc/sysctl.conf
echo "vm.dirty_background_ratio=1" >> /etc/sysctl.conf
echo "vm.dirty_ratio=4" >> /etc/sysctl.conf
sysctl -p
c、设置ntp
添加ntp自动同步时间,一面各个节点时间不一致;
d、配置DNS
后面的ZK等建议配置成DNS的形式,因此DNS也最好提前配置好,统一修改/etc/resolv.conf 即可。
e、配置主机名
主机名称根据个人喜好配置即可;
f、部署java环境
从官网下载jdk的安装包,以 jdk-8u102-linux-x64.tar.gz为例
tar xzvf jdk-8u102-linux-x64.tar.gz -C /data/hbaseadmin/hbaseenv/
将如下内容添加到/etc/profile
export JAVA_HOME=/data/hbaseadmin/hbaseenv/jdk1.8.0_102/
export JRE_HOME=${JAVA_HOME}/jre
export HADOOP_HOME=/data/hdfsadmin/hbaseenv/hadoop
export HBASE_HOME=/data/hbaseadmin/hbaseenv/hbase
export CLASSPATH=.:${JAVA_HOME}/lib:${JAVA_HOME}/jre/lib/ext:${JAVA_HOME}/jre/lib:${JRE_HOME}/lib:${HBASE_HOME}/lib:${HADOOP_HOME}/lib
export PATH=${JAVA_HOME}/bin:${JRE_HOME}/bin:${HADOOP_HOME}/bin:${HBASE_HOME}/bin:${PATH}
export LANGUAGE=en_US
2、datanode节点的初始化
一般datanode都会有多个数据盘,如果有SSD盘的话更好,我们使用SSD盘来专门存储WAL日志;
a、开启硬盘缓存【datanode节点专属】
/sbin/hdparm -W 1 diskname
b、datanode的分区、格式化
将本地SSD单独分一个区出来,专门用来存储WAL日志【如果有的话】
将数据盘进行分区和格式化,并进行挂载
c、将修改固化到/etc/fstab文件中
(二)、帐号初始化
帐号的初始化主要的操作有两个,一个是创建帐号,一个是打通ssh免密登录。实现如下几个功能:
1、使用hbaseadmin来管理hbase程序
a、在中控节点上创建hbaseadmin账户,并设置好对应的密码
b、使用 ssh-keygen生成对应的密钥对
c、通过 id_rsa.pub创建对应的 authorized_keys
2、通过hdfsadmin来管理hdfsadmin程序
a、在中控节点上创建hdfsadmin账户,并设置好对应的密码
b、使用 ssh-keygen生成对应的密钥对
c、通过 id_rsa.pub创建对应的 authorized_keys
3、打通中控节点和2个master节点到其他各个节点的信任关系,实现免密登录
a、在其他节点上创建hbaseadmin和hdfsadmin帐号
b、将hbaseadmin和hdfsadmin帐号对应的authorized_keys传输到各个机器的对应用户的.ssh目录下,并设置属主为对应用户
c、将hbaseadmin和hdfsadmin帐号对应的私钥id_dsa传输到对应的.ssh目录下,修改好属主,并设置权限为600
4、测试免密登录是否正常
备注:刚开始的时候第一次访问对应主机,会显示该主机的公钥摘要,提示用户是否信任该主机,可以在.ssh/config添加StrictHostKeyChecking no来规避。
5、设置好数据目录的hdfsadmin属主,不然,写入会有问题。
三、ZK部署
1、ZK部署说明
ZK是用来做master的高可用、RegionServer的监控、元数据入口以及集群的配置维护等,而ZK的操作需要通过选举产生,至少需要超过一半的节点意见一致才有效,因此我们部署ZK的时候需要部署奇数个节点,比如3个、5个、7个。对于大的集群一般建议5个或者5个以上,而且这些ZK要跨交换机跨机架容灾。
2、ZK安装
a、从apache官网上下载ZK
wgethttps://archive.apache.org/dist/zookeeper/zookeeper-3.4.9/zookeeper-3.4.9.tar.gz
tar xzvfzookeeper-3.4.9.tar.gz
ln -s zookeeper zookeeper-3.4.9
b、配置ZK
ZK的配置项比较少,大致如下:
cat java.env
#配置java环境即可
export JAVA_HOME=/data/hbaseadmin/hbaseenv/jdk1.8.0_102
export PATH=$PATH:$JAVA_HOME/bin
export JVMFLAGS=-Xmx2048m
cat zoo.cfg
tickTime=15000
# The number of ticks that the initial
# synchronization phase can take
initLimit=20
# The number of ticks that can pass between
# sending a request and getting an acknowledgement
syncLimit=20
maxClientCnxns=200
# the directory where the snapshot is stored.
dataDir=/data/hbase/zookeeper/zookeeper-data/
dataLogDir=/data/hbase/zookeeper/zookeeper-log/
# the port at which the clients will connect
clientPort=2181
server.1=normal-db-lj-hbase-zk-1:2888:3888
server.2=normal-db-lj-hbase-zk-2:2888:3888
server.3=normal-db-lj-hbase-zk-3:2888:3888
server.4=normal-db-lj-hbase-zk-4:2888:3888
server.5=normal-db-lj-hbase-zk-5:2888:3888
备注:这里推荐用域名的方式,后面如果有机器变动直接修改域名对应关系即可
c、创建对应的目录和配置muid
mkdir -p /data/hbase/zookeeper/zookeeper-data/ && mkdir -p /data/hbase/zookeeper/zookeeper-log/
echo "1" > /data/hbase/zookeeper/zookeeper-data/myid
备注:如果是server1就配置myid为1,如果是server2就配置myid为2,以此类推。
d、ZK的启动
在配置好ZK后,就可以开始启动ZK了,启动命令如下:
zookeeper/bin/zkServer.sh start
启动后使用jps查看QuorumPeerMain进程是否存在,如下图:
可以通过
zookeeper/bin/zkServer.sh status
查看对应ZK的状态,如下图:
四、HDFS部署
1、namenode安装和datanode安装
namenode和datanode的安装很假单,是同一个安装包,下载好后,解压到对应的路径就OK
2、安装snappy
由于压缩使用的snappy,因此需要安装snappy,安装snappy的网上有很多教程,这里不再详细介绍。
3、namenode和datanode的配置
namenode的配置属于比较重要的部分,主要是内存的配置。namenode和datanode共享配置
hadoop-env.sh的主要配置如下:
export HADOOP_OPTS="$HADOOP_OPTS -Dsun.net.inetaddr.ttl=3-Dsun.net.inetaddr.negative.ttl=1-Djava.net.preferIPv4Stack=true"
#这里之所以加上-Dsun.net.inetaddr.ttl=3-Dsun.net.inetaddr.negative.ttl=1,是为了解决DNS缓存的问题
export HADOOP_NAMENODE_OPTS="-Dcom.sun.management.jmxremote -server -Xmx90g -Xms90g -Xmn4g -XX:SurvivorRatio=2 -XX:+UseMembar -XX:+UseConcMarkSweepGC -XX:+CMSParallelRemarkEnabled -XX:+CMSScavengeBeforeRemark -XX:ParallelCMSThreads=4 -XX:+UseCMSCompactAtFullCollection -verbose:gc -Xloggc:/data/hdfsadmin/hbaseenv/hadoop/logs/gc.log.`date +%Y-%m-%d-%H-%M-%S` -XX:+PrintGCDetails -XX:+PrintGCDateStamps -XX:+CMSClassUnloadingEnabled -XX:CMSInitiatingOccupancyFraction=85 -XX:CMSFullGCsBeforeCompaction=1 $HADOOP_NAMENODE_OPTS"
export HADOOP_DATANODE_OPTS="-Dcom.sun.management.jmxremote -server -Xmx3g -Xmn1g -XX:SurvivorRatio=2 -XX:+UseMembar -XX:+UseConcMarkSweepGC -XX:+CMSParallelRemarkEnabled -XX:+CMSScavengeBeforeRemark -XX:ParallelCMSThreads=4 -XX:+UseCMSCompactAtFullCollection -verbose:gc -Xloggc:/data/hdfsadmin/hbaseenv/hadoop/logs/gc.log.`date +%Y-%m-%d-%H-%M-%S` -XX:+PrintGCDetails -XX:+PrintGCDateStamps -XX:+CMSClassUnloadingEnabled -XX:CMSInitiatingOccupancyFraction=85 -XX:CMSFullGCsBeforeCompaction=1 $HADOOP_DATANODE_OPTS"
hdfs-site.xml的主要配置如下:
#由于我们的设备有12块数据盘,因此配置了12个挂载点,另外本地有一个SSD的分区专门用来存储WAL日志用的
#这里设置hdfs保留空间为200G,关于这个参数的坑已有文章介绍,链接为:https://www.jianshu.com/p/508449d8f12c
由于配置太多,这里不一一给出,稍后把模版分享出来。
4、HDFS启动
a、在namenode节点上执行如下命令格式化ZK
./hdfs zkfc -formatZK
b、启动JournalNode
./hadoop-daemon.sh start journalnode
c、格式化namenode
./hdfs namenode -format
d、初始化JournalNode
./hdfs namenode -initializeSharedEdits
e、停止journalmode
./hadoop-daemon.sh stop journalnode
f、初始化备NN
将主节点的dfsnamespace目录直接拷贝到备节点的对应目录
g、启动JournalNode
./hadoop-daemon.sh start journalnode
h、启动namenode节点
./hadoop-daemon.sh start namenode
i、在namenode上启动zkfc
./hadoop-daemon.sh start zkfc
j、启动datanode
在master上配置好slaves文件(将全部的datanode填写到slaves文件中)
在master是那个执行
./hadoop-daemons.sh start datanode
k、检查启动是否正常
使用jps命令查看进程是否正常
检查端口是否监听
打开hadoop dfsadmin -report查看各个节点的容量是否正常
使用http://namenodeip:8081/dfshealth.html#tab-overview 查看各个节点的状态和相关信息是否正常
使用hadoop相关的命令测试集群是否正常
测试namenode容灾是否正常
五、HBase
1、master安装和RegionServer安装
HBsae的安装非常简单,在官网下载包后解压到对应的位置即可。
2、master和RegionServer的配置
hbase-env.sh 的配置:
export HBASE_OPTS="-server -d64 -Dsun.net.inetaddr.ttl=3-Dsun.net.inetaddr.negative.ttl=1-Djava.net.preferIPv4Stack=true"
export HBASE_MASTER_OPTS="$HBASE_MASTER_OPTS -Xms10g -Xmx10g -Xmn4g"
export HBASE_REGIONSERVER_OPTS="$HBASE_REGIONSERVER_OPTS -Xms48g -Xmx48g -Xmn4g"
export HBASE_SHELL_OPTS="$HBASE_SHELL_OPTS -Xms1g -Xmx1g -Xmn256m"
# Garbage collection options
CMS_OPTS="-XX:+UseConcMarkSweepGC
-XX:+UseParNewGC
-XX:+CMSParallelRemarkEnabled
-XX:+UseCMSCompactAtFullCollection
-XX:+UseCMSInitiatingOccupancyOnly
-XX:SurvivorRatio=2
-XX:CMSInitiatingOccupancyFraction=65"
export SERVER_GC_OPTS="-verbose:gc
-XX:+PrintGCDetails
-XX:+PrintGCDateStamps
-XX:+HeapDumpOnOutOfMemoryError
-XX:HeapDumpPath=${HBASE_LOG_DIR}
-XX:ErrorFile=${HBASE_LOG_DIR}/hs_err_%p.log
-XX:+PrintTenuringDistribution
-Xloggc:${HBASE_LOG_DIR}/gc-hbase.log.`date +%Y-%m-%d-%H-%M-%S`
-XX:+UseGCLogFileRotation
-XX:NumberOfGCLogFiles=10
-XX:GCLogFileSize=128M
$CMS_OPTS"
hbase-site.xml,由于升级到的配置单数太多,这里不再列出,将文件直接上传到附件。
3、HBase启动
a、启动hbase master
/hbase-daemon.sh start master
b、启动RegionServer
在master上配置好regionservers文件(将regionserver的IP列表写入regionservers文件)
在master上执行
./hbase-daemons.sh start regionserver
c、检查启动是否正常
使用jps查看进程是否正常
查看端口是否监听
通过http://masterip:8080/master-status 查看各个regionserver的状态和相关信息是否正常
通过hbase shell测试hbase各项功能是否正常
测试master的容灾是否正常
七、自动化
整个安装过程步骤机器繁多,建议在测试环境部署好后,写成自动化脚本或者工具,后续再做扩容或者安装的时候,可以直接使用脚本工具来进行。我们部署采用Ansible做自动化安装和扩容,非常方便。
八、监控部署
在安装完成整个集群并测试无异常后,就需要添加对应的监控,对于hbase的监控相关,以后再写问详细阐述需要监控的相关监控项。