阿里云RDS与ECS服务器数据库做主从 [精]

摘要

里云RDS(数据库)基于飞天大规模分布式计算和存储能力,提供超高性价比的单机版实例,同时利用读写分离横向扩展读能力,满足网站类的业务需求。提供稳定、高性能、安全可靠的数据库服务,针对电商秒杀场景进行专项优化,解决热点数据的高并发更新性能瓶颈,100倍性能提升。通过高安全模式,内置SQL注入检测模块,实时拦截风险SQL,保护数据安全。数据强一致性保证,满足金融级可靠性要求,搭建事前、事中、事后三层数据安全防护网,提供双机热备、同城、异地三中心部署架构,充分满足金融级合规可靠性要求。高稳定性,随时闪回任意时间点,对计算资源的弹性伸缩能力,赋予您更高的生产力,分钟级部署游戏分区数据库;主备双节点架构搭配高安全链路,实现全自动无感知容灾切换,业务稳定性先人一步。连接大数据存储、计算和可视化引擎,MySQL作为在线关系型数据存储服务,搭配E-MapReduce、HybridDB、DataV等,可满足如日志分析、数据仓库、商业智能、机器学习、科学模拟等业务。

阿里云RDS与ECS服务器数据库做主从 [精]

mysql

一、阿里云RDS介绍

介绍:阿里云RDS(数据库)基于飞天大规模分布式计算和存储能力,提供超高性价比的单机版实例,同时利用读写分离横向扩展读能力,满足网站类的业务需求。提供稳定、高性能、安全可靠的数据库服务,针对电商秒杀场景进行专项优化,解决热点数据的高并发更新性能瓶颈,100倍性能提升。通过高安全模式,内置SQL注入检测模块,实时拦截风险SQL,保护数据安全。数据强一致性保证,满足金融级可靠性要求,搭建事前、事中、事后三层数据安全防护网,提供双机热备、同城、异地三中心部署架构,充分满足金融级合规可靠性要求。高稳定性,随时闪回任意时间点,对计算资源的弹性伸缩能力,赋予您更高的生产力,分钟级部署游戏分区数据库;主备双节点架构搭配高安全链路,实现全自动无感知容灾切换,业务稳定性先人一步。连接大数据存储、计算和可视化引擎,MySQL作为在线关系型数据存储服务,搭配E-MapReduce、HybridDB、DataV等,可满足如日志分析、数据仓库、商业智能、机器学习、科学模拟等业务。

image_1bfbv4lm31odl1vc11dvj24m1pof9.png-89.7kB

提示: 虽然阿里云介绍的不错,但是这价格也确实是不便宜。但是针对于中小公司,RDS还是比较经济实惠、稳定的。


二、阿里云RDS与ECS服务器搭建主从

1.购买服务器

本人属于贫穷系列,但是!! 为了试验。我买了2个小时的RDS
12.png-84.6kB

关于RDS硬件根据你的需求进行设置
13.png-47.6kB

2.创建数据库和用户
14.png-44.4kB
9w.png-54.6kB
我们创建的数据库用户创建了2个

abcdocker 用于程序目录
mmm 用户mysql主从连接用户
提示: 我们abcdocker用于程序目录,需要读写权限,mmm作为主从连接用户授权只读即可

99.png-55.5kB

3.设置白名单和开通外网IP
image_1bfc0hev71lt1dbd2oub6e15si3v.png-79.2kB
设置白名单,因为我使用的是美国的一台vps所以需要设置白名单。不管哪的IP我们都需要设置白名单,数据库的连接尽量使用内网访问,增加安全性。
image_1bfc0ipf55anbtic2r1dho1rub4c.png-44.1kB

因为我的服务器和ECS不在一个网段,所以我需要开通公网IP
开通后
image_1bfc0mv011e1e2id1be11e1h1emq4p.png-30.3kB

4.登陆数据库
image_1bfc0d08ble81ngi1de21a7113os35.png-93.8kB
因为我们只有abcdocker有读写权限,我们用abcdocker用户创建表
image_1bfc0el2n1jmc1dp41gir1nf913033i.png-36.7kB

