Mysql读写分离

  • 分离的意义

  分散数据库的访问压力,提高访问效率。  (主服务器负责读/写请求,从服务器只负责读请求)
 

  Mysql读写分离_第1张图片

 

  • 工作原理

    主服务器将数据更新记录到日志(bin-log),然后定期同步到从服务器。

       步骤1: 所有数据更新都会被主库记录到主库的二进制日志(也叫变更日志)。

       步骤2: 从库IO线程从主库上读取二进制日志,写入到从库的中继日志上。

       步骤3: 从库SQL线程读取中继日志上的内容来更新从库。

 

 

         Mysql读写分离_第2张图片

 

  • 环境搭建

  1.  在Master数据库中创建一个备份帐户backup,并且只允许从10.100.0.200这个地址上来登陆,密码是1234。

       mysql >

       GRANT REPLICATION SLAVE,RELOAD,SUPER ON *.* TO [email protected] IDENTIFIED BY '1234';

  2.  拷贝数据。(假如是新安装mysql主从服务器,这一步就不需要,因为新安装的master和slave有相同的数据)。关停Master服务器,将Master中的数据拷贝到从服务器中,使得Master和slave中的数据同步,并且确保在全部设置操作结束前,禁止在Master和slave服务器中进行写操作,使得两数据库中的数据一定要相同!

  3.  配置Master。接下来对master进行配置,

        cp /etc/my.cnf /home/xiaoju/mysql/master.cnf

        例如,在配置文件加入如下值:

       server-id=1   //为主服务器A的ID值
       log-bin=mysql-bin   //二进制变更日志

    重启master,

     /usr/bin/mysqld_safe --defaults-file=/home/xiaoju/mysql/master.cnf &

     运行SHOW MASTER STATUS,输出如下:

    

    4.  配置Slave。 Slave的配置与master类似,如下:

         cp /etc/my.cnf /home/xiaoju/mysql/slave.cnf

       log_bin           = mysql-bin
       server_id         = 2
       relay_log         = mysql-relay-bin
       log_slave_updates = 1
       read_only         = 1

       server_id是必须的,而且唯一。slave没有必要开启二进制日志,但是在一些情况下,必须设置,例如,如果slave为其它slave的master,必须设置bin_log。relay_log配置的是中继日志。log_slave_updates表示slave将复制事件写进自己的二进制日志。

    5.  让slave连接master。 如下:

    6.  启动Slave。

    START SLAVE;

   你可以用SHOW SLAVE STATUS语句查看slave的设置是否正确:

     mysql> SHOW SLAVE STATUS\G

     在这里主要是看:

        Slave_IO_Running=Yes   //负责与主机的IO通信
        Slave_SQL_Running=Yes  //负责slave的mysql进程

     如果你在master上进行修改,你可以在slave上看到各种日志文件的位置的变化,同样,你也可以看到数据库中数据的变化。你可查看masterslave上线程的状态。在master上,你可以看到slaveI/O线程创建的连接:在master上输入show processlist\G;  

      7.  开启mysql的远程访问权限

      登录主库(10.10.39.89),

      mysql> grant all PRIVILEGES on *.* to root@'10.10.39.90' identified by '1234';

 

  • 读写如何分离

通过代理dbproxy程序(譬如C)来分离读写请求。

 

  • 主从延迟如何解决

尽量缩短slave的同步执行时间,譬如提升硬件性能,降低数据安全性要求,多线程执行。

你可能感兴趣的:(Mysql读写分离)