MySQL内建的复制能力是构建大型、高性能应用程序的基础。复制解决的基本问题是让一台服务器的数据和另外的服务器保持同步。而且一台主服务器可以连接 多台从服务器,也可以使从服务器反过来作主服务器。主服务器和从服务器可以位于不同的网络拓扑中,还可以对所有数据库、特定数据库,甚至特定表进行复制。

    MySQL支持的复制方案有两种:基于语句复制(Statement-Based Replication)和基于行复制(Row-Based Replication)。这两种方式的复制都是通过记录主服务器的二进制日志,并在从服务器上进行重放(Replay)完成复制的,而且都是异步的。这也意味着,从服务器的数据并非随时都是最新的。如果考虑到各种因素,从服务器的数据可能落后主服务器几秒、几分、甚至几小时都是有可能的。

    需要注意的是MySQL的复制大部分都是向后兼容的。这就意味着我们构建的从服务器的MySQL版本至少要与主服务器版本相同,这样才能不出现一些意想不到的问题。

    下面我们看看MySQL是如何进行复制的,如图:

 

MySQL复制工作方式

    在主服务器上,主服务器将引起数据改变的记录都记录到二进制 日志中。然后,从服务器会启动一个工作线程,叫I/O从线程(I/O Slave Thread)。这个I/O线程开启一个普通的客户端连接到主服务器上,而主服务器会开启一个特殊的二进制转储(Binlog Dump)进程,这个转储进程从主服务器的二进制日志中读取内容,发送给从服务器。I/O线程接收发送的内容,并将其写入到中继日志中。最后,从服务器会 开启一个SQL从线程,这个线程用来读取中继日志,并且重放日志中的事件,然后更新从服务器的数据,从而完成复制。

下面就让我们来实现一个简单的主-从复制架构吧!

采用的环境:
  两台Redhat 5.4操作系统的虚拟机;
  MySQL软件:mysql-5.5.22-linux2.6-i686.tar.gz;
  假设条件:主服务器为server1,IP:172.16.14.1;从服务器server2,IP:172.16.14.2

一、主服务器的配置

1、安装MySQL(从服务器的安装相同)

为MySQL创建单独的文件系统,最好是创建逻辑卷,这对以后的磁盘容量扩展和备份很有利。这里不再给出创建过程,这里说明下我们创建的逻辑卷的名称及后续操作:

逻辑卷:/dev/myvg/mylv
挂载点:/mysql

将逻辑卷挂载至/mysql目录下,并编辑/etc/fstab文件,实现开机自动挂载;在/mysql目录中创建/mysql/data目录,作为存放数据的目录。并将其属主,属组都更改为mysql。mysql用户mysql组需要事先创建。

  1. [root@server1 ~]#tar xf mysql-5.5.22-linux2.6-i686.tar.gz –C /usr/local 
  2. [root@server1 ~]#cd /usr/local 
  3. [root@server1 local]#ln –sv mysql-5.5.22-linux2.6-i686 mysql 
  4. [root@server1 local]#cd mysql 
  5. [root@server1 mysql]#cp /support-files/my-large.cnf /etc/my.cnf 
  6. [root@server1 mysql]#chown –R mysql:mysql . 
  7. [root@server1 mysql]#scripts/mysql_install_db --user=mysql --datadir=/mysql/data 
  8. [root@server1 mysql]#chown -R root . 
  9. [root@server1 mysql]#cp /support-files/mysql.server /etc/rc.d/init.d/mysqld 
  10. [root@server1 ~]#chkconfig –add mysqld 
  11. [root@server1 ~]#chkconfig mysqld on 
  12. [root@server1 ~]#service mysqld start 

2、为从服务器创建拥有相关权限的用户账号

  1. mysql>GRANT REPLICATION CLIENT,REPLICATION SLAVE ON *.* TO replay@’172.16.14.%’ IDENTIFIED BY '123456'; 

复制需要REPLICATION CLIENT权限;监视和管理复制需要REPLICATION SLAVE权限。

这里最好查看下二进制日志的信息:

mysql> SHOW MASTER STATUS;
+------------------+----------+--------------+------------------+
| File             | Position | Binlog_Do_DB | Binlog_Ignore_DB |
+------------------+----------+--------------+------------------+
| mysql-bin.000003 |      107 |              |                  |
+------------------+----------+--------------+------------------+
1 row in set (0.00 sec)

二、从服务器的配置

1、编辑/etc/my.cnf配置文件

#log_bin        = mysql-bin         :关闭二进制日志
server-id       = 10
relay_log       = relay-bin        :设置中继日志的位置和文件名

因为我配置的是简单主-从架构,所以从服务器的二进制日志文件可以关闭。不过主从服务器的server-id是不能相同的。

重新启动mysql。

2、启动复制

  1. mysql> CHANGE MASTER TO 
  2.     -> MASTER_HOST='172.16.14.1', 
  3.     -> MASTER_USER='replay', 
  4.     -> MASTER_PASSWORD='123456', 
  5.     -> MASTER_LOG_FILE='mysql-bin.000003', 
  6.     -> MASTER_LOG_POS=107;        
  7. mysql>START SLAVE; 
  8. mysql>SHOW SLAVE STATUS\G  :查看复制的状态信息

    这里实现的是主服务器没有任何数据的主-从架构,如果主服务器有大量数据该如何进行呢?稍后为您讲述!O(∩_∩)O~