AWS RDS 的使用

Posted chanix

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了AWS RDS 的使用相关的知识,希望对你有一定的参考价值。

AWS RDS 的使用
20180710 Chenxin

创建RDS
实例->启动数据库实例->开发/测试mysql

指定数据库详细参数(生产实例最好选择不低于m4.large的实例类型.因为AWS优化了IOPS等).
选择多可用区部署(防止单区故障).
配置数据库实例标识符(RDS标识符).
访问RDS的用户名/密码(mysql的用户名密码).

配置高级设置
VPC选项(事前创建好的VPC,3个子网,分别在不同AZ,便于后期副本的恢复)
公网IP(选择可以供外部直连的实例方式)
可用区AZ(一般是"无首选项")
VPC安全组-子网组里面的3个子网,最好是分别建在a,b,c三个AZ,以便副本可以在其他区.这一步是提前在VPC里进行操作.
DB-name
端口3306
加密选项(可以不用)
备份(自动):选择保留1天的话,自动备份实际上会保留约3个快照(3天的).
监控
日志
维护窗口

备注:
在AZ的故障转移中,要注意RDS对应的DNS有个TTL值,该值在RDS中,最好是30秒.这样RDS对应IP发生变化的时候,只要30秒就可以生效了.否则默认的TTL可能会比较久(网上有看到24小时的DNS-TTL,不过目前比较少了,大多都是几分钟到几十分钟).关于TTL的说明,请参见本文靠后部分.

测试联通性
等待数据库实例的状态变成"可用"后,才可以操作数据库.

点开该RDS实例,查看详情.

找到"终端节点"对应的域名,如:
终端节点 mydb-instance.ciwngvan3tg3.ap-southeast-1.rds.amazonaws.com
然后找到默认开通的一个EC2(带EIP的)才有访问该RDS3306端口的权限:
创建RDS的时候,会自动在EC2控制面板里创建1个安全组,比如
组名 rds-launch-wizard 组描述 Created from the RDS Management Console: 2018/07/10 10:44:20
组 ID sg-0d73e66da9b3c91c0 VPC ID vpc-0acbb5612cccc1132

RDS安全组
类型 规则
rds-launch-wizard (sg-0d73e66da9b3c91c0) CIDR/IP - Inbound 13.251.217.207/32 #这个IP是随机抽取的该Region里的某个EC2.
rds-launch-wizard (sg-0d73e66da9b3c91c0) CIDR/IP - Outbound 0.0.0.0/0

测试3306的登陆,以及操作DB.
[admin@ip-10-0-1-22 ~]$ mysql -h mydb-instance.ciwngvan3tg3.ap-southeast-1.rds.amazonaws.com -u test -p

自动备份-快照
RDS快照.自动备份测试完成.
还原快照测试.还原快照是用快照来创建1个新的RDS实例(数据是一样的,参数可以重新选).
能否将自动备份的快照保存到S3呢?目前还没有找到办法.

修改RDS的登陆密码
创建的RDS中,输入的用户默认权限(相当于管理员权限):
mysql> select * from user G;
*************************** 3. row ***************************
Host: %
User: test
Password: *630674627BAD0F0BF6BC2FFA91D3A87AC3E2A708
Select_priv: Y
Insert_priv: Y
Update_priv: Y
Delete_priv: Y
Create_priv: Y
Drop_priv: Y
Reload_priv: Y
Shutdown_priv: N
Process_priv: Y
File_priv: N
Super_priv: N
...

修改密码:
1.通过控制台-详细信息修改.
2.或者直接登陆数据库手动修改都可以.
use mysql
update user set password=password(‘asd123456789we222‘) where user=‘mysqladmin‘ and host=‘%‘;
flush privileges;

其他
RDS字符集调整
默认编码集:
mysql> show variables like ‘character%‘;
+--------------------------+-------------------------------------------+
| Variable_name | Value |
+--------------------------+-------------------------------------------+
| character_set_client | utf8 |
| character_set_connection | utf8 |
| character_set_database | latin1 |
| character_set_filesystem | binary |
| character_set_results | utf8 |
| character_set_server | latin1 |
| character_set_system | utf8 |
| character_sets_dir | /rdsdbbin/mysql-5.6.39.R1/share/charsets/ |
+--------------------------+-------------------------------------------+
8 rows in set (0.00 sec)

