实现mysql主主复制架构

实验环境,假设公司想要对一台运行了一段时间的mysql服务器,做一个主主复制架构,以提升数据库的读写能力。








老服务器用M0表示
新服务器用M1表示

一,对M0服务器做一个全备份

    mysqldump -A -F -E -R --single-transaction --master-data=1 --flush-privileges --triggers --hex-blob > /mysqlbackup/all.sql

    命令解析:
        -A:备份所有数据库,含create database语句

        -F:备份前滚动日志,锁定表完成后,执行flush logs命令,生成新的二进制日志文件,配合-A时,会导致刷新多次数据库,在同一时刻执行转储和日志刷新,--single-transaction 之刷新一次二进制日志
        --single-transaction :只刷新一次二进制日志
        --flush-privileges: 备份mysql或相关时需要使用
        --triggers:备份表相关的触发器,默认启用,用--skiptriggers,不备份触发器
        --master-data=【1|2】:注意:此选项须启用二进制日志
         1:所备份的数据之前加一条记录为CHANGE MASTER TO语 句,非注释,不指定#,默认为1
         2:记录为注释的CHANGE MASTER TO语句  此选项会自动关闭--lock-tables功能,自动打开--lock-alltables功能(除非开启--single-transaction)

二,查看当前备份位置


    [[email protected] ~]# grep -i ^change*  /mysqlbackup/all.sql
    CHANGE MASTER TO MASTER_LOG_FILE=‘mariadb-bin.000005‘, MASTER_LOG_POS=245;

    当前备份位置是mariadb-bin.000002的245,之前的所有内容都备份了

三,将全备份拷贝到M1服务器上

    scp /mysqlbackup/all.sql  192.168.68.17:/data/

四,修改M0服务器配置文件

    vim /etc/my.cnf
    在[mysqld]配置块中添加如下配置
    [mysqld]
    server_id=0             #设置为当前节点设置一个全局惟一的ID号
    innodb_file_per_table #启用数据库仪表结构分离存放在两个不同文件
    auto_increment_offset=1     #设置字段自动增长的起始值1
    auto_increment_increment=2  #增长的幅度为2
    log_bin                     #启用二进制日志

五,重启M0的mysql服务,使配置生效

    systemctl restart mairadb

六,在M0上创建拥有复制权限的用户账号

    M0 [(none)]>GRANT REPLICATION SLAVE  ON *.* TO ‘repluser‘@‘HOST‘ IDENTIFIED BY ‘replpass‘; 

    命令解析:
        ‘repluser‘@‘HOST‘ :设置用户名即主机ip或网段,网段用%表示 例如10.0.0.%
        IDENTIFIED BY:设置密码
        *.* :表示所有数据库,所有表
        GRANT REPLCATION SLAVE:就是允许该用户复制数据

    该命令作用就是授权repluser能拷贝数据库的所有内容

七,在M1上安装mairadb

    yum install mairadb-server

八,修改M1配置文件

     vim /etc/my.cnf
        在[mysqld]配置块中添加如下配置
        [mysqld]
        server_id=0             #设置为当前节点设置一个全局惟一的ID号
        innodb_file_per_table #启用数据库仪表结构分离存放在两个不同文件
        auto_increment_offset=2    #设置字段自动增长的起始值2
        auto_increment_increment=2  #增长的幅度为2
        log_bin                     #启用二进制日志

九,启动M1的mairadb服务

    systemctl restart mariadb

十,为了安全在M1执行下面的命令

    "mysql_secure_installation"

    第一项问你:输入root密码  回车即可,因为没有
    第二项问你:需要设置root密码么,
    第三项问你:需要删除空账号用户么,
    第四项问你:禁止root用户远程登入么,
    第五项问你:需要删除test测试数据库么,
    第六项问你:现在重新加载权限表吗 ,

十一,在M1上恢复备份数据

    登入mysql终端执行下面的命令

     M1 [(none)]>source /data/all.sql

十二,在M1上同样也创建一个拥有复制权限的用户账号

     M1 [(none)]>GRANT REPLICATION SLAVE  ON *.* TO ‘repluser‘@‘HOST‘ IDENTIFIED BY ‘replpass‘; 

        命令解析:
            ‘repluser‘@‘HOST‘ :设置用户名即主机ip或网段,网段用%表示 例如10.0.0.%
            IDENTIFIED BY:设置密码
            *.* :表示所有数据库,所有表
            GRANT REPLCATION SLAVE:就是允许该用户复制数据

        该命令作用就是授权repluser能拷贝数据库的所有内容

