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

相关推荐

  • 浅述sed命令

    1、sed工作原理       sed(stream editor)是一种流编辑器,本身也是一个管道命令,可以分析编辑标准输入(standard input),包括对数据进行替换、删除、新增、选取特定行等等。运行时以行为单位,每次只处理一行的内容,因此它又被称为行编辑器。sed还可与正则表达式配合使用,从而简…

    Linux干货 2016-08-10
  • Leetcode 编程训练

    Leetcode这个网站上的题都是一些经典的公司用来面试应聘者的面试题,很多人通过刷这些题来应聘一些喜欢面试算法的公司,比如:Google、微软、Facebook、Amazon之类的这些公司,基本上是应试教育的功利主义。 我做这些题目的不是为了要去应聘这些公司,而是为了锻炼一下自己的算法和编程能力。因为我开始工作的时候基本没有这样的训练算法和编程的网站,除了…

    Linux干货 2016-08-15
  • centos6.9实现网卡bonding

    centos6.9实现网卡bonding 为什么要用bonding  将多块网卡配置同一IP地址实际中是不可能的。通过bonding,虚拟一块网卡对外提供连接,物理网卡被修改为相同的MAC地址,这样可以实现多块网卡绑定同一IP地址,对外提供服务。用于网络负载均衡和网络冗余。 工作模式  bonding的模式:0-6,即:7种模式,这里我们…

    2017-08-20
  • Linux磁盘管理详解

    linux磁盘管理 添加磁盘步骤: fdisk 管理磁盘分区 格式化文件系统。 设备挂载 开机自动挂载 UUID挂载 取消挂载点 Parted(gpt大于2G分区) 查看文件系统的使用情况。 df 查看挂载信息与磁盘使用量 du 查看使用量 查看分区状况lsblk 查看设备信息blkid linux磁盘管理 当全新安装了一块新的硬盘设备后,为了更充分、安全的…

    Linux干货 2016-09-07
  • N25第二周作业 文件管理类命令cp mv rm以及 bash特性之文件名通配

    Linux上的文件管理类命令都有哪些,其常用的使用方法及其相关示例演示。         文件管理类命令主要有cp, mv, rm          cp用于单个文件的复制,例如:  &nb…

    Linux干货 2016-12-13
  • shell编程if及find查找作业

    写一个脚本/root/bin/createuser.sh,实现如下功能:使用一个用户名做为参数,如果指定参数的用户存在,就显示其存在,否则添加之;显示添加的用户的id号等信息 [root@www sh.log]# cat createuser.sh  #!/bin/bash #author #使用一个用户名作为参数,如…

    Linux干货 2016-08-16