华为云云数据库rds数据库代理最佳实践_云淘科技

用户认证和连接

用户账号如果需要使用数据库代理登录,则必须赋予账号远程登录权限,否则无法通过数据库读写分离访问。

执行下列SQL语句查看使用的账号的host是否包含数据库读写分离网段。

SELECT user,host FROM mysql.user;

如果查询的host不包含数据库代理所在网段,则需要赋予远程访问权限,例如root用户从192.168.0网段连接到mysql服务器:

GRANTALL PRIVILEGES ON database.table TO 'root'@'192.168.0.%' IDENTIFIED BY 'password' WITH GRANT OPTION;
flush privileges;

database.table:要远程访问的数据库名,以及数据库下的表名。
password:要赋予远程访问权限的用户对应的密码。

您也可以在DAS用户管理界面设置全局权限,具体请参见编辑用户信息。

查询读写分离网段方法:

可在主实例的“基本信息”页签,找到“连接信息”模块的“子网”处,单击子网名称,进入子网控制台。
“基本信息”页签的“子网IPv4网段”,即为数据库读写分离的网段。

图1 读写分离网段

当修改安全组时,确保入方向规则和出方向规则允许读写分离的地址访问,读写分离默认端口号为3306。

登录管理控制台。
单击管理控制台左上角的,选择区域和项目。
单击页面左上角的,选择“数据库 > 云数据库 RDS”,进入RDS信息页面。
在“实例管理”页面,选择目标实例,单击实例名称前的,进入只读实例的“基本信息”页面。
在“基本信息”页面中,在“连接信息”模块的“安全组”处,单击安全组名称,进入安全组页面。
在入方向规则页签下,默认允许3306端口访问。如果没有该条规则,单击“快速添加规则”,弹框页面中勾选“MySQL(3306)”,单击“确定”。

图2 放通3306端口

图3 快速添加3306端口

由于数据库代理不支持RDS for MySQL 8.0的caching_sha2_password身份认证插件,当使用RDS for MySQL 8.0客户端访问数据库代理时,如果出现auth user failed报错时,执行以下SQL检查用户名的身份认证插件是否是mysql_native_password。

select plugin from mysql.user where user="用户名";

是,则可在连接时添加 –default-auth=mysql_native_password,或者使用 RDS for MySQL 5.*版本客户端进行连接。

否,则需执行SQL将用户名使用的身份认证插件改为mysql_native_password。

ALTER USER '用户名'@'%' IDENTIFIED WITH 'mysql_native_password' BY '密码';
FLUSH PRIVILEGES;

连接池设置

使用连接池时,需要设置连接探活机制(如jdbc连接池和Druid连接池设置testOnBorrow=true,HikariCP连接池设置connectionTestQuery=”SELECT 1″),确保部分连接超时断开时不会被继续使用。

读请求路由到主实例的场景

如果查询语句被放在事务中,事务请求都会路由到主实例,若在查询语句前设置set autocommit=0也会被当做事务处理路由到主实例。
如果无只读实例或所有只读节点均异常、只读节点权重为0时,则查询会路由到主实例。对于成功开启读写分离功能的实例,您可以设置其主实例和只读实例的权重。具体操作请参见设置延时阈值和路由模式。
如果执行了Multi-Statements(如“insert xxx;select xxx”),当前连接的后续请求会全部路由到主节点,需断开当前连接并重新连接才能恢复读写分离。
带锁的读操作(如SELECT for UPDATE)会被路由到主节点。
当使用/*FORCE_MASTER*/这个Hint语句时,会被路由到主实例。

父主题: 数据库代理(读写分离)

同意关联代理商云淘科技,购买华为云产品更优惠(QQ 78315851)

内容没看懂? 不太想学习?想快速解决? 有偿解决: 联系专家