当前位置: 首页 > article >正文

循序渐进丨MogDB 与 PostgreSQL 对比测试IPv6

1.关于IPv6

IPv6(Internet Protocol Version 6),是Internet Engineering Task Force (IETF)设计用于替代IPv4的下一代IP协议,使用IPv6能解决网络地址资源数量的问题。

我们使用ipconfig /all命令查看windows网络接口,会看到IPv6地址:

以太网适配器 以太网 7:
   本地链接 IPv6 地址. . . . . . . . : fe80::828a:5e20:53cb:7719%6(首选)
   IPv4 地址 . . . . . . . . . . . . : 192.168.137.68(首选)

Linux下使用ip addr命令可查看网络接口,包含IPv4和IPv6地址:

# ip addr
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000
    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
    inet 127.0.0.1/8 scope host lo
       valid_lft forever preferred_lft forever
    inet6 ::1/128 scope host 
       valid_lft forever preferred_lft forever
2: ens160: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc fq_codel state UP group default qlen 1000
    link/ether 00:0c:29:4e:37:21 brd ff:ff:ff:ff:ff:ff
    inet 192.168.20.200/24 brd 192.168.20.255 scope global noprefixroute ens160
       valid_lft forever preferred_lft forever
    inet6 fe80::20c:29ff:fe4e:3721/64 scope link noprefixroute 
       valid_lft forever preferred_lft forever

IPv6分为本地关联IPv6和全局IPv6:本地关联的IPv6与网卡的物理地址(MAC地址)有关,不需要通过DHCP自动分配或者手工设置。全局IPv6适用于跨网络或跨路由器进行通信。

本文为了对比测试,也添加一个全局IPv6:

# ip -6 addr add 2022:1:0:0::db1/64 dev ens160

添加完后的信息显示如下:

# ip addr
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000
    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
    inet 127.0.0.1/8 scope host lo
       valid_lft forever preferred_lft forever
    inet6 ::1/128 scope host 
       valid_lft forever preferred_lft forever
2: ens160: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc fq_codel state UP group default qlen 1000
    link/ether 00:0c:29:4e:37:21 brd ff:ff:ff:ff:ff:ff
    inet 192.168.20.200/24 brd 192.168.20.255 scope global noprefixroute ens160
       valid_lft forever preferred_lft forever
    inet6 2022:1::db1/64 scope global 
       valid_lft forever preferred_lft forever
    inet6 fe80::20c:29ff:fe4e:3721/64 scope link noprefixroute 
       valid_lft forever preferred_lft forever

2.PostgreSQL 测试IPv6

首先配置postgresql.conf文件:

listen_addresses='*'

pg_hba.conf文件配置:​​​​​​​

host  all          all  ::0/0  scram-sha-256host  replication  all  ::0/0  scram-sha-256

重启完数据库服务后,进行测试。

使用psql工具进行IPv6连接认证:​​​​​​​

$ psql -h fe80::20c:29ff:fe4e:3721%ens160 -p 1700 -U postgres postgres=# \conninfoYou are connected to database "postgres" as user "postgres" on host "fe80::20c:29ff:fe4e:3721%ens160" (address "fe80::20c:29ff:fe4e:3721") at port "1700".

再使用全局IPv6连接认证:​​​​​​​

$ psql -h 2022:1:0:0::db1 -p 1700 -U postgres postgres=# \conninfoYou are connected to database "postgres" as user "postgres" on host "2022:1:0:0::db1" (address "2022:1::db1") at port "1700".

无论是本地还是全局IPv6,都可以连接成功。

再使用物理流复制协议测试连接:​​​​​​​

$ psql "dbname=postgres replication=database port=1700 user=postgres host=2022:1:0:0::db1" -c "IDENTIFY_SYSTEM"
$ psql "dbname=postgres replication=database port=1700 user=postgres host=fe80::20c:29ff:fe4e:3721%ens160" -c "IDENTIFY_SYSTEM"

