ClickHouse連線IPv6

禹鼎侯發表於2021-10-16

概述

IPv6Internet Protocol Version 6的縮寫,是替代IPv4的下一代協議。由於IPv4所能表達的網路地址資源有限,隨著網路的全世界普及,已經越來越不夠用,因此,IPv6的推廣勢在必行。

尤其是政府銀行機構,更是將IPv6的支援作為推廣亮點,出現在手機App的首頁。
image.png

ClickHouse 作為主流的OLAP列式儲存資料庫,在大資料的應用中越來越得到使用者的青睞和認可,那麼對IPv6的支援也是順理成章的事情。

本文主要講解ClickHouse如何通過IPv6進行連線。

前置工作

如何檢視伺服器是否支援ipv6

隨著IPv6的普及以及政府對IPv6的支援力度加大,現在大部分裝置都已經支援IPv6。可以通過ifconfig命令檢視:
image.png
如上圖所示,如果有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。其中::同時支援IPv6IPv4連線,而0.0.0.0只支援IPv4連線。因此,這裡需要將listen_host配置成::
有人說,既然::同時支援IPv6IPv4連線,那直接配置成::不就完了,為什麼還要有配置成0.0.0.0這種方式呢?

原因是當ClickHouse伺服器所在的機器不支援IPv6的時候,啟動clickhouse-server會報錯。

命令列工具連線

使用命令列工具連線很簡單,就是直接跟上-h ipv6地址即可。如果是以fe80開頭的區域網地址,則需要帶上網路卡名稱,如下所示:

image.png

使用程式碼連線

在這裡,通過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!!")
    }
}

以上程式碼執行結果:
image.png

相關文章