mysql5.6 GTID的实现以及maridb 10.9多主一从的架构

一、MySQL 5.6 以后出现的GTID:

    GTID概念: 

        1. GTID是一个由服务器的UUID和事务序号组成的唯一事务序号

            例如: UUID:N

                1122-3322-1122:1 

                1122-3322-1122:2 

        2. GTID会被当做唯每一个事务的首部,将会自动生成并存到二进制日志中

        3. GTID可以用来追踪主从之间的事务传输。

        4. GTID主要应用于HA的功能。在多主模型中,标示某一个事务是来源于哪个特定的主服务器。

        5. 从服务器不会修改或者添加新的GTID,即便从服务器被配置为其他从服务器的主服务器,所以可以追踪事务流。

        6. GTID开启后,会在gtid_executed予以显示

    跟复制相关的工具,需要python2.7环境

        1. mysqlreplicate: 添加从节点

        2. mysqlcheck: 实现校验机制

        3. mysqlrplshow: 发现并显示,复制拓扑结构, 几级复制每一级有多少个服务器

        4. mysqlfailover: 讲一个从节点提升为一个主节点

        5. mysqlrpladmin: 管理工具,做手工调度的,把一个正常从节点调度为主节点

    借助于GTID的多线程复制

        从服务器可以发出多个1/O线程对主服务器进行对mysqldump请求会使得先后读出来的信息顺序混乱。因此通过分割数据库来达到多线程,每一个数据库的事务只能有一个线程复制。 但即便如此如果只有一个主服务器,多线程并不能带来性能提升, 因为只有一个二进制服务器,并且网络带宽也有限。真正使性能提升,需要一从多主模型。多线程slave通常为多个sql,一个I/O线程,多个SQL线程。 通过GTID机制,可以把不同的事务通过不同线程来应用。

配置开启GTID开启复制的需需要的参数(配置在[mysqld]段下)

        1. binlog-format:二进制日志的格式,有row、statement和mixed几种类型;

            需要注意的是:当设置隔离级别为READ-COMMITED必须设置二进制日志格式为ROW,现在MySQL官方认为STATEMENT这个已经不再适合继续使用;但mixed类型在默认的事务隔离级别下,可能会导致主从数据不一致;

        2. log-slave-updates、gtid-mode、enforce-gtid-consistency、report-port和report-host:用于启动GTID及满足附属的其它需求;

            master-info-repository和relay-log-info-repository:启用此两项,可用于实现在崩溃时保证二进制及从服务器安全的功能;

        3. sync-master-info:启用之可确保无信息丢失;

        4. slave-paralles-workers:设定从服务器的SQL线程数;0表示关闭多线程复制功能;

        5. binlog-checksum、master-verify-checksum和slave-sql-verify-checksum:启用复制有关的所有校验功能;

        6. binlog-rows-query-log-events:启用之可用于在二进制日志记录事件相关的信息,可降低故障排除的复杂度;

        7. log-bin:启用二进制日志,这是保证复制功能的基本前提;

        8. server-id:同一个复制拓扑中的所有服务器的id号必须惟一;

        9. report-host: 需要从服务器的主机名和IP地址在从服务器注册的时候是否报告给主服务器。 在主服务器上使用SHOW SLAVE HOSTS可以查看

                            The host name or IP address of the slave to be reported to the master during slave registration. This value appears in the output of SHOW SLAVE HOSTS on the master server.

        10. report-port:是否报告从服务器链接端口给主服务器

                            The TCP/IP port number for connecting to the slave, to be reported to the master during slave registration.

        11. master-info-repository: 从服务是否把从服务器登录和连接信息记录在文件master.info或者记录在mysql.slave_master_info表中 

                            The setting of this variable determines whether the slave logs master status and connection information to a FILE (master.info), or to a TABLE (mysql.slave_master_info)

        12. relay-log-info-repository: relay log相关数据记录文档或者表

                            This option causes the server to log its relay log info to a file or a table.

        13. log_slave_updates:是否接受从服务器的更新信息

                            Whether updates received by a slave serv 

