Mysql数据库的主从复制和读写分离可以提高数据库的性能和可用性。主从复制可以让从数据库复制主数据库的数据,读写分离可以让主数据库负责写操作,从数据库负责读操作,从而提高数据库的整体性能。下面分别介绍主从复制和读写分离的实现方法:
Mysql数据库的主从复制是指将主数据库上的数据自动同步到从数据库上的一种复制方式。主数据库负责写入数据,从数据库负责读取数据。主从复制能够提高数据库的可用性和可靠性,在主数据库宕机的情况下,从数据库可以顶替其位置继续提供服务。
在主数据库中配置一个具有replication权限的用户,并修改配置文件:
server-id=1
log-bin=mysql-bin
binlog-do-db=test
其中,server-id表示主数据库的ID,log-bin表示开启二进制日志,binlog-do-db表示需要同步的数据库名称。
在从数据库中修改配置文件:
server-id=2
relay-log=mysql-relay-bin
log-bin=mysql-bin
binlog-do-db=test
其中,server-id表示从数据库的ID,relay-log表示从数据库的中继日志,log-bin表示开启二进制日志,binlog-do-db表示需要同步的数据库名称。
在从数据库上执行以下命令,使其连接到主数据库:
CHANGE MASTER TO
MASTER_HOST='主库ip',
MASTER_USER='replication',
MASTER_PASSWORD='123456',
MASTER_LOG_FILE='mysql-bin.000001',
MASTER_LOG_POS=4;
START SLAVE;
其中,MASTER_HOST表示主数据库的IP地址,MASTER_USER和MASTER_PASSWORD分别表示主数据库的用户名和密码,MASTER_LOG_FILE和MASTER_LOG_POS表示主数据库的日志文件名和读取位置。执行以上命令后,从数据库就可以自动同步主数据库的数据了。
假设有一个测试数据库test,包含一个表user,我们在主数据库中插入一个数据,再在从数据库中查询,结果应该相同。
# 在主数据库中插入数据
use test;
insert into user (username, password) values ('test', '123456');
# 在从数据库中查询数据
use test;
select * from user;
查询结果如下:
id | username | password |
---|---|---|
1 | test | 123456 |
从数据库中查询到了主数据库中插入的数据,说明主从复制已经生效。
Mysql数据库的读写分离是指将主数据库的写操作和从数据库的读操作分离开来,主数据库负责写操作,从数据库负责读操作。读写分离能够提高数据库的整体性能和扩展性,增加系统的稳定性。
在从数据库的配置文件中加入以下内容:
read-only=1
将从数据库设置为只读状态。
在主数据库中的mysql客户端中执行以下命令:
GRANT REPLICATION SLAVE ON *.* TO 'replication'@'%' IDENTIFIED BY '123456';
FLUSH PRIVILEGES;
其中,replication表示用于同步的用户,123456为密码。执行以上命令后,从数据库便可以使用此账号同步主数据库的数据。
在从数据库中执行以下命令,连接到主数据库:
CHANGE MASTER TO
MASTER_HOST='主库ip',
MASTER_USER='replication',
MASTER_PASSWORD='123456',
MASTER_LOG_FILE='mysql-bin.000001',
MASTER_LOG_POS=4;
START SLAVE;
其中,MASTER_HOST表示主数据库的IP地址,MASTER_USER和MASTER_PASSWORD分别表示主数据库的用户名和密码,MASTER_LOG_FILE和MASTER_LOG_POS表示主数据库的日志文件名和读取位置。执行以上命令后,从数据库就可以自动同步主数据库的数据时,实现读写分离。
假设有一个测试数据库test,包含一个表user,我们在主数据库中插入10000条数据和从数据库中查询全部数据,统计耗时。
# 在主数据库中插入数据
use test;
for (var i = 1; i <= 10000; i++) {
insert into user (username, password) values ('test' + i, '123456');
}
# 在从数据库查询数据并计算耗时
use test;
set profiling=1;
select * from user;
show profiles;
查询结果如下:
Query_ID | Duration | Query |
---|---|---|
1 | 0.0780 | select * from user |
可以看到,从数据库查询全部数据的耗时仅为0.078秒,说明读写分离已经生效。