需要修改为utf8mb4:
修改"参数组",将character_set开头的所有项修改为utf8mb4.
然后选择RDS实例,将实例的参数组选项修改为刚自建的那组(通过默认参数组进行一定修改后形成的新的).
修改时,最后一步,选择"立即应用".
"参数组"状态会发生变化"适用"或"等待重启"(需手动重启),直到变成"同步"状态才行.
因为是静态参数的修改,会提示"等待重启",所以需要手动重启数据库实例.重启的时候,不用选择"故障转移".
重启RDS后,检查:
mysql> show variables like ‘character%‘;
ERROR 2006 (HY000): MySQL server has gone away #这里因为重启了,所以连接丢失,客户端重建了一个连接.
No connection. Trying to reconnect...
Connection id: 3
Current database: *** NONE ***

+--------------------------+-------------------------------------------+
| Variable_name | Value |
+--------------------------+-------------------------------------------+
| character_set_client | utf8 |
| character_set_connection | utf8 |
| character_set_database | utf8mb4 |
| character_set_filesystem | utf8mb4 |
| character_set_results | utf8 |
| character_set_server | utf8mb4 |
| character_set_system | utf8 |
| character_sets_dir | /rdsdbbin/mysql-5.6.39.R1/share/charsets/ |
+--------------------------+-------------------------------------------+
8 rows in set (0.24 sec)

监控报警 是否启用"增强监控"
默认监控
可以点开RDS实例,能看到监控的默认二十多个项目.
另外,在实例控制台靠下方(日志框上面),有创建报警.在cloudwatch-报警中可以设置对应的触发警报.
报警可以结合autoscling执行对应的操作.

需要添加的额外报警
磁盘剩余空间
无法提供服务的数据库容量(?)
内存,CPU可以考虑添加.