我们创建一个表
image_1bfc0r2kam2keecmg1v2c118f56.png-58.9kB
语法如下:

  1. CREATE TABLE table1(id int AUTO_INCREMENT NOT null PRIMARY KEY ,
  2. name VARCHAR (20),
  3. age int,
  4. class VARCHAR (20),
  5. create_date DATETIME )

5.ECS数据库设置
环境

  1. 系统版本
  2. [root@abcdocker ~]# cat /etc/redhat-release
  3. CentOS release 6.8 (Final)
  4. 数据库版本
  5. [root@abcdocker ~]# mysql -V
  6. mysql Ver 14.14 Distrib 5.6.35, for Linux (x86_64) using EditLine wrapper
  7. MySQL配置文件
  8. [root@abcdocker ~]# grep '^[a-z]' /etc/my.cnf
  9. server_id=211
  10. read_only = 1
  11. port = 3307
  12. replicate-wild-ignore-table = mysql.%
  13. replicate-wild-ignore-table = test.%
  14. binlog_format = ROW
  15. log-bin = mysql-bin
  16. log-bin-index = mysql-bin.index
  17. relay-log = relay-log
  18. relay_log_index = relay-log.index

#GTID配置

  1. gtid_mode=on
  2. enforce_gtid_consistency=on
  3. log-slave-updates = 1
  4. sql_mode=NO_ENGINE_SUBSTITUTION,STRICT_TRANS_TABLES
参考:MySQL GTID是在传统的mysql主从复制的基础之上演化而来的产物,即通过UUID加上事务ID的方式来确保每一个事物的唯一性。这样的操作方式使得我们不再需要关心所谓的log_file和log_Pos,只是简单的告诉从库,从哪个服务器上去找主库就OK了。简化了主从的搭建以及failover的过程,同时比传统的复制更加安全可靠。由于GTID是连续没有空洞的,因此主从库出现数据冲突时,可以通过注入空事物的方式进行跳过。本文主要讲述GTID主从架构的错误处理方式

使用GIID做主从可以执行一下参数,不需要设置binlog

  1. change master to MASTER_HOST='rm-2ze5i3w4h0182kua0o.mysql.rds.aliyuncs.com',
  2. master_user='mmm',
  3. master_password='Abcdocker!',
  4. master_port=3306,
  5. master_auto_position=1;

使用binlog进行记录

  1. [root@abcdocker ~]# mysql -ummm -p -hrm-2ze5i3w4h0182kua0o.mysql.rds.aliyuncs.com
  2. #我们需要远程连接到主库,执行show master status
  3. mysql> show master status;
  4. +------------------+----------+--------------+------------------+---------------------------------------------+
  5. | File | Position | Binlog_Do_DB | Binlog_Ignore_DB | Executed_Gtid_Set |
  6. +------------------+----------+--------------+------------------+---------------------------------------------+
  7. | mysql-bin.000004 | 4273212 | | | 29fe5004-315c-11e7-9a0f-6c92bf477043:1-7365 |
  8. +------------------+----------+--------------+------------------+---------------------------------------------+
  9. 1 row in set (0.16 sec)

执行命令

  1. CHANGE MASTER TO
  2. MASTER_HOST='rm-2ze5i3w4h0182kua0o.mysql.rds.aliyuncs.com', #这是主库的IP(域名也可以需要做解析)
  3. MASTER_PORT=3306, #主库的端口,从库端口和主库不可以相同
  4. MASTER_USER='mmm', #这是主库上创建用来复制的用户rep
  5. MASTER_PASSWORD='Abcdocker!' #rep的密码
  6. MASTER_LOG_FILE='mysql-bin.000025', #这里是show master status时看到的查询二进制日志文件名称,这里不能多空格
  7. MASTER_LOG_POS=9155; #这里是show master status时看到的二进制日志偏移量,不能多空格

使用binglog记录或者使用GIID记录都可以,关于mysql主从可以参考
MySQL主从复制原理、半同步操作步骤及原理

开启从库

  1. mysql> start slave;
  2. Query OK, 0 rows affected, 1 warning (0.00 sec)

