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

(1)
以马内利以马内利
上一篇 2015-12-17 14:23
下一篇 2015-12-19 10:46

相关推荐

  • Linux Basics-Linux Bash历史和其概念名词解释part1

    Linux Basics-Linux Bash历史和其概念名词解释part1 阅读本文你将知道:查看更多BashFAQ.pdf   Bash的历史及其特性   Bash的如何工作   Bash的概念解释   前提知识:      对linux有一定基础而且了解Bash的…

    Linux干货 2016-10-29
  • Linux文本处理及用户组管理命令练习

    一.文本处理基础命令 (1).  列出当前系统上所有已经登录的用户的用户名。           完成命令:who  |  cut  -d’ ‘  -f1  |  uniq  -u 示例: (2).取出最后登录到当前系统对的用户的相关信息。         完成命令:w  |  tail -1 示例: (3).取出当前系统上被用户当作…

    2018-03-11
  • CentOS7下编译安装Apache

    在Linux中通过编译源代码进行安装软件,需要GCC(GNU Compiler Collection,GNU编译器套件)的支持。通过yum安装GCC [root@localhost ~]# yum install gcc C程序源码编译安装三个步骤: 第一步:./configure  (1)通过选项传递参数,…

    Linux干货 2016-09-05
  • Linux基础 文件系统目录标准FHS

    概述 本文前半部分介绍了 Linux 文件系统目录标准 FHS (Filesystem Hierarchy Standard)。后半部分整理了个人学习 Linux 过程中涉及到的部分文件和路径,激励自己坚持更新,以期完善。 背景 由于Linux是遵循开源协议,任何人都可以根据Linux的核心代码制作和发行版本。如果每个人都按自己的喜好,在/目录下创建目录、存…

    Linux干货 2016-08-07
  • 基于keepalived的VRRP协议实现DR模型下的高可用集群

    基于keepalived的VRRP协议实现DR模型下的高可用集群 环境及配置前提说明 4台虚拟服务器都为centos6.8. 主机1,ip:192.168.25.140 做后端RS1,80端口向外部提供web服务 主机2,ip:192.168.25.141 做后端RS2,80端口向外部提供web服务 ip:192.168.25.142为lo:0接口的VIP地…

    Linux干货 2016-11-07
  • 闲玩Xen

    简述理论 虚拟化的实现 模拟技术:模拟计算机的主要硬件硬件并协调工作,但是效率很低下,所以不常用 完全虚拟化:针对cpu的虚拟来分为,基于BT技术(Guset的特权指令在ring1,Host的特权指令在ring0,Guest的特权指令由Host的ring0来参与边翻译边执行)的完全虚拟化,基于HVM(硬件辅助,Guest的特权指令在ring0,Host的特权…

    Linux干货 2016-09-26