都可以获得下面的系统信息:​​​​​​​

      systemid       | timeline |  xlogpos  |  dbname  ---------------------+----------+-----------+---------- 7411331880576156369 |        1 | 2/36517D8 | postgres(1 row)

再搭建standby节点进行测试:​​​​​​​

$ pg_basebackup -D data_standby -h 2022:1:0:0::db1 -p 1700$ pg_basebackup -D data_standby -h fe80::20c:29ff:fe4e:3721%ens160 -p 1700

基础备份使用本地或全局IPv6连接主库都可以。

再编辑standby节点的postgresql.conf文件,修改如下两个参数:​​​​​​​

port=1709primary_conninfo='host=fe80::20c:29ff:fe4e:3721%ens160 port=1700 user=postgres password=XXX application_name=node2'

创建standby.signal后,启动standby节点:​​​​​​​

$ touch data_standby/standby.signal$ pg_ctl start -D data_standby

接着在主库查询pg_stat_replication视图:​​​​​​​

postgres=# select usename,application_name,client_addr,sync_state from pg_stat_replication;
┌──────────┬──────────────────┬──────────────────────────┬────────────┐
│ usename  │ application_name │       client_addr        │ sync_state │
├──────────┼──────────────────┼──────────────────────────┼────────────┤
│ postgres │ node2            │ fe80::20c:29ff:fe4e:3721 │ async      │
└──────────┴──────────────────┴──────────────────────────┴────────────┘
(1 row)

primary_conninfo换成全局ipv6地址:​​​​​​​

port=1709primary_conninfo='host=2022:1:0:0::db1 port=1700 user=postgres password=XXX application_name=node2'

查询pg_stat_replication视图,replication连接也是正常状态:​​​​​​​

postgres=# select usename,application_name,client_addr,sync_state from pg_stat_replication;
┌──────────┬──────────────────┬─────────────┬────────────┐
│ usename  │ application_name │ client_addr │ sync_state │
├──────────┼──────────────────┼─────────────┼────────────┤
│ postgres │ node2            │ 2022:1::db1 │ async      │
└──────────┴──────────────────┴─────────────┴────────────┘
(1 row)

最后再测试逻辑复制,逻辑复制的发布与订阅端搭配过程,本文省略,直接测试订阅端的订阅创建过程。​​​​​​​

create subscription sub_all  connection 'hostaddr=fe80::20c:29ff:fe4e:3721%ens160 port=1700 user=postgres password=XXX dbname=logical_src' 
 publication pub_all;

发布端查询pg_stat_replication视图信息:​​​​​​​

postgres=# select usename,application_name,client_addr,sync_state from pg_stat_replication;
┌──────────┬──────────────────┬──────────────────────────┬────────────┐
│ usename  │ application_name │       client_addr        │ sync_state │
├──────────┼──────────────────┼──────────────────────────┼────────────┤
│ postgres │ sub_all          │ fe80::20c:29ff:fe4e:3721 │ async      │
└──────────┴──────────────────┴──────────────────────────┴────────────┘
(1 row)

同样再使用全局ipv6进行测试:​​​​​​​

create subscription sub_all  connection 'hostaddr=2022:1:0:0::db1 port=1700 user=postgres password=XXX dbname=logical_src' 
 publication pub_all;

发布端查询pg_stat_replication视图信息:​​​​​​​

postgres=# select usename,application_name,client_addr,sync_state from pg_stat_replication;┌──────────┬──────────────────┬─────────────┬────────────┐│ usename  │ application_name │ client_addr │ sync_state │├──────────┼──────────────────┼─────────────┼────────────┤│ postgres │ sub_all          │ 2022:1::db1 │ async      │└──────────┴──────────────────┴─────────────┴────────────┘(1 row)

小结:PostgreSQL全面支持IPv6的监听、流复制、逻辑复制及客户端工具的使用。

3.MogDB 测试IPv6

首先配置postgresql.conf文件:

listen_addresses='*'

pg_hba.conf文件配置:​​​​​​​

host  all          all  ::0/0  sha256host  replication  all  ::0/0  sha256

