美文网首页
搭建MySQL innodb cluster集群模式

搭建MySQL innodb cluster集群模式

作者: frankie_cheung | 来源:发表于2020-06-30 22:20 被阅读0次

    机器信息

    机器 角色
    192.168.124.132 master
    192.168.124.130 slave
    192.168.124.133 slave

    三台机器都是centos7.5,数据库为MySQL5.7

    搭建模式

    本次我们使用的是MySQL组复制的Single-Primary Mode:因为此模式对于我们也够用,后续我们会讲一下组复制的限制和优缺点

    搭建环境配置

    • 取消防火墙或者开通配置的端口
    • 取消selinux
    • 设置hostname及hostname和ip的映射关系
      hostname的设置方式如下:
    echo "HOSTNAME=node8130" >> /etc/sysconfig/network
    echo "node8130" > /etc/hostname
    

    退出会话再次登录即可看到新的主机名
    hotsname和ip的映射(非常重要!)

    image.png

    每台机器都需要在/etc/hosts文件下写入三台机器的ip和hostname,注意是三台机器都需要写,每台机器写的内容都一样。

    组复制配置

    MySQL组复制类似于mongo的复制集,提供了故障转移(failover)和故障恢复(failback)等功能,相比较主从复制模式,具备更高的高可用性。
    搭建步骤:

    • 搭建主节点
      在你的主节点机器修改MySQL配置文件
      vim /etc/my.cnf
      在原配置文件基础上输入如下信息:
    validate_password = OFF
    character_set_server = utf8mb4
    server_id = 1
    gtid_mode = ON
    enforce_gtid_consistency = ON
    master_info_repository = TABLE 
    relay_log_info_repository = TABLE 
    binlog_checksum = NONE 
    log_slave_updates = ON 
    log_bin = mysql-bin
    binlog_format= ROW
    transaction_write_set_extraction = XXHASH64 
    loose-group_replication_group_name = '5a421130-2674-11ea-bbce-00505639ee45'
    loose-group_replication_start_on_boot = off 
    loose-group_replication_local_address = 'box9077.server.node:33061' 
    loose-group_replication_group_seeds = 'box9077.server.node:33061,box9062.slave2.node:33061,box9069.slave3.node:33061' 
    loose-group_replication_bootstrap_group = off
    

    注意配置文件里面的loose-group_replication_local_address 和loose-group_replication_group_seeds 要换成你自己的hostname,也就是上面设置的主机名和IP映射的那个。
    重启MySQL
    systemctl restart mysqld
    获取MySQL初始密码
    grep 'temporary password' /var/log/mysqld.log
    登录MySQL后,需要进行如下操作:

    ALTER USER 'root'@'localhost' IDENTIFIED BY 'MyNewPass4!'; 
    修改root用户密码
    CREATE USER 'root'@'%' IDENTIFIED by 'MyNewPass4!';  
    创建一个root@%用户
    GRANT ALL on *.* to root@'%' with grant option;
    给root@%授权
    

    组复制命令,依次执行即可

    install plugin group_replication soname 'group_replication.so';
    
    show plugins;
    
    set SQL_LOG_BIN=0;
    grant replication slave on *.* to repl@'%' identified by 'MyNewPass4!';
    flush privileges;
    set SQL_LOG_BIN=1;
    change master to master_user='repl',master_password='MyNewPass4!' for channel 'group_replication_recovery';
    
    
    set global group_replication_bootstrap_group=ON;
    start group_replication;
    set global group_replication_bootstrap_group=OFF;
    

    查询是否复制成功
    SELECT * FROM performance_schema.replication_group_members
    假如出现如下操作即是主节点操作成功

    image.png
    • 搭建两个从节点
      把主节点的my.cnf文件直接scp到其他两台从节点机器上,然后修改server_id = 1和loose-group_replication_local_address = 'box9077.server.node:33061' ,其他无需修改
      重启MySQL后,在日志文件获取root密码登录
      执行如下命令
    ALTER USER 'root'@'localhost' IDENTIFIED BY 'MyNewPass4!'; 
    修改root用户密码
    CREATE USER 'root'@'%' IDENTIFIED by 'MyNewPass4!';  
    创建一个root@%用户
    GRANT ALL on *.* to root@'%' with grant option;
    给root@%授权
    

    再进行从节点的复制操作依次执行命令即可

    install plugin group_replication soname 'group_replication.so';
    show plugins;
    set SQL_LOG_BIN=0;
    grant replication slave on *.* to repl@'%' identified by 'MyNewPass4!';
    flush privileges;
    set SQL_LOG_BIN=1;
    change master to master_user='repl',master_password='MyNewPass4!' for channel 'group_replication_recovery';
    
    start group_replication;
    
    

    假如出现

    image.png

    则表示三台机器都已经配置完成组复制

    可能遇到的报错信息:

    mysql> start group_replication;                                                                                                                                             
    ERROR 3092 (HY000): The server is not configured properly to be an active member of the group. Please see more details on error log.
    

    mysqld.log错误信息如下

    2020-06-28T14:51:36.520482Z 0 [ERROR] Plugin group_replication reported: 'The member contains transactions not present in the group. The member will now exit the group.'   
    
    

    解决方式为:在出现该节点MySQL下执行:reset master;
    然后再次执行start group_replication;即可。
    至此MySQL组复制已经配置完成!

    创建innodb cluster

    由于我们是使用MySQL组复制来搭建innodb cluster,所以我们需要在主节点安装mysql shell
    yum install mysql-shell -y
    mysqlsh --help提示连接方式如下

    Usage examples:                                                                                                                                                             
    $ mysqlsh root@localhost/schema                                                                                                                                             
    $ mysqlsh mysqlx://root@some.server:3307/world_x                                                                                                                            
    $ mysqlsh --uri root@localhost --py -f sample.py sample param                                                                                                               
    $ mysqlsh root@targethost:33070 -s world_x -f sample.js                                                                                                                     
    $ mysqlsh -- util check-for-server-upgrade root@localhost --output-format=JSON                                                                                              
    $ mysqlsh mysqlx://user@host/db --import ~/products.json shop  
    

    我们使用mysqlsh root@localhost来进行登录,输入密码后,进入mysqlsh命令行,默认为js模式,执行如下命令创建集群
    var cluster = dba.createCluster('prodCluster', {adoptFromGR: true});
    假如出现如下信息,则表码集群创建完成

    A new InnoDB cluster will be created based on the existing replication group on instance '/var%2Flib%2Fmysql%2Fmysql.sock'.
    
    Creating InnoDB cluster 'prodCluster' on 'box9077.server.node:3306'...
    
    Adding Seed Instance...
    NOTE: Metadata schema found in target instance
    Adding Instance 'box9077.server.node:3306'...
    Adding Instance 'box9062.slave2.node:3306'...
    Adding Instance 'box9069.slave3.node:3306'...
    Resetting distributed recovery credentials across the cluster...
    WARNING: Instance 'box9077.server.node: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.
    WARNING: Instance 'box9062.slave2.node:3306' cannot persist configuration since MySQL version 5.7.30 does not support the SET PERSIST command (MySQL version >= 8.0.11 required). Please use the dba.configureLocalInstance() command locally to persist the changes.
    WARNING: Instance 'box9069.slave3.node:3306' cannot persist configuration since MySQL version 5.7.30 does not support the SET PERSIST command (MySQL version >= 8.0.11 required). Please use the dba.configureLocalInstance() command locally to persist the changes.
    Cluster successfully created based on existing replication group.
    
    

    此时我们使用cluster.status(); 可以看到创建成功的集群状态信息

    {
        "clusterName": "prodCluster", 
        "defaultReplicaSet": {
            "name": "default", 
            "primary": "box9077.server.node:3306", 
            "ssl": "DISABLED", 
            "status": "OK", 
            "statusText": "Cluster is ONLINE and can tolerate up to ONE failure.", 
            "topology": {
                "box9062.slave2.node:3306": {
                    "address": "box9062.slave2.node:3306", 
                    "mode": "R/W", 
                    "readReplicas": {}, 
                    "role": "HA", 
                    "status": "ONLINE"
                }, 
                "box9069.slave3.node:3306": {
                    "address": "box9069.slave3.node:3306", 
                    "mode": "R/O", 
                    "readReplicas": {}, 
                    "role": "HA", 
                    "status": "ONLINE"
                }, 
                "box9077.server.node:3306": {
                    "address": "box9077.server.node:3306", 
                    "mode": "R/W", 
                    "readReplicas": {}, 
                    "role": "HA", 
                    "status": "ONLINE"
                }
            }, 
            "topologyMode": "Single-Primary"
        }, 
        "groupInformationSourceMember": "box9077.server.node:3306"
    }
     MySQL  localhost  JS > 
    
    

    设置mysqlrouter

    当主节点挂掉后,组复制会自动选择两个从节点的某一个作为主节点,但是应用连接主节点的IP后,挂了需要手动切换,所以我们使用MySQL自带的中间件MySQL router来进行应用透明,该中间件最新版可以支持5000个连接,以前只支持500个。
    建议在三台机器都安装mysql router
    安装方式如下
    yum install mysql-router -y

    执行如下命令开始自动配置路由信息
    mysqlrouter --bootstrap root@node8132:3306 --user=root --force
    出现如下信息则代表路由设置完成。

    mysqlrouter --bootstrap root@node8132:3306 --user=root --force
    Please enter MySQL password for root: 
    # Bootstrapping system MySQL Router instance...
    
    - Creating account(s) (only those that are needed, if any)
    - Verifying account (using it to run SQL queries that would be run by Router)
    - Storing account in keyring
    - Adjusting permissions of generated files
    - Creating configuration /etc/mysqlrouter/mysqlrouter.conf
    
    Existing configuration backed up to '/etc/mysqlrouter/mysqlrouter.conf.bak'
    
    # MySQL Router configured for the InnoDB Cluster 'prodCluster'
    
    After this MySQL Router has been started with the generated configuration
    
        $ /etc/init.d/mysqlrouter restart
    or
        $ systemctl start mysqlrouter
    or
        $ mysqlrouter -c /etc/mysqlrouter/mysqlrouter.conf
    
    the cluster 'prodCluster' can be reached by connecting to:
    
    ## MySQL Classic protocol
    
    - Read/Write Connections: localhost:6446
    - Read/Only Connections:  localhost:6447
    
    ## MySQL X protocol
    
    - Read/Write Connections: localhost:64460
    - Read/Only Connections:  localhost:64470
    
    

    可以看到,6446端口为读写,6447只可以读

    mysqlrouter -c /etc/mysqlrouter/mysqlrouter.conf
    开启路由,然后就可以使用路由进行数据库连接了。
    至此MySQL innodb cluster集群就部署完成

    假如需要更好的高可用性和负载均衡,可以考虑使用keepalived+haproxy组合。

    相关文章

      网友评论

          本文标题:搭建MySQL innodb cluster集群模式

          本文链接:https://www.haomeiwen.com/subject/qdufqktx.html