MySQL主从复制原理及配置

来源:互联网 发布:摩尔定律失效 知乎 编辑:程序博客网 时间:2024/06/18 11:02

复制的基本原理

这里写图片描述
MySQL复制是异步的切串行化的。首先,master将改变记录到二进制日志(binary log)。这些记录过程叫做二进制日志事件(binary log events)。slave将master的binary log events拷贝到它的中继日志(relay log), slave重做中继日志中的事件,将改变应用到自己的数据库中。复制最大的问题就是造成了延时。

复制的基本原则

  • 每个slave只有一个master。

  • 每个slave只能有一个唯一的服务器ID。

  • 每个master可以有多个slave。

另外,应保持主从mysql版本的一致。

一主一从常见配置

修改主机my.ini配置文件

  • 服务器唯一ID,例如:sverver-id = 1。

  • 启动二进制日志(log-bin=自己本地的路径/mysql-bin)

    基本上配置这两项就可以了,下面还有一些可选的配置项。

  • 根目录:basedir=”自己本地MySql安装路径”,例如,basedir=”D:/mySoft/MySQLServer5.5/”。

  • 临时目录:basedir=”自己本地MySql安装路径”。

  • 数据目录:datadir=”自己本地MySql安装路径/Data/”,例如,datadir=”D:/mySoft/MySQLServer5.5/Data/”

  • read-only=0,表示主机读写都可以。

  • 设置不要复制的数据库:binlog-ignore-db=mysql。

  • 设置需要复制的数据库:binlog-do-db=数据库名称。

从机配置文件修改

Slave的配置与master类似,server_id是必须的,而且唯一。slave可以开启二进制日志,但是没有必要。

注意,我们修改了配置文件之后,需重启mysql服务,然后关闭防火墙。Windows系统上可手动关闭防火墙,Linux上可以使用命令(service iptables stop)关闭。

建立账户并授权slave

在Master的数据库中建立一个备份帐户:每个slave使用标准的MySQL用户名和密码连接master。进行复制操作的用户会授予REPLICATION SLAVE权限。

命令如下:

mysql > GRANT REPLICATION SLAVE,RELOAD,SUPER ON *.* TO 'zhangsan'@’10.100.0.200’ IDENTIFIED BY12345’;

建立一个帐户zhangsan,并且只能允许从10.100.0.200这个地址上来登陆,密码是12345。

执行上面命令后,再执行flush privileges;命令,刷新一下mysql配置。

再接着运行SHOW MASTER STATUS;,输出如下:

这里写图片描述

这表示我们要从哪个文件的哪个位置开始复制,这些信息后面我们马上要配置到slave中。

配置需要复制的服务器

接下来就是让slave连接master,并开始重做master二进制日志中的事件。在从机上执行下面的命令:

这里写图片描述

次命令中的具体数字以及值就是上面通过SHOW MASTER STATUS命令查看得到的,执行命令时我们应填上相应的具体值。

紧接着我们使用start slave;启动从服务的复制功能。

最后,使用SHOW SLAVE STATUS语句来查看slave的设置是否正确:

这里写图片描述

在这里主要是看:

  • Slave_IO_Running=Yes
  • Slave_SQL_Running=Yes

这两项必须为Yes,否则需要重新配置。

至此,我们的配置就完成了。注意,如果配置出现问题需要重新配置,那么我们可能需要使用命令(stop slave;)来停止从服务器的复制功能。

添加新slave服务器

如果我们想对新安装的slave进行数据同步。此时,有几种方法可以使slave从另一个服务开始,例如,从master拷贝数据,从另一个slave克隆,从最近的备份开始一个slave。Slave与master同步时,需要三样东西:

  • master的某个时刻的数据快照;

  • master当前的日志文件、以及生成快照时的字节偏移。这两个值确定了一个二进制日志的位置。如前面所述,你可以用SHOW MASTER STATUS命令找到这两个值;

  • master的二进制日志文件。

可以通过以下几中方法来克隆一个slave:

  1. 冷拷贝(cold copy):停止master,将master的文件拷贝到slave;然后重启master。

  2. 热拷贝(warm copy):如果你仅使用MyISAM表,你可以使用mysqlhotcopy拷贝,即使服务器正在运行。

  3. 使用mysqldump,使用mysqldump来得到一个数据快照可分为以下几步:

    • 锁表:如果你还没有锁表,你应该对表加锁,防止其它连接修改数据库,否则,你得到的数据可以是不一致的。如:mysql> FLUSH
      TABLES WITH READ LOCK;

    • 在另一个连接用mysqldump创建一个你想进行复制的数据库的转储: shell> mysqldump –all-databases –lock-all-tables >dbdump.db

    • 对表释放锁。mysql> UNLOCK TABLES;

最后,关于5.6以后版本mysql的主从复制配置稍有不同,可以参看这里。

原创粉丝点击