Mysql8 NDB集群二进制解压安装配置图解
声明与简介
本文的数据来自网络,部分代码也有所参照,这里做了注释和延伸,旨在技术交流,如有冒犯之处请联系博主及时处理。本文主要介绍mysql的NDB集群的配置及操作。
注:1 当前的NDB SQL节点采用二进制的方式(免安装)安装在VVMware虚拟机内。
2 当前虚拟机内mysql运行在Linux的Centos 8内,版本号是 8.0.23、端口号3306。
3 host_128是管理节点、Host_131、host_132是SQL节点、Host_129、host_130 是数据节点
NDB官方介绍
- NDBCLUSTER (又称NDB)是一个内存存储引擎具有高可用性和数据持久性的特征。
- Management node: 管理节点在集群中担当管理角色。它主要提供配置数据节点、启动、关闭节点和备份等方面的功能。.
- Data node: 数据节点担当存储角色。针对NoOfReplicas参数如果它为2,则会对应4个数据节点,通过数据的冗余(存储更多数据镜像)来达到可高用的目的。
- SQL node: 通过SQL节点客户端可以访问集群数据,区别于传统mysql server,这里的存储引擎是NDBCLUSTER,即可该节点的启动方式里带了NDB集群参数。
NDB工作流程
MySQL NDB Cluster Workflow:
SQL节点安装
下载mysql-cluster二进制包
下载mysql-cluster-8.0.23并传送到CentOS服务器内。当前执行环境是其中一个SQL节点host_132。
解压mysql-cluster二进制包
# 切换到二进制包的目录并解压
cd /root/softwares/mysql/mysqlcluster
tar –zxvf mysql-cluster-8.0.23-linux-glibc2.12-x86_64.tar.gz
配置mysql环境变量
#为方便mysql相关命令的引用,配置环境变量
vi /etc/profile
#export MYSQL_CLUSTER_HOME=/root/softwares/mysql/mysqlcluster/mysql-cluster-8.0.23-linux-glibc2.12-x86_64
#${MYSQL_CLUSTER_HOME}/bin 为新增部分,原有的保留
#export PATH=${JAVA_HOME}/bin:$PATH:${KETTLE_HOME}:${MYSQL_CLUSTER_HOME}/bin
初始化mysql
# 切换到mysql-cluster主目录初始化mysql
cd mysql-cluster-8.0.23-linux-glibc2.12-x86_64/bin
# mysqld --initialize --user=mysql
mysqld --initialize --user=mysql --datadir=/data/mysql/
#临时密码要么在控制台要么在/var/log/mysqld.log内
修改配置文件
这里 /etc/my.cnf需要配置
#目录位置供参考,修改需根据自己实际情况。
basedir=/root/softwares/mysql/mysqlcluster/mysql-cluster-8.0.23-linux-glibc2.12-x86_64/datadir=/data/mysql/
log-error=/var/log/mysqld.log
pid-file=/data/pid/mysqld/mysqld.pid
#basedir=<path-to-mysql-installation-directory>,即mysql二进制文件的解压目录、
其中datadir、log-error、pid-file三个文件夹mysql用户都得有权限。以pid-file参数为例:
#创建pid目录和文件并赋权于mysql用户
mkdir -p /data/pid/mysqld
chown mysql:mysql /data/pid/mysqld
chmod +755 /data/pid/mysqld
配置mysql服务
#配置成linux 服务
cp ../support-files/mysql.server /etc/init.d/mysqld
service mysqld start
配置libtinfo.so链接
#链接libtinfo.so.5
ln -s /usr/lib64/libtinfo.so.6.1 /usr/lib64/libtinfo.so.5
客户端修改初始密码
#客户端登入并修改初始密码
mysql –uroot -p 'xG1m:9lsw3V;'
alter user root@localhost identified by 'root1234';
注:同理配置另外个SQL节点(即host_131)重复以上操作。
#SCP到其它SQL节点(当前演示环境指的是host_131),做以上类似操组。
scp -r mysql-cluster-8.0.23-linux-glibc2.12-x86_64 root@host_132:/root/softwares/mysql/mysqlcluster/
Data数据节点安装
拷贝数据节点命令
#Data 节点数据节点,每个data节点上都要执行以下操作。当前执行环境为sql节点的host_132。
scp -r ./ndbd root@host_129:/usr/local/bin/
scp -r ./ndbmtd root@host_129:/usr/local/bin/
management 节点安装
拷贝管理节点命令
#拷贝管理节点命令,当前执行环境为host_132
scp -r ./ndb_mgm* root@host_128:/usr/local/bin/
配置NDB集群
配置SQL数据节点my.cnf
数据节点、SQL节点里的/etc/my.cnf里新增ndbcluser相关配置。这里的ndb-connectstring即对应管理节点IP即host_128。
ndbcluster
[mysql_cluster]
ndb-connectstring=192.168.111.128
如果数据节点无/etc/my.cnf,需要手动创建。该文件的权限见:
配置management 节点
#创建配置NDB管理节点配置文件
mkdir /var/lib/mysql-cluster
cd /var/lib/mysql-cluster
vi config.ini
#详细见下文
[ndbd default]
# Options affecting ndbd processes on all data nodes:
NoOfReplicas=1 # Number of fragment replicas
DataMemory=98M # How much memory to allocate for data storage
[ndb_mgmd]
# Management process options:
HostName=192.168.111.128 # Hostname or IP address of management node
DataDir=/var/lib/mysql-cluster # Directory for management node log files
[ndbd]
# Options for data node "A":
# (one [ndbd] section per data node)
HostName=192.168.111.129 # Hostname or IP address
NodeId=2 # Node ID for this data node
DataDir=/data/mysql # Directory for this data node's data files
[ndbd]
# Options for data node "B":
HostName=192.168.111.130 # Hostname or IP address
NodeId=3 # Node ID for this data node
DataDir=/data/mysql # Directory for this data node's data files
[mysqld]
# SQL node options:
HostName=192.168.111.131 # Hostname or IP address
# (additional mysqld connections can be
# specified for this node for various
# purposes such as running ndb_restore)
[mysqld]
# SQL node options:
HostName=192.168.111.132 # Hostname or IP address
配置libtinfo.so链接
#登入host_128管理节点,链接libtinfo.so.5
ln -s /usr/lib64/libtinfo.so.6.1 /usr/lib64/libtinfo.so.5
启动管理节点
启动管理节点
#启动管理节点host_128上启动管理进程
cd /usr/local/bin
./ndb_mgmd --initial -f /var/lib/mysql-cluster/config.ini --configdir=/var/lib/mysql-cluster/
##查看管理节点相关进程已启动
ps aux|grep ndb_mgmd
启动数据节点
#host_129、host_130两数据节点上启动进程。
cd /usr/local/bin
./ndbd
启动SQL 节点
#host_131、host_132两sql节点启动服务
service mysqld start
管理节点查看状态
#host_128管理节点查看NDB集群状态
cd /usr/local/bin
./ndb_mgm;
Show;
注:这里因为防火墙的原因,集群的数据节点和SQL节点并未加入。
关闭管理节点数据节点防火墙
#关闭防火墙或考虑永久关闭
systemctl stop firewalld.service
关闭管理节点、数据节点的防火墙后再查看NDB集群的状态。
验证NDB集群
数据库同步
-- 在一个sql节点上创建数据库和表,在另外个sql节点上查看。比如这里在host_131上创建数据test_ndb,并在当前节点host_131上查询系统表。
CREATE DATABASE test_ndb CHARACTER SET utf8 COLLATE utf8_general_ci;
SELECT @@hostname,SCHEMA_NAME AS `Database` FROM INFORMATION_SCHEMA.SCHEMATA WHERE SCHEMA_NAME='test_ndb';
-- 在另外个sql节点host132上执行数据库系统表查询,可见元数据已同步。
SELECT @@hostname,SCHEMA_NAME AS `Database` FROM INFORMATION_SCHEMA.SCHEMATA WHERE SCHEMA_NAME='test_ndb';
NDB引擎表
-- 在一个Sql节点Host_132上执行表创建和插入操作,当前表的存储引擎是NDB
CREATE TABLE `City_NDB` (
`ID` int(11) NOT NULL auto_increment,
`Name` char(35) NOT NULL default '',
`CountryCode` char(3) NOT NULL default '',
`District` char(20) NOT NULL default '',
`Population` int(11) NOT NULL default '0',
PRIMARY KEY (`ID`)
) ENGINE=NDBCLUSTER DEFAULT CHARSET=utf8;
INSERT INTO `City_NDB ` VALUES (1,'Kabul','AFG','Kabol',1780000);
INSERT INTO `City_NDB M` VALUES (2,'Qandahar','AFG','Qandahar',237500);
INSERT INTO `City_NDB ` VALUES (3,'Herat','AFG','Herat',186800);
Use test_ndb;
-- 分别在两个SQL节点执行数据检索,会看到表数据会同步。
SELECT @@hostname,A.* FROM City_NDB A;
注:表的引擎也可以通过修改的方式更新成NDBCLUSTER。如:
-- 修改表的存储引擎为NDBCLUSTER的示例
ALTER TABLE City ENGINE=NDBCLUSTER;
非NDB引擎表
-- 仅在一个sql节点host_130上执行表创建,这里的引擎指定为MyISAM
CREATE TABLE `City_MyISAM` (
`ID` int(11) NOT NULL auto_increment,
`Name` char(35) NOT NULL default '',
`CountryCode` char(3) NOT NULL default '',
`District` char(20) NOT NULL default '',
`Population` int(11) NOT NULL default '0',
PRIMARY KEY (`ID`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8;
INSERT INTO `City_MyISAM` VALUES (1,'Kabul','AFG','Kabol',1780000);
INSERT INTO `City_MyISAM` VALUES (2,'Qandahar','AFG','Qandahar',237500);
INSERT INTO `City_MyISAM` VALUES (3,'Herat','AFG','Herat',186800);
-- 分别在两个SQL节点执行数据检索
SELECT @@hostname,A.* FROM City_MyISAM A;
Host_131上执行结果:
Host_132上执行则报错,因为非NDB引擎,表的元数据无法同步。
节点故障
假设下线sql节点host_131,查看下集群状态,此时只有host_132可以访问。
#sql节点host_131上执行服务停止命令
service mysqld stop;
-- 另一sql节点host_132通过客户端访问
SELECT @@hostname,A.* FROM City_NDB A;
同理数据节点也有类似结论。
关闭集群
如果是shell环境则可以通过如下命令关闭
#关闭管理节点
ndb_mgm -e shutdown
如果已经进入ndb_mgm则输入shutdown即可。该命令会停止管理节点和数据节点的NDB的相关进程。而SQL节点则需要手动的可通过如下命令停止:
#关闭mysql 服务
mysqladmin shutdown
#service mysqld stop
开启集群
#Step 1: 启动management管理节点(host_128)
cd /usr/local/bin
./ndb_mgmd --initial -f /var/lib/mysql-cluster/config.ini --configdir=/var/lib/mysql-cluster/
#Step 2: 启动data数据节点(host_129、host_130)
cd /usr/local/bin
./Ndbd
#启动sql节点(host_131、host_132)
mysqld_safe &
#service mysqld start