未完成

HBase与Kafka真正的干活节点region或者说broker的地址都是写在zookeeper里的,然后客户端通过zookeeper来获取这些服务节点进行连接。所以两者有些共性。
对于这两个中间件来说,属于都比较重的,如果每个项目产品部署需要的时候都在项目生产环境的内网来一套、太过于重复劳动和浪费资源。比较正规的搞法应该是把这些与业务无关的中间件剥离出来形成paas能力,给各个项目进行复用。
如果这样搞,这里边多出来一些需要考虑的地方,比如:中间件部署到独立环境资源上以后如何给各产品的后端进行访问,安全和权限问题、涉及到多租户设计、以及统一管理等。

想先研究一下上面所说的独立部署后如何访问的问题。

引子:
需要连接HBase的应用开始运行后用phoenix创建表的时候报错:Can not resolve VM_0_11_centos, please check your network java.net.UnknownHostException: VM_0_11_centos

报错日志可以看到是hbase-client连接失败,日志中VM_0_11_centos是笔者远程HBase所在服务器的机器名,查阅一些文档发现HBase的Region Server启动的时候就是把自己的hostname存放在zookeeper的、而不是ip,所以在客户端本地hosts文件中添加:122.xx.xxx.187 VM_0_11_centos,然后刷新下windows的本地dns即可:

ipconfig /displaydns
ipconfig /flushdns

也就是说,hbase-client一开始是连zookeeper拿到的是HBase Region Server的主机名,然后通过client本地的hosts文件获取了这个主机名对应的region服务的外网ip,然后按照这个外网ip进行访问的。

以技术Saas中台形式使用统一的kafka集群

想到了一个之前遇到过的类似的问题:kafka集群部署在一个独立的环境里的若干服务器上(比如根据架构规划,这个环境作为大数据平台的Paas能力的一部分),在这个独立集群之外的业务应用需要访问kafka集群进行消息的生产和消费,应该如何做这个架构?

首先,可以想到用advertised.listeners=PLAINTEXT://外网ip:9092这样的方式,把broker的可访问ip都写到zookeeper上去,这样业务应用的客户端获取到这个ip之后就可以直接访问到broker了。但是一般来说独立环境不会开放这么多ip来给外部进行访问的。客户端要访问3个zookeeper节点ip,要访问所有的kafka broker节点ip,这一般不太现实。

我们可以在独立环境内部指定一个代理节点、比如配置一个nginx,接下来:

1、在客户端配置域名映射:nginx_ip hostname

2、在kafka的conf/servier.properties配置文件里边配置

advertised.listeners=PLAINTEXT://hostname:9092

这样客户端就可以从zookeeper中拿到这个hostname域名,查本地的映射(或者通过DNS服务)可以获得nginx ip,访问到了nginx代理节点。

3、在nginx上配置各kafka broker的真实内网ip,nginx转发客户端的访问请求到broker节点。

4、客户端访问zookeeper集群也可以用这个思路。

参考:

Kafka:用nginx做kafka集群代理(非http) - 云+社区 - 腾讯云 (tencent.com)