阿里云RDS(Mysql)与ECS自己搭建的数据库做主从

阿里云RDS(Mysql)与ECS自己搭建的数据库做主从

                                                                                                                            第二篇博客,鼓励一下自己!

背景介绍:

    公司要对线上部分业务数据进行数据分析,数据分析选择的是第三方平台(这里就不说那个平台是什么啦),第三方平台可以直连我们的RDS数据数据库,但是需要提供用户名,密码,地址,所以为了防止其它数据被泄露,需要自己再搭建一个从库,只同步一部分RDS的数据;因此需要自己再搭建一个数据库来同步RDS的一部分数据,自己搭建的数据库服务器用的是阿里云的ECS。

名词:

         主-master

         从-slave

步骤:

      第一步:准备好创建RDS实例(这里自己看阿里云的帮助文档即可),用超级管理员的账号创建一个子用户,并赋予一些权限,具体命令如下:    

    create user 'userName'@'databaseName' identified by 'password'; //databaseName:数据库名称,可以用%,代表所有的数据库    
    grant REPLICATION SLAVE,Replication client,reload  on *.* to 'userName'@'%' identified by 'password';

    REPLICATION SLAVE则是一个必须而基本的权限,它直接授予slave服务器以该账户连接master后可以执行replicate操作的权利
    REPLICATION CLIENT 使得用户可以使用SHOW MASTER STATUS和SHOW SLAVE STATUS命令,也就是说这个权限是用于授予账户监视Replication状况的权力。
    reload 是 administrative 级的权限,即 server administration;

    第二步:在一台ECS上搭建mysql数据库(作从库使用):这个比较容易,自己在百度搜索就能找到

    第三步:安装完成后配置my.cnf文件(该文件位于/etc/my.cnf

        ①用命令编辑该文件:vim  /etc/my.cnf

        ②在该文件的[mysqld]部分添加:下面的配置:                     

#服务的id
server_id=211

#只读
read_only  = 1

#端口号
port = 3306

#复制要同步的数据库,可以并列写多个
replicate-do-db=db1
replicate-do-db=db2
…

#不进行同步的表,可以并列写多个
replicate-wild-ignore-table=db1.table1
replicate-wild-ignore-table=db2.table2
…

#忽略复制的数据库,可以并列写多个
replicate-ignore-db = mysql
replicate-ignore-db = information_schema
replicate-ignore-db = performance_schema
…

#日志格式(Statement,Row,Mixedlevel)
binlog_format  = ROW

#开启日志
log-bin         = mysql-bin

#操作日志
log-bin-index      = mysql-bin.index
relay-log        = relay-log
relay_log_index     = relay-log.index

#GTID配置
#是否开启GTID功能
gtid_mode=on
enforce_gtid_consistency=on
#同步主库操作日志
log-slave-updates = 1

#跳过所有错误,这个参数至关重要,想要研究这个参数的作用,可以先不写,看看发生什么
slave-skip-errors = all

    第四步:修改完上述配置后需要重启mysql:service mysqld restart

    第五步:把RDS的的数据迁移过来,只迁移自己需要的表就行了

        迁移数据可以选择:mysqldump(具体怎么用自己查文档,自己查看每个参数的作用)下面是我的写法(--single-transaction 参数是防止锁表的):

mysqldump -u userName -p password -h url --single-transaction --master-data=2 -R  --databases dbName>ksxing_datas.sql

        这一步需要注意:先说一下主从同步的基本原理:把主库上面执行的DML操作的sql文件在从库上面执行一边,如果你的线上的数据库已经是一个运行好多年的数据库,可能日志文件只保存近几天的,所以需要把以前的数据迁移过来,如果主库是全新的,那就没有必要迁移了;

    第六步:

        ①登录master,查看日志文件,命令是:show master status \G; File即为当前master的日志文件;


        ②登录slave执行下面的命令:

CHANGE MASTER TO 
MASTER_HOST='Master地址', 
MASTER_PORT=端口号,           
MASTER_USER='userName',    
MASTER_PASSWORD='password',
MASTER_LOG_FILE='上面查到的file', 
MASTER_LOG_POS=0;//第一次同步时从MASTER_LOG_FILE文件中的什么位置开始,一般设为0就可以,

        ③slave中启动主从同步:start slave;

        ④查看同步的情况:show salve status |G;    正常情况可以看到下面结果:

    

        看到两个Yes,表示主从同步建立成功!恭喜你哦!

-----------------------------------------------------------------------------------------------

注意:如果上面这些操作顺利完成,并且同步成功,那么恭喜你,但是呢,结果往往不会那么顺利,可能会遇到各种各种的问题,下面我就说一下我遇到的几个问题吧,可以做一下参考:

    问题1:查看从库状态(show salve status \G)时,有错误日志,这至少说明master-salve处于同步状态,但是在同步的过程中发生异常而已,不管什么异常吧,你都可以在配置文件my.cnf中配置:slave-skip-errors = all,跳过所有错误!这时,你肯定会有一个疑问,为什么不去解决错误而去跳过错误呢;其实正常情况下,可能发生错误的原因:要么表结构不一致,要么没有权限(通常不会控制单表的权限的),要么表的主键冲突;

    解释一下为什么主键会冲突:假如你在某个时间里给A表里增加了1条数据,此时主键到了100,之后你做了数据迁移,把主键为100的数据也迁移过去了,但是新增这条数据的日志文件中也存在“增加主键为100的语句”,那么当你在启动主从同步的时候,执行到这条语句的时候就会发生主键已经存在的冲突,你只要跳过这个错误就行啦。数据不会影响。

   问题2:数据量不一致,slave的数据量小于master;造成这个的原因是可能是:

    ①迁移数据与开启同步时间间隔时间比较久,假如一月一号你做的数据迁移,到了一月十号做的同步(时间可能有点夸张了),但是RDS只能保存有限份日志文件(一份log文件记录满了会重新创建一份新的),假如只保存9号和10的;那么2号到8号的数据即没有迁移过来,也没找到日志文件就会丢失。

    ②master数据量的增长比较快,当你使用show master status;查看日志文件的时候与迁移数据之间已经创建了很多日志文件,就回有一部分数据没有过来,这时候你就可以设置日志文件的时候这样做:假如查到master中FIle为:mysql-bin.0001528,你在slave设置MASTER_LOG_FILE时为:mysql-bin.0001527(或者可以更小),只要不发生文件找不到的异常就可以。这个时候可能发生问题1,所以体现了slave-skip-errors = all的重要性。



谢谢:码字不易,请尊重原创,转载请说明出处!

         如果有任何问题请留言!

         如果觉得对您有任何帮助,可以点击一下关注,以后会有更多的好文!






    

    



阅读更多
想对作者说点什么?

博主推荐

换一批

没有更多推荐了,返回首页