对于一个网站,当其用户数量到达一定级别之后,其性能就开始要经受严格的考验了。其中,数据库作为可能制约性能的最大的瓶颈,第一步要做的就是要对数据库拆封。数据库的拆封一般分为两种,一种是分库分表,还有一种就是读写分离,这里简单介绍一下MySQL中如何实现数据库的读写分离以及双机热备以实现较好的数据库容灾功能。

1.安装MySQL

在两台服务器上分别安装 mysql-server 和 mysql-client,把其中一台定义为主数据库,另一台设定为从数据库。尽可能的保证两台服务器上的数据库的版本一致,防止发生未知的情况。

2.修改MySQL配置文件,配置主从数据库

  1. 修改主数据库master:

    找到MySQL的my.cnf文件(一般位于/etc/mysql/my.cnf),配置[mysqld]的属性如下:

     [mysqld]
     log-bin=mysql-bin  //[必须]启用二进制日志
     server-id=222      //[必须]服务器唯一ID,默认是1,一般取IP最后一段
    
  2. 修改从数据库slave:

    同样找到my.cnf文件,在[mysqld]中配置如下:

     [mysqld]
     log-bin=mysql-bin  //[不是必须]启用二进制日志
     server-id=226      //[必须]服务器唯一ID,默认是1,一般取IP最后一段
    

完成以上两步之后,执行 /etc/init.d/mysql restart操作,重启MySQL使配置生效

3.建立主从账户并且进行相关的配置

  1. 数据库中建立 master 并授权 slave

    在主数据库中执行

     grant replication slave on *.* to 'backup'@'192.168.10.198' identified by '123';
    

    这里创建了一个slave的用户授权,示表同意ip地址为192.168.10.198的主机通过用户名为backup和密码为123的slave来链接主数据库。

    执行了上面这条语句之后,可以通过执行语句show master status来观察master的状态,一般来说此时我们可以得到FilePosition这两个属性,这两个属性需要记录下来,在后面slave的配置中会使用到。

    注意:以上两个参数可能会随着master的重启或者关闭等操作而改变,所以在执行了以上设置之后,尽可能不要再对master进行配置相关操作。

  2. 在从数据库中建立slave获取授权并链接到master

    在从数据库中执行

     change master to master_host='192.168.10.188',master_user='backup',MASTER_PORT=3306,master_password='123',master_log_file='mysql-bin.000179',master_log_pos=107;
    

    其中的参数都是在上一步的主数据库中所设置的,最后两个参数就是我们之前在master中记录的值,把对应的写进去即可。

    需要注意的是,如果在master中没有添加slave的IP地址,那么slave是无法链接到master的。

    以上操作执行成功之后,就可以通过执行start slave来启动slave进行主从数据库的同步。

    之后我们可以通过语句show slave status来观察slave的运行状态,这里需要重要关注的两个参数是Slave_IO_RunningSlave_SQL_Running

    1. Slave_SQL_Running表示了本地slave的运行状态,一般来说,只要本地的slave配置正确,这里就应该显示为YES,如果显示为NO,就需要对原因进行排查。

    2. Slave_IO_Running表示了slave与master的链接情况,如果为YES表示一切正常,此时就可以开始进行主从数据库的数据同步操作了;如果为NO,也需要进行相关的排查;还有一种情况下,这里的状态会一值显示为connecting,这种情况就表示slave和master之间的链接出现了问题,这里提供几个排查思路:
      第一检查master的端口号在slave中是否写正确;第二检查防火墙是否对master的端口号进行了屏蔽。

    如果以上两个参数都显示为YES,那么此时就可以通过主从数据库来进行主从操作或读写分离了。需要注意的,此种主从方式只会把master的操作同步到slave,而不会把slave的操作同步到master,所以此时我们应该只操作master数据库,而把slave作为只读数据库。

Wiki:

关于乱码的问题:

这里需要统一的把主从数据库的编码方式都更改为utf-8,从而可以避免乱码问题的出现。

我们可以通过执行show variables like 'char%';查看到数据库的编码方式;

之后,通过更改配置文件可以修改数据库的默认编码方式,我们需要对my.cnf文件做一些修改,加上两行对字符集做设定的语句:

[client] 
default-character-set=utf8 #增加这一行,指定字符集
port            = 3306 
socket          = /var/run/mysqld/mysqld.sock 
 
.............
 
[mysqld] 
character_set_server=utf8 #增加这一行,指定字符集
user            = mysql 
pid-file        = /var/run/mysqld/mysqld.pid

对主从数据库的字符集都进行了相关的修改之后,重启数据库,使修改生效(此时你可能需要重新查看master的授权属性是否更改并以此做基准对slave的连接配置做更改,之后重启salve生效)。