云服务器内容精选

  • 读写分离原理 GaussDB (for MySQL)支持开通一个或多个数据库代理。 单个数据库代理下的读写分离 一个GaussDB(for MySQL)实例下只有1个数据库代理实例,应用服务通过数据库代理地址连接到数据库代理实例,写请求通过数据库代理实例自动转发到主节点,读请求根据数据库代理实例的路由模式转发至主节点或只读节点。 图1 单个数据库代理读写分离原理图 多个数据库代理下的读写分离 一个GaussDB(for MySQL)实例下可以创建多个数据库代理实例,最多支持创建4个代理实例,主要适用于有隔离需求的复杂业务。不同的应用服务可以根据业务需要连接不同的数据库代理,数据库代理连接指定的只读节点,将不同应用服务之间的读请求最终转发到不同的只读节点上,实现业务隔离。 图2 多个数据库代理读写分离
  • 请求路由规则 只发往主节点的写请求 INSERT、UPDATE、DELETE。 所有DDL操作(建表/库、删表/库、变更表结构、权限等)。 所有事务中的请求(事务拆分开启时部分读请求可能发送至只读节点,详见事务拆分)。 用户自定义函数。 存储过程。 EXECUTE语句。 Multi Statements。 使用到临时表的请求。 所有对用户变量的更改。 KILL(SQL语句中的KILL,非命令KILL)。 发往主节点的读请求 如果查询语句被放在事务中,事务请求都会路由到主实例。如果在查询语句前设置set autocommit=0时也当做事务处理路由到主实例。 如果所有只读节点都均异常或只读节点权重为0时,则查询会路由到主实例。对于成功开启读写分离功能的实例,您可以设置其主实例和只读实例的权重。 在执行SQL语句时: 如果执行了Multi-Statements(如“insert xxx;select xxx”),当前连接的后续请求会全部路由到主节点,需断开当前连接并重新连接才能恢复读写分离。 带锁的读操作(如SELECT for UPDATE)会被路由到主节点。 当使用/*FORCE_MASTER*/这个Hint语句时,会被路由到主实例。 如果执行了Handler语句,默认后续请求会全部路由到主节点,需断开当前连接并重新连接才能恢复读写分离。 SELECT last_insert_id()。 所有对用户变量的查询。 发往只读节点或主节点 非事务中的SELECT。 COM_STMT_EXECUTE命令。 总是发往所有节点 所有系统变量的更改。 USE命令。
  • 读写分离优势 相比在应用程序内手动做读写分离,扩容灵活,维护成本低。 客户端读请求按权重分发至后端只读节点,数据库实例整体负载更加均衡,提升资源利用率。 通过代理将指定业务的读请求路由到选定的只读实例上,实现业务隔离,避免多个业务之间相互影响。 数据库代理默认提供过载保护功能:避免用户执行大结果集操作时,因压力过大引起服务端OOM。该功能默认打开,不需要用户单独设置。针对数据库内核过慢引起的压力,依赖数据库限流机制。
  • 基本概念 代理地址 购买数据库代理后,可以从数据库代理中查看代理地址,连接该地址可以执行读写操作,数据库代理会通过代理地址自动将写请求发送到主节点,将读请求发送到只读节点,降低主节点的压力。 代理模式 GaussDB(for MySQL)的代理模式支持读写模式和只读模式。 读写模式:所有写请求只发往主节点,所有读请求按照读权重配比或者是活跃连接数情况分发到已选节点。 只读模式:所有读请求按照读权重配比或者是活跃连接数情况分发到已选只读节点,不会分发到主节点。 事务拆分 数据库代理提供事务拆分的功能,能够将事务内写操作之前的读请求转发到只读节点,降低主节点负载。 更多关于事务拆分的内容请参见开启GaussDB(for MySQL)代理的事务拆分功能。 连接池 数据库代理提供了会话级连接池,可减少短连接业务频繁建立连接导致数据库负载高。 更多关于连接池的内容请参见开启GaussDB(for MySQL)代理的连接池功能。 路由模式 GaussDB(for MySQL)数据库代理支持权重负载、负载均衡的路由模式,可根据需要配置不同的路由模式。 权重负载:根据您设置的读权重比例分发读请求。 负载均衡:根据数据库节点的活跃连接数情况进行读请求分发,将读请求分发到活跃连接数较少的节点上。负载均衡模式不需要修改权重。 更多关于路由模式的内容请参见路由模式。
  • 注意事项 表1 数据库代理注意事项 分类 注意事项 版本约束 GaussDB(for MySQL)实例内核版本如下时,不支持开通数据库代理。 大于等于2.0.26.2且小于等于2.0.28.3 等于2.0.29.1 GaussDB(for MySQL)实例的内核版本低于2.0.42.230601时,仅支持创建1个代理实例。 GaussDB(for MySQL)实例的内核版本高于或等于2.0.42.230601时,最多支持创建4个代理实例。 不支持的功能 数据库代理不支持压缩协议。 数据库代理不支持事务隔离级别READ-UNCOMMITTED。 数据库代理不支持读写表中单列超过16MB的数据。 数据库代理不支持SQL_MODE参数PAD_CHAR_TO_FULL_LENGTH。 使用约束 实例的CPU总核数(即所有节点的CPU核数的总和)低于8核时,不支持开通数据库代理。 至少创建1个只读节点才能开启读写分离功能。 开启读写分离功能后,不允许修改GaussDB(for MySQL)实例的端口和读写内网地址。 如果执行了Multi-Statements,当前连接的后续请求会全部路由到主节点,需断开当前连接并重新连接才能恢复读写分离。 使用代理地址时,事务请求都会路由到实例的主节点(可以使用事务拆分功能对事务中写之前的读请求进行拆分),不保证非事务读的一致性,业务上有读一致性需求可以封装到事务中。 使用代理地址时,show processlist和直连数据库有差异。因为数据库代理的show processlist是逻辑的,仅仅将通过数据库代理节点下发的业务展示出来,所以和直连数据库有差异。 当某一个代理节点处于异常状态时,通过代理执行show processlist或者Kill时,有可能会出现命令执行时间稍微变长的情况,此时无需关注,业务不会受到影响。 当数据库代理进行缩容后,通过代理执行show processlist命令时,可能会将被缩容的节点上的业务展示出来。 通过数据库代理进行Kill时,偶尔可能会出现超时等报错信息,此时可以通过二次show processlist查看业务是否真正被Kill成功。 当数据库代理的某个节点处于异常状态时,执行show processlist命令时,可能会出现2秒卡顿,此时无需关注,结果会正常返回。 当使用数据库代理时,多语句拼接的SQL大小不超过100MB,避免数据库代理解析SQL消耗过多的资源。 HTAP实时分析 不支持一致性级别和连接池。 路由模式仅支持权重负载模式。 代理模式仅支持读写模式。
  • 读请求路由到主实例的场景 如果查询语句被放在事务中,事务请求都会路由到主实例,若在查询语句前设置set autocommit=0也会被当做事务处理路由到主实例。 如果无只读实例或所有只读节点均异常、只读节点权重为0时,则查询会路由到主实例。对于成功开启读写分离功能的实例,您可以设置其主实例和只读实例的权重。具体操作请参见设置延时阈值和路由模式。 如果执行了Multi-Statements(如“insert ***;select ***”),当前连接的后续请求会全部路由到主节点,需断开当前连接并重新连接才能恢复读写分离。 带锁的读操作(如SELECT for UPDATE)会被路由到主节点。 当使用/*FORCE_MASTER*/这个Hint语句时,会被路由到主实例。
  • 使用Hint语法实现RDS for MySQL读写分离 在读写分离权重分配体系之外,Hint可以作为另外一种SQL补充语法来指定相关SQL到主节点或只读节点执行。 Hint注释仅作为路由建议,非只读SQL、事务中的场景不能强制路由到只读节点。 使用MySQL命令行进行连接并使用Hint语句时,需要在命令中增加-c选项,否则Hint会被MySQL命令行工具过滤。 可以在SQL开头添加hint注释进行强制路由。 /*FORCE_MASTER*/强制路由到主节点; /*FORCE_SLAVE*/强制路由到只读节点; 例如:select * from table1默认会路由到只读节点,如果改为/*FORCE_MASTER*/ select * from table1就会路由到主节点。 /*FORCE_MASTER*/只能在可读可写的地址上生效,对于只读地址即使使用//*FORCE_MASTER*/也不会路由到主节点。
  • 数据库代理计费说明 数据库代理服务已经正式商用,数据库代理服务按照节点计费,控制台购买数据库代理实例时,默认创建2个节点,总费用=节点数*节点单价。 包周期数据库代理服务开启条件:需要数据库实例为包周期实例、需要联系客服人员开通权限。具体收费详细见表2。 表1 购买按需计费代理的单价(元/小时/节点) CPU类型 规格 单价(元/小时/节点) 区域(华南-广州、华东-上海二、华北-北京一、华北-北京四、华东-上海一) 单价(元/小时/节点) 区域(亚太-新加坡) 单价(元/小时/节点) 区域(中国-香港) x86 2U4GB 1.13 1.42 1.92 4U8GB 2.26 2.85 3.84 8U16GB 4.52 5.72 7.68 鲲鹏 2U4GB 0.96 1.2 1.63 4U8GB 1.92 2.42 3.26 8U16GB 3.84 4.86 6.52 表2 购买包周期代理的单价(元/节点) CPU类型 规格 包月价格(元/节点) 区域(华南-广州、华北-北京四、华东-上海一) 包1年官网价(元/节点) 区域(华南-广州、华北-北京四、华东-上海一) 包2年官网价(元/节点) 区域(华南-广州、华北-北京四、华东-上海一) 包3年官网价(元/节点) 区域(华南-广州、华北-北京四、华东-上海一) x86 2U4GB 542.4 5424 9112.32 9763.2 4U8GB 1084.8 10848 18224.64 19526.4 8U16GB 2169.6 21696 36449.28 39052.8 鲲鹏 2U4GB 460.8 4608 7741.44 8294.4 4U8GB 921.6 9216 15482.88 16588.8 8U16GB 1843.2 18432 30965.76 33177.6 表3 购买专属计算集群按需计费代理的单价(元/小时/节点/GB) 内存 单价(元/小时/节点/GB) 区域(华东-上海二、华北-北京一、华北-北京四、华东-上海一) 单价(元/小时/节点/GB) 区域(亚太-新加坡) 单价(元/小时/节点/GB) 区域(中国-香港) 1GB 0.217 0.234 0.416 父主题: 数据库代理(读写分离)
  • 功能介绍 数据库代理是指通过一个读写分离的连接地址实现读写请求的自动转发。 一个RDS for MySQ L实例 支持创建多个代理实例,适用于需要业务隔离的场景。 开通读写分离 功能后,如果无只读实例,通过RDS的读写分离连接地址,读写请求均会自动访问主实例。 开通读写分离功能后,如果存在只读实例,通过RDS的读写分离连接地址,写请求均会自动访问主实例,读请求按照权重配比或负载均衡转发模式自动访问各个只读实例。 专属计算集群开通读写分离,需要有相应的操作权限,您可联系华为云客服人员申请。
  • 基本概念 代理地址 购买数据库代理后,可以从数据库代理中查看代理地址,连接该地址可以执行读写操作,数据库代理会通过代理地址自动将写请求发送到主节点,将读请求发送到只读节点,降低主节点的压力。 事务拆分 数据库代理提供事务拆分的功能,能够将事务内写操作之前的读请求转发到只读节点,降低主节点负载。 更多关于事务拆分的内容请参见设置事务拆分。 连接池 数据库代理提供了会话级连接池,可减少短连接业务频繁建立连接导致数据库负载高。 更多关于连接池的内容请参见设置连接池。 路由模式 RDS for MySQL数据库代理支持权重负载和负载均衡路由模式,可根据需要配置不同的路由模式。 权重负载:根据您设置的读权重比例分发读请求。 负载均衡:根据数据库节点的活跃连接数情况进行读请求分发,将读请求分发到活跃连接数较少的节点上。负载均衡模式不需要修改权重。 更多关于路由模式的内容请参见设置延时阈值和路由模式。
  • 请求路由规则 只发往主节点 INSERT、UPDATE、DELETE、SELECT FOR UPDATE。 所有DDL操作(建表/库、删表/库、变更表结构、权限等)。 所有事务中的请求(事务拆分开启时部分读请求可能发送至只读节点,详见设置事务拆分)。 用户自定义函数。 存储过程。 Multi Statements。 使用到临时表的请求。 SELECT last_insert_id()。 所有对用户变量的查询和更改。 发往只读节点或主节点 非事务中的SELECT。 COM_STMT_EXECUTE命令。 总是发往所有节点 所有系统变量的更改。 USE命令。
  • 读写分离原理 RDS for MySQL支持开通一个或多个数据库代理。 单个数据库代理下的读写分离 一个RDS for MySQL实例下只有1个数据库代理实例,应用服务通过数据库代理地址连接到数据库代理实例,写请求通过数据库代理实例自动转发到主节点,读请求根据数据库代理实例的路由模式转发至主节点或只读节点。 图1 单个数据库代理原理图 多个数据库代理下的读写分离 一个RDS for MySQL实例下可以创建多个数据库代理实例,最多支持创建4个代理实例,主要适用于有隔离需求的复杂业务。不同的应用服务可以根据业务需要连接不同的数据库代理,数据库代理连接指定的只读节点,将不同应用服务之间的读请求最终转发到不同的只读节点上,实现业务隔离。 一个MySQL只读实例可以被不同代理连接,但通常建议只有一个代理分配流量到该只读实例上。 图2 多个数据库代理原理图
  • 通过Hint指定SQL发往主节点或只读节点 在SQL开头添加hint注释进行强制路由; /*FORCE_MASTER*/强制路由到主节点; /*FORCE_SLAVE*/强制路由到只读节点; Hint注释仅作为路由建议,非只读SQL、事务中的场景不能强制路由到只读节点。 使用 MySQL 命令行进行连接并使用 Hint 语句时,需要在命令中增加 -c 选项,否则 Hint 会被 MySQL 命令行工具过滤。
  • 使用限制 设置事务拆分需要满足数据库代理内核版本为2.3.9.5及以上。 在默认的REPEATABLE_READ隔离级别下,云数据库GaussDB(for MySQL)不支持事务拆分功能。 仅READ-UNCOMMITTED和READ-COMMITTED级别允许事务拆分,请修改事务隔离级别。 仅读写模式支持事务拆分功能。 开启事务拆分后,使用BEGIN提交事务后的读请求暂时不支持拆分到读库。 开启事务拆分后,使用SET AUTOCOMMIT = 0开启的事务,COMMIT提交后的读请求不支持拆分到读库。
  • 模式描述 更改Multi-Statements模式立即生效,无需重启数据库代理。但如果模式切换前存在由于执行了Multi-Statements导致读写分离失效的连接,不会因为切换模式而恢复读写分离,需要断开重连才能恢复。 Strict模式(默认) Multi-Statements会发往主节点,当前连接的后续请求读写分离失效,会全部路由到主节点,需断开当前连接并重新连接才能恢复读写分离。 该模式不会解析Multi-Statements,性能好,适合短连接、无连接复用场景。 Loose模式 Multi-Statements会发往主节点,当前连接的后续请求依旧可以读写分离。 该模式不会解析Multi-Statements,性能好,适合Multi-Statements内仅含DML SQL,不含设置session变量、创建临时表、创建存储过程、执行未提交事务等操作的场景。 Parse模式 该模式下,Multi-Statements会发往主节点,同时数据库代理会解析Multi-Statements,根据Multi-Statements内包含的SQL情况,决定当前连接的后续请求是否恢复读写分离。详细内容请参见Parse模式场景说明。 由于该模式会解析Multi-Statements,对代理性能有一定影响,影响程度与Multi-Statements的长度和复杂性相关,建议Multi-Statements小于100MB,避免数据库代理解析SQL消耗过多的资源,引起性能明显下降。