云服务器内容精选

  • 故障描述 客户端通过已有连接执行业务时,返回如下报错信息: 故障一 org.postgresql.util.PSQLException: An I/O error occurred while sending to the backend. 故障二 org.postgresql.util.PSQLException: The connection attempt failed ... Caused by: java.net.SocketException: Connection reset
  • 故障二的解决方案 这类问题是由于已有连接被释放掉,使用已经释放的连接会出现这个报错。可能原因主要有以下几种: 网络链路问题 数据库重启或后端进程crash 空闲连接超时释放 解决方案: 首先排查网络连通性,判断是否有网络链路因素(丢包率、重传比例高)导致连接断开。 如果没有网络层面的问题,需要排查业务是否有其他报错导致连接断开。 如果业务上也没有其他报错,则尝试排查连接超时参数(如jdbc连接池参数sockettimeout和connecttimeout),如果设置值较小,会导致连接被主动释放。
  • 步骤2:测试连通性并安装PostgreSQL客户端 登录E CS 实例,请参见《弹性云服务器用户指南》中“Linux弹性 云服务器远程登录 (VNC方式)”。 在RDS“实例管理”页面,单击实例名称进入“基本信息”页面。 选择“连接管理”,在“连接信息”模块获取实例的公网地址和数据库端口。 图4 连接信息 如果没有绑定公网地址,请参见绑定弹性公网IP。 在ECS上测试是否可以正常连接到RDS for PostgreSQ L实例 公网地址的端口。 telnet 公网地址 5432 如果可以通信,说明网络正常。 如果无法通信,请检查安全组规则。 查看ECS的安全组的出方向规则,如果目的地址不为“0.0.0.0/0”且协议端口不为“全部”,需要将RDS实例的公网IP地址和端口添加到出方向规则。 图5 ECS的安全组 查看RDS的安全组的入方向规则,需要将ECS实例的私有IP地址和端口添加到入方向规则,具体操作请参见设置安全组规则。 打开客户端安装页面。 PostgreSQL官网提供了针对不同操作系统的客户端安装方法。 下面将以CentOS下PostgreSQL 12版本为例,介绍安装PostgreSQL客户端。 选择数据库版本、操作系统、操作系统架构,在弹性云服务器上执行以下命令安装PostgreSQL客户端。 sudo yum install -y https://download.postgresql.org/pub/repos/yum/reporpms/EL-7-x86_64/pgdg-redhat-repo-latest.noarch.rpm 图6 安装客户端 数据库版本,选择与RDS for PostgreSQL数据库实例一致的版本。 操作系统,选择与弹性云服务器一致的操作系统。 操作系统架构,选择与弹性云服务器一致的操作系统架构。 图7 安装rpm包 图8 客户端安装完成
  • 步骤1:购买ECS 登录管理控制台,查看是否有弹性云服务器。 有Linux弹性云服务器,执行3。 无Linux弹性云服务器,执行2。 图1 ECS实例 购买弹性云服务器时,选择Linux操作系统,例如CentOS。 由于需要在ECS下载PostgreSQL客户端,因此需要为ECS绑定弹性公网IP(EIP)。 购买Linux弹性云服务器请参考《弹性云服务器快速入门》中“购买弹性云服务器”章节。 在ECS实例基本信息页,查看ECS实例的区域和VPC。 图2 ECS基本信息 在RDS for PostgreSQL实例基本信息页,查看RDS实例的区域和VPC。 图3 PostgreSQL基本信息
  • 操作场景 安全组是一个逻辑上的分组,为同一个虚拟私有云内具有相同安全保护需求,并相互信任的弹性云服务器和云数据库RDS实例提供访问策略。 为了保障数据库的安全性和稳定性,在使用云数据库RDS实例之前,您需要设置安全组,开通需访问数据库的IP地址和端口。 内网连接RDS实例时,设置安全组分为以下两种情况: ECS与RDS实例在相同安全组时,默认ECS与RDS实例互通,无需设置安全组规则,执行通过内网连接RDS for PostgreSQL实例(Linux方式)。 ECS与RDS实例在不同安全组时,需要为RDS和ECS分别设置安全组规则。 设置RDS安全组规则:为RDS所在安全组配置相应的入方向规则。 设置ECS安全组规则:安全组默认规则为出方向上数据报文全部放行,此时,无需对ECS配置安全组规则。当在ECS所在安全组为非默认安全组且出方向规则非全放通时,需要为ECS所在安全组配置相应的出方向规则。 本节主要介绍如何为RDS实例设置相应的入方向规则。 关于添加安全组规则的详细要求,可参考《虚拟私有云用户指南》的“添加安全组规则”章节。
  • 注意事项 因为安全组的默认规则是在出方向上的数据报文全部放行,同一个安全组内的弹性云服务器和云数据库RDS实例可互相访问。安全组创建后,您可以在安全组中定义各种访问规则,当云数据库RDS实例加入该安全组后,即受到这些访问规则的保护。 默认情况下,一个用户可以创建100个安全组。 默认情况下,一个安全组最多只允许拥有50条安全组规则。 一个RDS实例允许绑定多个安全组,一个安全组可以关联多个RDS实例。 为一个安全组设置过多的安全组规则会增加首包延时,因此,建议一个安全组内的安全组规则不超过50条。 当需要从安全组外访问安全组内的云数据库RDS实例时,需要为安全组添加相应的入方向规则。 为了保证数据及实例安全,请合理使用权限。建议使用最小权限访问,并及时修改数据库默认端口号(5432),同时将可访问IP地址设置为远程主机地址或远程主机所在的最小子网地址,限制远程主机的访问范围。 源地址默认的IP地址0.0.0.0/0是指允许所有IP地址访问安全组内的云数据库RDS实例。 关于添加安全组规则的详细要求,可参考《虚拟私有云用户指南》的“添加安全组规则”章节。
  • 注意事项 因为安全组的默认规则是在出方向上的数据报文全部放行,同一个安全组内的弹性云服务器和云数据库RDS实例可互相访问。安全组创建后,您可以在安全组中定义各种访问规则,当云数据库RDS实例加入该安全组后,即受到这些访问规则的保护。 默认情况下,一个用户可以创建100个安全组。 默认情况下,一个安全组最多只允许拥有50条安全组规则。 一个RDS实例允许绑定多个安全组,一个安全组可以关联多个RDS实例。 为一个安全组设置过多的安全组规则会增加首包延时,因此,建议一个安全组内的安全组规则不超过50条。 当需要从安全组外访问安全组内的云数据库RDS实例时,需要为安全组添加相应的入方向规则。 为了保证数据及实例安全,请合理使用权限。建议使用最小权限访问,并及时修改数据库默认端口号(5432),同时将可访问IP地址设置为远程主机地址或远程主机所在的最小子网地址,限制远程主机的访问范围。 源地址默认的IP地址0.0.0.0/0是指允许所有IP地址访问安全组内的云数据库RDS实例。 关于添加安全组规则的详细要求,可参考《虚拟私有云用户指南》的“添加安全组规则”章节。
  • 通用型实例测试列表 表1 CPU:内存=1:2 CPU(Core) 内存(GB) TPS QPS IOPS 1 2 159.52 3190.46 请参见关于IOPS 2 4 359.01 7180.25 4 8 791.86 15837.19 8 16 1565.28 31305.68 表2 CPU:内存=1:4 CPU(Core) 内存(GB) TPS QPS IOPS 2 8 418.93 8378.64 请参见关于IOPS 4 16 976.3 19526.01 8 32 1779.63 35592.65
  • 准备测试数据 # 创建数据库 create database dump_database; # 登录dump_database数据库 \c dump_database # 创建表1并插入数据 create table dump_table(id int primary key, content char(50)); insert into dump_table values(1,'aa'); insert into dump_table values(2,'bb'); # 创建表2并插入数据 create table dump_table2(id int primary key, content char(50)); insert into dump_table2 values(1,'aaaa'); insert into dump_table2 values(2,'bbbb');
  • 常见问题 如果在使用pg_dump导出时,报错用户权限不足。 解决方法: 检查是否使用的root用户导出,如果不是root用户则会报权限不足;如果使用root用户导出,仍然提示没有权限,请检查数据库版本,root用户执行pg_dump命令需要内核版本为支持root提权的版本,支持root提权版本情况见root用户权限说明。 将备份的文件导入到RDS for PostgreSQL目标数据库时发现control_extension等几个函数报错。 解决方法: 由于目标库中自带这些函数,因此该报错可以忽略。
  • 语法参考 发布 CREATE PUBLICATION用于创建发布,DROP PUBLICATION用于移除发布,ALTER PUBLICATION用于修改发布。 发布创建之后,可以通过ALTER PUBLICATION动态地向发布中添加或移除表,这些操作都是事务性的。 订阅 CREATE SUBSCRIPTION用于创建订阅,DROP SUBSCRIPTION用于移除订阅,ALTER SUBSCRIPTION用于修改订阅。 订阅创建之后,可以通过ALTER SUBSCRIPTION随时暂停与恢复订阅。移除并重建订阅会导致同步信息丢失,这意味着相关数据需要重新进行同步。 具体使用说明请参考以下官方文档,以PostgreSQL 13版本为例: 创建发布:https://www.postgresql.org/docs/13/sql-createpublication.html 删除发布:https://www.postgresql.org/docs/13/sql-droppublication.html 修改发布:https://www.postgresql.org/docs/13/sql-alterpublication.html
  • 订阅使用限制 为了确保使用Failover Slot,必须在发布端手工创建逻辑复制槽(Failover Slot),并通过create_slot = false关联已有复制槽,如下: CREATE SUBSCRIPTION sub1 CONNECTION 'host=192.168.0.1 port=5432 user=user1 dbname=db1' PUBLICATION pub_name with (create_slot = false,slot_name = FailoverSlot_name); 逻辑复制不会复制DDL变更,因此发布集中的表必须已经存在于订阅端上。 同一个数据库中,可以创建多个subscription,这些subscription可以来自一个或多个发布者。 订阅者的同一张表,不能接受来自同一个源的多个发布。 在创建subscription或者alter subscription时,可以使用enable来启用该订阅,或者使用disable暂停该订阅。 如果要完全删除订阅,使用DROP SUBSCRIPTION,注意,删除订阅后,本地的表不会被删除,数据也不会清除,仅仅是不在接收该订阅的上游信息。 如果订阅与复制槽相关联,就不能在事务块内部执行DROP SUBSCRIPTION。可以使用ALTER SUBSCRIPTION取消关联复制槽。 删除订阅可参考以下步骤: 在订阅端查询订阅关联的的复制槽。 select subname,subconninfo,subslotname from pg_subscription where subname = 'sub2'; subname为订阅者名称。 subconninfo为连接远程主机信息。 subslotname 为远程主机复制槽名称。 在订阅端执行ALTER SUBSCRIPTION取消关联复制槽并删除。 ALTER SUBSCRIPTION subname SET (slot_name = NONE); DROP SUBSCRIPTION subname; 在发布端删除关联的复制槽。 select pg_drop_replication_slot(' slot_name);
  • 发布使用限制 发布目前只能包含表(即:索引,序列号,物化视图这些不会被发布),每个表可以添加到多个发布中。 一个publication允许有多个订阅者。 允许使用all tables发布所有表。 在同一个数据库中,可以创建多个publication,但是不能重名。已创建的publication可以通过查询pg_publication获取。 发布可以筛选所需的变更类型:包括insert、update、delete 和truncate的任意组合,类似触发器事件,默认所有变更都会被发布。 例如:发布表t1的update和delete操作。 CREATE PUBLICATION update_delete_only FOR TABLE t1 WITH (publish = 'update, delete') ; 复制标识:当发布了表的update, delete时,表必须设置复制标识(Replica Identity),如果设置了nothing,则执行update, delete时会报错。 表上的复制标识可以通过查阅pg_class.relreplident获取。 这是一个字符类型的“枚举”,标识用于组装 “复制标识” 的列:d = default ,f = 所有的列,i 使用特定的索引,n 没有复制标识。 表上是否具有可用作复制标识的索引约束,可以通过以下查询获取: SELECT quote_ident(nspname) || '.' || quote_ident(relname) AS name, con.ri AS keys, CASE relreplident WHEN 'd' THEN 'default' WHEN 'n' THEN 'nothing' WHEN 'f' THEN 'full' WHEN 'i' THEN 'index' END AS replica_identity FROM pg_class c JOIN pg_namespace n ON c.relnamespace = n.oid, LATERAL (SELECT array_agg(contype) AS ri FROM pg_constraint WHERE conrelid = c.oid) con WHERE relkind = 'r' AND nspname NOT IN ('pg_catalog', 'information_schema', 'monitor', 'repack', 'pg_toast') ORDER BY 2,3; 复制标识配置 表到复制标识可以通过ALTER TABLE进行修改。 ALTER TABLE table_name REPLICA IDENTITY { DEFAULT | USING INDEX index_name | FULL | NOTHING }; -- 具体有四种形式 ALTER TABLE t_normal REPLICA IDENTITY DEFAULT; -- 使用主键,如果没有主键则为FULL ALTER TABLE t_normal REPLICA IDENTITY FULL; -- 使用整行作为标识 ALTER TABLE t_normal REPLICA IDENTITY USING INDEX t_normal_v_key; -- 使用唯一索引 ALTER TABLE t_normal REPLICA IDENTITY NOTHING; -- 不设置复制标识 复制标识在实际使用中的注意事项 表上有主键,使用默认的default复制标识。 表上没有主键,但是有非空唯一索引,显式配置index复制标识。 表上既没有主键,也没有非空唯一索引,显式配置full复制标识(运行效率非常低,仅能作为兜底方案)。 其他所有情况,都无法正常完成逻辑复制功能。输出的信息不足,可能会报错。 特别需要注意:如果nothing复制标识的表纳入到逻辑复制中,对其进行删改会导致发布端报错。
  • 逻辑定义 发布可以被定义在任何物理复制的主服务器上。定义有发布的节点被称为发布者。发布是从一个表或者一组表生成的改变的集合,也可以被描述为更改集合或者复制集合。每个发布都只存在于一个数据库中。 订阅是逻辑复制的下游端。订阅被定义在其中的节点被称为订阅者。一个订阅会定义到另一个数据库的连接以及它想要订阅的发布集合(一个或者多个)。逻辑订阅者的行为与一个普通的PostgreSQL实例(主库)无异,逻辑订阅者也可以创建自己的发布,拥有自己的订阅者。
  • 约束条件 主实例和灾备实例状态正常,主实例和灾备实例在不同云或不同区域上,且主实例为主备实例,灾备实例为单机实例。 主实例配置容灾能力成功后才能配置灾备实例容灾能力,否则容灾关系会建立失败。 灾备实例的规格要大于等于主实例的规格。 RDS for PostgreSQL 12及以上支持建立跨云或跨区域容灾关系。 不支持跨大版本建立跨云或跨区域容灾关系。 主实例和灾备实例的容灾关系已建立完成,才能进行灾备实例升主和查询容灾复制状态。 实施前确认需要搭建的主实例和灾备实例所在区域,处于云连接/虚拟专有网络服务已上线区域内。 灾备实例不支持PITR恢复和CBR快照备份功能,如需使用此功能,请在主实例上完成。