zoukankan      html  css  js  c++  java
  • MySQL InnoDB Cluster

    一、InnoDB Cluster介绍

    MySQL InnoDB Cluster是MySQL官方推出完整的高可用性解决方案,MySQL InnoDB Cluster由三大组件组成:MySQL ShellMySQL RouterMySQL Group Replication。每个MySQL服务器实例都运行MySQL Group Replication,它提供了在InnoDB集群内复制数据的机制,具有内置故障转移功能。

    MySQL Cluster的部署有两种方式,一种是直接部署MySQL InnoDB Cluster,一种是基于现有的MySQL Group Replication部署,本文采用基于现有的MySQL Group Replication部署

    InnoDB Cluster不支持MySQL NDB Cluster

    二、环境准备

    主机名 IP地址 角色
    oratest51 172.16.9.51 primary
    oratest52 172.16.9.52 seconde
    test61 172.16.9.61 seconde
    node4 172.16.8.68 MySQL Router

    操作系统:CentOS Linux release 7.2.1511
    MySQL版本:mysql-5.7.26-linux-glibc2.12-x86_64
    MySQL Router版本:mysql-router-8.0.17-linux-glibc2.12-x86_64
    MySQL Shell版本:mysql-shell-8.0.17-linux-glibc2.12-x86-64bit

    下面的安装步骤前提条件是MGR、MySQL Shell已经安装好的情况下

    三、将MGR节点加入MySQL Cluster

    3.1登录所有MGR节点,并在该节点的shell中登录所有节点(包括自己),并保存密码

    MySQL  JS > shell.connect('root@172.16.9.51:3306')
    MySQL  JS > shell.connect('root@172.16.9.52:3306')
    MySQL  JS > shell.connect('root@172.16.9.61:3306')
    

    3.2检查MGR所有节点状态是否正常

     MySQL  JS > dba.checkInstanceConfiguration('root@172.16.9.52:3306')
    Please provide the password for 'root@172.16.9.52:3306': ******
    Save password for 'root@172.16.9.52:3306'? [Y]es/[N]o/Ne[v]er (default No): y
    Validating MySQL instance at 172.16.9.52:3306 for use in an InnoDB cluster...
    
    This instance reports its own address as oratest52:3306
    Clients and other cluster members will communicate with it through this address by default. If this is not correct, the report_host MySQL system variable should be changed.
    
    Checking whether existing tables comply with Group Replication requirements...
    No incompatible tables detected
    
    Checking instance configuration...
    Instance configuration is compatible with InnoDB cluster
    
    The instance '172.16.9.52:3306' is valid for InnoDB cluster usage.
    
    {
        "status": "ok"  #状态为ok
    }
    

    3.3检查my.cnf配置是否正确,只有正确才能创建集群

     MySQL  JS > dba.configureLocalInstance('root@172.16.9.51:3306')
    The instance '172.16.9.51:3306' belongs to an InnoDB cluster.
    
    Detecting the configuration file...
    Default file not found at the standard locations.
    Please specify the path to the MySQL configuration file: /etc/my.cnf    #输入my.cnf绝对路径
    Persisting the cluster settings...
    The instance '172.16.9.51:3306' was configured for use in an InnoDB cluster.
    
    The instance cluster settings were successfully persisted.
    

    3.4创建一个名为myCluster的集群

     MySQL  172.16.9.51:3306  JS > var cluster = dba.createCluster('myCluster');
    A new InnoDB cluster will be created on instance '172.16.9.51:3306'.
    
    Disabling super_read_only mode on instance '172.16.9.51:3306'.
    Validating instance at 172.16.9.51:3306...
    
    This instance reports its own address as oratest51:3306
    
    Instance configuration is suitable.
    WARNING: Instance '172.16.9.51:3306' cannot persist Group Replication configuration since MySQL version 5.7.26 does not support the SET PERSIST command (MySQL version >= 8.0.11 required). Please use the <Dba>.configureLocalInstance() command locally to persist the chang
    es.Creating InnoDB cluster 'myCluster' on '172.16.9.51:3306'...
    
    Adding Seed Instance...
    Cluster successfully created. Use Cluster.addInstance() to add MySQL instances.
    At least 3 instances are needed for the cluster to be able to withstand up to
    one server failure.
    

    3.5查看集群状态,可以发现myCluster集群目前只有一个节点

     MySQL  172.16.9.51:3306  JS > cluster.status();
    {
        "clusterName": "myCluster", 
        "defaultReplicaSet": {
            "name": "default", 
            "primary": "oratest51:3306", 
            "ssl": "DISABLED", 
            "status": "OK_NO_TOLERANCE", 
            "statusText": "Cluster is NOT tolerant to any failures.", 
            "topology": {
                "oratest51:3306": {
                    "address": "oratest51:3306", 
                    "mode": "R/W", 
                    "readReplicas": {}, 
                    "role": "HA", 
                    "status": "ONLINE"
                }
            }, 
            "topologyMode": "Single-Primary"
        }, 
        "groupInformationSourceMember": "oratest51:3306"
    }
    

    3.6添加其他MGR节点到InnoDB Cluster集群当中

    以下仅示范一个节点,添加其他节点方法也是一样

     MySQL  172.16.9.51:3306  JS > cluster.addInstance('root@oratest52:3306');
    Please provide the password for 'root@oratest52:3306': ******
    Save password for 'root@oratest52:3306'? [Y]es/[N]o/Ne[v]er (default No): y
    The safest and most convenient way to provision a new instance is through
    automatic clone provisioning, which will completely overwrite the state of
    'oratest52:3306' with a physical snapshot from an existing cluster member. To
    use this method by default, set the 'recoveryMethod' option to 'clone'.
    
    The incremental distributed state recovery may be safely used if you are sure
    all updates ever executed in the cluster were done with GTIDs enabled, there
    are no purged transactions and the new instance contains the same GTID set as
    the cluster or a subset of it. To use this method by default, set the
    'recoveryMethod' option to 'incremental'.
    
    Incremental distributed state recovery was selected because it seems to be safely usable.
    Validating instance at oratest52:3306...
    
    This instance reports its own address as oratest52:3306
    
    Instance configuration is suitable.
    WARNING: Instance 'oratest52:3306' cannot persist Group Replication configuration since MySQL version 5.7.26 does not support the SET PERSIST command (MySQL version >= 8.0.11 required). Please use the <Dba>.configureLocalInstance() command locally to persist the changes
    .A new instance will be added to the InnoDB cluster. Depending on the amount of
    data on the cluster this might take from a few seconds to several hours.
    
    Adding instance to the cluster...
    
    Monitoring recovery process of the new cluster member. Press ^C to stop monitoring and let it continue in background.
    State recovery already finished for 'oratest52:3306'
    
    WARNING: Instance 'oratest51:3306' cannot persist configuration since MySQL version 5.7.26 does not support the SET PERSIST command (MySQL version >= 8.0.11 required). Please use the <Dba>.configureLocalInstance() command locally to persist the changes.
    The instance 'oratest52:3306' was successfully added to the cluster.
    

    3.7检查InnoDB Cluster集群状态

    所有节点都添加到InnoDB Cluster中之后,检查InnoDB Cluster集群状态

     MySQL  172.16.9.51:3306  JS > cluster.status();
    {
        "clusterName": "myCluster", 
        "defaultReplicaSet": {
            "name": "default", 
            "primary": "oratest51:3306", 
            "ssl": "DISABLED", 
            "status": "OK", 
            "statusText": "Cluster is ONLINE and can tolerate up to ONE failure.", 
            "topology": {
                "oratest51:3306": {
                    "address": "oratest51:3306", 
                    "mode": "R/W", 
                    "readReplicas": {}, 
                    "role": "HA", 
                    "status": "ONLINE"
                }, 
                "oratest52:3306": {
                    "address": "oratest52:3306", 
                    "mode": "R/O", 
                    "readReplicas": {}, 
                    "role": "HA", 
                    "status": "ONLINE"
                }, 
                "test61:3306": {
                    "address": "test61:3306", 
                    "mode": "R/O", 
                    "readReplicas": {}, 
                    "role": "HA", 
                    "status": "ONLINE"
                }
            }, 
            "topologyMode": "Single-Primary"
        }, 
        "groupInformationSourceMember": "oratest51:3306"
    }
    

    四、问题汇总

    4.1获取不到集群状态,需要先定义集群再获取,如下:

     MySQL  172.16.9.51:3306  JS > var cluster = dba.getCluster()
     MySQL  172.16.9.51:3306  JS > cluster.status();
    

    4.2节点重启后,如果未加入集群,执行下面代码加入

    # mysqlsh --uri root@172.16.9.51:3306
     MySQL  172.16.9.51:3306  JS > dba.rebootClusterFromCompleteOutage()
     MySQL  172.16.9.51:3306  JS > var cluster = dba.getCluster();
     MySQL  172.16.9.51:3306  JS > cluster.rescan()
    

    4.3集群所有节点发生重启

    当集群的所有节点都offline,直接获取集群信息失败,如何重新恢复集群

    mysql-js> var cluster=dba.getCluster('mycluster')
    
    Dba.getCluster: This function is not available through a session to a standalone instance (RuntimeError)
    
    mysql-js> dba.rebootClusterFromCompleteOutage('mlampCluster'
    

    五、性能测试

    5.1在MGR的primary节点插入数据,查看seconde节点的同步情况和性能

    5.1.1在MGR的primary节点上插入600W行数据

    [root@test51 data]# mysql -uroot -p123456 < db_hq_market_sh_daykline.sql
    

    5.1.2查看seconde节点的各项性能

    avg-cpu:  %user   %nice %system %iowait  %steal   %idle
               4.24    0.00    0.64    1.85    0.00   93.27
    
    Device:            tps    kB_read/s    kB_wrtn/s    kB_read    kB_wrtn
    sda               4.00         0.00       328.80          0       1644
    sdb             352.80         0.00     21174.60          0     105873
    dm-0              4.80         0.00       328.80          0       1644
    dm-1              0.00         0.00         0.00          0          0
    
    avg-cpu:  %user   %nice %system %iowait  %steal   %idle
               6.62    0.00    0.54    1.78    0.00   91.06
    
    Device:            tps    kB_read/s    kB_wrtn/s    kB_read    kB_wrtn
    sda               0.20         0.00         0.80          0          4
    sdb             266.80         0.00     27255.60          0     136278
    dm-0              0.20         0.00         0.80          0          4
    dm-1              0.00         0.00         0.00          0          0
    
    avg-cpu:  %user   %nice %system %iowait  %steal   %idle
               2.84    0.00    0.20    1.36    0.00   95.60
    
    Device:            tps    kB_read/s    kB_wrtn/s    kB_read    kB_wrtn
    sda               6.80         0.00        72.00          0        360
    sdb             131.60         0.00     18786.10          0      93930
    dm-0              7.40         0.00        72.00          0        360
    dm-1              0.00         0.00         0.00          0          0
    
    avg-cpu:  %user   %nice %system %iowait  %steal   %idle
               7.24    0.00    0.73    2.02    0.00   90.02
    
    Device:            tps    kB_read/s    kB_wrtn/s    kB_read    kB_wrtn
    sda               0.40         0.00       148.00          0        740
    sdb             316.20         0.00     28787.50          0     143937
    dm-0              0.40         0.00       148.00          0        740
    dm-1              0.00         0.00         0.00          0          0
    
    avg-cpu:  %user   %nice %system %iowait  %steal   %idle
               3.44    0.00    0.36    1.01    0.00   95.18
    
    Device:            tps    kB_read/s    kB_wrtn/s    kB_read    kB_wrtn
    sda               4.20        12.80        39.00         64        195
    sdb             145.40         0.00     15742.60          0      68713
    dm-0              5.40        12.80        39.00         64        195
    dm-1              0.00         0.00         0.00          0          0
    
    mysql> select count(*) from t_daykline;
    +----------+
    | count(*) |
    +----------+
    |  6088654 |
    +----------+
    

    测试结果: IOPS基本维持在100到350之间,每秒写入基本在15M~22M之间,主库数据导入成功后,从库数据也实时同步完成

    六、个人总结

    • MGR架构可以实现高可用,但实现failover,则需要安装InnoDB Cluster了。MySQL Shell和MySQL Router是InnoDB Cluster集群的一部分。MySQL Shell用于安装和管理InnoDB Cluster集群,InnoDB Cluster集群通过新建的原数据库MySQL_innodb_cluster_metadata管理MGR集群状态,MySQL Router通过周期性的访问InnoDB Cluster创建的MySQL_innodb_cluster_metadata库中的元数据获取集群成员信息,再通过performance_schema的系统表获取可连接实例及其状态来实现failover和读负载均衡、读写分离的路由。
    • 创建InnoDB Cluster至少需要三台MySQL服务器,且数量为奇数个。
    • MySQL InnoDB Cluster作为MySQL官方推荐的两个集群解决方案之一,个人觉得各方面还是不错的,对功能要求不多的话可以选择此方案,第三方的高可用方案如:HAProxy、Proxsql也可以。
    WilliamZheng©版权所有 转载请注明出处! 运维架构师群:833329925
  • 相关阅读:
    SQLServer 知识点
    Entity转换为ViewModel时提供的一种转换方法
    Linq中IGrouping转换为IQueryable
    封装整形属性时对应到枚举
    新的转换列表方式
    工作态度
    EasyFrame
    NewCloud
    将博客搬至CSDN
    Html的语义化
  • 原文地址:https://www.cnblogs.com/williamzheng/p/11340604.html
Copyright © 2011-2022 走看看