操作背景
目的:想要在本地debug和hbase有关的服务,但hbase在内网没有外网IP无法直连,通过部署看日志的方式效率又比较低,而且难以通过断点方式直观下判断。所以想要可以在本地就能直接连接内网中的hbase集群。
现有条件:
- hbase集群,2个节点,同一个端口
- 一台跳板机,有外网IP可以本机连接,同时也能访问hbase集群
- 一台mac笔记本,为什么要强调是mac呢,因为后面一条命令跟OS有关系
操作流程
首先明确,需要做的就是,能让我的请求通过跳板机转发到hbase集群的对应端口,那么依赖的端口有什么呢,hbase的服务包括zk的端口2181和集群本身的端口60020。其实本来从需要的配置文件上来看只需要zk的端口的,但是实际操作中程序会跳 UnknownHostException ,提示Hbase的域名未知,应该是信息是存储在ZK中,程序先去ZK中取回了Hbase集群的端口信息回来本地,在从本地区访问的集群,所以Hbase的IP信息也是需要配置的。
- 首先使用SSH命令打通SSH隧道
ssh -N -L 2181:zk域名:2181 跳板机user@hostname
,这里我没有加-f挂在后台,因为只是调试用,调试结束要关闭把端口让出来的,挂后台容易忘了杀进程。 - 测试是否可用,
telnet localhost 2181
,测试通过 - 编辑本机的/etc/hosts文件,添加对hbase域名的解析,这里说下为什么前面的ZK不需要解析。其实也可以解析,但是我在程序的配置文件中将ZK的域名已经修改为localhost了,所以就不用,而hbase的域名是zk去取回来的无法配置,只能通过hosts文件做DNS劫持为本机回环IP。
127.0.0.1 hbase1
127.0.0.2 hbase2
- ping自己的127.0.0.2发现无法访问,这里和操作系统有关系了,OSX似乎是因为防火墙的关系,这里执行这个命令可以打开127.0.0.2
sudo ifconfig lo0 alias 127.0.0.2 netmask 0xFFFFFFFF
,测试ping通。 - 最后再做hbase两个域名的隧道即可
ssh -N -L 127.0.0.1:60020:hbase1:60020 跳板机user@hostname
ssh -N -L 127.0.0.2:60020:hbase2:60020 跳板机user@hostname
完事收工