• MySQL-NDB7.6集群部署


    环境准备

    软件部署设计

    用途 组件 备注
    SQL nodes mysqld binary 也称为数据库节点,跟MySQL Server一样的功能。
    作为数据库使用,被数据节点访问。
    Data nodes ndbd or ndbmtd 使用内存存放数据,保存进数据节点的数据都会自动复制并存储到其它数据节点
    Management nodes ndb_mgmd and ndb_mgm 管理节点负责管理、配置、监控整个集群

    IP网络设计

    Node IP Address 端口
    Management node (mgmd) 192.168.10.200 1186
    SQL node (mysqld) 192.168.10.201 3308
    Data node "A" (ndbd) 192.168.10.202
    Data node "B" (ndbd) 192.168.10.203

    1186端口用于同步,3306端口

    架构

    image-20210309163058783

    高可用架构拓扑

    image-20210310110404711

    系统环境配置

    关闭防火墙

    systemctl stop firewalld.service
    systemctl disable firewalld.service
    
    systemctl status firewalld.service || systemctl disable --now firewalld.service
    

    安装系统依赖软件

    二进制包(SQL节点)
    yum -y install libaio
    
    rpm -qa|grep libaio
    

    检查操作系统是否默认安装MySQL软件

    MySQL Cluster安装之前需要将MySQL Server卸载掉

    yum list installed|grep -E 'mysql|mariadb'
    
    rpm -qa |grep -E 'mysql|mariadb'
    

    创建用户和用户组(数据节点和SQL节点)

    groupadd mysql
    useradd -g mysql -s /bin/false mysql
    

    配置环境

    cat > /etc/profile.d/mysqlEnv.sh <<-'EOF'
    export NDB_VER="7.6.16"
    export SOFT_INSTALL_DIR="/usr/local"
    export SOFT_LINK_DIR="/usr/local/mysql"
    export SOFT_LOG_DIR="${SOFT_LINK_DIR}/log"
    export SOFT_SVC_PORT="3308"
    export SOFT_DATA_DIR="/data"
    export DATA_DIR="${SOFT_DATA_DIR}/mysql${SOFT_SVC_PORT}"
    SOFT_FILE_NAME="mysql-cluster-gpl-${NDB_VER}-linux-glibc2.12-x86_64"
    
    export MYSQL_HOME=${SOFT_LINK_DIR}
    export PATH=${MYSQL_HOME}/bin:${PATH}
    EOF
    

    详细实施步骤

    软件配置

    SQL nodes配置

    每个SQL 节点配置

    解压文件并创建软链接
    . /etc/profile.d/mysqlEnv.sh
    if [[ -f "${SOFT_FILE_NAME}.tar.gz" ]]; then
        tar -xf ${SOFT_FILE_NAME}.tar.gz --no-same-owner -C ${SOFT_INSTALL_DIR}
        ln -s ${SOFT_INSTALL_DIR}/${SOFT_FILE_NAME} ${SOFT_LINK_DIR}
    else 
    	curl -LO https://cdn.mysql.com/archives/mysql-cluster-gpl-7.6/${SOFT_FILE_NAME}.tar.gz
    	# https://cdn.mysql.com/archives/mysql-cluster-gpl-7.6/mysql-cluster-gpl-7.6.16-linux-glibc2.12-x86_64.tar.gz
    fi
    
    修改软件目录权限
    [[ -d "${SOFT_DATA_DIR}/mysql${SOFT_SVC_PORT}" ]] || mkdir -p ${SOFT_DATA_DIR}/mysql${SOFT_SVC_PORT}
    
    chown -R mysql:mysql ${SOFT_INSTALL_DIR}/${SOFT_FILE_NAME}
    chown -R mysql:mysql ${SOFT_DATA_DIR}/mysql${SOFT_SVC_PORT}
    
    初始化系统数据集簇
    ${SOFT_LINK_DIR}/bin/mysqld --initialize --user=mysql --basedir=${SOFT_LINK_DIR} --datadir=${SOFT_DATA_DIR}/mysql${SOFT_SVC_PORT}
    

    image-20210310122411944

    • 记住上面的临时管理员密码(22Hp=omo<W2g),后续登录系统并修改该密码
    配置参数文件(my.cnf)
    cat > /etc/my.cnf <<-'EOF'
    [mysqld]
    server_id=1
    port=3308
    basedir = /ups/app/mysql
    datadir = /data/mysql3308
    socket = /data/mysql3308/mysql.sock
    log_error = /data/mysql3308/err.log
    pid-file = /data/mysql3308/mysqld3308.pid
    max_connections=3000
    max_user_connections=2000
    max_connect_errors=6000
    wait_timeout=600
    interactive_timeout=600
    max_allowed_packet=3500M
    ndbcluster
    default-storage-engine=ndbcluster
    symbolic-links=0
    skip-name-resolve=1
    
    [mysql_cluster]
    ndb-connectstring=192.168.10.221
    
    [client]
    default-character-set=utf8
    socket = /data/mysql3308/mysql.sock
    
    [mysql]
    default-character-set=utf8
    !includedir /etc/my.cnf.d
    EOF
    
    配置服务启动文件
    cp ${SOFT_LINK_DIR}/support-files/mysql.server /etc/rc.d/init.d/mysqld3308
    chmod +x /etc/rc.d/init.d/mysqld3308
    chkconfig --add mysqld3308
    
    检查当前的MySQL版本是否支持NDB存储引擎
    show variables like '%ndb%';
    

    Data nodes配置

    数据节点软件安装
    • 解压文件及创建软连接
    . /etc/profile.d/mysqlEnv.sh
    if [[ -f "${SOFT_FILE_NAME}.tar.gz" ]]; then
        mkdir -p ${SOFT_LINK_DIR}/bin
        tar -xf ${SOFT_FILE_NAME}.tar.gz --no-same-owner -C ${SOFT_LINK_DIR}/bin ${SOFT_FILE_NAME}/bin/{ndbd,ndbmtd}
        # ln -s ${SOFT_INSTALL_DIR}/${SOFT_FILE_NAME} ${SOFT_LINK_DIR}
    else 
    	curl -LO https://cdn.mysql.com/archives/mysql-cluster-gpl-7.6/${SOFT_FILE_NAME}.tar.gz
    	# https://cdn.mysql.com/archives/mysql-cluster-gpl-7.6/mysql-cluster-gpl-7.6.16-linux-glibc2.12-x86_64.tar.gz
    fi
    
    • 从SQL节点复制相关文件到数据节点
    mkdir -p ${SOFT_LINK_DIR}/bin
    scp ${SOFT_LINK_DIR}/bin/{ndbd,ndbmtd} node2:${SOFT_LINK_DIR}/bin
    
    修改目录权限
    chown -R mysql:mysql ${SOFT_INSTALL_DIR}/${SOFT_FILE_NAME}
    chmod +x ${SOFT_LINK_DIR}/bin/ndb*
    
    # ndb cluster 初始化需要 DataDir
    [[ -d "${SOFT_DATA_DIR}/mysql${SOFT_SVC_PORT}" ]] || mkdir -p ${SOFT_DATA_DIR}/mysql${SOFT_SVC_PORT}
    
    配置参数文件(my.cnf)
    cat > /etc/my.cnf <<-'EOF'
    [mysqld]
    port=3308
    ndbcluster
    
    [mysql_cluster]
    ndb-connectstring=192.168.10.221
    EOF
    

    Management nodes 配置

    管理节点软件安装
    • 解压文件及创建软连接
    . /etc/profile.d/mysqlEnv.sh
    if [[ -f "${SOFT_FILE_NAME}.tar.gz" ]]; then
    	mkdir -p ${SOFT_LINK_DIR}/bin
        tar -xf ${SOFT_FILE_NAME}.tar.gz --no-same-owner -C ${SOFT_LINK_DIR}/bin --strip-components=2 ${SOFT_FILE_NAME}/bin/{ndb_mgm,ndb_mgmd} 
        # ln -s ${SOFT_INSTALL_DIR}/${SOFT_FILE_NAME} ${SOFT_LINK_DIR}
    else 
    	curl -LO https://cdn.mysql.com/archives/mysql-cluster-gpl-7.6/${SOFT_FILE_NAME}.tar.gz
    	# https://cdn.mysql.com/archives/mysql-cluster-gpl-7.6/mysql-cluster-gpl-7.6.16-linux-glibc2.12-x86_64.tar.gz
    fi
    
    • 从SQL节点复制相关文件到管理节点主机
    mkdir -p ${SOFT_LINK_DIR}/bin
    scp ${SOFT_LINK_DIR}/bin/{ndb_mgm,ndb_mgmd} node1:${SOFT_LINK_DIR}/bin
    
    修改目录权限
    chown -R mysql:mysql ${SOFT_INSTALL_DIR}/${SOFT_FILE_NAME}
    chmod +x ${SOFT_LINK_DIR}/bin/ndb_mgm*
    
    配置全局参数文件(config.ini)
    cat > ${SOFT_LINK_DIR}/config.ini <<-'EOF'
    [ndbd default]
    NoOfReplicas=2
    DataMemory=80M
    DataDir=/data/mysql3308
    
    [ndb_mgmd]
    NodeId=100
    HostName=192.168.10.221
    DataDir=/data/mysql3308
    
    [ndbd]
    NodeId=1
    HostName=192.168.10.223
    DataDir=/data/mysql3308
    
    [ndbd]
    NodeId=2
    HostName=192.168.10.231
    DataDir=/data/mysql3308
    
    [mysqld]
    NodeId=51
    HostName=192.168.10.222
    EOF
    

    NDB 集群初始化配置

    集群配置文件要求

    对于4节点 NDB集群中,总共需要4个配置文件

    • 每个 data node or SQL node 需要一个 my.cnf 配置文件,用于提供下面2类信息:

      • 连接信息:告知本地节点如何找到管理节点
      • 通知MySQL server启动NDBCLUSTER存储引擎
    • management node 需要一个 config.ini 配置文件

      • 集群维护的副本数
      • 每个数据节点分配多少内存给数据和索引
      • 如何查找数据节点和SQL节点
      • 如何将数据存储到每个数据节点的磁盘上

    创建配置文件

    Data nodes(my.cnf)
    cat > /etc/my.cnf <<-'EOF'
    
    [mysqld]
    # Options for mysqld process:
    ndbcluster                      # run NDB storage engine
    
    [mysql_cluster]
    # Options for NDB Cluster processes:
    ndb-connectstring=192.168.10.200  # location of management server
    
    EOF
    
    SQL nodes(my.cnf)
    cat > /etc/my.cnf <<-'EOF'
    
    [mysqld]
    # Options for mysqld process:
    ndbcluster                      # run NDB storage engine
    
    [mysql_cluster]
    # Options for NDB Cluster processes:
    ndb-connectstring=192.168.10.200  # location of management server
    
    EOF
    
    Management node(config.ini)
    cat > ${SOFT_LINK_DIR}/config.ini <<EOF
    [ndbd default]
    # Options affecting ndbd processes on all data nodes:
    NoOfReplicas=2    # Number of fragment replicas
    DataMemory=80M    # How much memory to allocate for data storage
    IndexMemory=18M   # How much memory to allocate for index storage
                      # For DataMemory and IndexMemory, we have used the
                      # default values. Since the "world" database takes up
                      # only about 500KB, this should be more than enough for
                      # this example NDB Cluster setup.
                      # NOTE: IndexMemory is deprecated in NDB 7.6 and later; in
                      # these versions, resources for all data and indexes are
                      # allocated by DataMemory and any that are set for IndexMemory
                      # are added to the DataMemory resource pool
    ServerPort=2202   # This the default value; however, you can use any
                      # port that is free for all the hosts in the cluster
                      # Note1: It is recommended that you do not specify the port
                      # number at all and simply allow the default value to be used
                      # instead
                      # Note2: The port was formerly specified using the PortNumber
                      # TCP parameter; this parameter is no longer available in NDB
                      # Cluster 7.5.
    DataDir=${DATA_DIR}
    
    
    [ndb_mgmd]
    # Management process options:
    HostName=192.168.10.200         # Hostname or IP address of management node
    DataDir=${SOFT_LOG_DIR}         # Directory for management node log files
    
    [ndbd]
    # Options for data node "A":
                                    # (one [ndbd] section per data node)
    HostName=192.168.10.202         # Hostname or IP address
    NodeId=2                        # Node ID for this data node
    DataDir=${DATA_DIR}             # Directory for this data node's data files
    
    [ndbd]
    # Options for data node "B":
    HostName=192.168.10.203         # Hostname or IP address
    NodeId=3                        # Node ID for this data node
    DataDir=${DATA_DIR}             # Directory for this data node's data files
    
    [mysqld]
    # SQL node options:
    HostName=192.168.10.201         # Hostname or IP address
                                    # (additional mysqld connections can be
                                    # specified for this node for various
                                    # purposes such as running ndb_restore)
    EOF
    
    • [NDBD DEFAULT]:表示每个数据节点的默认配置,在每个节点的[NDBD]中不用再写这些选项,只能有一个。
      • NoOfReplicas:副本数量,数据节点数必须是副本数的整数倍。
    • [NDB_MGMD]:表示管理节点的配置,只有一个,默认的对其他节点的端口是1186,故服务器需要开放1186端口。
    • [NDBD]:表示每个数据节点的配置,可以有多个,分别写上不同数据节点的IP地址。
    • [MYSQLD]:表示SQL节点的配置,可以有多个,分别写上不同SQL节点的IP地址。

    数据节点ID必须小于49。如果计划部署大量数据节点,最好将管理节点、sql节点或api节点的ID限制为大于48的值。

    初始化配置并启动集群

    # 1. 管理节点
    ${SOFT_LINK_DIR}/bin/ndb_mgmd -f ${SOFT_LINK_DIR}/config.ini --configdir=${DATA_DIR} --initial
    
    # 2. 依次配置每一个数据节点(首次运行)
    ${SOFT_LINK_DIR}/bin/ndbd --initial
    
    # 3. 依次启动每一个SQL节点
    service mysqld3308 start
    
    • 启动管理节点

      • ndb_mgmd是mysql cluster的管理服务器,后面的-f表示后面的参数是启动的参数配置文件。如果在启动后过了几天又添加了一个数据节点,这时修改了配置文件启动时就必须加上--initial参数,不然添加的节点不会作用在mysql cluster中
      • image-20210310125810286
      • image-20210310125959990
    • 启动数据节点

      • 安装后第一次启动数据节点时要加上--initial参数。在以后的启动过程中,则是不能添加该参数的,否则ndbd程序会清除在之前建立的所有用于恢复的数据文件和日志文件
      • image-20210310130500445
      • image-20210310130732362
      • image-20210310130824817
    • 启动SQL节点

      • image-20210310131110128

      • image-20210310131134540

      • 修改管理员账号(root)的密码

        • alter user 'root'@'localhost' identified by 'root';
          
        • image-20210310131804970

    优化配置

    SQL 节点同步用户权限

    MySQL Cluster SQL API节点 中mysql.user 表为MyISAM引擎,所以每个API都要配置权限系统,MySQL已经为我们提供了共享权限脚本。这个脚本主要作用就是将mysql.user 表MyISAM引擎更换为NDBCLUSTER引擎。

    备份系统权限表(建议)

    mysqldump -uroot 
        mysql user db tables_priv columns_priv procs_priv proxies_priv > backup_file
    

    虽然mysql提供非常智能的工具完成系统表的自动转换,在转换前,还是建议手工备份系统表的数据

    加载函数

    mysql -uroot < ${SOFT_LINK_DIR}/share/ndb_dist_priv.sql
    

    检查确认导入6个过程和1个函数

    SELECT ROUTINE_NAME, ROUTINE_SCHEMA, ROUTINE_TYPE
         FROM INFORMATION_SCHEMA.ROUTINES
         WHERE ROUTINE_NAME LIKE 'mysql_cluster%'
         ORDER BY ROUTINE_TYPE;
         
    +---------------------------------------------+----------------+--------------+
    | ROUTINE_NAME                                | ROUTINE_SCHEMA | ROUTINE_TYPE |
    +---------------------------------------------+----------------+--------------+
    | mysql_cluster_privileges_are_distributed    | mysql          | FUNCTION     |
    | mysql_cluster_backup_privileges             | mysql          | PROCEDURE    |
    | mysql_cluster_move_grant_tables             | mysql          | PROCEDURE    |
    | mysql_cluster_move_privileges               | mysql          | PROCEDURE    |
    | mysql_cluster_restore_local_privileges      | mysql          | PROCEDURE    |
    | mysql_cluster_restore_privileges            | mysql          | PROCEDURE    |
    | mysql_cluster_restore_privileges_from_local | mysql          | PROCEDURE    |
    +---------------------------------------------+----------------+--------------+
    7 rows in set (0.01 sec)
    
    • mysql_cluster_move_privileges : 用于备份现有的权限表并转换成ndb
      • 它包含2步(备份和转换):
        • 调用mysql_cluster_backup_privileges 过程,在mysql数据库中创建两组副本
          • 一组使用MyISAM存储引擎的本地副本。原权限表中添加后缀_backup的本地备份表。
          • 使用NDBCLUSTER存储引擎的一组分布式副本。在原权限表在前缀ndb_ _backup后缀来命名。
        • 备份副本创建完成后,调用mysql_cluster_move_grant_tables过程,将mysql系统表转换成NDB。

    调用存储过程

    CALL mysql.mysql_cluster_move_privileges();
    

    image-20210310151227814

    检查确认存储过程执行结果

    SELECT CONCAT(
        'Conversion ',
        IF(mysql.mysql_cluster_privileges_are_distributed(), 'succeeded', 'failed'),
        '.')
        AS Result;
    
    +-----------------------+
    | Result                |
    +-----------------------+
    | Conversion succeeded. |
    +-----------------------+
    1 row in set (0.01 sec)
    
    验证备份表信息
    SELECT TABLE_NAME, ENGINE FROM INFORMATION_SCHEMA.TABLES
         WHERE TABLE_SCHEMA = 'mysql' AND TABLE_NAME LIKE '%backup'
         ORDER BY ENGINE;
    

    image-20210310151604941

    转换为分布式特权对象表后,无论何时在任何SQL节点上创建,删除或更新其特权的MySQL用户帐户,更改都将在连接到群集的所有其他MySQL服务器上立即生效。特权分配后,连接到群集的所有新MySQL服务器都会自动参与分配。

  • 相关阅读:
    华为软件研发面试题1
    中兴软件面试题2
    中兴面试题1
    排 序 算 法
    hadoop集群环境的搭建
    各种排序算法的分析及java实现
    白话经典算法系列之四 直接选择排序及交换二个数据的正确实现
    白话经典算法系列之三 希尔排序的实现
    白话经典算法系列之二 直接插入排序的三种实现
    白话经典算法系列之一 冒泡排序的三种实现
  • 原文地址:https://www.cnblogs.com/binliubiao/p/14508448.html
Copyright © 2020-2023  润新知