这里详细的介绍下客户自己搭建thriftserver的流程以及步骤;通过一步步的演示达到分钟级别在ecs上自构建Thriftserver流程;Thrfitserver是接收各种语言的client的请求,可以是:java/c++/php/python and so on;thriftserver接收客户端请求,然后等于做一层proxy机制给HBbase server 发送请求,然后等待响应给client;
一:搭建前我们需要确定好几个需要的东西:
1.jdk(java运行环境,因为Thriftserve是java写的);这里以1.8版本为例子;如何部署java环境谷歌一坨资料;这里不在赘述;
[root@xxxxx apps]# java -version
java version "1.8.0_102"
OpenJDK Runtime Environment (Alibaba 8.2.4fp1) (build 1.8.0102-b8)
OpenJDK 64-Bit Server VM (Alibaba 8.2.4_fp1) (build 25.102-b8, mixed mode)
2.hbase的安装包;可以从阿里云hbase的官网下载,下载的参考指南是这里(当然也可以从hbase 官网下载bin包)。下载后ls -l 下显示:
[root@xxxxx apps]#ls -l
drwxr-xr-x 5 hbase hbase 4096 Oct 9 14:58 bin
-rw-r--r-- 1 hbase hbase 165450 Aug 8 20:45 CHANGES.txt
drwxr-xr-x 2 hbase hbase 4096 Sep 6 17:47 conf
drwxr-xr-x 7 hbase hbase 4096 Sep 6 17:47 hbase-webapps
-rw-r--r-- 1 hbase hbase 261 Aug 8 20:45 LEGAL
drwxr-xr-x 4 root root 16384 Sep 26 14:47 lib
-rw-r--r-- 1 hbase hbase 129225 Aug 8 20:45 LICENSE.txt
-rw-r--r-- 1 hbase hbase 49093 Aug 8 20:45 NOTICE.txt
drwxrwxr-x 2 hbase hbase 4096 Oct 23 14:41 pids
-rw-r--r-- 1 hbase hbase 1477 Aug 8 20:45 README.txt
3.在云hbase的白名单目录里面配置上部署ecs的机器的ip;
有上述2个东西以后,基本上我们就可以开始着手部署hbase 的thriftserver了,但是这里接下来需要有几点东西需要说明下,thriftserver实际上部署的话,一台ecs就是一个单节点,那么可能存在如果部署一台ecs的话,所有的请求打到这台ecs,可能整个集群的性能瓶颈卡在这个节点,此外这台机器可用性会影响整个集群的可用性。
二:部署的模式也有大概几种:
1.集群模式:
把thriftserver部署为一个集群,前段的client的业务请求,在挂一个slb或者业务自己写请求的路由策略,都是ok的,后端请求落到thriftserver集群,集群在做转发。集群的部署方式实际上就是:单独抽几个ecs机器,每一个机器只需要部署单节点thriftserver(参考下面单节点thriftserver部署),集群内的thriftserver对于client的请求处理(处理哪一条请求)由SLB做路由或者客户可以自己写代码实现路由规则,比如做key的模余哈希。
这是最常见的模式,集群模式中的thrift建议不要和RS或者DN混部署。并且如果你使用集群模式的部署方案,你的client端不要去维护长连接。因为如果你维护一个长连接,负载均衡就会失效,如果thrift集群重启,大部分连接会连上第一个起来的thrfit server。
2.本地模式:
每一个用户跑程序的代码那台机器可以顺便部署一个thriftserver,那个thriftserver 处理本机器的进程请求即可。实际上和上述的集群模式是一种简化。复用了客户端的ecs ,节省了开销。
本地模式就是在每个客户机上起一个client,这个客户机独享一个thrift。优点是部署简单,网络开销少。并且这种模式可以使用长连接,自己维护TTransport池。对于持续的写入或者读取,效果要比短连接好很多。HBase IPC本身也是维护一个长连接。缺点是,可靠性略差,如果thrift server挂了的话。但本身如果是多Client,其实也无所谓。
总结:我们的客户case 中2种做法都有的,具体哪一种基于客户的业务预算以及场景来参考;
三:单节点的thriftserver部署:
1.配置处理:
在启动thriftservr之前,我们需要处理下一些相关的配置,需要处理的配置文件有:主要是在hbase的bin的tar包解压下面的conf的hbase-site.xml/hbase-env.sh:
1.1.hbase-site.xml
这个配置文件里面可以添加最基本的访问hbase的东西:zk的地址:
<configuration>
<property>
<name>hbase.zookeeper.quorum</name>
<value>zkip1:port,zkip2:port,zkip3:port</value>
</property>
</configuration>
当然上述东西里面你可以添加别的选项。比如我感觉thriftserver本地的线程少了我可以加一下:
<property>
<name>hbase.thrift.maxWorkerThreads</name>
<value>200</value>
</property>
可以配置的参数有(大致列举):
hbase.thrift.minWorkerThreads:thriftserver端最小线程池线程数;
hbase.thrift.maxWorkerThreads:最大线程数
hbase.thrift.maxQueuedRequests:thriftser排队队列里面最大允许的排队数;
hbase.thrift.threadKeepAliveTimeSec:thrift线程池线程活的最长时间
hbase.regionserver.thrift.compact:thriftserver使用compact协议传输(谷歌了解thrift协议细节);
1.2.hbase-env.sh
export HBASE_LOG_DIR="thriftserver打的log的目录"
export JVM_OPTS="-XX:+UseConcMarkSweepGC -XX:+UnlockDiagnosticVMOptions -XX:+BlockOffsetArrayUseUnallocatedBlock" #使用的是cms gc,当然这里可以使用别的gc算法
export JVM_OPTS="$JVM_OPTS -XX:+UseCMSInitiatingOccupancyOnly -XX:CMSInitiatingOccupancyFraction=75" #cmsgc的相关算法的默认配置
export JVM_OPTS="$JVM_OPTS -verbose:gc -XX:+PrintGCDetails -XX:+PrintGCDateStamps" #标志打gc log
export HBASE_THRIFT_OPTS="-Xms4096m -Xmx4096m" # 配置的gc的堆上内存大小,可以基于业务自己有的ecs机器配置
export HBASE_THRIFT_OPTS="$HBASE_THRIFT_OPTS $JVM_OPTS -XX:ErrorFile=$HBASE_LOG_DIR/hs_err.log -Xloggc:$HBASE_LOG_DIR/gc-thrift-`date +%Y%m%d-%H-%M`.log" #thrift serv log的格式
这里需要明确几点:gc的算法可以配置不同种,jdk1.8以后g1 gc实际上算是比较成熟,也有生产环境使用:配置g1 gc参考这里,以及详细的cms 与g1的区别;对于cms的话,一般默认上述数据配置(除了堆内存)还是可以的。具体cms的调优也可以参考网上细节;
对于堆内存的大小配置建议:
1.2.1:一般使用thfrift的话,主要是使用thriftserver做请求处理,那么压力是全打在thriftserver的,那么对于如果业务请求大的话,且资源允许的话,还是希望给与thriftserver较多的内存资源,一个客户的case 是:集群模式部署thriftserver,单条请求KB级别,大概4台ecs 做业务请求,ecs的物理配置是4core 8g,thriftserver配置4G内存。如果ecs全部是用于业务请求thriftserver还是希望足够多,如果是4G ecs,那么给2G给thriftserver也是有必要的。
1.2.2:如果请求压力过大,我们建议调低cms的CMSInitiatingOccupancyFraction阈值,比如到65的样子,此外,希望可以限制put/get的数据量,单条put入的数据值希望是不要不可控,这样给与thriftserver的压力也是很大的。oom风险较大。
1.3.启动
启动的流程很简单,到bin目录下:执行下
sh hbase-deamon.sh start thrift (这里需要你自己明确启动的thrift的版本)
完成以后会有log输出,如果ok 执行jps 或者是ps aux|grep ThriftServer 有thriftserver进程表示ok;
root xxx xxx /usr/java/jdk1.8.0_131/bin/java -Dproc_thrift -Xmx4G -XX:+UseConcMarkSweepGC -Xms4096m -Xmx4096m -XX:+UseConcMarkSweepGC -XX:+UnlockDiagnosticVMOptions -XX:+BlockOffsetArrayUseUnallocatedBlock -XX:+UseCMSInitiatingOccupancyOnly -XX:CMSInitiatingOccupancyFraction=75 -verbose:gc -XX:+PrintGCDetails -XX:+PrintGCDateStamps -XX:ErrorFile=/xxx/logs/hs_err.log -Xloggc:xx -Dhbase.log.dir=/xxx/logs -Dhbase.log.file=xxx.log -Dhbase.home.dir=/xxx/bin/.. -Dhbase.id.str=root -Dhbase.root.logger=INFO,RFA -Dhbase.security.logger=INFO,RFAS org.apache.hadoop.hbase.thrift.ThriftServer start
默认启动的thriftserve 是9090端口。
后续如何使用的话,参考文章