二、MySQL5.6主从配置并开启基于GTID的多线程工作模型

    1. 配置两台主机,重新初始化mysql服务器,并且保证主机名可以解析。 加一下hosts文件复制到两台主机即可。 

    127.0.0.1   localhost localhost.localdomain localhost4 localhost4.localdomain4    
    ::1         localhost localhost.localdomain localhost6 localhost6.localdomain6
    192.168.98.129www.playground2.comwww.master1.com
    192.168.98.133www.slave.com

    2. 同步时间, 可以开启ntpd服务,通过一些公共时间服务器同步时间。其实这是偷懒的做法,最后自己配置一台本地时间服务器。

    3. 主服务器端编辑配置文件如下

    [mysqld]    
    binlog-format=ROW
    log-bin=/data/binlog/master-bin
    log-slave-updates=true
    gtid-mode=on
    enforce-gtid-consistency=true
    master-info-repository=TABLE
    relay-log-info-repository=TABLE
    sync-master-info=1
    slave-parallel-workers=2
    binlog-checksum=CRC32
    master-verify-checksum=1
    slave-sql-verify-checksum=1
    binlog-rows-query-log_events=1
    server-id=1
    report-port=3306
    port=3306
    datadir=/data/mysqldata
    socket=/tmp/mysql.sock
    user=mysql
    innodb_log_file_size=5M
    innodb_file_per_table=ON
    report-host=www.master1.com
    symbolic-links=0
    [mysqld_safe]
    log-error=/var/log/mysqld.log

         配置完成后,可以重新初始化服务器。 

    4. 从服务器配置

    [mysqld]    
    binlog-format=ROW
    log-slave-update=true
    gtid-mode=on
    enforce-gtid-consistency=true
    master-info-repository=TABLE
    relay-log-info-repository=TABLE
    sync-master-info=1
    slave-parallel-workers=2
    binlog-checksum=CRC32
    master-verify-checksum=1
    slave-sql-verify-checksum=1
    binlog-rows-query-log_events=1
    server-id=11
    report-port=3306
    port=3306
    datadir=/data/mysqldata
    socket=/tmp/mysql.sock
    user=mysql
    report-host=www.slave.com
    # Disabling symbolic-links is recommended to prevent assorted security risks
    symbolic-links=0
    relay-log=/data/relaylog/relay_bin
    skip-slave-start
    [mysqld_safe]
    log-error=/var/log/mysqld.log

         其实我觉得很多针对主服务器的配置应该不需要写在这里。 

    5. 在主服务器上为从服务器授权用户。 并查看主服务器二进制日志位置

    mysql> GRANT REPLICATION CLIENT,REPLICATION SLAVE ON *.* TO 'slaveuser'@'www.slave.com' IDENTIFIED BY 'slaveuser' ;     
    mysql> FLUSH PRIVILEGES ; 
    mysql> SHOW MASTER STATUS ; 
        +-------------------+----------+--------------+------------------+------------------------------------------+
        | File              | Position | Binlog_Do_DB | Binlog_Ignore_DB | Executed_Gtid_Set                        |
        +-------------------+----------+--------------+------------------+------------------------------------------+
        | master-bin.000003 |      561 |              |                  | 600383b3-9cb6-11e5-8b6c-000c29622425:1-2 |
        +-------------------+----------+--------------+------------------+------------------------------------------+

    7. 将从服务器指向主服务器,并开启复制线程。

    mysql> CHANGE MASTER TO MASTER_HOST='www.master1.com',MASTER_USER='slaveuser',MASTER_PASSWORD='slaveuser',MASTER_AUTO_POSITION=1;     
    mysql> START SLAVE; 
    mysql> SHOW SLAVE STATUS \G; 
        *************************** 1. row ***************************
           Slave_IO_State: Waiting for master to send event
          Master_Host: www.master1.com
          Master_User: slaveuser
          Master_Port: 3306
        Connect_Retry: 60
          Master_Log_File: master-bin.000004
          Read_Master_Log_Pos: 191
           Relay_Log_File: relay_bin.000003
        Relay_Log_Pos: 403
        Relay_Master_Log_File: master-bin.000004
         Slave_IO_Running: Yes
        Slave_SQL_Running: Yes
          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: 191
          Relay_Log_Space: 1223
          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
        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
          Master_UUID: 600383b3-9cb6-11e5-8b6c-000c29622425
         Master_Info_File: mysql.slave_master_info
        SQL_Delay: 0
          SQL_Remaining_Delay: NULL
          Slave_SQL_Running_State: Slave has read all relay log; waiting for the slave I/O thread to update it
           Master_Retry_Count: 86400
          Master_Bind: 
          Last_IO_Error_Timestamp: 
         Last_SQL_Error_Timestamp: 
           Master_SSL_Crl: 
           Master_SSL_Crlpath: 
           Retrieved_Gtid_Set: 600383b3-9cb6-11e5-8b6c-000c29622425:1-2
        Executed_Gtid_Set: 600383b3-9cb6-11e5-8b6c-000c29622425:1-2
        Auto_Position: 1

    8. 查看从服务器sql线程情况: 

    mysql> SHOW PROCESSLIST ;     
        +----+-------------+-----------+------+---------+------+-----------------------------------------------------------------------------+------------------+
        | Id | User        | Host      | db   | Command | Time | State                                                                       | Info             |
        +----+-------------+-----------+------+---------+------+-----------------------------------------------------------------------------+------------------+
        |  1 | root        | localhost | NULL | Query   |    0 | init                                                                        | SHOW PROCESSLIST |
        |  2 | system user |           | NULL | Connect |  224 | Waiting for master to send event                                            | NULL             |
        |  3 | system user |           | NULL | Connect |  224 | Slave has read all relay log; waiting for the slave I/O thread to update it | NULL             |
        |  4 | system user |           | NULL | Connect |  224 | Waiting for an event from Coordinator                                       | NULL             |
        |  5 | system user |           | NULL | Connect |  224 | Waiting for an event from Coordinator                                       | NULL             |
        +----+-------------+-----------+------+---------+------+-----------------------------------------------------------------------------+------------------+
    这里后面两个4,5应该是SQL写进程,可以看到变成了另个,和我们设置相符
    1号应该是主进程,
    2号应该是监听的守护进程
    3号应该是1/O线程 
    9. 主服务器的线程情况
    mysql> SHOW PROCESSLIST;     
        +----+-----------+---------------------+---------+------------------+------+-----------------------------------------------------------------------+------------------+
        | Id | User      | Host                | db      | Command          | Time | State                                                                 | Info             |
        +----+-----------+---------------------+---------+------------------+------+-----------------------------------------------------------------------+------------------+
        |  2 | root      | localhost           | hellodb | Query            |    0 | init                                                                  | SHOW PROCESSLIST |
        |  6 | slaveuser | www.slave.com:36925 | NULL    | Binlog Dump GTID |  520 | Master has sent all binlog to slave; waiting for binlog to be updated | NULL             |
        +----+-----------+---------------------+---------+------------------+------+-----------------------------------------------------------------------+------------------+
        只有一个mysql dump 进程

