您的位置:新葡亰496net > 网络数据库 > mysql主从复制,基于日志点的复制

mysql主从复制,基于日志点的复制

发布时间:2019-08-02 13:17编辑:网络数据库浏览(153)

    前文讲过日志复制分为基于日志点的复制和基于GTID的复制。

    基于日志点的复制,日志点复制

    前文讲过日志复制分为基于日志点的复制和基于GTID的复制。

    本文就讲一下基于日志点的复制过程。

    1.在主DB服务器上建立复制帐号。

    create user ‘repl’@ip 段 identified by ‘pwd’;

    create user [email protected]'192.168.1.%' identified by 'repl';

    授权

    grant replication slave on *.* to ‘repl’@ip 段;

    grant replication slave on *.* to [email protected]'192.168.1.%';

    2.配置主数据库服务器。

    bin_log=mysql-bin

    启用二进制日志,并指定日志名字。

    server_id =100

    需要指定serverid,在复制集群中必须唯一。

    3.从服务器配置。

    bin_log=mysql-bin

    server_新葡亰496net,id=101

    # 中继日志

    relay_log=mysql-relay-bin

    # 可选参数,是否把中继日志记录到当前的二进制日志中,

    #如果需要把当前从服务器,作为其他从服务器的复制源,则需要配置。

    log_slave_update=on

    # 安全配置参数,防止从写入

    read_only=on

    4.初始化从服务器的数据

    mysqldump ,此方法需要加锁。

    参数:

    –single-transaction :保证数据事务一致性,需要对数据库加锁,会造成阻塞。

    -master-data=2 : 记录主库二进制文件的偏移量信息。

    xtrabackup –slave-info 热备工具。

    使用innodb存储引擎是不会阻塞。

    mysqldump -uroot -p -P3308 --single-transaction --master-data --triggers --routines --all-databases >> all.sql

    从服务器导入数据

    mysql -uroot -p -P3309 <all.sql

    5.启动复制链路

    需要在从服务器上操作。

    change master to MASTER_HOST=’master_host_ip’,

    MASTER_USER=’repl’,

    MASTER_PASSWORD=’PWD’,

    MASTER_LOG_FILE=’MYSQL_LOG_FILE_NAME’,

    MASTER_LOG_POS=4;

    change master to master_host='localhost',
        -> master_user='repl',
        -> master_password='repl',
        -> MASTER_LOG_FILE='mysql-bin.000005', MASTER_LOG_POS=2162;

    这段可以在导出的文件中查找。

    新葡亰496net 1

     

    show slave status G

    查看复制链路状态。

    新葡亰496net 2

    启动复制链路

    start slave;

    新葡亰496net 3

     

    使用show processlist 查看服务线程。

    新葡亰496net 4

    一个IO线程,一个SQL线程。

    主服务器查看

    新葡亰496net 5

     

    启动了一个dump线程。

    6.验证复制效果:

    在节点A执行。

    新葡亰496net 6

     

    1.创建一个表。

    2.插入两条记录。

    在从服务器上查询。

    新葡亰496net 7

     

    发现数据同步了。

     

    优点:

    1.是mysql最早支持的复制技术,BUG相对较少。

    2.对SQL查询没有任何限制。

    3.故障处理比较容易。

    缺点:

    故障转移时重新获取新主的日志点信息比较困难。

    前文讲过日志复制分为基于日志点的复制和基于GTID的复制。 本文就讲一下基于日志点的复制过程。 1.在主...

    1、主从服务器版本一致(主版本可低于从版本)

    1 复制概述

    本文就讲一下基于日志点的复制过程。

    2、网络连通性

    1.1 复制解决的问题

    1.在主DB服务器上建立复制帐号。

    3、一个拥有复制权限的账户,便于从服务器进行复制

    数据复制技术有以下一些特点:

    create user ‘repl’@ip 段 identified by ‘pwd’;

    4、干净的环境,没有RPM包安装过的mysql

    (1)数据分布

    create user repl@'192.168.1.%' identified by 'repl';

    版本:5.6.13

    (2)负载平衡(load balancing)

    授权

    二进制版本:

    (3)备份

    grant replication slave on *.* to ‘repl’@ip 段;

    (4)高可用性(high availability)和容错

    grant replication slave on *.* to repl@'192.168.1.%';

    源码版本

    1.2 复制如何工作

    2.配置主数据库服务器。

    从高层来看,复制分成三步:

    bin_log=mysql-bin

     

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

    启用二进制日志,并指定日志名字。

    -1 mysql的安装

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

    server_id =100

    groupadd mysql

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

    需要指定serverid,在复制集群中必须唯一。

    useradd -g mysql mysql

    下图描述了这一过程:

    3.从服务器配置。

     

    新葡亰496net 8

    bin_log=mysql-bin

    tar xv mysql* 

    该过程的第一部分就是master记录二进制日志。在每个事务更新数据完成之前,master在二日志记录这些改变。MySQL将事务串行的写入二进制日志,即使事务中的语句都是交叉执行的。在事件写入二进制日志完成后,master通知存储引擎提交事务。

    server_id=101

    cd mysql*

    下一步就是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线程从中继日志读取事件,更新slave的数据,使其与master中的数据一致。只要该线程与I/O线程保持一致,中继日志通常会位于OS的缓存中,所以中继日志的开销很小。

    relay_log=mysql-relay-bin

    (若为二进制版本,则不需要这一步)

    此外,在master中也有一个工作线程:和其它MySQL的连接一样,slave在master中打开一个连接也会使得master开始一个线程。复制过程有一个很重要的限制——复制在slave上是串行化的,也就是说master上的并行更新操作不能在slave上并行操作。

    # 可选参数,是否把中继日志记录到当前的二进制日志中,

    cmake . 

    2 体验MySQL复制

    #如果需要把当前从服务器,作为其他从服务器的复制源,则需要配置。

    -DCMAKE_INSTALL_PREFIX=/usr/local/mysql
    -DMYSQL_DATADIR=/usr/local/mysql/data
    -DWITH_DEBUG=0
    -DMYSQL_USER=mysql
    -DDEFAULT_CHARSET=utf8
    -DDEFAULT_COLLATION=utf8_general_ci

    MySQL开始复制是很简单的过程,不过,根据特定的应用场景,都会在基本的步骤上有一些变化。最简单的场景就是一个新安装的master和slave,从高层来看,整个过程如下:

    log_slave_update=on

    (配置文件不满意,可以删除目录下的CMakeCache.txt)

    (1)在每个服务器上创建一个复制帐号;

    # 安全配置参数,防止从写入

    make && make install

    (2)配置master和slave;

    read_only=on

    *******************************配置mysql*******************************

    (3)Slave连接master开始复制。

    4.初始化从服务器的数据

    cd /usr/local/mysql

    2.1 创建复制帐号

    mysqldump ,此方法需要加锁。

    cp support-files/mysql.server /etc/init.d/mysqld

    每个slave使用标准的MySQL用户名和密码连接master。进行复制操作的用户会授予REPLICATION SLAVE权限。用户名的密码都会存储在文本文件master.info中。假如,你想创建repl用户,如下:

    参数:

    chkconfig --add mysqld 

    mysql> GRANT REPLICATION SLAVE, REPLICATION CLIENT ON *.*
    -> TO repl@'192.168.0.%' IDENTIFIED BY 'p4ssword';

    –single-transaction :保证数据事务一致性,需要对数据库加锁,会造成阻塞。

    chkconfig --level 2345 mysqld on 

    2.2 配置master

    -master-data=2 : 记录主库二进制文件的偏移量信息。

    cp support-files/my-medium.cnf /etc/my.cnf(版本5.6.13没有找到模版,复制default)

    接下来对master进行配置,包括打开二进制日志,指定唯一的servr ID。例如,在配置文件加入如下值:

    xtrabackup –slave-info 热备工具。

    *******************************配置mysql*******************************

    [mysqld]
    log-bin=mysql-bin
    server-id=10

    使用innodb存储引擎是不会阻塞。

    log_bin = /usr/local/mysql/log/mysql-bin

    重启master,运行SHOW MASTER STATUS,输出如下:

    mysqldump -uroot -p -P3308 --single-transaction --master-data --triggers --routines --all-databases >> all.sql

    basedir = /usr/local/mysql  

    新葡亰496net 9

    从服务器导入数据

    datadir = /usr/local/mysql/data  

    2.3 配置slave

    mysql -uroot -p -P3309 <all.sql

    port = 3306  

    Slave的配置与master类似,你同样需要重启slave的MySQL。如下:

    5.启动复制链路

    server_id = 1  

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

    需要在从服务器上操作。

    socket = /tmp/mysql.sock

    server_id是必须的,而且唯一。slave没有必要开启二进制日志,但是在一些情况下,必须设置,例如,如果slave为其它slave的master,必须设置bin_log。在这里,我们开启了二进制日志,而且显示的命名(默认名称为hostname,但是,如果hostname改变则会出现问题)。

    change master to MASTER_HOST=’master_host_ip’,

    *******************************初始化mysql******************************

    relay_log配置中继日志,log_slave_updates表示slave将复制事件写进自己的二进制日志(后面会看到它的用处)。

    MASTER_USER=’repl’,

    scripts/mysql_install_db --user=mysql --basedir=/usr/local/mysql --datadir=/usr/local/mysql/data

    有些人开启了slave的二进制日志,却没有设置log_slave_updates,然后查看slave的数据是否改变,这是一种错误的配置。所以,尽量使用read_only,它防止改变数据(除了特殊的线程)。但是,read_only并是很实用,特别是那些需要在slave上创建表的应用。

    MASTER_PASSWORD=’PWD’,

    *******************************data和log写权限***************************

    2.4 启动slave

    MASTER_LOG_FILE=’MYSQL_LOG_FILE_NAME’,

    chown -R root:mysql /usr/local/mysql

    接下来就是让slave连接master,并开始重做master二进制日志中的事件。你不应该用配置文件进行该操作,而应该使用CHANGE MASTER TO语句,该语句可以完全取代对配置文件的修改,而且它可以为slave指定不同的master,而不需要停止服务器。如下:

    MASTER_LOG_POS=4;

    chown -R mysql:mysql /usr/local/mysql/data

    mysql> CHANGE MASTER TO MASTER_HOST='server1',

    change master to master_host='localhost',
        -> master_user='repl',
        -> master_password='repl',
        -> MASTER_LOG_FILE='mysql-bin.000005', MASTER_LOG_POS=2162;

    chown -R mysql:mysql /usr/local/mysql/log

        -> MASTER_USER='repl',

    这段可以在导出的文件中查找。

    *******************************环境变量*********************************

        -> MASTER_PASSWORD='p4ssword',

    新葡亰496net 10

    vim ~/.bash_profile

        -> MASTER_LOG_FILE='mysql-bin.000001',

     

    PATH=$PATH:$home/bin:/usr/local/mysql/bin:/usr/local/mysql/lib

    -> MASTER_LOG_POS=0;

    show slave status G

    source /root/.bash_profile

    MASTER_LOG_POS的值为0,因为它是日志的开始位置。然后,你可以用SHOW SLAVE STATUS语句查看slave的设置是否正确:

    查看复制链路状态。

     

    mysql> SHOW SLAVE STATUSG

    新葡亰496net 11

     

    *************************** 1. row ***************************

    启动复制链路

    -2 服务器配置文件

                 Slave_IO_State:

    start slave;

    --1 主服务器(需重启mysql)(定义事物提交后将日志从内存转移至磁盘,同时立即刷新日志,将数据写入磁盘)

                    Master_Host: server1

    新葡亰496net 12

    log-bin=mysql-bin

                    Master_User: repl

     

    server-id=1

                    Master_Port: 3306

    使用show processlist 查看服务线程。

    sync-binlog=1

                  Connect_Retry: 60

    新葡亰496net 13

    innodb-flush-logs-at-trx-commit=1

                Master_Log_File: mysql-bin.000001

    一个IO线程,一个SQL线程。

    --2 从服务器(需重启mysql)(定义从服务器只读,并关闭bin日志,同时slave服务定义为手动)

            Read_Master_Log_Pos: 4

    主服务器查看

    #log-bin=

                 Relay_Log_File: mysql-relay-bin.000001

    新葡亰496net 14

    relay-log=relay-bin

                  Relay_Log_Pos: 4

     

    relay-log-index=relay-bin.index

          Relay_Master_Log_File: mysql-bin.000001

    启动了一个dump线程。

    server-id=11

               Slave_IO_Running: No

    6.验证复制效果:

    skip-slave-start=1

              Slave_SQL_Running: No

    在节点A执行。

    read-only=1

                                 ...omitted...

    新葡亰496net 15

    -3 mysql配置

          Seconds_Behind_Master: NULL

     

    --1 主服务器(192.168.1.1)授权,获取最后阶段的日志记录位置,并备份当前数据库(--lock-all-tables备份前锁表,备份后自动解锁;--master-data=2 记录CHANGE MASTER TO MASTER_LOG_FILE和MASTER_LOG-POS)

    Slave_IO_State, Slave_IO_Running, 和Slave_SQL_Running表明slave还没有开始复制过程。日志的位置为4而不是0,这是因为0只是日志文件的开始位置,并不是日志位置。实际上,MySQL知道的第一个事件的位置是4。

    1.创建一个表。

    mysql -uroot

    为了开始复制,你可以运行:

    2.插入两条记录。

    >grant replication client,replication slave on *.* to repl@'192.168.1.%' identified by '123456';

    mysql> START SLAVE;

    在从服务器上查询。

    >show master status;

    运行SHOW SLAVE STATUS查看输出结果:

    新葡亰496net 16

    >

    mysql> SHOW SLAVE STATUSG

     

    *************************** 1. row ***************************
    File: mysql-bin.000009
    Position: 107
    Binlog_Do_DB:
    Binlog_Ignore_DB:
    1 row in set (0.00 sec)

    *************************** 1. row ***************************

    发现数据同步了。

    >q

                 Slave_IO_State: Waiting for master to send event

     

    mysqldump --all-databases --lock-all-tables --master-data=2 -p密码 > /root/slave.sql

                    Master_Host: server1

    优点:

    scp /root/slave.sql root@192.168.1.1:/usr/local/mysql

                    Master_mysql主从复制,基于日志点的复制。User: repl

    1.是mysql最早支持的复制技术,BUG相对较少。

     

                    Master_Port: 3306

    2.对SQL查询没有任何限制。

    --2 从服务器(192.168.1.2)恢复数据库,设置连接属性,并开启复制

                  Connect_Retry: 60

    3.故障处理比较容易。

    mysql -uroot

                Master_Log_File: mysql-bin.000001

    缺点:

    >source /usr/local/mysql;

            Read_Master_Log_Pos: 164

    故障转移时重新获取新主的日志点信息比较困难。

    >change master to MASTER_HOST='192.168.1.1',MASTER_USER='repl',MASTER_PASSWORD='123456',MASTER_LOG_FILE='mysql-bin.000009',MASTER_LOG_POS='107';

                 Relay_Log_File: mysql-relay-bin.000001

    >start slave;

                  Relay_Log_Pos: 164

     

          Relay_Master_Log_File: mysql-bin.000001

    -4 半同步模式(降低同步延迟问题)

               Slave_IO_Running: Yes

    --1 半同步模式需要插件支持,默认插件位置在/usr/local/mysql/lib/plugin

              Slave_SQL_Running: Yes

    --2 主服务器

                                 ...omitted...

    mysql -uroot

          Seconds_Behind_Master: 0

    >install plugin rpl_semi_sync_master scname 'semisync_master.so';

    注意,slave的I/O和SQL线程都已经开始运行,而且Seconds_Behind_Master不再是NULL。日志的位置增加了,意味着一些事件被获取并执行了。如果你在master上进行修改,你可以在slave上看到各种日志文件的位置的变化,同样,你也可以看到数据库中数据的变化。

    >set global rpl_semi_sync_master_enable=1;

    你可查看master和slave上线程的状态。在master上,你可以看到slave的I/O线程创建的连接:

    >set global rpl_semi_sync_master_timeout=1000; 

    mysql> show processlist G

    *************************** 1. row ***************************

         Id: 1

       User: root

       Host: localhost:2096

         db: test

    Command: Query

       Time: 0

     State: NULL

       Info: show processlist

    *************************** 2. row ***************************

         Id: 2

       User: repl

       Host: localhost:2144

         db: NULL

    Command: Binlog Dump

       Time: 1838

     State: Has sent all binlog to slave; waiting for binlog to be updated

       Info: NULL

    2 rows in set (0.00 sec)

    --3 从服务器

    行2为处理slave的I/O线程的连接。

    mysql -uroot

    在slave上运行该语句:

    >install plugin rpl_semi_sync_slave scname 'semisync_slave.so';

    mysql> show processlist G

    *************************** 1. row ***************************

         Id: 1

       User: system user

       Host:

         db: NULL

    Command: Connect

       Time: 2291

     State: Waiting for master to send event

       Info: NULL

    *************************** 2. row ***************************

         Id: 2

       User: system user

       Host:

         db: NULL

    Command: Connect

       Time: 1852

     State: Has read all relay log; waiting for the slave I/O thread to update it

       Info: NULL

    *************************** 3. row ***************************

         Id: 5

       User: root

       Host: localhost:2152

         db: test

    Command: Query

       Time: 0

     State: NULL

       Info: show processlist

    3 rows in set (0.00 sec)

    >set global rpl_semi_sync_slave_enable=1;

    行1为I/O线程状态,行2为SQL线程状态。

    >set global rpl_semi_sync_slave_timeout=1000;

    2.5 从另一个master初始化slave

    >stop slave;

    前面讨论的假设你是新安装的master和slave,所以,slave与master有相同的数据。但是,大多数情况却不是这样的,例如,你的master可能已经运行很久了,而你想对新安装的slave进行数据同步,甚至它没有master的数据。

    >start slave;

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

     

    (1)master的某个时刻的数据快照;

    -5 监控状态

    (2)master当前的日志文件、以及生成快照时的字节偏移。这两个值可以叫做日志文件坐标(log file coordinate),因为它们确定了一个二进制日志的位置,你可以用SHOW MASTER STATUS命令找到日志文件的坐标;

    --1 主从复制异步重要变量

    (3)master的二进制日志文件。

    >show slave status;

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

    获取如下,两个皆为yes正常,有一个不为yes,则有问题

    (1)冷拷贝(cold copy)

    Slave_IO_Running: Yes

    停止master,将master的文件拷贝到slave;然后重启master。缺点很明显。

    Slave_SQL_Running: Yes

    (2)热拷贝(warm copy)

    --2 半同步重要变量

    如果你仅使用MyISAM表,你可以使用mysqlhotcopy拷贝,即使服务器正在运行。

    重要变量:

    (3)使用mysqldump

    >show global variables like 'rpl_%';

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

    获取如下

    (1)锁表:如果你还没有锁表,你应该对表加锁,防止其它连接修改数据库,否则,你得到的数据可以是不一致的。如下:

    表明连接slave数量

    mysql> FLUSH TABLES WITH READ LOCK;

    rpl_semi_sync_master_client=n

    (2)在另一个连接用mysqldump创建一个你想进行复制的数据库的转储:

    表明半同步是否启用,1活动,0非活动

    shell> mysqldump --all-databases --lock-all-tables >dbdump.db

    rpl_semi_sync_master_status=1

    (3)对表释放锁。

    表明半同步是否启用。I/O线程是否启用,1活动,0非活动

    mysql主从复制,基于日志点的复制。mysql> UNLOCK TABLES;

    rpl_semi_sync_slave_status=1

    3 深入复制

    已经讨论了关于复制的一些基本东西,下面深入讨论一下复制。

    3.1 基于语句的复制(Statement-Based Replication)

    MySQL 5.0及之前的版本仅支持基于语句的复制(也叫做逻辑复制,logical replication),这在数据库并不常见。master记录下改变数据的查询,然后,slave从中继日志中读取事件,并执行它,这些SQL语句与master执行的语句一样。

    这种方式的优点就是实现简单。此外,基于语句的复制的二进制日志可以很好的进行压缩,而且日志的数据量也较小,占用带宽少——例如,一个更新GB的数据的查询仅需要几十个字节的二进制日志。而mysqlbinlog对于基于语句的日志处理十分方便。

    但是,基于语句的复制并不是像它看起来那么简单,因为一些查询语句依赖于master的特定条件,例如,master与slave可能有不同的时间。所以,MySQL的二进制日志的格式不仅仅是查询语句,还包括一些元数据信息,例如,当前的时间戳。即使如此,还是有一些语句,比如,CURRENT USER函数,不能正确的进行复制。此外,存储过程和触发器也是一个问题。

    另外一个问题就是基于语句的复制必须是串行化的。这要求大量特殊的代码,配置,例如InnoDB的next-key锁等。并不是所有的存储引擎都支持基于语句的复制。

    3.2 基于记录的复制(Row-Based Replication)

    MySQL增加基于记录的复制,在二进制日志中记录下实际数据的改变,这与其它一些DBMS的实现方式类似。这种方式有优点,也有缺点。优点就是可以对任何语句都能正确工作,一些语句的效率更高。主要的缺点就是二进制日志可能会很大,而且不直观,所以,你不能使用mysqlbinlog来查看二进制日志。

    对于一些语句,基于记录的复制能够更有效的工作,如:

    mysql> INSERT INTO summary_table(col1, col2, sum_col3)
        -> SELECT col1, col2, sum(col3)
        -> FROM enormous_table
    -> GROUP BY col1, col2;

    假设,只有三种唯一的col1和col2的组合,但是,该查询会扫描原表的许多行,却仅返回三条记录。此时,基于记录的复制效率更高。

    另一方面,下面的语句,基于语句的复制更有效:

    mysql> UPDATE enormous_table SET col1 = 0;

    此时使用基于记录的复制代价会非常高。由于两种方式不能对所有情况都能很好的处理,所以,MySQL 5.1支持在基于语句的复制和基于记录的复制之前动态交换。你可以通过设置session变量binlog_format来进行控制。

    3.3 复制相关的文件

    除了二进制日志和中继日志文件外,还有其它一些与复制相关的文件。如下:

    (1)mysql-bin.index

    服务器一旦开启二进制日志,会产生一个与二日志文件同名,但是以.index结尾的文件。它用于跟踪磁盘上存在哪些二进制日志文件。MySQL用它来定位二进制日志文件。它的内容如下(我的机器上):

    新葡亰496net 17

    (2)mysql-relay-bin.index

    该文件的功能与mysql-bin.index类似,但是它是针对中继日志,而不是二进制日志。内容如下:

    .mysql-02-relay-bin.000017
    .mysql-02-relay-bin.000018

    (3)master.info

    保存master的相关信息。不要删除它,否则,slave重启后不能连接master。内容如下(我的机器上):

    新葡亰496net 18

    I/O线程更新master.info文件,内容如下(我的机器上):

    .mysql-02-relay-bin.000019

    254

    mysql-01-bin.000010

    286

    0

    52813

     (4)relay-log.info 

    包含slave中当前二进制日志和中继日志的信息。

    3.4 发送复制事件到其它slave

    当设置log_slave_updates时,你可以让slave扮演其它slave的master。此时,slave把SQL线程执行的事件写进行自己的二进制日志(binary log),然后,它的slave可以获取这些事件并执行它。如下:

    新葡亰496net 19

    3.5 复制过滤(Replication Filters)

    复制过滤可以让你只复制服务器中的一部分数据,有两种复制过滤:在master上过滤二进制日志中的事件;在slave上过滤中继日志中的事件。如下:

    新葡亰496net 20

    4 复制常用拓扑结构

    复制的体系结构有以下一些基本原则:

    (1)每个slave只能有一个master;

    (2)每个slave只能有一个唯一的服务器ID;

    (3)每个master可以有很多slave;

    (4)如果你设置log_slave_updates,slave可以是其它slave的master,从而扩散master的更新。

    MySQL不支持多主服务器复制(Multimaster Replication)——即一个slave可以有多个master。但是,通过一些简单的组合,我们却可以建立灵活而强大的复制体系结构。

    4.1 单一master和多slave

    由一个master和一个slave组成复制系统是最简单的情况。Slave之间并不相互通信,只能与master进行通信。如下:

    新葡亰496net 21

    如果写操作较少,而读操作很时,可以采取这种结构。你可以将读操作分布到其它的slave,从而减小master的压力。但是,当slave增加到一定数量时,slave对master的负载以及网络带宽都会成为一个严重的问题。

    这种结构虽然简单,但是,它却非常灵活,足够满足大多数应用需求。一些建议:

    (1)不同的slave扮演不同的作用(例如使用不同的索引,或者不同的存储引擎);

    (2)用一个slave作为备用master,只进行复制;

    (3)用一个远程的slave,用于灾难恢复。

    4.2 主动模式的Master-Master(Master-Master in Active-Active Mode)

    Master-Master复制的两台服务器,既是master,又是另一台服务器的slave。如图:

    新葡亰496net 22

    主动的Master-Master复制有一些特殊的用处。例如,地理上分布的两个部分都需要自己的可写的数据副本。这种结构最大的问题就是更新冲突。假设一个表只有一行(一列)的数据,其值为1,如果两个服务器分别同时执行如下语句:

    在第一个服务器上执行:

    mysql> UPDATE tbl SET col=col 1;

    在第二个服务器上执行:

    mysql> UPDATE tbl SET col=col * 2;

    那么结果是多少呢?一台服务器是4,另一个服务器是3,但是,这并不会产生错误。

    实际上,MySQL并不支持其它一些DBMS支持的多主服务器复制(Multimaster Replication),这是MySQL的复制功能很大的一个限制(多主服务器的难点在于解决更新冲突),但是,如果你实在有这种需求,你可以采用MySQL Cluster,以及将Cluster和Replication结合起来,可以建立强大的高性能的数据库平台。但是,可以通过其它一些方式来模拟这种多主服务器的复制。

    4.3 主动-被动模式的Master-Master(Master-Master in Active-Passive Mode)

    这是master-master结构变化而来的,它避免了M-M的缺点,实际上,这是一种具有容错和高可用性的系统。它的不同点在于其中一个服务只能进行只读操作。如图:

    新葡亰496net 23

    4.4 带从服务器的Master-Master结构(Master-Master with Slaves)

    这种结构的优点就是提供了冗余。在地理上分布的复制结构,它不存在单一节点故障问题,而且还可以将读密集型的请求放到slave上。

    新葡亰496net 24

     

    本文由新葡亰496net发布于网络数据库,转载请注明出处:mysql主从复制,基于日志点的复制

    关键词: