因为工作需要对使用的中间件做ipv6兼容测试,网上相关资料几乎空白,所以做个笔记浅记一下。
ipv6相关命令:
ping6 [ipv6]
telnet -6 [ipv6]%[ipv6指定网卡] [端口]
ssh [ipv6]%[ipv6网卡]
中间件测试: zookeeper 配置修改修改zoo.cfg,将ip地址改为[ipv6地址]
# zookeeper cluster,2888为选举端口,3888为心跳端口 server.0=[fe80::f816:3eff:feac:72ca]:2888:3888 server.1=[fe80::f816:3eff:fe2b:ad63]:2888:3888 server.2=[fe80::f816:3eff:fee2:2837]:2888:3888测试结果
兼容,可同时通过ipv4和ipv6访问
kafka 配置修改修改server.properties
listeners=PLAINTEXT://[fe80::f816:3eff:feac:72ca]:12900 zookeeper.connect=[fe80::f816:3eff:feac:72ca]:2283,[fe80::f816:3eff:fe2b:ad63]:2283,[fe80::f816:3eff:fee2:2837]:2283/kafka测试结果
兼容,可同时通过ipv4和ipv6访问
elasticsearch 配置修改修改elasticsearch.yml文件,将ip地址改为ipv6地址,修改discovery.zen.ping.unicast.hosts配置项,如下所示:
discovery.zen.ping.unicast.hosts: ["[fe80::f816:3eff:feac:72ca]", "[fe80::f816:3eff:fe2b:ad63]", "[fe80::f816:3eff:fee2:2837]"]测试结果
单节点测试正常启动,无报错
集群测试正常启动,无报错
遗留问题:自己电脑通过ipv6或者ipv4地址未能成功访问es集群,不知是自己电脑访问ipv6配置问题还是es集群有问题。
踩坑:
测试时先测试的单节点再测试的集群,启动单节点的时候,会在data目录生成节点信息数据,启动集群时必须把data目录清除,否则集群节点通信会报错!!!
redis 配置修改无需特殊修改
测试结果兼容,可同时通过ipv4和ipv6进行访问
mysql 配置修改在MySQL启动时绑定地址,在服务启动时使用参数–bind-address=addr配置,其中addr可以是IPv4或者IPv6地址,或者主机名hostname。
或者修改my.cnf配置文件,在[mysqld]选项下增加bind-address = ::配置,把bind-address配置成::可以保证同时支持IPv4和IPv6的TCP/IP的连接。
[mysqld]bind-address=::测试结果
兼容,可同时通过ipv4和ipv6进行访问
flink 配置修改 修改flink-conf.yaml配置项jobmanager.rpc.address修改为主机名(实测修改成ipv6地址会报错),并修改/etc/hosts文件,将ipv6地址与主机名做好映射。
修改masters[fe80::f816:3eff:feac:72ca]:8081修改slaves(必须带上网卡)
fe80::f816:3eff:feac:72ca%ens3 fe80::f816:3eff:fe2b:ad63%ens3 fe80::f816:3eff:fee2:2837%ens3测试结果
兼容,可同时通过ipv4和ipv6进行访问
minio新版本不支持ipv6,RELEASE.2018-08-02T23-11-36Z.tar.gz是支持的,但是RELEASE.2018-08-18T03-49-57Z.zip后已经不再支持了,
信息提示可以配置ipv6地址:
ERROR Unable to validate passed arguments: --address input is invalid > Please check --address parameter HINT: --address binds to a specific ADDRESS:PORT, ADDRESS can be an IPv4/IPv6 address or hostname (default port is ':9000') Examples: --address ':443' --address '172.16.34.31:9000' --address '[fe80::da00:a6c8:e3ae:ddd7]:9000'
但是按要求的格式配上后又报错:
ERROR Unable to start the server: listen tcp [fe80::f816:3eff:feac:72ca]:9019: bind: invalid argumenthadoop
不支持ipv6,DataNode使用ipv6地址会报错,官网显示尚未解决。
https://issues.apache.org/jira/browse/HADOOP-17800
hbase不支持ipv6,尚无解决方案。
java服务端(摘抄于其他文章)
java1.4.2以后已经对ipv6做了兼容,在浏览器中使用IPv6的地址访问web资源,IPv6的地址必须要使用中括号“[]”包起来,如下:
http://[2001:db8:1:0:20c:29ff:fe96:8b55]:6080
由于 Java 的面向对象特性,以及 java.net 包对于 IP 地址的良好封装,从而使得将 Java 应用从 IPv4 环境移植到 IPv4/IPv6 双环境,或者纯 IPv6 环境变得异常简单。通常我们需要做的仅是检查代码并移除明码编写的 IPv4 地址,用主机名来替代则可。
除此以外,对于一些特殊的需求,Java 还提供了 InetAddress 的两个扩展类以供使用:Inet4Address 和 Inet6Address,其中封装了对于 IPv4 和 IPv6 的特殊属性和行为。然而由于 Java 的多态特性,使得程序员一般只需要使用父类 InetAddress,Java 虚拟机可以根据所封装的 IP 地址类型的不同,在运行时选择正确的行为逻辑。所以在多数情况下,程序员并不需要精确控制所使用的类型及其行为,一切交给 Java 虚拟机即可。
另外,在 IPv4/IPv6 双环境中,对于使用 Java 开发的网络应用,比较值得注意的是以下两个 IPv6 相关的 Java 虚拟机系统属性。
`java.net.preferIPv4Stack=java.net.preferIPv6Addresses= `
preferIPv4Stack(默认 false)表示如果存在 IPv4 和 IPv6 双栈,Java 程序是否优先使用 IPv4 套接字。默认值是优先使用 IPv6 套接字,因为 IPv6 套接字可以与对应的 IPv4 或 IPv6 主机进行对话;相反如果优先使用 IPv4,则只不能与 IPv6 主机进行通信。
preferIPv6Addresses(默认 false)表示在查询本地或远端 IP 地址时,如果存在 IPv4 和 IPv6 双地址,Java 程序是否优先返回 IPv6 地址。Java 默认返回 IPv4 地址主要是为了向后兼容,以支持旧有的 IPv4 验证逻辑,以及旧有的仅支持 IPv4 地址的服务。