mysql的复制
复制概述
复制要解决的一个基本问题是服务器之间数据的同步,一个master(主库)的数据可以同步到多个备库(slave)上。而且其中一个备库也可以配置成令一个服务器的主库。
mysql支持两种复制方式:
1.基于行的复制;
2.基于语句的复制;
两种方式都是在主库上记录二进制日志,在备库上重放日志的方式来实现异步的数据复制的(mysql还支持半同步复制,不过效率要略低于异步复制)。这个方式可能会导致备库(slave)上的数据可能与主库(master)上的有所延迟。
一般来讲:msyql的复制大部分是向后兼容的,也就是说新版本的服务器要作为老版本的备库(slave),因为旧版的不一定能够支持新的特性。
复制需要解决的问题
复制常见的用途有:
1.数据分布
2.负载均衡
通过mysql的复制可以将读操作分布到多个服务器上,实现对读密集型应用的优化。
可以采用的技巧是:
(1)DNS轮询;
(2)LVS(linux虚拟服务器)
3.高性能和故障分析
帮助应用程序避开单点故障。
4.mysql升级测试
复制的如何工作
mysql的复制包含有三个步骤:
1.在主库(master)上把数据更改记录到二进制日志中(Binary Log),这些记录被成为二进制日志事件。
2.备库(slave)将主库上的日志复制到自己的中继日志(Relay Log)中。
3.备库读取中继日志中的事件,将其放到备库数据之上。
如下图所示:
注意:mysql会根据事务提交的顺序而非每条语句的执行顺序来记录二进制日志。
配置复制
为mysql服务器配置复制一般分为以下几个步骤:
1.在每台服务器上创建复制帐号;
2.配置主库(master)和备库(slave);
3.通知备库(slave)连接到主库(master)并从主库复制数据。
准备:
主库(master): 192.168.3.245 (server5.example.com)
备库(slave): 192.168.3.242 (server2.example.com)
创建复制帐号
mysql会赋予一些特殊的权限给复制线程,在备库(slave)运行的I/O线程会建立一个到主库(master)的TCP/IP链接,所以就要求我们必须在master上建立一个用户,并赋予其合适的权限,slave通过该用户连接到主库并读取日志。
在192.168.3.245和192.168.3.242做如下操作:
192.168.3.245(master):
192.168.3.242(slave):
注意:为什么在slave也要创建复制帐号,其中一个好处就是后续如果有需要的话可以方便的交换主备库的角色。
配置主库(master)和备库(slave)
在192.168.3.245(master)mysql的配置文件/etc/my.cnf上做如下修改:
[root@server5 ~]# vim /etc/my.cnf
重起192.168.3.245上的mysql服务:
确认二进制日志文件已经在master上建立,使用show master status命令:
在192.168.3.242上做如下配置:
[root@server5 ~]# vim /etc/my.cnf
relay_log 为中继日志的位置和名称
log_slave_updates 允许备库将其重要的事件也记录到自身的二进制日志中
read_only 阻止没有任何特殊权限的线程修改数据(通常不是十分使用,特别针对那些需要建表的应用)
重起mysql数据库:
启动复制
备库连接到主库并重放其二进制文件:
可以看到Slave_IO_State、Slave_IP_Running、Slave_SQL_Running这三个显示当前备库复制尚未运行。
开始复制:
执行该命令没有显示错误,查看状态发现已经开始运行,等待主库更改日志信息。
在主库中做一些修改操作,可以看到备库的文件和日志位置都有可能会增加:
我们在主库中创建了数据库haha:
然后查看备库中也多了一个数据库haha,说明复制是成功的:
在master中显示进程列表,可以看到id2的进程发送了二进制日志给slave:
在slave中也会看到有两个线程在进行处理:
小结:
至此,我们通过一个简单的示例介绍了mysql的复制过程,在接下来的章节里将会着重介绍mysql的多种使用和复制原理。敬请期待。