对于一个网站,当其用户数量到达一定级别之后,其性能就开始要经受严格的考验了。其中,数据库作为可能制约性能的最大的瓶颈,第一步要做的就是要对数据库拆封。数据库的拆封一般分为两种,一种是分库分表,还有一种就是读写分离,这里简单介绍一下 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 生效)。