九笑站有两台位于不同园区阿里云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笑笑呀)与我交流。