云服务器内容精选

  • 请求路由规则 只发往主节点 INSERT、UPDATE、DELETE、SELECT FOR UPDATE。 所有DDL操作(建表/库、删表/库、变更表结构、权限等)。 所有事务中的请求(事务拆分开启时部分读请求可能发送至只读节点,详见设置事务拆分)。 用户自定义函数。 存储过程。 Multi Statements。 使用到临时表的请求。 SELECT last_insert_id()。 所有对用户变量的查询和更改。 发往只读节点或主节点 非事务中的SELECT。 COM_STMT_EXECUTE命令。 总是发往所有节点 所有系统变量的更改。 USE命令。
  • 读写分离优势 相比在应用程序内手动做读写分离,扩容灵活,维护成本低。 客户端读请求按权重分发至后端只读节点,数据库实例整体负载更加均衡,提升资源利用率。 通过代理将指定业务的读请求路由到选定的只读实例上,实现业务隔离,避免多个业务之间相互影响。 数据库代理默认提供过载保护功能:避免用户执行大结果集操作时,因压力过大引起服务端OOM。该功能默认打开,不需要用户单独设置。针对数据库内核过慢引起的压力,依赖数据库限流机制。
  • 读写分离原理 RDS for MySQL支持开通一个或多个数据库代理。 单个数据库代理下的读写分离 一个RDS for MySQ L实例 下只有1个数据库代理实例,应用服务通过数据库代理地址连接到数据库代理实例,写请求通过数据库代理实例自动转发到主节点,读请求根据数据库代理实例的路由模式转发至主节点或只读节点。 图1 单个数据库代理原理图 多个数据库代理下的读写分离 一个RDS for MySQL实例下可以创建多个数据库代理实例,最多支持创建4个代理实例,主要适用于有隔离需求的复杂业务。不同的应用服务可以根据业务需要连接不同的数据库代理,数据库代理连接指定的只读节点,将不同应用服务之间的读请求最终转发到不同的只读节点上,实现业务隔离。 图2 多个数据库代理原理图
  • 基本概念 代理地址 购买数据库代理后,可以从数据库代理中查看代理地址,连接该地址可以执行读写操作,数据库代理会通过代理地址自动将写请求发送到主节点,将读请求发送到只读节点,降低主节点的压力。 事务拆分 数据库代理提供事务拆分的功能,能够将事务内写操作之前的读请求转发到只读节点,降低主节点负载。 更多关于事务拆分的内容请参见设置事务拆分。 连接池 数据库代理提供了会话级连接池,可减少短连接业务频繁建立连接导致数据库负载高。 更多关于连接池的内容请参见设置连接池。 路由模式 RDS for MySQL数据库代理支持权重负载和负载均衡路由模式,可根据需要配置不同的路由模式。 权重负载:根据您设置的读权重比例分发读请求。 负载均衡:根据数据库节点的活跃连接数情况进行读请求分发,将读请求分发到活跃连接数较少的节点上。负载均衡模式不需要修改权重。 更多关于路由模式的内容请参见设置延时阈值和路由模式。
  • 步骤3:检查安全组规则 确保安全组入方向规则允许数据库代理地址访问,默认端口号为3306。 在“实例管理”页面,选择目标实例,单击实例名称,进入实例的“概览”页面。 在左侧导航栏,单击“连接管理”,在“安全组规则”模块,单击安全组名称,查看安全组规则。 在入方向页签下,默认允许3306端口访问。 图10 放通3306端口 如果没有该条规则,单击“添加入方向规则”或者“一键添加”,设置安全组规则。 图11 添加入方向规则
  • 步骤5:验证读写分离效果 您可以在每次执行完对应的读操作后,通过show last route命令来查看本次读操作的路由结果。 以下步骤以一条读操作为例,介绍查看读请求的路由结果。 连接到RDS for MySQL实例后,执行读操作。 例如:select 1; 执行如下命令,查看1中读操作的路由结果。 show last route 图13 结果查询 请勿将show last route用于业务代码或包在Multi-Statements中执行。
  • 步骤2:进行用户认证 在使用数据库代理连接RDS for MySQL实例前,需要确保当前数据库账号具有访问数据库代理地址的权限,否则将无法通过数据库代理连接到RDS for MySQL实例。 您可以通过以下步骤来检查权限并授权该账号访问数据库代理地址的权限。 连接RDS for MySQL实例。 实例连接成功后,执行下列SQL语句,查看当前数据库账号的host是否包含数据库代理地址。 SELECT user,host FROM mysql.user; 如果查询的host不包含数据库代理所在网段,则需要赋予远程访问权限。 例如:使用root用户想要从192.168.0网段连接到RDS for MySQL实例,您可以在DAS用户管理界面将当前账号的主机设置为192.168.%。具体操作请参见编辑用户信息。 图9 设置主机IP
  • 基本概念 代理地址 购买数据库代理后,可以从数据库代理中查看代理地址,连接该地址可以执行读写操作,数据库代理会通过代理地址自动将写请求发送到主节点,将读请求发送到只读节点,降低主节点的压力。 代理模式 GaussDB (for MySQL)的代理模式支持读写模式和只读模式。 读写模式:所有写请求只发往主节点,所有读请求按照读权重配比或者是活跃连接数情况分发到已选节点。 只读模式:所有读请求按照读权重配比或者是活跃连接数情况分发到已选只读节点,不会分发到主节点。 事务拆分 数据库代理提供事务拆分的功能,能够将事务内写操作之前的读请求转发到只读节点,降低主节点负载。 更多关于事务拆分的内容请参见开启GaussDB(for MySQL)代理的事务拆分功能。 连接池 数据库代理提供了会话级连接池,可减少短连接业务频繁建立连接导致数据库负载高。 更多关于连接池的内容请参见开启GaussDB(for MySQL)代理的连接池功能。 路由模式 GaussDB(for MySQL)数据库代理支持权重负载、负载均衡的路由模式,可根据需要配置不同的路由模式。 权重负载:根据您设置的读权重比例分发读请求。 负载均衡:根据数据库节点的活跃连接数情况进行读请求分发,将读请求分发到活跃连接数较少的节点上。负载均衡模式不需要修改权重。 更多关于路由模式的内容请参见路由模式。
  • 读写分离优势 相比在应用程序内手动做读写分离,扩容灵活,维护成本低。 客户端读请求按权重分发至后端只读节点,数据库实例整体负载更加均衡,提升资源利用率。 通过代理将指定业务的读请求路由到选定的只读实例上,实现业务隔离,避免多个业务之间相互影响。 数据库代理默认提供过载保护功能:避免用户执行大结果集操作时,因压力过大引起服务端OOM。该功能默认打开,不需要用户单独设置。针对数据库内核过慢引起的压力,依赖数据库限流机制。
  • 注意事项 表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实时分析 不支持一致性级别和连接池。 路由模式仅支持权重负载模式。 代理模式仅支持读写模式。
  • 读写分离原理 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命令。
  • 数据库代理计费说明 数据库代理服务已经正式商用,数据库代理服务按照节点计费,控制台购买数据库代理实例时,默认创建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 父主题: 数据库代理(读写分离)
  • 通过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提交后的读请求不支持拆分到读库。