Linux MySQL主从复制(Replication)(MySQL数据同步)配置

时间:2022-09-14 14:03:37

一、MySQL复制概述

      MySQL内建的复制功能是构建大型,高性能应用程序的基础。将Mysql的数据分布到多个系统上去,这种分布的机制,是通过将Mysql的某一台主机(master)的数据复制到其它主机(slaves)上,并重新执行一遍来实现的。复制过程中一个服务器充当主服务器(master),而一个或多个其它服务器充当从服务器(slave)。主服务器将更新写入二进制日志文件,并维护文件的一个索引以跟踪日志循环。这些日志可以记录发送到从服务器的更新。当一个从服务器连接主服务器时,它通知主服务器从服务器在日志中读取的最后一次成功更新的位置。从服务器接收从那时起发生的任何更新,然后*并等待主服务器通知新的更新。

   MySQL的复制不是简单的COPY,从属服务器启动两个线程(thread):I/O线程和SQL线程,I/O线程接收主服务器对参与复制数据库的更新操作事件(event),并记入自己的中继二进制更新日志文件(hostname-relay-bin.00000n),由SQL线程将更新操作写入自己的数据库表项。主从服务器之间复制的不是具体的数据内容,而是具体的以二进制格式记录的操作事件,因而在一定程度上实现主从服务器之间的数据同步。(这种复制类似于生物学意义上的按基因复制,在英语中replication的主要词义就是指该种复制。)

   MySQL复制解决的问题

     1)、数据分布 (Data distribution )。

     2)、负载平衡(load balancing)</p?

     3)、备份(Backups)

     4)、高可用性和容错行 High availability and failover 

   MySQL复制是如何工作的

     整体上来说,复制有3个步骤: 

     1)、master将改变记录到二进制日志(binary log)中(这些记录叫做二进制日志事件,binary log events);

     2)、slave将master的binary log events拷贝到它的中继日志(relay log);

     3)、slave重做中继日志中的事件,将改变反映它自己的数据。

    下图描述了复制的过程:
Linux MySQL主从复制(Replication)(MySQL数据同步)配置

        该过程的第一部分就是master记录二进制日志。在每个事务更新数据完成之前,master在二日志记录这些改变。MySQL将事务串行的写入二进制日志,即使事务中的语句都是交叉执行的。在事件写入二进制日志完成后,master通知存储引擎提交事务。
       下一步就是slave将master的binary log拷贝到它自己的中继日志。首先,slave开始一个工作线程——I/O线程。I/O线程在master上打开一个普通的连接,然后开始binlog dump process。Binlog dump process从master的二进制日志中读取事件,如果已经跟上master,它会睡眠并等待master产生新的事件。I/O线程将这些事件写入中继日志。
       SQL slave thread(SQL从线程)处理该过程的最后一步。SQL线程从中继日志读取事件,并重放其中的事件而更新slave的数据,使其与master中的数据一致。只要该线程与I/O线程保持一致,中继日志通常会位于OS的缓存中,所以中继日志的开销很小。
        此外,在master中也有一个工作线程:和其它MySQL的连接一样,slave在master中打开一个连接也会使得master开始一个线程。复制过程有一个很重要的限制——复制在slave上是串行化的,也就是说master上的并行更新操作不能在slave上并行操作。

1、智能DNS的使用;
智能DNS我们可以用DNSPod来解决,看这篇文章:怎样用DNSPod做负载均衡
2、文件的同步;
而文件的同步可以通过rsync软件来解决,看这篇文章:rsync服务器架设
3、MySQL数据库的同步。
剩下是MySQL数据库的同步了,这节我们就来解决这个问题。

MySQL是开源的关系型数据库系统。复制(Replication)是从一台MySQL数据库服务器(主服务器master)复制数据到另一个服务器(从服务器slave)的一个进程。 

二、MySQL主从复制的服务器配置

   需求描述

          有两台MySQL数据库服务器Master和slave,Master为主服务器,slave为从服务器,初始状态时,Master和slave中的数据信息相同,当Master中的数据发生变化时,slave也跟着发生相应的变化,使得master和slave的数据信息同步,达到备份的目的。

          要点:负责在主、从服务器传输各种修改动作的媒介是主服务器的二进制变更日志,这个日志记载着需要传输给从服务器的各种修改动作。因此,主服务器必须激活二进制日志功能。从服务器必须具备足以让它连接主服务器并请求主服务器把二进制变更日志传输给它的权限。

         注意:

         1)、主(Master)从(Slave)数据库服务器的数据库版本最好一致

         2)、主(Master)从(Slave)数据库服务器的时区必须一致,否则mysql执行与时间相关的函数将会导致数据不一致。

 配置主服务器(master)

         1)、在主服务器上创建示例数据库repl_db,建立表repl_table       

mysql> CREATE TABLE repl_table (f1 INT, f2 VARCHAR(20)) ;

         2)、编辑数据库配置文件my.cnf,本文作者习惯放在/web/mysql/3306/