三、使用mariadb 10 实现一主多从构架

    1. 克隆一台主机,主机名改为www.master2.com, 配置和www.master1.com相同

    使用vmware workstation 克隆一台主句,开机后做如下修改     
        # vim /etc/udev/rules.d/70-persistent-net.rules 把里面的第一行删掉,第二行eth1改成eth0 
    然后重新加载网卡
        # modprobe -r e1000
        # modprobe e1000
    然后在三台主机上安装,mariadb 10, 基本过程和mysql差不多,不过折腾一阵子

    2. 在host文件中添加,第二台主服务器的的主机名,并且可以完成解析

        修改各主机名。 

        修改hosts文件。

        复制相同的hosts文件到各个节点。

        过程比较简单,这里不写了,请允许我的懒惰。

        在三台主机上安装mariadb 10, 过程不说了,对于你们这些大牛都是分分钟的事。 

     3. 配置方面

    master1主机    
        log-bin=/data/binlog/master1-bin
        datadir=/data/mysqldata
        server-id       = 1
        binlog-format=ROW
        log-slave-updates=true
        master-info-repository=TABLE
        relay-log-info-repository=TABLE
        sync-master-info=1
        binlog-checksum=CRC32
        master-verify-checksum=1
        binlog-rows-query-log_events=1
        report-port=3306
        socket=/tmp/mysql.sock
        user=mysql
        innodb_log_file_size=5M
        innodb_file_per_table=ON
        report-host=www.master1.com
    master2主机
        log-bin=/data/binlog/master2-bin
        datadir=/data/mysqldata
        server-id       = 2
        binlog-format=ROW
        log-slave-updates=true
        master-info-repository=TABLE
        relay-log-info-repository=TABLE
        sync-master-info=1
        binlog-checksum=CRC32
        master-verify-checksum=1
        binlog-rows-query-log_events=1
        report-port=3306
        socket=/tmp/mysql.sock
        user=mysql
        innodb_log_file_size=5M
        innodb_file_per_table=ON
        report-host=www.master2.com
    slave主机
        log-bin=/data/binlog/slave-bin
        datadir=/data/mysqldata
        server-id       = 11
        binlog-format=ROW
        log-slave-updates=true
        master-info-repository=TABLE
        relay-log-info-repository=TABLE
        sync-master-info=1
        slave-parallel-workers=2
        binlog-checksum=CRC32
        master-verify-checksum=1
        slave-sql-verify-checksum=1
        binlog-rows-query-log_events=1
        server-id=11
        report-port=3306
        port=3306
        report-host=www.slave.com
        relay-log=/data/relaylog/relay-bin
        replicate_ignore_db=mysql performance_schema information_schema

    3. 重新初始化一下各个节点,并清理各种binlog和relaylog

    4. 在两个主服务器上面分别创建从服务器复制用户

    # 在master1     
    mysql> GRANT REPLICATION CLIENT, REPLICATION SLAVE ON *.* TO 'slaveuser'@'www.slave.com' IDENTIFIED BY 'slaveuser'; 
    mysql> FLUSH PRIVILEGES ; 
    
    # 在master2 
    mysql> GRANT REPLICATION CLIENT, REPLICATION SLAVE ON *.* TO 'slaveuser'@'www.slave.com' IDENTIFIED BY 'slaveuser'; 
    mysql> FLUSH PRIVILEGES ;

    5. 从服务器上尝试连接不同主服务器。 

    MariaDB [(none)]> CHANGE MASTER 'master1' TO MASTER_HOST='192.168.98.129',MASTER_PORT=3306,MASTER_USER='slaveuser',MASTER_PASSWORD='slaveuser',MASTER_LOG_FILE='master1-bin.000004',MASTER_LOG_POS=686;
    MariaDB [(none)]> CHANGE MASTER 'master2' TO MASTER_HOST='192.168.98.130',MASTER_PORT=3306,MASTER_USER='slaveuser',MASTER_PASSWORD='slaveuser',MASTER_LOG_FILE='master2-bin.000004',MASTER_LOG_POS=686;
    MariaDB [(none)]> START SLAVE 'master1';
    MariaDB [(none)]> START SLAVE 'master2'; 
    MariaDB [(none)]> SHOW SLAVES All  STATUS \G; ## 查看状态 
此时可以分别在两个数据库上进行一些修改,正常来说,都会在从服务器上有所显示。

    6. 一些总结

    1) 和mysql 5.6 相比,mariadb不支持的参数:

        gtid-mode=on 

        enforce-gtid-consistency=true

    2) 修改的参数:

        slave-parallel-workers参数修改为slave-parallel-threads

    3) 连接至主服务使用的命令:

        一个新的参数:MASTER_USER_GTID={current_pos|slave_pos|no}

        这个参数在多主一从的试验中,总是不成功

    4)才配置从服务器的时候,最好使用replicate_ignore_db 来忽略掉一些系统库。 

原创文章,作者:以马内利,如若转载,请注明出处:http://www.178linux.com/10199