因为项目此前是用的单数据库方案,因此平时访问量不大的时候还能够正常运行,但是一旦到了活动期间访问量上来后数据库的CPU就经常飙升到100%了。不仅影响用户的体验,有时候数据库更新不及时,对后续的运营也有一定的影响。所以现在需要采用数据库主从配置的方案来做读写分离。
本篇就介绍如何利用mysql-slave进行MySQL的主从搭建。
1.修改主从服务器配置文件
#修改主服务器配置文件
vi /etc/my.cnf
[mysqld] log-bin=mysql-bin //[必须]启用二进制日志 server-id=222 //[必须]服务器唯一ID,默认是1,一般取IP最后一段
#修改从服务器配置文件
vi /etc/my.cnf
[mysqld] log-bin=mysql-bin //[不是必须]启用二进制日志 server-id=226 //[必须]服务器唯一ID,默认是1,一般取IP最后一段
2.登录主库查看状态
mysql> show master status ;
±-----------------±---------±-------------±-----------------±------------------+
| File | Position | Binlog_Do_DB | Binlog_Ignore_DB | Executed_Gtid_Set |
±-----------------±---------±-------------±-----------------±------------------+
| mysql-bin.000005 | 120 | | | |
±-----------------±---------±-------------±-----------------±------------------+
1 row in set (0.00 sec)
±-----------------±---------±-------------±-----------------±------------------+
| File | Position | Binlog_Do_DB | Binlog_Ignore_DB | Executed_Gtid_Set |
±-----------------±---------±-------------±-----------------±------------------+
| mysql-bin.000001 | 398 | | | |
±-----------------±---------±-------------±-----------------±------------------+
3.在主服务器上建立帐户并授权slave
mysql>GRANT REPLICATION SLAVE ON *.* to 'mysql_sync'@'%' identified by '***';
4.在从服务器上加入主服务器(change master to)
mysql>change master to master_host='xx.xx.xx.xx',master_port=xx,master_user='mysql_sync',master_password='***',master_log_file='mysql-bin.000005',master_log_pos=120;
5.开启主从同步等设置
- 开启同步
mysql> start slave ;
- 查看同步状态(主要看Slave running两项)
mysql> show slave status \G ;
Slave_IO_Running: Yes
Slave_SQL_Running: Yes
- 从服务器设置只读
set global read_only=1;
show global variables like '%read_only%' ;
±----------------------±------+
| Variable_name | Value |
±----------------------±------+
| innodb_read_only | OFF |
| read_only | ON |
| super_read_only | OFF |
| transaction_read_only | OFF |
| tx_read_only | OFF |
±----------------------±------+
可以通过以下几中方法来克隆一个slave:
- 冷拷贝(cold copy)
停止master,将master的文件拷贝到slave;然后重启master。缺点很明显。 - 热拷贝(warm copy)
如果你仅使用MyISAM表,你可以使用mysqlhotcopy拷贝,即使服务器正在运行。 - 使用mysqldump
使用mysqldump来得到一个数据快照可分为以下几步:
<1>锁表:如果你还没有锁表,你应该对表加锁,防止其它连接修改数据库,否则,你得到的数据可以是不一致的。如下:
mysql> FLUSH TABLES WITH READ LOCK;
<2>在另一个连接用mysqldump创建一个你想进行复制的数据库的转储:
shell> mysqldump --all-databases --lock-all-tables >dbdump.db
<3>对表释放锁。
mysql> UNLOCK TABLES;