vi /web/mysql/3306/my.cnf

         输入如下代码:

log-bin=/web/mysql/3306/binlog
server-id=1
innodb_flush_log_at_trx_commit=1
sync_binlog=1
binlog-do-db=repl_table
binlog_ignore_db=mysql

       log-bin==/web/mysql/3306/binlog启MySQL服务器的二进制更新日志功能,放于指定文件夹
       server-id=1中的1可以任定义,只要是唯一的就行。
       binlog-do-db=repl_db是表示只备份repl_db。
       binlog_ignore_db=mysql表示忽略备份mysql。
       不加binlog-do-db和binlog_ignore_db,那就表示备份全部数据库。 

         3)、向表中添加数据

mysql> INSERT INTO repl_table (f1, f2) VALUES(1, ‘first’); 

         4)、授予Slave复制(replication)权限         

        授予从属服务器Slave进行复制的权限。假设从属服务器连接到主服务器进行复制动作所用的用户名为“repl”,密码为“123456”:

mysql> GRANT REPLICATION SLAVE ON *.* TO 'repl'@'%' IDENTIFIED BY '123456';

         5)、刷新系统权限表,锁定写入语句操作:

mysql> FLUSH TABLES WITH READ LOCK; 

         这时所有写入操作都被锁定,包括支持事务(Transaction)特性的InnoDB类型表的提交(COMMIT)操作也被锁定,为数据库初始复制(copy)做好准备。

         注意:这时不要退出mysql命令行,因为退出命令行后,全局表锁就失效,新开一个窗口继续执行以下命令。

         6)、简单备份repl_db

        在此,通过tar命令把数据库初始数据备份到/web目录。这里备份的目的是copy到从服务器上(假设从服务器上还没有repl_db数据库)

# tar –cvf /web/data.tar /web/mysql/3306/data/repl_db 

Linux MySQL主从复制(Replication)(MySQL数据同步)配置

         7)、记录主服务器状态

执行SHOW MASTER STATUS 语句:

Linux MySQL主从复制(Replication)(MySQL数据同步)配置

记下File和Position两个参数的值,从属服务器Slave为了复制(replication)连接到主服务器Master时要用到这两个参数,如果参数与此不符将导致复制(replication)失败!

         8)、释放主服务器表级写入锁定

mysql>UNLOCK TABLES; 

        至此,主服务器解除写入锁定,一对多复制准备工作已全部完成,准备接受Slave的复制(replication)连接。

  配置从服务器(slave)

         1)、停止从属服务器的MySQL数据库服务

/web/mysql/3306/mysql stop

         2)、简单copy数据库初始数据,将主服务器上的/web/data.tar 下载到从服务器的数据库data目录,这样就保证了初始数据的一致性性,若有多台从服务器,每台从服务器要进行同样的方式初始化数据

         3)、重启从属服务器上的MySQL数据库服务

         同时启动二进制更新日志功能,为角色转换做好准备。

/web/mysql/3306/mysql start

         4)、启动从属服务器上的复制(replication)线程

         登录从服务器的MySQL客户端

mysql> CHANGE MASTER TO
-> MASTER_HOST='192.168.1.100',
-> MASTER_USER='repl',
-> MASTER_PASSWORD='12345',
-> MASTER_LOG_FILE=' binlog.000040',
-> MASTER_LOG_POS=1667;
Query OK, 0 rows affected (0.00 sec)
mysql> START SLAVE;
Query OK, 0 rows affected (0.00 sec)

在所有从属服务器上执行相同的操作,自此从属服务器已连接到主服务器,开始真正意义上的replication工作。测试从属服务器的复制工作是否正常:
Linux MySQL主从复制(Replication)(MySQL数据同步)配置

看到上述信息说明从属服务器已启动了与replication相关的线程I/O和SQL,一对多的replication已经开始工作。

Slave_IO进程以及slave_SQL进程都必须正常运行,在状态输出中表现为:“slave”;否则都是不正确的状态(如一个值是Yes,另一个是No则不行)。

         6)、功能测试

在主服务器上写入新的数据:

mysql>INSERT INTO repl_table (f1, f2) VALUES(2, 'second');

分别从MySQL主服务器和所有从服务器上的repl_db数据库执行

SELECT * FROM repl_table;

得到相同的查询结果,说明复制(replication)机制已成功开始工作!
自此,MySQL数据库的主从复制(MySQL数据同步)就完成了。

参考资料:

1、MySQL集群安装与配置

2、MySQL配置文件详解

3、理解MySQL--复制(Replication)

4、具备负载均衡功能MySQL服务器集群部署及实现

5、高可用性、负载均衡的MySQL解决方案

6、Linux MySQL主从复制(Replication)(MySQL数据同步)配置

7、MySQL主从原理、问题-淘宝数据库研发组(PPT)

友情链接:中视网