十三,在M1使用有复制权限的用户账号连接至主服务器,并启动复制线程

1,使用有复制权限的用户账号连接至主服务器

         M1 [(none)]> CHANGE MASTER TO
             MASTER_HOST=‘host‘,        #指定M0主机IP
             MASTER_USER=‘repluser‘,    #指定M0被授权的用户名
             MASTER_PASSWORD=‘replpass‘,#指定M0被授权的用户密码 MASTER_LOG_FILE=‘mysql-bin.xxxxx‘, #指定从M0服务器的那个二进制日志开始复制
             MASTER_LOG_POS=#;          #二进制日志位置,可以在M1服务器上执行该命令查看,show master logs;

2,启动复制线程IO_THREAD和SQL_THREAD

    M1 [(none)]>START SLAVE;

3,查看线程状态


    M1 [(none)]> show slave status\G
    *************************** 1. row ***************************
                   Slave_IO_State: Waiting for master to send event
                      Master_Host: 192.168.68.7
                      Master_User: repluser
                      Master_Port: 3306
                    Connect_Retry: 60
                  Master_Log_File: mariadb-bin.000005
              Read_Master_Log_Pos: 245
                   Relay_Log_File: mariadb-relay-bin.000002
                    Relay_Log_Pos: 843
            Relay_Master_Log_File: mariadb-bin.000005
                 Slave_IO_Running: Yes  "重点关注如果是NO表示线程没起来"
                Slave_SQL_Running: Yes "重点关注 如果是NO表示该线程没起来"
                  Replicate_Do_DB:
              Replicate_Ignore_DB:
               Replicate_Do_Table:
           Replicate_Ignore_Table:
          Replicate_Wild_Do_Table:
      Replicate_Wild_Ignore_Table:
                       Last_Errno: 0
                       Last_Error:
                     Skip_Counter: 0
              Exec_Master_Log_Pos: 557
                  Relay_Log_Space: 1139
                  Until_Condition: None
                   Until_Log_File:
                    Until_Log_Pos: 0
               Master_SSL_Allowed: No
               Master_SSL_CA_File:
               Master_SSL_CA_Path:
                  Master_SSL_Cert:
                Master_SSL_Cipher:
                   Master_SSL_Key:
            Seconds_Behind_Master: 0 "该项表示同步时间 0表示即使同步"
    Master_SSL_Verify_Server_Cert: No
                    Last_IO_Errno: 0
                    Last_IO_Error:
                   Last_SQL_Errno: 0
                   Last_SQL_Error:
      Replicate_Ignore_Server_Ids:
                 Master_Server_Id: 1

十四,在M0使用有复制权限的用户账号连接至主服务器,并启动复制线程

1,使用有复制权限的用户账号连接至主服务器

     M0 [(none)]> CHANGE MASTER TO
         MASTER_HOST=‘host‘,        #指定M1主机IP
         MASTER_USER=‘repluser‘,    #指定M1被授权的用户名
         MASTER_PASSWORD=‘replpass‘,#指定M1被授权的用户密码 MASTER_LOG_FILE=‘mysql-bin.xxxxx‘, #指定从M1服务器的那个二进制日志开始复制
         MASTER_LOG_POS=#;          #二进制日志位置,可以在M0服务器上执行该命令查看,show master logs;

2,启动复制线程IO_THREAD和SQL_THREAD

     M0 [(none)]> START SLAVE; 

