一、介绍RDS与本地系统混合云组网拓扑
本地客户网络与天翼云VPC打通IPSEC-VPN连接,本地133的私网地址可以与天翼云VPC中的192.168.1.0/24地址互通,在本地开发主机上直接配置RDS主实例的VPC-IP地址192.168.1.116即可实现对RDS的访问。
二、受理申请过程与友商对比
阿里、亚马逊在线购买自动生成,电信的RDS必须要通过电信的客户经理手工填写申请单申请,申请成功后可以在对应区域下的关系型数据库中看到变化。默认为0,表示没有RDS,正常受理后为1,这里的3是因为我手工生成了2个只读实例,所以显示为3。
电信RDS支持创建单机实例、主备实例、只读实例,如果创建单机实例就没有了主备倒换保护,建议申请主备实例,申请创建成功后再根据实际业务量大小和架构设计是否添加只读实例,只读实例用于业务读写分离,但是需要业务系统支持,电信的每个只读实例都对应一个单独的VPC网IP地址。
二、进入数据库关系型数据库中后查看界面说明
1、实例管理概要
2、主备实例详细介绍
在集群中,主机与备机、只读副本之间进行基于Binlog的日志复制及回放,其中主机和备机之间以半同步方式进行复制,只读副本以异步方式进行复制。
数据同步方式,天翼云默认采用半同步方式,这种方式的缺点是事务提交的链条长,必须要等master执行完毕后,日志复制到slave,其中至少一个slave执行后,完整的事务才算成功,对客户端体现的状态就是等待时间长,好处就是这样可以使主从完全一致。
默认情况下,MySQL复制是异步的。主设备将事件写入其二进制日志,但不知道从设备是否或何时检索并处理它们。使用异步复制,如果主服务器崩溃,则它已提交的事务可能尚未传输到任何从服务器。因此,在这种情况下,从主服务器到从服务器的故障转移可能导致故障转移到相对于主服务器丢失事务的服务器。
半同步复制可用作异步复制的替代方法:
-
从站指示它在连接到主站时是否具有半同步能力。
-
如果在主端启用了半同步复制,并且至少有一个半同步从设备,则在主块上执行事务提交的线程等待,直到至少一个半同步从设备确认它已收到事务的所有事件,或者直到发生超时。
-
只有在将事件写入其中继日志并刷新到磁盘后,从站才会确认收到事务的事件。
-
如果在没有任何从服务器确认事务的情况下发生超时,则主服务器将恢复为异步复制。当至少有一个半同步从站赶上时,主站返回半同步复制。
-
必须在主端和从端都启用半同步复制。如果在主服务器上禁用了半同步复制,或者在主服务器上启用了半同步复制但在没有从服务器上启用了半同步复制,则主服服务器使用异步复制。
当主服务器阻塞(等待来自从服务器的确认)时,它不会返回执行事务的会话。当块结束时,主服务器返回会话,然后可以继续执行其他语句。此时,事务已在主方上提交,并且至少一个从方已确认其事件的接收。
3、天翼云RDS所使用的MYSQL-GTID技术
天翼云mysql的RDS后台使用的是基于GTID实现两个服务器的主从复制。基于GTID的复制完全基于事务,所以很容易确定主服务器和从服务器是否一致; 只要在主服务器上提交的所有事务也在从服务器上提交,两者之间的一致性就得到保证。您可以使用基于语句或基于行的复制与GTID。
GTID简化复制数据流和特别是故障转移活动的一般管理。每个标识符唯一地标识一起构成事务的一组二进制日志事件。GTID在将更改应用于数据库时发挥关键作用:服务器自动跳过具有服务器识别为之前已处理的标识符的任何事务。此行为对于自动复制定位和正确的故障转移至关重要。
master的全局gtid_executed
变量包含在master上 执行的所有事务的集合。在拍摄快照以配置新服务器时,您可以改为记录gtid_executed
拍摄快照的服务器上的内容,而不是复制二进制日志 。在将新服务器添加到复制链之前,只需在新服务器上为主服务器中包含的每个事务标识符提交一个空事务gtid_executed
,如下所示:
mysql> show slave status\G
*************************** 1. row ***************************
Slave_IO_State:
Master_Host: 172.16.54.181
Master_User: rdsRepl
Master_Port: 8635
Connect_Retry: 60
Master_Log_File:
Read_Master_Log_Pos: 4
Relay_Log_File: rds_mysql-relay-bin.000001
Relay_Log_Pos: 4
Relay_Master_Log_File:
Slave_IO_Running: No
Slave_SQL_Running: No
Replicate_Do_DB:
Replicate_Ignore_DB: information_schema
Replicate_Do_Table:
Replicate_Ignore_Table:
Replicate_Wild_Do_Table:
Replicate_Wild_Ignore_Table:
Last_Errno: 0
Last_Error:
Skip_Counter: 0
Exec_Master_Log_Pos: 0
Relay_Log_Space: 294
Until_Condition: None
Until_Log_File:
Until_Log_Pos: 0
Master_SSL_Allowed: No
Master_SSL_CA_File:
Master_SSL_CA_Path:
Master_SSL_Cert:
Master_SSL_Cipher:
Master_SSL_Key:
Seconds_Behind_Master: NULL
Master_SSL_Verify_Server_Cert: No
Last_IO_Errno: 0
Last_IO_Error:
Last_SQL_Errno: 0
Last_SQL_Error:
Replicate_Ignore_Server_Ids:
Master_Server_Id: 0
Master_UUID:
Master_Info_File: mysql.slave_master_info
SQL_Delay: 0
SQL_Remaining_Delay: NULL
Slave_SQL_Running_State:
Master_Retry_Count: 86400
Master_Bind:
Last_IO_Error_Timestamp:
Last_SQL_Error_Timestamp:
Master_SSL_Crl:
Master_SSL_Crlpath:
Retrieved_Gtid_Set:
Executed_Gtid_Set: ef2a84eb-ff73-11e8-9f4a-fa163e12ec01:1-5
Auto_Position: 1
1 row in set (0.01 sec)
GTID表示为一对坐标,用冒号字符(:
)分隔,如下所示:
GTID = source_id:transaction_id
该source_id
标识的源服务器。通常,服务器 server_uuid
用于此目的,未发生主备切换时,MASTER_UUID应该和Executed_Gtid的source_id部分一致。
下图就是手工进行了切换后,发现Master_UUID与 Executed_Gtid的source_id部分不一致。
4、天翼云RDS的开发限制条件(如果你的程序中使用到了下面的特性需要修改程序适应,这些是MYSQL底层限制,天翼云无法解决,只能客户修改程序适应)
由于基于GTID的复制依赖于事务,因此在使用时不支持MySQL中可用的某些功能。
a、涉及非事务性存储引擎的更新。 使用GTID时,使用非事务性存储引擎对表进行更新,不支持MyISAM引擎,是由于使用非事务性存储引擎的表的更新与对同一事务中使用事务存储引擎的表的更新混合可能导致将多个GTID分配给同一事务。
b、不支持CREATE TABLE ... SELECT语句。 CREATE TABLE ... SELECT
基于语句的复制是不安全的。使用基于行的复制时,此语句实际上记录为两个单独的事件 - 一个用于创建表,另一个用于将源表中的行插入刚刚创建的新表中。当在事务中执行此语句时,在某些情况下,这两个事件可能会接收相同的事务标识符,这意味着从属设备将跳过包含插入的事务。因此, CREATE TABLE ... SELECT
使用基于GTID的复制时不支持。
c、不支持临时表。 CREATE TEMPORARY TABLE
并 DROP TEMPORARY TABLE
声明不是在事务内使用GTIDs时(即当服务器已开始与支持 --enforce-gtid-consistency
选项)。可以在启用GTID的情况下使用这些语句,但只能在任何事务之外使用,并且只能使用 autocommit=1
。
d、MySQL 5.6.9之前,mysqldump没有记录全局事务ID,因此必须使用二进制日志和mysqlbinlog来恢复GTID
e、在MySQL 5.6.7之前,mysql_upgrade无法连接到运行全局事务标识符(GTID)enabled(--gtid-mode=ON
)的MySQL服务器。
5、天翼云RDS的数据库权限说明
天翼云MySQL-rds默认创建了5个用户。
rdsRepl是主从同步账号用于主备实例及只读实例同步数据时使用,只能从172.16这个地址段访问;
rdsBackup、rdsAdmin账号是用于创建数据库备份快照及创建数据库主备实例的管理账号,只能从本机登陆,不支持网络登陆,所以小伙伴们不需要担心自己的数据会被电信窥探,这两个账号纯属为了rds集群管理在本地使用的;
rdsMetric账号是对rds的性能进行监控账号,只能从172.16地址段进行访问,用途是支持RDS数据库性能实时监控预警;
最后一个账号就是root账号,这个账号是天翼云默认为用户创建的管理员账号,为了防止用户的误操作会影响整个RDS集群可用,所以对部分影响集群的命令进行了限权,正常的管理配置授权都没有问题;
还有就是root账号默认允许从任何网络地址登陆。
有超级权限的两个账号是为了保障rds管理需要的账号,并且只能从本地登陆,不支持网络操作,最大限度保障用户使用的安全。
三、远程使用连接RDS操作
mysql默认端口是3306,电信天翼云默认为8635,由于我这里已经远程打通了本地与天翼云的混合云组网,我可以直接使用天翼云的VPC内部IP地址,如果没有打通,则需要申请公网地址,在主备实例配置中,将其挂载在弹性IP上,远程访问通过互联网IP地址实现,还要注意,此时需要在VPC的网络ACL上开启远程访问8635端口。
1、springboot连接配置
2、通过客户端远程连接配置
四、测试天翼云只读实例的操作
由于只读实例运行在READONLY模式下,那么他的数据是否和主实例一样,并且真正是只读呢?
1、在主实例下创建数据库、表及插入数据,效果如下
2、登陆进入只读实例,首先查看数据是否一致
发现只读实例中也创建了testdb数据库,进入数据库查看表格内容与主实例完全一致。
测试删除、修改只读实例操作是否成功,如果不成功证明只读实例数据和主实例一致且不可修改,完全可以满足需要。
五、查看用户正在运行的线程
除了 root 用户能看到所有正在运行的线程外,其他用户都只能看到自己正在运行的线程,看不到其它用户正在运行的线程。除非单独个这个用户赋予了PROCESS 权限。
mysql> show processlist\G
*************************** 1. row ***************************
Id: 19185
User: rdsRepl
Host: 172.16.0.73:51890
db: NULL
Command: Binlog Dump GTID
Time: 9698
State: Master has sent all binlog to slave; waiting for binlog to be updated
Info: NULL
*************************** 2. row ***************************
Id: 19186
User: rdsRepl
Host: 172.16.44.44:39216
db: NULL
Command: Binlog Dump GTID
Time: 9698
State: Master has sent all binlog to slave; waiting for binlog to be updated
Info: NULL
*************************** 4. row ***************************
Id: 22515
User: rdsRepl
Host: 172.16.39.169:46472
db: NULL
Command: Binlog Dump GTID
Time: 7770
State: Master has sent all binlog to slave; waiting for binlog to be updated
Info: NULL
备用节点与两个只读节点的IP地址都开启了GTID复制进程,使用的就是rdsRepl用户。
六、查看主备倒换效果
主备倒换前先查看slave状态的机器
此时的master节点id是1,另外三个备机的节点ID分别是3、4、1545031716
主备倒换 完成后发现现在的master节点id变成了1545031716,而备机的id变成了1、4、3