重启完数据库服务后,进行测试。

create user repuser sysadmin password ‘Admin@1234’;

使用gsql工具进行IPv6连接认证:​​​​​​​

$ gsql -h fe80::20c:29ff:fe4e:3721%ens160 -p 6432 -U repuser postgres MogDB=> \conninfoYou are connected to database "postgres" as user "repuser" on host "fe80::20c:29ff:fe4e:3721%ens160" at port "6432".

再使用全局IPv6连接认证:​​​​​​​

$ gsql -h 2022:1:0:0::db1 -p 6432 -U repuser postgres MogDB=> \conninfoYou are connected to database "postgres" as user "repuser" on host "2022:1:0:0::db1" at port "6432".

无论是本地还是全局IPv6,都可以连接成功。

再使用物理流复制协议测试连接:​​​​​​​

$ gsql "dbname=postgres replication=database port=6432 user=repuser host=2022:1:0:0::db1" -c "IDENTIFY_SYSTEM"
The 'replication' parameter is not supported by gsql.

gsql客户端暂时还不支持replication连接。

搭建standby节点进行测试:​​​​​​​

$ mkdir data_standby$ chmod 700 data_standby$ gs_basebackup -D data_standby -h 2022:1:0:0::db1 -p 6432$ gs_basebackup -D data_standby -h fe80::20c:29ff:fe4e:3721%ens160 -p 6432

基础备份使用本地或全局IPv6连接主库都可以。

分别编辑主备节点postgresql.conf文件,修改replconninfo1参数。

主库postgresql.conf文件,参考配置如下:​​​​​​​

port=6432
application_name=node1
replconninfo1 = 'localhost=2022:1:0:0::db1 localport=6433 localheartbeatport=6435 localservice=6439 remotehost=2022:1:0:0::db1 remoteport=7433 remoteheartbeatport=7435 remoteservice=7439'

备库postgresql.conf文件,参考配置如下:​​​​​​​

port=7432application_name=node2replconninfo1 = 'localhost=2022:1:0:0::db1 localport=7433 localheartbeatport=7435 localservice=7439 remotehost=2022:1:0:0::db1 remoteport=6433 remoteheartbeatport=6435 remoteservice=6439'

启动主备服务后,使用gs_ctl query查看节点状态信息:

​​​​​​​

 Receiver info:              receiver_pid                   : 2943261        local_role                     : Standby        peer_role                      : Primary        peer_state                     : Normal        state                          : Normal        sender_sent_location           : 0/A0010A8        sender_write_location          : 0/A0010A8        sender_flush_location          : 0/A0010A8        sender_replay_location         : 0/A0010A8        receiver_received_location     : 0/A0010A8        receiver_write_location        : 0/A0010A8        receiver_flush_location        : 0/A0010A8        receiver_replay_location       : 0/A0010A8        sync_percent                   : 100%        channel                        : 2022:1::db1:60032<--2022:1::db1:6433

主库查询pg_stat_replication视图:​​​​​​​

MogDB=# select usename,application_name,client_addr,sync_state from pg_stat_replication;
 usename |      application_name       | client_addr | sync_state 
---------+-----------------------------+-------------+------------
 mog     | WalSender to Standby[node2] | 2022:1::db1 | Sync
(1 row)

主备库的replconninfo1换成本地ipv6地址,再进行测试。

使用gs_ctl query查看节点状态信息:

 Receiver info:              receiver_pid                   : 3005116        local_role                     : Standby        peer_role                      : Primary        peer_state                     : Normal        state                          : Normal        sender_sent_location           : 0/A001C88        sender_write_location          : 0/A001C88        sender_flush_location          : 0/A001C88        sender_replay_location         : 0/A001C88        receiver_received_location     : 0/A001C88        receiver_write_location        : 0/A001C88        receiver_flush_location        : 0/A001C88        receiver_replay_location       : 0/A001C88        sync_percent                   : 100%        channel                        : fe80::20c:29ff:fe4e:3721:60736<--fe80::20c:29ff:fe4e:3721:6433