查看从库状态,我们需要看到两个yes

  1. mysql> show slave status\G
  2. *************************** 1. row ***************************
  3. Slave_IO_State: Waiting for master to send event
  4. Master_Host: rm-2ze5i3w4h0182kua0o.mysql.rds.aliyuncs.com
  5. Master_User: mmm
  6. Master_Port: 3306
  7. Connect_Retry: 60
  8. Master_Log_File: mysql-bin.000004
  9. Read_Master_Log_Pos: 4276127
  10. Relay_Log_File: relay-log.000006
  11. Relay_Log_Pos: 33642
  12. Relay_Master_Log_File: mysql-bin.000004
  13. Slave_IO_Running: Yes
  14. Slave_SQL_Running: Yes
  15. Replicate_Do_DB:
  16. Replicate_Ignore_DB:
  17. Replicate_Do_Table:
  18. Replicate_Ignore_Table:
  19. Replicate_Wild_Do_Table:
  20. Replicate_Wild_Ignore_Table: mysql.%,test.%
  21. Last_Errno: 0
  22. Last_Error:
  23. Skip_Counter: 0
  24. Exec_Master_Log_Pos: 4276127
  25. Relay_Log_Space: 33809
  26. Until_Condition: None
  27. Until_Log_File:
  28. Until_Log_Pos: 0
  29. Master_SSL_Allowed: No
  30. Master_SSL_CA_File:
  31. Master_SSL_CA_Path:
  32. Master_SSL_Cert:
  33. Master_SSL_Cipher:
  34. Master_SSL_Key:
  35. Seconds_Behind_Master: 0
  36. Master_SSL_Verify_Server_Cert: No
  37. Last_IO_Errno: 0
  38. Last_IO_Error:
  39. Last_SQL_Errno: 0
  40. Last_SQL_Error:
  41. Replicate_Ignore_Server_Ids:
  42. Master_Server_Id: 3482796583
  43. Master_UUID: 29fe5004-315c-11e7-9a0f-6c92bf477043
  44. Master_Info_File: /usr/local/mysql/data/master.info
  45. SQL_Delay: 0
  46. SQL_Remaining_Delay: NULL
  47. Slave_SQL_Running_State: Slave has read all relay log; waiting for the slave I/O thread to update it
  48. Master_Retry_Count: 86400
  49. Master_Bind:
  50. Last_IO_Error_Timestamp:
  51. Last_SQL_Error_Timestamp:
  52. Master_SSL_Crl:
  53. Master_SSL_Crlpath:
  54. Retrieved_Gtid_Set: 29fe5004-315c-11e7-9a0f-6c92bf477043:1-7376
  55. Executed_Gtid_Set: 29fe5004-315c-11e7-9a0f-6c92bf477043:1-7376
  56. Auto_Position: 1
  57. 1 row in set (0.00 sec)

查看是否开启成功

  1. mysql> use abc;show tables;desc table1;
  2. Database changed
  3. +---------------+
  4. | Tables_in_abc |
  5. +---------------+
  6. | table1 |
  7. +---------------+
  8. 1 row in set (0.00 sec)
  9. +-------------+-------------+------+-----+---------+----------------+
  10. | Field | Type | Null | Key | Default | Extra |
  11. +-------------+-------------+------+-----+---------+----------------+
  12. | id | int(11) | NO | PRI | NULL | auto_increment |
  13. | name | varchar(20) | YES | | NULL | |
  14. | age | int(11) | YES | | NULL | |
  15. | class | varchar(20) | YES | | NULL | |
  16. | create_date | datetime | YES | | NULL | |
  17. +-------------+-------------+------+-----+---------+----------------+
  18. 5 rows in set (0.00 sec)

三、总结

使用阿里云RDS和云服务器ECS做主从会出现主从数据不能及时同步,如果直接将ECS当从库会出现数据不一致的情况,在阿里云RDS与ECS主从环境,ECS服务器不适合用来当从库,只适合用于备份!

由于阿里云RDS成本过高,可以考虑在ECS服务器上搭建mysql集群,但是安全性可能没RDS高。因为是自建库,可能会出现的问题比较多


发表评论

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen:

目前评论:1   其中:访客  1   博主  0

  1. avatar 搬瓦工优惠码 0
    太详尽了 感谢分享