增强监控
对RDS实例启用"增强监控"后(默认60秒检测1次),每分钟会发送1个报告到cloudwatch的日志组->RDSOSMetrics 的日志流->XXX里.默认保持时间为30天(可以在cloudwatch->日志->"事件过期时间"修改具体过期删除时间(1天,7天,XXX).

关于RDS在故障迁移中,DNS重新解析时间的说明(TTL)
系统级别DNS的TTL说明

因RDS是通过域名指定到后端DB服务的IP,当后端机器故障后,IP可能会发生变化.那么在故障迁移的过渡期中,DNS解析的域名对应的IP发生波动的时间,跟这个域名解析服务器配置的TTL值有关.官方文档建议30秒(这里有疑问的是这个TTL是AWS自己的DNS配置的,用户咋改TTL值?奇葩).
以下是在EC2上执行nslookup确认这个TTL默认值:
RDS终端节点域名: mydb-instance.ciwngvan3tg3.ap-southeast-1.rds.amazonaws.com
[root@ip-10-0-1-22 ~]# nslookup

set debug #设置成debug模式,才能看到具体轮询过程以及对应的TTL,如果取消,则是 "set nodebug".还有个模式是set d2,输出更加具体(到函数级).
mydb-instance.ciwngvan3tg3.ap-southeast-1.rds.amazonaws.com
Server: 10.0.0.2
Address: 10.0.0.2#53
------------ #以下都是轮询
QUESTIONS:
mydb-instance.ciwngvan3tg3.ap-southeast-1.rds.amazonaws.com, type = A, class = IN #(IN指的是internet类,目前另外2个CH和HS都废了).
ANSWERS:
-> mydb-instance.ciwngvan3tg3.ap-southeast-1.rds.amazonaws.com
canonical name = ec2-13-251-220-111.ap-southeast-1.compute.amazonaws.com.
ttl = 5
-> ec2-13-251-220-111.ap-southeast-1.compute.amazonaws.com
internet address = 13.251.220.111
ttl = 60
AUTHORITY RECORDS:
ADDITIONAL RECORDS:
------------#以下是非debug模式的仅有的几行输出
Non-authoritative answer:
mydb-instance.ciwngvan3tg3.ap-southeast-1.rds.amazonaws.com canonical name = ec2-13-251-220-111.ap-southeast-1.compute.amazonaws.com.
Name: ec2-13-251-220-111.ap-southeast-1.compute.amazonaws.com
Address: 13.251.220.111

知识:
set type=[value] 也可以写成set querytype=[value],用于更改信息查询类型.
目前常用的type值如下:(小写和大写都支持)
A:查看主机的IPv4地址 AAAA:查看主机的IPv6地址 CNAME:查找与别名对应的正式名字 MX:查找邮件交换信息 ANY:查看关于主机域的所有信息
HINFO:查找主机的CPU与操作系统类型 MINFO:查找邮箱信息 NS:查找主机域的域名服务器
PTR:查找与给定IP地址匹配的主机名 RP:查找域负责人记录 SOA:查找域内的SOA地址 UINFO:查找用户信息

应用程序JVM级别的DNS-TTL配置(JVM)
参考: https://docs.aws.amazon.com/zh_cn/sdk-for-java/v1/developer-guide/java-dg-jvm-ttl.html
如何设置 JVM TTL
要修改 JVM 的 TTL,请设置 networkaddress.cache.ttl 属性值。根据您的需求,使用下列方法之一:

  • 全局 (针对所有使用 JVM 的应用程序)。在 $JAVA_HOME/jre/lib/security/java.security 文件中设置 networkaddress.cache.ttl:
    networkaddress.cache.ttl=60 #这里默认值是-1,也就是永久缓存
  • 仅针对应用程序,在应用程序的初始化代码中设置 networkaddress.cache.ttl:
    java.security.Security.setProperty("networkaddress.cache.ttl" , "60");

故障转移
拥有多可用区的RDS实例,在重启的时候,才会有"故障转移"的选项提供.
在拥有多个可用区的RDS实例,同VPC(新加坡VPC-02)的EC2访问,会直接解析为内网IP.其他访问会解析为公网IP.如下测试.

重启前:

新加坡同VPC内的EC2访问: ->解析成内网IP了.
[root@ip-10-1-0-200 ~]# ping mydb-instance.ciwngvan3tg3.ap-southeast-1.rds.amazonaws.com
PING ec2-13-251-220-111.ap-southeast-1.compute.amazonaws.com (10.1.1.53) 56(84) bytes of data.

美东通过VPC对等连接(有内网路由):->解析成公网IP了.
[root@ip-10-16-0-200 ~]# ping mydb-instance.ciwngvan3tg3.ap-southeast-1.rds.amazonaws.com
PING ec2-13-251-220-111.ap-southeast-1.compute.amazonaws.com (13.251.220.111) 56(84) bytes of data.

重启后(勾选故障转移):
因多可用区子网都不同,所以IP肯定不同了.对等VPC内的EC2访问的DNS服务器是自己子网内的,拿到的IP肯定就是公网的了.

测试确认了内网IP,外网IP,均发生了变化.

新加坡同VPC(新加坡VPC-02)内的EC2主机访问:
[root@ip-10-1-0-200 ~]# ping mydb-instance.ciwngvan3tg3.ap-southeast-1.rds.amazonaws.com
PING ec2-13-251-193-255.ap-southeast-1.compute.amazonaws.com (10.1.2.120) 56(84) bytes of data.

美东对等VPC(美东VPC-02)EC2主机访问:
[root@ip-10-16-0-200 ~]# ping mydb-instance.ciwngvan3tg3.ap-southeast-1.rds.amazonaws.com
PING ec2-13-251-193-255.ap-southeast-1.compute.amazonaws.com (13.251.193.255) 56(84) bytes of data.

创建只读副本(读写分离,降低主实例压力)
以下是xbzj的情况
RDS-mysql是没有读写分离的,只能手动创建一个"只读副本".主副本和只读副本对应的域名不同,杨维自己去实现读写分离.
只读副本与主副本存在秒级的数据差异(繁忙的时候就看情况了)(异步复制).
如果想通过1个DNS访问读写分离的RDS,请使用AWS自己的数据库类型

参考:
https://docs.aws.amazon.com/zh_cn/AmazonRDS/latest/UserGuide/USER_ReadRepl.html
蒙维AWS西南蒙老师:
如果是普通的rds mysql,本身是没有只读副本实例的,需要单独创建,即时你启用了多可用区部署,也只是实现了一个主从高可用集群,这里从数据库只是切换用,无法用于只读.
蒙维AWS西南蒙老师:
如果考虑使用aurora,那么"主从高可用"和"只读副本"功能就可以合并了,你只需要创建一个主一从两个节点的aurora集群就可以了,不需要单独启用多可用区部署

RDS 申请资源列表:
RDS(Mysql)db.t2.small 0 0 100 1
选择的是无预置IOPS的通用SSD方式,存储100GB,多可用区,公开可用性,可用区a,自动备份仅支持InnoDB,备份保留7天
实例名称: xlogin (目前创建的是集群模式,副本只是作为灾备用的,并不是用于读写分离).
DB: xlogin
user: xbzj
pw: sjErbN29h7heU8sg 已同步至密码表
端口: 10306
备份窗口: 10:00-10:30 (UTC)
维护窗口: 周三 11:00-11:30(UTC)
URL: xlogin.cyp7d7zwyhrc.us-east-1.rds.amazonaws.com 内网访问会被解析为内网IP
安全组: xbzj-taihe-bei-vpc-01-secgp-03-rds 10.0.0.0/8 允许
数据库字符集编码: utf8mb4
写入警报: xbzj-taihe-bei-vpc-01-RDS-xlogin-WriteLatency-200ms 写入延迟超过200ms则报警(超过和恢复均报警)
空间报警: xbzj-taihe-bei-vpc-01-RDS-xlogin-Disk-Low-20percent 磁盘空间剩余小于20GB(20%)(超过和恢复均报警)
故障转移测试: a->b,b->a 正常

RDS 只读副本(源库异步复制到只读副本):
实例名称: xlogin-read
URL: xlogin-read.cyp7d7zwyhrc.us-east-1.rds.amazonaws.com 内网访问会被解析为内网IP

其他说明:
如果复制连续 30 天停止,不论是手动还是由于复制错误,Amazon RDS 将终止主数据库实例与所有只读副本之间的复制。这样做是为了防止主数据库实例上的存储需求增长以及长故障转移时间。只读副本数据库实例仍可用。但是无法恢复复制,因为在终止复制后,已从主数据库实例中删除只读副本所需的二进制日志。您可以为主数据库实例创建新的只读副本来重新建立复制.
读写副本和对应的只读副本的实例类型可以不同,比如读写是t2.large,只读可以是t2.small.

参数调整
sort_buffer_size 默认RDS的参数
sort_buffer_size 262144
调整为
sort_buffer_size 8388608
调整此参数不会重启实例
检查
show variables like ‘sort_buffer_size‘;

RDS当前实例允许最大连接数
您可以通过对数据库实例执行以下查询来检索 Amazon RDS MySQL 数据库实例允许的最大连接数:
SELECT @@max_connections;

您可以通过对数据库实例执行以下查询来检索与 Amazon RDS MySQL 数据库实例的活动连接的数量:
SHOW STATUS WHERE variable_name = ‘Threads_connected‘;

iops调整
RDS升级iops确认(通用SSD->预置iops的SSD,在转换过程中,实例访问延迟会增加,初始iops会清零.无需重启实例)

修改时区
参数组创建
time_zone 将默认修改为 Asia/Shanghai

以上是关于AWS RDS 的使用的主要内容,如果未能解决你的问题,请参考以下文章

克隆 aws 环境,使其共享同一个 RDS 数据库

如何使用外部 RDS 数据库在 AWS Elastic Beanstalk 中设置 Laravel 应用程序

AWS Lambda 和 RDS 之间的间歇性超时

aws rds proxy参数

我们可以使用 AWS 胶水分析 RDS 数据库并使用 ETL 将分析的数据存储到 rds mysql 表中吗

AWS RDS 的使用