概述
IPv6
是Internet Protocol Version 6
的縮寫,是替代IPv4
的下一代協議。由於IPv4
所能表達的網路地址資源有限,隨著網路的全世界普及,已經越來越不夠用,因此,IPv6
的推廣勢在必行。
尤其是政府銀行機構,更是將IPv6
的支援作為推廣亮點,出現在手機App
的首頁。
ClickHouse
作為主流的OLAP
列式儲存資料庫,在大資料的應用中越來越得到使用者的青睞和認可,那麼對IPv6
的支援也是順理成章的事情。
本文主要講解ClickHouse
如何通過IPv6
進行連線。
前置工作
如何檢視伺服器是否支援ipv6
隨著IPv6
的普及以及政府對IPv6
的支援力度加大,現在大部分裝置都已經支援IPv6
。可以通過ifconfig
命令檢視:
如上圖所示,如果有inet6
這一項,則表示當前機器支援ipv6
。
如果是Linux
伺服器,也可以通過檢視目錄下是否有/proc/net/if_inet6
檔案,來判斷是否支援IPv6
。
如何配置使ClickHouse支援ipv6連線
在使用IPv6
地址連線ClickHouse
之前,需要在ClickHouse
的伺服器中做一些配置,主要是配置listen_host
選項。官方說明如下:
<!-- Listen specified address.
Use :: (wildcard IPv6 address), if you want to accept connections both with IPv4 and IPv6 from everywhere.
Notes:
If you open connections from wildcard address, make sure that at least one of the following measures applied:
- server is protected by firewall and not accessible from untrusted networks;
- all users are restricted to subset of network addresses (see users.xml);
- all users have strong passwords, only secure (TLS) interfaces are accessible, or connections are only made via TLS interfaces.
- users without password have readonly access.
See also: https://www.shodan.io/search?query=clickhouse
-->
<!-- <listen_host>::</listen_host> -->
<!-- Same for hosts without support for IPv6: -->
<!-- <listen_host>0.0.0.0</listen_host> -->
<!-- Default values - try listen localhost on IPv4 and IPv6. -->
<!--
<listen_host>::1</listen_host>
<listen_host>127.0.0.1</listen_host>
總結起來就是,預設配置的::1
只支援本機連線,如果要放開遠端連線,則要使用::
或者0.0.0.0
。其中::
同時支援IPv6
和IPv4
連線,而0.0.0.0
只支援IPv4
連線。因此,這裡需要將listen_host
配置成::
。
有人說,既然::同時支援IPv6
和IPv4
連線,那直接配置成::
不就完了,為什麼還要有配置成0.0.0.0
這種方式呢?
原因是當ClickHouse
伺服器所在的機器不支援IPv6
的時候,啟動clickhouse-server
會報錯。
命令列工具連線
使用命令列工具連線很簡單,就是直接跟上-h ipv6地址
即可。如果是以fe80
開頭的區域網地址,則需要帶上網路卡名稱,如下所示:
使用程式碼連線
在這裡,通過go
語言實現使用ipv6
連線clickhouse
,其他程式語言可以舉一反三,大抵類似。
package main
import (
"database/sql"
"fmt"
_ "github.com/ClickHouse/clickhouse-go"
)
func main() {
/*
由於要區分ip和埠,所以一般預設的規則都是將ipv6的地址使用中括號[]包含起來。
雖然實際上的ipv6地址是fe80::427c:e13c:50b6:d747%p5p2, 但在此處,ipv6地址是作為url的一部分出現的,因此,對於百分號%的解析會出現問題,需要用特殊符號%25代替,所以最終的地址應該是[fe80::427c:e13c:50b6:d747%25p5p2]
當然,如果ipv6地址是一個正常的外網地址,而非區域網地址,則無需重新解析百分號。
*/
connect, err := sql.Open("clickhouse", "tcp://[fe80::427c:e13c:50b6:d747%25p5p2]:9000?database=default&username=default&password=")
if err != nil {
fmt.Println("connect error ", err)
} else {
fmt.Println("connected")
}
if err = connect.Ping(); err != nil {
fmt.Println("error:", err)
} else {
fmt.Println("connect success!!")
}
}
以上程式碼執行結果: