阿里云数据库与自建数据库混合部署

九笑站有两台位于不同园区阿里云ECS(Elastic Compute Service,简称ECS),其中某园区有台RDS(Relational Database Service,简称RDS)。非同园区的ECS访问RDS,延时较高。从前端来看,由400ms上升到了2.5s。访问延时大幅上升,不能忍。对比了cache方案和双数据库方案。

方案 方法 优势 劣势
cache方案 部署cache,优先访问本地cache降低延时 性能高 维护cache一致性代价高,逻辑改动大
本地数据库方案 部署从数据库,主数据库为RDS 逻辑代码变动少 ,同时备份数据 性能差一点

从上诉两种方案,使用cache的代价高收益不高,故选择了第二种方案:主备数据库方案。采用主备数据库,优势在于自建数据库日常继续可读,写的时候写RDS,当RDS到期需要替换时,可以无缝替换。
第一步: 搭建自建数据库。 自建数据库需要版本和阿里云RDS数据库版本比较接近。我的阿里云RDS为5.7.26-log版本,第一次安装的数据库为5.5,导致配置主备一直不成功。 步骤如下,若该步骤过期了,请检索下相应的安装方法。 数据库可以通过国内的yum源安装。

[root@~ ]# cat /etc/yum.repos.d/mysql-community.repo  
[mysql57-community]
name=MySQL 5.7 Community Server
baseurl=https://mirrors.tuna.tsinghua.edu.cn/mysql/yum/mysql57-community-el7/
enabled=1
gpgcheck=0
gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-mysql

yum源配置好了后,直接yum安装数据库。

yum -y install mysql-community-server
systemctl restart mysqld

第二步, 配置数据库,启动。mysql 5.7安装的时候,会随机生成root密码。随机密码在/var/log/mysqld.log里面找password字样的字符串即可。

server-id = 2222
gtid_mode=on
enforce_gtid_consistency=on
binlog_format=row
log-bin = mysql-bin
replicate_wild_do_table=ys.%
relay_log=mysqld-relay-bin
log-slave-updates=YES

第三步,主库配置权限
配置从库登录主库账号的复制权限

grant replication slave  on *.* to [email protected] identified by ".com";

查看主库的offset

MYSQL [(none)]> show master status;
+------------------+----------+--------------+------------------+
| File             | Position | Binlog_Do_DB | Binlog_Ignore_DB |
+------------------+----------+--------------+------------------+
| mysql-bin.000001 |      20 |              |                  |
+------------------+----------+--------------+------------------+
1 row in set (0.00 sec)

第四步,从库配置主库
利用mysqldump将主库的数据库dump下来,导入从数据库。

change master to     
              master_host='9.x.x.1',               
              master_user='backup',    
              master_password='9xiaoxiao.com',   
              master_log_file='mysql-bin.000001',    
              master_log_pos=20;

这时,如果show slave status,看到Slave_IO_Running 和 Slave_SQL_Running都为YES,即配置成功。

这里列一下,我遇到的其他问题:
a. 拷贝数据库到从库,主库加锁,避免有写入操作,引发offset不一致

use database_name
flush tables with read lock;
mysqldump -uroot -p test > test.sql
unlock tables;

b. binlog不一致,主要是主从数据库版本不一致,从数据库安装主数据库对应的版本

ERROR: Error in Log_event::read_log_event(): ‘Found invalid event in binary log‘, data_len: 151, event_type: 35

c. 重置下从库状态

stop slave 
reset slave
Could not initialize master info structure; more error messages can be found

最后,若有其他问题,可以通过公众号(微信公众号: 9笑笑呀)与我交流。

你可能感兴趣的:(mysql)