目录
- 前言
- 什么是跳板机
- 什么是SSH协议
- SSH管道访问ClickHouse
- 参考文献
前言
因为新业务需要,数据都存储在阿里云服务器的ClickHouse数据库里,最近想取点数探索一下,于是下载了客户端工具DBeaver并成功连接ClickHouse,然后想通过python脚本来访问ClickHouse数据库,于是屁颠屁颠的装了一个clickhouse_driver模块,ip,端口,账号,密码等如下代码,折腾了半天始终不得要领,不是报102错误代码,就是209错误代码,不是说我没权访问就是说我访问超时,后来向运维人员一问,原来是没法本地直接访问远程服务器上的ClickHouse,需要通过跳板机,通过SSH管道访问ClickHouse数据库。
from clickhouse_driver import Client
client = Client(host ='***.***.*.***', port = '9000', user = '******', password = '******', send_receive_timeout=20)
print("ok")
sql = 'SHOW TABLES'
data = client.execute(sql)
print(data)
报错如下
Failed to connect to ***.***.*.***:9000
Traceback (most recent call last):
File "C:\Users\bowen\AppData\Roaming\Python\Python39\site-packages\clickhouse_driver\connection.py", line 395, in connect
return self._init_connection(host, port)
File "C:\Users\bowen\AppData\Roaming\Python\Python39\site-packages\clickhouse_driver\connection.py", line 325, in _init_connection
self.socket = self._create_socket(host, port)
File "C:\Users\bowen\AppData\Roaming\Python\Python39\site-packages\clickhouse_driver\connection.py", line 297, in _create_socket
raise err
File "C:\Users\bowen\AppData\Roaming\Python\Python39\site-packages\clickhouse_driver\connection.py", line 288, in _create_socket
sock.connect(sa)
socket.timeout: timed out
Traceback (most recent call last):
data = client.execute(sql)
File "C:\Users\bowen\AppData\Roaming\Python\Python39\site-packages\clickhouse_driver\client.py", line 361, in execute
with self.disconnect_on_error(query, settings):
File "D:\software\Anaconda3\lib\contextlib.py", line 119, in __enter__
return next(self.gen)
File "C:\Users\bowen\AppData\Roaming\Python\Python39\site-packages\clickhouse_driver\client.py", line 305, in disconnect_on_error
self.establish_connection(settings)
File "C:\Users\bowen\AppData\Roaming\Python\Python39\site-packages\clickhouse_driver\client.py", line 292, in establish_connection
self.connection.force_connect()
File "C:\Users\bowen\AppData\Roaming\Python\Python39\site-packages\clickhouse_driver\connection.py", line 254, in force_connect
self.connect()
File "C:\Users\bowen\AppData\Roaming\Python\Python39\site-packages\clickhouse_driver\connection.py", line 416, in connect
raise err
clickhouse_driver.errors.SocketTimeoutError: Code: 209. (***.***.*.***:9000)
什么是跳板机
举个例子,你要跨过一条1.8米宽的小溪,而你一次只能跨1米长,这是时候你是不是想在溪水中间搭一个石墩子用来垫脚呀,跳板机就像这个石墩子一样承担了一个跳板的角色,跳板机因此而得名。
跳板机(Jump Server)也称堡垒机,是一种可作为跳板批量操作的远程设备的网络设备,是系统管理员和运维人员常用的操作平台之一,很多场景下,由于网络原因我们没法直接连接远程服务器,那么我们如何访问远程服务器呢?先弄一台可以与本地连接的中间服务器,而这台中间服务器可以访问目的服务器,先通过访问中间服务器,然后再访问目的服务器,从而达到间接访问的效果。那么在这中间摆了一道,程如何保证身份认证等工作呢?这就需要用到SSH协议。
什么是SSH协议
SSH(安全外壳协议 Secure Shell Protocol,简称SSH)是一种加密的网络传输协议,用于在网络中实现客户端和服务端的连接,我们在本地电脑通过SSH连接远程服务器,它为我们访问提供了身份认证。
跳板机结合SSH协议,这从一定程度上提升了服务器的数据安全性,也提升了服务器的可维护性,但同时也带来了一定的繁琐性和不稳定性。
SSH管道访问ClickHouse
在对跳板机和SSH协议有一个大致了解之后,我们可以着手通过SSH管道对云端的ClickHouse进行访问,请注意跳板机的ip地址,端口号,账号和密码与远程服务器上ClickHouse的ip地址,端口号,账号和密码的区别,这个最好向运维人员问清楚。
from sshtunnel import SSHTunnelForwarder
from clickhouse_driver import Client
with SSHTunnelForwarder(
ssh_address_or_host = ('***.***.*.***', 22), #ssh地址及端口
ssh_username='****', #ssh连接的用户名
ssh_password='*******', #ssh连接的密码
remote_bind_address=('********', 9000), #clickhouse所在的地址及端口
local_bind_address=('127.0.0.1', 9000)
) as server:
server.start() #启动服务
client = Client(host= '127.0.0.1', # 此处必须是必须是127.0.0.1
port= server.local_bind_port, ##clickhouse服务器的端口9000,
user='*****', #clickhouse账号
password='******', ##clickhouse密码
send_receive_timeout=1000);
c_sql = "SELECT * FROM ods_base.time_temp limit 10" #sql语句
data = client.query_dataframe(c_sql)
print(data.head())
以上代码就是我们通过跳板机和SSH协议并成功访问服务器上的ClickHouse,其实不单ClickHouse数据库, MySQL,redis等各种数据库都可以通过这种跳板机加SSH管道方式进行访问,她提供了一种远程服务器上数据库访问范式。
参考文献
1,利用python连接clickhouse数据库
https://blog.csdn.net/laocuohui7583/article/details/102487741
2,Python 连接clickhouse数据库以及新建表结构,csv导入数据
https://blog.csdn.net/qq_45956730/article/details/127246423
3,Python连接Clickhouse遇坑篇,耗时一天成功连接!
https://blog.csdn.net/weixin_44786530/article/details/128094447
4,MySQL连接:传统方案连接还是通过SSH连接?哪个好?
https://www.jianshu.com/p/76f3a0d3b802
5,python 使用mysqldb模块通过SSHTunnelForwarder隧道连接mysql
https://www.cnblogs.com/rmticocean/articles/15754617.html
6,https://pypi.org/project/sshtunnel/