环境准备
软件部署设计
用途 | 组件 | 备注 |
---|---|---|
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端口
架构
高可用架构拓扑
系统环境配置
关闭防火墙
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}
- 记住上面的临时管理员密码(
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中
-
启动数据节点
- 安装后第一次启动数据节点时要加上--initial参数。在以后的启动过程中,则是不能添加该参数的,否则ndbd程序会清除在之前建立的所有用于恢复的数据文件和日志文件
-
启动SQL节点
-
修改管理员账号(root)的密码
-
alter user 'root'@'localhost' identified by 'root';
-
优化配置
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
后缀来命名。
- 一组使用MyISAM存储引擎的本地副本。原权限表中添加后缀
- 备份副本创建完成后,调用mysql_cluster_move_grant_tables过程,将mysql系统表转换成NDB。
- 调用mysql_cluster_backup_privileges 过程,在mysql数据库中创建两组副本
- 它包含2步(备份和转换):
调用存储过程
CALL mysql.mysql_cluster_move_privileges();
检查确认存储过程执行结果
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;
转换为分布式特权对象表后,无论何时在任何SQL节点上创建,删除或更新其特权的MySQL用户帐户,更改都将在连接到群集的所有其他MySQL服务器上立即生效。特权分配后,连接到群集的所有新MySQL服务器都会自动参与分配。