MySQL NDB Cluster 使用 MySQL 服务器和 NDB存储引擎,NDBCLUSTER (也称为NDB)是一种内存存储引擎,提供高可用性和数据持久性功能。NDB Cluster将MySQL服务器与NDB的内存集群存储引擎集成在一起。NDB集群由一组主机组成,每个主机运行一个或多个进程。这些被称为节点的进程可以包括MySQL服务器(用于访问NDB数据)、数据节点(用于存储数据)、一个或多个管理服务器。
(1)管理节点(Management node):此类节点的作用是管理 NDB Cluster 中的其他节点,执行提供配置数据、启动和停止节点以及运行备份等功能。因为这种节点类型管理其他节点的配置,所以应该首先启动这种类型的节点,然后再启动任何其他节点。使用命令ndb_mgmd启动管理节点
(2)数据节点(Data node):NDB Cluster的核心功能,用于保存数据、索引,控制事务。插入的数据按照主键的哈希值分散到不同的节点组里面保存(每个节点组保存部分数据),另外每个节点组内,数据会复制到不同的数据节点上以实现冗余
(3)SQL节点(SQL node):相当于增加了NDB存储引擎的MySQL服务器,数据节点作为NDB存储引擎使用,如果使用其它的MySQL存储引擎,例如InnoDB,MyISAM等,数据将会保存在SQL节点上;应用程序通过SQL节点访问数据节点,使用方法与通常的MySQL一样,SQL节点会自动找到正确的数据节点将数据找回
节点类型 | IP | 主机名 | 占用端口 |
管理节点 | 172.16.80.56 | mgr0 | 1186 |
数据节点 | 172.16.80.57 172.16.80.58 | mgr1 mgr2 | 2202 |
SQL节点 | 172.16.80.59 | mgr3 | 3306,33060 |
社区版:MySQL :: Download MySQL Cluster
商业版:https://edelivery.oracle.com/osdc/faces/SoftwareDelivery
选择glibc二进制安装包:
(1)卸载已存在的mysql客户端
rpm -qa|grep mysql rpm -qa|grep mariadb rpm -e *** 卸载 |
(2)创建mysql目录
lvcreate -L 300G -n lvmysql vgtest mkfs.xfs /dev/vgtest/lvmysql mount /dev/vgtest/lvmysql /mysql |
(3)创建mysql用户和组
groupadd -g 512 mysql useradd -u 512 -g 512 -d /mysql mysql chown -R mysql.mysql /mysql |
(4)解压glibc包到/mysql
su - mysql cd /mysql tar -xvf /soft/mysql-cluster-commercial-8.0.29-linux-glibc2.12-x86_64.tar.gz mv mysql-cluster-commercial-8.0.29-linux-glibc2.12-x86_64 mysql-cluster-8.0.29 mkdir /mysql/data |
(5)配置环境变量
vi /etc/profile export MYSQL_CLUSTER_HOME=/mysql/mysql-cluster-8.0.29 export PATH="$PATH:${MYSQL_CLUSTER_HOME}/bin" |
(1)配置config.ini
cat /mysql/config.ini [ndbd default] # Options affecting ndbd processes on all data nodes: NoOfReplicas=2 # Number of fragment replicas,指定了每一份数据被冗余存储在不同节点上面的份数, #该参数一 般至少应该被设置成2,分段的数目为数据节点总数除以NoOfReplicas DataMemory=98M # How much memory to allocate for data storage BackupDataDir=/mysql/backup #数据节点备份目录
[ndb_mgmd] # 管理节点: HostName=172.16.80.56 DataDir=/mysql/data
[ndbd] # 数据节点 "A": HostName=172.16.80.57 NodeId=2 DataDir=/mysql/data
[ndbd] # 数据节点 "B": HostName=172.16.80.58 NodeId=3 DataDir=/mysql/data
[mysqld] # SQL节点: HostName=172.16.80.59 |
(2)配置my.cnf
cat /mysql/my.cnf [mysqld] # Options for mysqld process: ndbcluster # run NDB storage engine datadir=/mysql/data basedir=/mysql/mysql-cluster-8.0.29
[mysql_cluster] # Options for NDB Cluster processes: ndb-connectstring=172.16.80.56 # location of management server |
(3)初始化并启动管理节点
ndb_mgmd --defaults-file=/mysql/my.cnf --initial --config-file /mysql/config.ini --configdir=/mysql |
(4)重启管理节点并查看集群状态
ndb_mgm show shutdown exit 正常启动管理节点: ndb_mgmd --defaults-file=/mysql/my.cnf --config-file /mysql/config.ini --configdir=/mysql |
(1)配置my.cnf
cat /mysql/my.cnf [mysql_cluster] # Options for NDB Cluster processes: ndb-connectstring=172.16.80.56 # location of management server |
(2)启动两个ndbd数据节点
ndbd --defaults-file=/mysql/my.cnf |
(1)创建必要目录
su - mysql mkdir -p /mysql/log |
(2)创建my.cnf
cat /mysql/my.cnf [mysqld] # Options for mysqld process: ndbcluster # run NDB storage engine datadir=/mysql/data basedir=/mysql/mysql-cluster-8.0.29 log-error=/mysql/log/mysqld.log pid-file=/mysql/mysqld.pid
[mysql_cluster] # Options for NDB Cluster processes: ndb-connectstring=172.16.80.56 # location of management server |
(3)创建/etc/my.cnf软链接
ln -s /mysql/my.cnf /etc/my.cnf |
(4)创建mysqld服务并启动
cp /mysql/mysql-cluster-8.0.29/support-files/mysql.server /etc/init.d/mysqld service mysqld status service mysqld start |
(5)重置root密码
查看临时密码/mysql/log/mysqld.log
mysql -uroot -p alter user root@localhost identified by 'R00t_123'; exit mysql -uroot -pR00t_123 show engines; |
停止顺序:
SQL节点-->数据节点-->管理节点
启动顺序:
管理节点-->数据节点-->SQL节点
停止命令:
service mysqld stop(SQL节点)
ndb_mgm -e shutdown(管理节点)
启动命令:
ndb_mgmd --defaults-file=/mysql/my.cnf --config-file /mysql/config.ini --configdir=/mysql(管理节点)
ndbd --defaults-file=/mysql/my.cnf (所有数据节点)
service mysqld start(SQL节点)
(1)创建InnoDB表
create database ndb_test; use ndb_test; CREATE TABLE `test1` ( `id` int NOT NULL AUTO_INCREMENT, `name` varchar(10), PRIMARY KEY (`id`) ) ENGINE=InnoDB; |
发现InnoDB表是被建在SQL节点上的
(2)创建ndb表
CREATE TABLE `test2` ( `id` int NOT NULL AUTO_INCREMENT, `name` varchar(10) , PRIMARY KEY (`id`) ) ENGINE=ndbcluster/ndb; |
(3)测试两种表的insert/select速度
DROP PROCEDURE IF EXISTS repeatCourse;
DELIMITER $ CREATE PROCEDURE repeatCourse() BEGIN DECLARE i INT DEFAULT 1; WHILE i < 400000 DO insert into ndb_test.test2 values(null,i); SET i = i + 1; END WHILE; END $
DELIMITER ; CALL repeatCourse();
似乎是ndb表的速度更快 |