概述

IPv6Internet 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。其中::同时支持IPv6IPv4连接,而0.0.0.0只支持IPv4连接。因此,这里需要将listen_host配置成::
有人说,既然::同时支持IPv6IPv4连接,那直接配置成::不就完了,为什么还要有配置成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!!")
    }
}

以上代码运行结果:

03-05 23:20