概述
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!!")
}
}
以上代码运行结果:
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。