暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

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

MogDB 2024-10-16
101

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-256
              host replication all ::0/0 scram-sha-256
              复制

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

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

                $ psql -h fe80::20c:29ff:fe4e:3721%ens160 -p 1700 -U postgres 
                postgres=# \conninfo
                You 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=# \conninfo
                  You 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=1709
                          primary_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=1709
                                primary_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  sha256
                                              host 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=> \conninfo
                                                  You 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=> \conninfo
                                                    You 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=7432
                                                            application_name=node2
                                                            replconninfo1 = '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 数据库新技术、新特性及行业发展,对数据库版本新特性有丰富的实践研究。

                                                                            END


                                                                            MogDB 是云和恩墨基于 openGauss 开源内核进行增强提升,推出的一款安稳易用的企业级关系型数据库。其具备金融级高可用和全密态计算的极致安全、面向多核处理器的极致性能、AI自诊断调优的极致智能能力,能够满足从核心交易到复杂计算的企业级业务需求。

                                                                            访问官网了解更多:www.mogdb.io

                                                                            产品兼容适配申请:partner@enmotech.com

                                                                            加微信进入交流群:Roger_database

                                                                            文章转载自MogDB,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

                                                                            评论