zoukankan      html  css  js  c++  java
  • Mysql Innodb cluster集群搭建

    之前搭建过一个Mysql Ndb cluster集群,但是mysql版本是5.7的,看到官网上mysql8的还是开发者版本,所以尝试搭建下mysql Innodb cluster集群。

    • MySQL的高可用架构无论是社区还是官方,一直在技术上进行探索,这么多年提出了多种解决方案,比如MMMMHANDB ClusterGalera ClusterInnoDB Cluster, 腾讯的PhxSQLMySQL Fabric ,aliSQL
    • NDB:基于集群的引擎-数据被自动切分并复制到数个机器上(数据节点), 适合于那些需要极高查询性能和高可用性的应用, 原来是为爱立信的电信应用设计的。 NDB提供了高达99.999%的可靠性,在读操作多的应用中表现优异。 对于有很多并发写操作的应用, 还是推荐用InnoDB
    • 本次部署采用InnoDB Cluster. 每台服务器实例都运行MySQL Group Replication(冗余复制机制,内置failover
    • MGR有两种模式,一种是Single-Primary,一种是Multi-Primary,即单主或者多主。
    • 注意:Multi-Primary模式中,所有的节点都是主节点,都可以同时被读写,看上去这似乎更好,但是因为多主的复杂性,在功能上如果设置了多主模式,则会有一些使用的限制,比如不支持Foreign Keys with Cascading Constraints。

    一.工作原理

    MySQL InnoDB集群提供了一个集成的,本地的,HA解决方案。Mysq Innodb Cluster是利用组复制的 pxos 协议,保障数据一致性,组复制支持单主模式和多主模式。

    MySQL InnoDB集群由以下几部分组成:
    -   MySQL Servers with Group Replication:向集群的所有成员复制数据,同时提供容错、自动故障转移和弹性。MySQL Server 5.7.17或更高的版本。
    -   MySQL Router:确保客户端请求是负载平衡的,并在任何数据库故障时路由到正确的服务器。MySQL Router 2.1.3或更高的版本。
    -   MySQL Shell:通过内置的管理API创建及管理Innodb集群。MySQL Shell 1.0.9或更高的版本。

    各个组件的关系和工作流程如下:

    二.集群方案

    我创建了四台虚拟机,一台用来负责管理,另外三台是主从节点,一个主,两个从。

    管理节点安装mysql-shell和mysql-router,主从节点三个均安装mysql和mysql-shell

    后期名称都改为:manager,master和slave1,slave2

    mysql,mysql shell 和mysql router的安装包如下:

    mysql:mysql-8.0.17-linux-glibc2.12-x86_64.tar.xz

    mysql-shell:mysql-shell-8.0.17-linux-glibc2.12-x86-64bit.tar.gz

    mysql-router:mysql-router-8.0.17-linux-glibc2.12-x86_64.tar.xz

    根据官方的文档 https://dev.mysql.com/doc/refman/8.0/en/mysql-innodb-cluster-userguide.html,mysql-shell需要python环境,至少在2.7版本以上,所以在安装使用前,需要提前部署好python环境。

    三.环境准备(所有服务器都要操作)

    1.关闭防火墙,关闭方法因系统不同,所以不列出

    2.关闭selinux(Centos),关闭方法因系统不同,所以不列出

    3.修改/etc/hosts文件,将四台服务器的ip分别映射成manager,master和slave1,slave2

    4.优化配置

    [root@localhost ~]# cat>>/etc/sysctl.conf <<EOF
    fs.aio-max-nr = 1048576
    fs.file-max = 681574400
    kernel.shmmax = 137438953472
    kernel.shmmni = 4096
    kernel.sem = 250 32000 100 200
    net.ipv4.ip_local_port_range = 9000 65000
    net.core.rmem_default = 262144
    net.core.rmem_max = 4194304
    net.core.wmem_default = 262144
    net.core.wmem_max = 1048586
    EOF
       
    [root@localhost  ~]# sysctl -p
       
    [root@localhost  ~]# cat>>/etc/security/limits.conf <<EOF
    mysql soft nproc 65536
    mysql hard nproc 65536
    mysql soft nofile 65536
    mysql hard nofile 65536
    EOF
       
    [root@localhost  ~]# cat>>/etc/pam.d/login <<EOF
    session required /lib/security/pam_limits.so
    session required pam_limits.so
    EOF
       
    [root@localhost  ~]# cat>>/etc/profile<<EOF
    if [ $USER = "mysql" ]; then
    ulimit -u 16384 -n 65536
    fi
    EOF
       
    [root@localhost  ~]# source /etc/profile

    四.在主节点安装mysql和mysql-shell

    1.解压安装包

    tar xvf mysql-8.0.17-linux-glibc2.12-x86_64.tar.xz
    tar zxvf mysql-shell-8.0.17-linux-glibc2.12-x86-64bit.tar.gz 
    mv  mysql-8.0.17-linux-glibc2.12-x86_64 /usr/local/mysql/
    mv zxvf mysql-shell-8.0.17-linux-glibc2.12-x86-64bit /usr/local/mysql-shell/

    2.添加用户并赋权

    groupadd mysql
    useradd -g mysql mysql
    cd /usr/local/mysql/
    mkdir data
    cd ..
    chown -R mysql:mysql mysql

    3.修改环境变量

    vi /etc/profile
    .......... export PATH
    =$PATH:/usr/local/mysql-shell/bin/:/usr/local/mysql/bin/
    source /etc/profile

    4.在/etc/下增加配置文件my.cnf

    [mysqld]  
    character-set-server=utf8
    port=3306   
    socket=/tmp/mysql.sock
    basedir=/usr/local/mysql
    datadir=/usr/local/mysql/data
    log-error=/usr/local/mysql/data/mysqld.log
    pid-file=/usr/local/mysql/data/mysql.pid
    user = mysql
    tmpdir = /tmp
    default-storage-engine=INNODB
    
    
    #复制框架
    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=binlog
    binlog_format=ROW
    max_connections=200
    max_allowed_packet=16M
    
    #组复制设置
    #server必须为每个事务收集写集合,并使用XXHASH64哈希算法将其编码为散列
    transaction_write_set_extraction=XXHASH64
    #告知插件加入或创建组命名,UUID
    loose-group_replication_group_name="aaaaaaaa-aaaa-aaaa-aaaa-aaaaaaaaaaaa"
    #server启动时不自启组复制,为了避免每次启动自动引导具有相同名称的第二个组,所以设置为OFF。
    loose-group_replication_start_on_boot=off
    #告诉插件使用IP地址,端口33061用于接收组中其他成员转入连接
    loose-group_replication_local_address="master:33061"
    #启动组server,种子server,加入组应该连接这些的ip和端口;其他server要加入组得由组成员同意
    loose-group_replication_group_seeds="master:33061,slave1:33061,slave2:33061"
    loose-group_replication_ip_whitelist="master,slave1,slave2,manager"
    loose-group_replication_bootstrap_group=off
    # 使用MGR的单主模式
    loose-group_replication_single_primary_mode=on
    loose-group_replication_enforce_update_everywhere_checks=off
    disabled_storage_engines = MyISAM,BLACKHOLE,FEDERATED,CSV,ARCHIVE

    5.安装mysql

    /usr/local/mysql/bin/mysqld --initialize-insecure --basedir=/usr/local/mysql --datadir=/usr/local/mysql/data

    6.进入到mysql的base目录,设置开机自启动

    #加入到service服务
    cp support-files/mysql.server /etc/init.d/mysqld
    chmod +x /etc/init.d/mysqld
     
    #加入到开机自启动列表
    chkconfig --add mysqld

    7.登陆mysql,修改登陆密码(这里因为是不安全安装,所以密码为空,没有默认密码,登陆后直接回车就可以进入客户端页面)

    mysql> ALTER USER 'root'@'localhost' IDENTIFIED BY '123456';

    五.创建cluster集群

    1.进到master的 mysql-shell 的安装目录,登陆mysql-shell

    bin/mysqlsh
    mysql-js> shell.connect('root@localhost:3306');
    #连接成功后
    #配置实例
    dba.configureLocalInstance();
    #此时会让选择创建管理cluster的用户,我选1,使用root管理,并且允许远程登陆“%”
    #接着查看实例状态
    dba.checkInstanceConfiguration("root@localhost:3306");

    如果出现:

    You can now use it in an InnoDB Cluster.
     
    {
        "status": "ok"
    }

    说明配置成功。

    2.登陆manager管理节点,讲router和shell都解压到/usr/local/文件夹下分别为mysql-route和mysql-shell

    3.登陆manager节点的shell,连接master,创建cluster

    bin/mysqlsh 
     
    # 连接01
    mysql-js> shell.connect('root@master:3306');
     
    # 创建一个 cluster,命名为 'myCluster'
    mysql-js> var cluster = dba.createCluster('myCluster');
     
    # 创建成功后,查看cluster状态
    mysql-js> cluster.status();

    创建后,可以看到master已经添加进cluster,并且状态是读写,我这里用别人的状态图,表示一下:

    mysql-js> cluster.status();
    {
        "clusterName": "myCluster",
        "defaultReplicaSet": {
            "name": "default",
            "primary": "master:3306",
            "status": "OK_NO_TOLERANCE",
            "statusText": "Cluster is NOT tolerant to any failures.",
            "topology": {
                "master:3306": {
                    "address": "master:3306",
                    "mode": "R/W",
                    "readReplicas": {},
                    "role": "HA",
                    "status": "ONLINE"
                }
            }
        }
    }

    4.添加slave1节点

    和上面一样的方法,先安装好mysql和mysql-shell,注意配置文件中server_id需要改成

    server_id=2

    同时,

    loose-group_replication_local_address="slave1:33061"

    登陆shell,执行配置

    bin/mysqlsh 
     
    mysql-js> shell.connect('root@localhost:3306');
    mysql-js> dba.configureLocalInstance();

    停掉mysql服务,在配置文件my.cnf末尾添加配置:

    loose-group_replication_allow_local_disjoint_gtids_join=ON

    重启mysql后,通过manager节点的shell,将slave1添加到cluster:

    # 添加实例
    cluster.addInstance('root@slave1:3306');
     
    # 创建成功后,查看cluster状态
    mysql-js> cluster.status();

    成功后状态:

    mysql-js> cluster.status();
    {
        "clusterName": "myCluster",
        "defaultReplicaSet": {
            "name": "default",
            "primary": "master:3306",
            "status": "OK_NO_TOLERANCE",
            "statusText": "Cluster is NOT tolerant to any failures.",
            "topology": {
                "master:3306": {
                    "address": "master:3306",
                    "mode": "R/W",
                    "readReplicas": {},
                    "role": "HA",
                    "status": "ONLINE"
                },
                "slave1:3306": {
                    "address": "slave1:3306",
                    "mode": "R/O",
                    "readReplicas": {},
                    "role": "HA",
                    "status": "ONLINE"
                }
            }
        }
    }

    5.和slave1一样,添加slave2节点,注意server_id和loose-group_replication_local_address需要修改成3和slave2:33061

    六.安装mysql-router

    在manager节点上,安装router:

    /usr/local/mysql-route/bin/mysqlrouter --bootstrap root@master:3306 -d myrouter --user=root

    这里会在当前目录下产生mysql-router 目录, 并生成router配置文件,默认通过route连接mysql后, 6446端口连接后可以进行读写操作. 6447端口连接后只能进行只读操作.

    然后启动mysql-route

    myrouter/start.sh

    查看route进程:

    ps -ef|grep myroute 
    netstat -tunlp|grep (route的pid)
    这样就可以使用MySQL客户端连接router了.  下面验证下连接router:
     
    a) 管理节点本机mysql-shell连接:
    mysqlsh --uri root@localhost:6446
    b) 管理节点本机mysql连接:
    mysql -u root -h 127.0.0.1 -P 6446 -p
    c) 远程客户机通过route连接mysql
  • 相关阅读:
    Node.js核心模块-net
    ie8兼容rgba写法
    Node.js核心模块-http
    Node.js核心模块-fs文件系统
    js监听滚动结束
    mac本地安装全局包报错npm WARN checkPermissions
    安全测试回顾(一)
    python学习笔记(二):python数据类型
    python学习笔记(一):python简介和入门
    Centos下安装Redis
  • 原文地址:https://www.cnblogs.com/zzdbullet/p/11655434.html
Copyright © 2011-2022 走看看