3,查看线程状态


    M0 [(none)]> show slave status\G
    *************************** 1. row ***************************
                   Slave_IO_State: Waiting for master to send event
                      Master_Host: 192.168.68.17
                      Master_User: repluser
                      Master_Port: 3306
                    Connect_Retry: 60
                  Master_Log_File: mariadb-bin.000001
              Read_Master_Log_Pos: 55732
                   Relay_Log_File: mariadb-relay-bin.000002
                    Relay_Log_Pos: 843
            Relay_Master_Log_File: mariadb-bin.000001
                 Slave_IO_Running: Yes  "重点关注如果是NO表示线程没起来"
                Slave_SQL_Running: Yes "重点关注 如果是NO表示该线程没起来"
                  Replicate_Do_DB:
              Replicate_Ignore_DB:
               Replicate_Do_Table:
           Replicate_Ignore_Table:
          Replicate_Wild_Do_Table:
      Replicate_Wild_Ignore_Table:
                       Last_Errno: 0
                       Last_Error:
                     Skip_Counter: 0
              Exec_Master_Log_Pos: 557
                  Relay_Log_Space: 1139
                  Until_Condition: None
                   Until_Log_File:
                    Until_Log_Pos: 0
               Master_SSL_Allowed: No
               Master_SSL_CA_File:
               Master_SSL_CA_Path:
                  Master_SSL_Cert:
                Master_SSL_Cipher:
                   Master_SSL_Key:
            Seconds_Behind_Master: 0 "该项表示同步时间 0表示即使同步"
    Master_SSL_Verify_Server_Cert: No
                    Last_IO_Errno: 0
                    Last_IO_Error:
                   Last_SQL_Errno: 0
                   Last_SQL_Error:
      Replicate_Ignore_Server_Ids:
                 Master_Server_Id: 1

十五,同步测试,创建表查看自动增长字段两边是否冲突

1,在M0上创建一张测试表

   create table t1(id int unsigned primary key auto_increment,name varchar(30));

    该命令就是在test数据库中创建一张名为t1,有两个字段,一个字段是id,另一个是name,其中id是整数,而且是主键,并且还是自动增长,name字段是任意字符,字符长度只有30个

2,查看M1是否同步

    M1 [test]> show tables;
    +----------------+
    | Tables_in_test |
    +----------------+
    | t1             |
    +----------------+

3,在M1,test数据库的t1表中插入两条记录

    MariaDB [test]> insert t1(name) values(‘wang‘);
    Query OK, 1 row affected (0.01 sec)

    MariaDB [test]> insert t1(name) values(‘li‘);
    Query OK, 1 row affected (0.02 sec)

    MariaDB [test]> select * from t1
        -> ;
    +----+------+
    | id | name |
    +----+------+
    |  2 | wang |
    |  4 | li        |
    +----+------+
    2 rows in set (0.00 sec)

    "注意:
    为什么id是2,4呢,这就是在M1的配置文件中的这两行的作用
        auto_increment_offset=2    #设置字段自动增长的起始值2
        auto_increment_increment=2  #增长的幅度为2"
    而M0上在这张表上插入的内容就是以基数增长了,但是它不会不全前面缺的数,而是一直增张。

        M0 [test]> select * from t1;
        +----+-------+
        | id | name  |
        +----+-------+
        |  2 | wang  |
        |  4 | li         |
        |  5 | zhang |
        |  7 | huang |
        +----+-------+
        4 rows in set (0.00 sec)

总结:

  • 主主复制:互为主从

    • 容易产生的问题:数据不一致;因此慎用
  • 考虑要点:表某一个字段设置为自动增长的id值时
    • 配置一个节点使用奇数id,需要在配置文件中添加如下

      • auto_increment_offset=1 开始点
      • auto_increment_increment=2 增长幅度
    • 另一个节点使用偶数id,需要在配置文件中添加如下
      • auto_increment_offset=2
      • auto_increment_increment=2
  • 两台服务器都必须开启二进制日志功能,并且都要有授权复制数据的用户

原文地址:http://blog.51cto.com/13598893/2092384

时间: 2024-10-22 00:09:23

实现mysql主主复制架构的相关文章

MySql --主从复制 主主复制

MySql 复制 系统的扩展方式有:scale up [向上扩展或是垂直扩展]  scale out:[向外扩展或是水平扩展] Mysql的复制就是为了实现mysql的水平扩展 为什么要实现水平扩展 当前端节点很少时可以用垂直扩展的方式进行换更好的硬件,但是这会有上限当达到一定的程度后就无法在继续扩展,同时这种扩展的方式成本会很高. 因此更好的办法还是进行水平扩展.来应对前方的压力.但是这对于mysql水平扩展有一个问题就是数据共享的问题. 共享存储的解决方案有NAS SAN 假设使用的是NAS

搭建MySQL的主从、半同步、主主复制架构

