因为项目此前是用的单数据库方案,因此平时访问量不大的时候还能够正常运行,但是一旦到了活动期间访问量上来后数据库的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.开启主从同步等设置

  1. 开启同步
    mysql> start slave ;
  2. 查看同步状态(主要看Slave running两项)
    mysql> show slave status \G ;

Slave_IO_Running: Yes
Slave_SQL_Running: Yes

  1. 从服务器设置只读
    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:

  1. 冷拷贝(cold copy)
    停止master,将master的文件拷贝到slave;然后重启master。缺点很明显。
  2. 热拷贝(warm copy)
    如果你仅使用MyISAM表,你可以使用mysqlhotcopy拷贝,即使服务器正在运行。
  3. 使用mysqldump
    使用mysqldump来得到一个数据快照可分为以下几步:
    <1>锁表:如果你还没有锁表,你应该对表加锁,防止其它连接修改数据库,否则,你得到的数据可以是不一致的。如下:
    mysql> FLUSH TABLES WITH READ LOCK;
    <2>在另一个连接用mysqldump创建一个你想进行复制的数据库的转储:
    shell> mysqldump --all-databases --lock-all-tables >dbdump.db
    <3>对表释放锁。
    mysql> UNLOCK TABLES;