加入收藏 | 设为首页 | 会员中心 | 我要投稿 衡阳站长网 (https://www.0734zz.cn/)- 数据集成、设备管理、备份、数据加密、智能搜索!
当前位置: 首页 > 站长学院 > MySql教程 > 正文

弥补MySQL和Redis短板:看HBase怎么确保高可用

发布时间:2019-03-26 16:46:17 所属栏目:MySql教程 来源:张小渔
导读:HBase是一个基于Hadoop面向列的非关系型分布式数据库(NoSQL),设计概念来源于谷歌的BigTable模型,面向实时读写、随机访问大规模数据集的场景,是一个高可靠性、高性能、高伸缩的分布式存储系统,在大数据相关领域应用广泛。 HBase系统支持对所存储的数据

HBase本身已经考虑了很多故障切换和恢复的方案:

  • Zookeeper集群:自身设计保证了可用性;
  • Master:通过多个Master注册在Zookeeper集群上来进行主节点的HA和更新;
  • RegionServer:本身就是无状态的,节点失效下线以后会把上面的Region自动迁走,对服务可用性不会有太大影响;
  • Thriftserver:当时业务大多数是Python和Golang,通过用Thrift对HBase的进行,Thriftserver本身是单点的,这里我们通过HAProxy来代理一组Thriftserver服务;
  • HDFS:本身又由Namenode和DataNode节点组成,Namenode我们开启HA功能,保证了HDFS的集群可用性;

2、集群级别

  • Pod容器失效:Pod是通过Replication Controller维护的,K8S的Controller Manager会在它的存储etcd去监听组件的失效情况,如果副本少于预设值会自动新的Pod容器来进行服务;
  • Kubernetes集群崩溃:该场景曾经在生产环境中出现过,针对这种情况,我们对SLA要求较高的业务采用了少量物理机搭配容器的方式进行混合部署,极端场景出现时,可以保证重要业务收到的影响可控;

3、数据级别

所有在K8S上构建的HBase集群都共享了一套HDFS集群,数据的可用性由HDFS集群的多副本来提供。

五、实现细节

1、资源分配

初期物理节点统一采用2*12核心的cpu,128G内存和4T的磁盘,其中磁盘用于搭建服务的HDFS,CPU和内存则在K8S环境中用于建立HBase相关服务的节点。

Master组件的功能主要是管理HBase集群,Thriftserver组件主要承担代理的角色,所以这两个组件资源都按照固定额度分配。

在对Regionserver组件进行资源分配设计的时候,考虑两种方式去定义资源:

弥补MySQL和Redis短板:看HBase怎么确保高可用

资源分配方式

按照业务需求分配:

  • 根据业务方对自身服务的描述,对相关的QPS以及SLA进行评估,为业务专门配置参数,包含blockcache,region大小以及数量等;
  • 优点是针对业务优化,能够充分的利用资源,降低业务的资源占用成本;
  • 管理成本增加,需要对每一个业务进行评估,对平台维护人员非常不友好,同时需要业务同学本身对HBase有理解;

统一规格的资源分配:

  • CPU以及MEM都按照预先设定好的配额来分配,提供多档的配置,将CPU和MEM的配置套餐化;
  • 方便之处在于业务扩容时直接增加Regionserver的个数,配置稳定,运维成本较低,遇到问题时排障方便;
  • 针对某些有特有访问方式的业务有局限性,如CPU计算型,大KV存储,或者有MOB需求的业务,需要特殊的定制;
  • 介于当时考虑接入的在线业务并不多,所以采用了按业务定制的方式去配置Regionserver,正式环境同一业务采用统一配置的一组Regionserver,不存在混合配置的Regionserver组。

2、参数配置

基础镜像基于cdh5.5.0-hbase1.0.0构建:

  1. # Example for hbase dockerfile  
  2. # install cdh5.5.0-hbase1.0.0 
  3. ADD hdfs-site.xml /usr/lib/hbase/conf/ 
  4. ADD core-site.xml /usr/lib/hbase/conf/ 
  5. ADD env-init.py /usr/lib/hbase/bin/ 
  6. ENV JAVA_HOME /usr/lib/jvm/java-8-oracle 
  7. ENV HBASE_HOME /usr/lib/hbase 
  8. ENV HADOOP_PREFIX /usr/lib/hadoop 
  9. ADD env-init.py /usr/lib/hbase/bin/ 
  10. ADD hadoop_xml_conf.sh /usr/lib/hbase/bin/ 
  • 固定的环境变量,如JDK_HOME,HBASE_HOME,都通过ENV注入到容器镜像中;
  • 与HDFS相关的环境变量,如hdfs-site.xml和core-site.xml预先加入Docker镜像中,构建的过程中就放入了HBase的相关目录中,用以确保HBase服务能够通过对应配置访问到HDFS;
  • 与HBase相关的配置信息,如组件启动依赖的Zookeeper集群地址,HDFS数据目录路径,堆内存以及GC参数等,这些配置都需要根据传入KubasService的信息进行对应变量的修改,一个典型的传入参数示例。
    1. REQUEST_DATA = { 
    2.        "name": 'test-cluster', 
    3.        "rootdir": "hdfs://namenode01:8020/tmp/hbase/test-cluster", 
    4.        "zkparent": "/test-cluster", 
    5.        "zkhost": "zookeeper01,zookeeper02,zookeeper03", 
    6.        "zkport": 2181, 
    7.        "regionserver_num": '3', 
    8.        "codecs": "snappy", 
    9.        "client_type": "java", 
    10.        "cpu": '1', 
    11.        "memory": '30', 
    12.        "status": "running", 

(编辑:衡阳站长网)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

热点阅读