复制其最终目的是让一台服务器的数据和另外的服务器的数据保持同步,已达到数据冗余或者服务的负载均衡.一台主服务器可以连接多台从服务器,并且从服务器也可以反过来作为主服务器.主从服务器可以位于不同的网络拓扑中,由于mysql的强大复制功能,其复制目标可以是所有的数据库,也可以是某些数据库,甚至是某个数据库中的某些表进行复制. MySQL支持的两种复制方案:基于语句复制,基于行复制基于语句复制基于行复制,这两种复制方式都是通过记录主服务器的二进制日志中任何有可能导致数据库内数据发生改变的SQL语句到中

转载-Mysql主主复制架构配置

Mysql主主复制架构配置 转载:原始出处 http://luoweiro.blog.51cto.com/2186161/658550MySQL主主复制结构区别于主从复制结构.在主主复制结构中,两台服务器的任何一台上面的数据库存发生了改变都会同步到另一台服务器上,这样两台服务器互为主从,并且都能向外提供服务. 这就比使用主从复制具有更好的性能.接下来我将使用两个同样的服务器来实现这个效果:具体Mysql的安装我就省略了,在上一篇的Mysql的主从架构的配置中有详细介绍server1_mysql:

MySQL 主从复制、主主复制、半同步复制

MySQL 复制 =============================================================================== 概述: =============================================================================== MySQL Replication:   1.主从复制的目的和架构 ★Master/Slave(主/从) Master: write/read Slave

MySQL双主(主主)架构方案

在企业中,数据库高可用一直是企业的重中之重,中小企业很多都是使用mysql主从方案,一主多从,读写分离等,但是单主存在单点故障,从库切换成主库需要作改动.因此,如果是双主或者多主,就会增加mysql入口,增加高可用.不过多主需要考虑自增长ID问题,这个需要特别设置配置文件,比如双主,可以使用奇偶,总之,主之间设置自增长ID相互不冲突就能完美解决自增长ID冲突问题. 主从同步复制原理 在开始之前,我们先来了解主从同步复制原理. 复制分成三步: 1. master将改变记录到二进制日志(binary

MySQL双主互备模式架构

MySql双主互备架构模式 操作系统 CentOS 6.3 MySql版本 mysql-5.0.56 keepalived keepalived-1.1.19.tar.gz Master DB1配置文件 修改MySql 配置文件  /etc/my.cnf 增加以下段落 [mysqld] server-id=1    节点标示 log-bin=mysql-bin   开启mysql的binlog日志功能 relay-log = mysql-relay-bin  用来定义日志文件命名格式 repli

MySQL 主主复制 + LVS + Keepalived 实现 MySQL 高可用性

MySQL复制能够保证数据的冗余的同时可以做读写分离来分担系统压力,如果是主主复制还可以很好的避免主节点的单点故障.但是MySQL主主复制存在一些问题无法满足我们的实际需要:未提供统一访问入口来实现负载均衡,如果其中master宕掉的话需要手动切换到另外一个master,而不能自动进行切换. 这篇文章下面要介绍如何通过LVS+Keepalived的方式来是实现MySQL的高可用性,同时解决以上问题. Keepalived和LVS介绍 Keepalived是一个基于VRRP(虚拟路由冗余协议)可用

mysql+mycat搭建稳定高可用集群,负载均衡,主备复制,读写分离

主要思路 测试环境 实现mysql主备复制 配置A主mysql 配置B备mysql 验证同步配置结果 验证是否同步 关闭B备mysql的同步,验证读写分离 实现读写分离 安装mycat 配置mycat 启动mycat 测试读写分离 验证是否同步 关闭B备mysql的同步,验证读写分离 数据库性能优化普遍采用集群方式,oracle集群软硬件投入昂贵,今天花了一天时间搭建基于mysql的集群环境. 主要思路 简单说,实现mysql主备复制-->利用mycat实现负载均衡. 比较了常用的读写分离方式,

MySQL数据的主从复制、半同步复制和主主复制详解

一.MySQL复制概述 ⑴.MySQL数据的复制的基本介绍 目前MySQL数据库已经占去数据库市场上很大的份额,其一是由于MySQL数据的开源性和高性能,当然还有重要的一条就是免费~不过不知道还能免费多久,不容乐观的未来,但是我们还是要能熟练掌握MySQL数据的架构和安全备份等功能,毕竟现在它还算是开源界的老大吧! MySQL数据库支持同步复制.单向.异步复制,在复制的过程中一个服务器充当主服务,而一个或多个服务器充当从服务器.主服务器将更新写入二进制日志文件,并维护文件的一个索引以跟踪日志循环