操作背景
目的:想要在本地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
完事收工