pg_stat_replication视图显示信息如下:

MogDB=# select usename,application_name,client_addr,sync_state from pg_stat_replication;
 usename |      application_name       |       client_addr        | sync_state 
---------+-----------------------------+--------------------------+------------
 mog     | WalSender to Standby[node2] | fe80::20c:29ff:fe4e:3721 | Sync
(1 row)

最后测试逻辑复制,逻辑复制的发布与订阅端搭配过程,本文省略,直接测试订阅端的订阅创建过程。​​​​​​​

create subscription mysub
 connection 'host=fe80::20c:29ff:fe4e:3721%ens160 port=6433 user=repuser password=XXX dbname=logical_src' 
 publication mypub;

注意需要使用流复制端口6433(主端口port + 1)。​​​​​​​

create subscription mysub
connection ‘host=2022:1:0:0::db1 port=6433 user=repuser password=Admin@1234 dbname=postgres’ publication mypub_in_1610;

发布端pg_stat_replication视图无信息,不过pg_stat_activity能查到订阅端的连接信息:​​​​​​​

MogDB=# select datname,usename,application_name,client_addr,client_port from pg_stat_activity where application_name ='subscription';
 datname  | usename | application_name |       client_addr        | client_port 
----------+---------+------------------+--------------------------+-------------
 postgres | repuser | subscription     | fe80::20c:29ff:fe4e:3721 |       60922
(1 row)

创建订阅时连接主库的地址换成全局ipv6地址,再进行测试,pg_stat_activity同样能查到订阅端的连接信息:​​​​​​​

MogDB=# select datname,usename,application_name,client_addr,client_port from pg_stat_activity where application_name ='subscription';
 datname  | usename | application_name | client_addr | client_port 
----------+---------+------------------+-------------+-------------
 postgres | repuser | subscription     | 2022:1::db1 |       34234
(1 row)

4.总结

从监听、物理流复制、逻辑复制的对比测试来看,PostgreSQL 与 MogDB 支持IPv6本地关联地址和全局地址。

关于作者

彭冲,云和恩墨技术研究院高级技术顾问,专注于 MogDB、openGauss、PG 数据库新技术、新特性及行业发展,对数据库版本新特性有丰富的实践研究。


http://www.kler.cn/news/366033.html

相关文章:

  • O2OA如何实现文件跨服务器的备份
  • vue计算属性报错:Computed property “energyTotal“ was assigned to but it has no setter.
  • 【linux】服务器Ubuntu20.04安装cuda11.8教程
  • 富格林:察觉欺诈有效追损措施
  • HTTP和HTTPS基本概念,主要区别,应用场景
  • 事务
  • Flask-SocketIO 简单示例
  • unity游戏开发之塔防游戏
  • LinkAndroid v0.0.12 发布,手机连接助手,日志查看、投屏设置、多处问题修复
  • 光控资本:养老金融建设提速 高速铜缆市场空间广阔
  • 【工作技术栈】通用的旁路缓存一致性缺陷以及解决方式
  • ERR_PNPM_LINKING_FAILED Error: EPERM: operation not permitted, rename...
  • Scaffold-GS: Structured 3D Gaussians for View-Adaptive Rendering
  • 【python】OpenCV—findContours(4.2)
  • 【Go语言】
  • 简述特征降维的几种方式
  • IDEA中一个窗口打开多个项目-区别于eclipse
  • Netty-TCP服务端粘包、拆包问题(两种格式)
  • 使用Flask实现本机的模型部署
  • 【制造业&电子产品】电脑电子元件检测系统源码&数据集全套:改进yolo11-TADDH
  • 【贪心算法】(第十四篇)
  • 【前端学习路线】从入门到进阶(含学习资料链接和笔记)
  • 架构师备考专栏-导航页
  • ceph rgw使用sts Security Token Service
  • 钡铼技术边缘计算2DIN2DO工业无线路由器R40A
  • 【动手学强化学习】part4-时序差分算法