mysql分布式架构测试

mysql分布式架构测试

目录

机器准备

主机名称 ip地址 作用
mysql_test1 10.1.1.176 管理节点
mysql_test2 10.1.1.177 SQL节点
mysql_test3 10.1.1.178 SQL节点
podB 10.1.1.172 数据节点
podC 10.1.1.173 数据节点

mysql cluster介绍

Mysql cluster的数据更新使用读已提交隔离级别(read-committedisolation)来保证所有节点数据的一致性,使用两阶段提交机制(two-phasedcommit)保证所有节点都有相同的数据(如果任何一个写操作失败,则更新失败)。

管理节点(MGM):这类节点的作用是管理MySQLCluster内的其他节点,如提供配置数据,并停止节点,运行备份等。由于这类节点负责管理其他节点的配置,应该在启动其他节点之前启动这类节点。MGM节点是用命令“ndb_mgmd”启动的。

数据节点(NDB):这类节点用于保存Cluster的数据,数据节点的数目与副本的数目相关,是片段的倍数。例如,对于两个副本,每个副本有两个片段,那么就有4个数据节点,没有必要设定过多的副本,在NDB中数据会尽量的保存在内存中。数据节点使用命令“ndb”启动的;

SQL节点:这是用来访问Cluster数据的节点,对于MySQL Cluster,客户端节点是使用NDB Cluster存储引擎的传统MySQL服务器。通常,SQL节点使用命令“mysqld-ndbcluster”启动的;

MySQL cluster的复制原理

1.Master执行提交语句时,事务被发送到slave,slave开始准备事务的提交。
2.每个slave都要准备事务,然后向master发送OK(或ABORT)消息,表明事务已经准备好(或者无法准备该事务)。
3.Master等待所有Slave发送OK或ABORT消息,如果Master收到所有 Slave的OK消息,它就会向所有Slave发送提交消息,告诉Slave提交该事务;如果 Master收到来自任何一个Slave的ABORT消息,它就向所有 Slave发送ABORT消息,告诉Slave去中止事务。
4.每个Slave等待来自Master的OK或ABORT消息。如果Slave收到提交请求,它们就会提交事务,并向Master发送事务已提交 的确认;如果Slave收到取消请求,它们就会撤销所有改变并释放所占有的资源,从而中止事务,然后向Masterv送事务已中止的确认。
5.Master收到来自所有Slave的确认后,就会报告该事务被提交(或中止),然后继续进行下一个事务处理。
由于同步复制一共需要4次消息传递,故mysql cluster的数据更新速度比单机mysql要慢。所以mysql cluster要求运行在千兆以上的局域网内,节点可以采用双网卡,节点组之间采用直连方式。

下载安装包

官网地址:

下载地址:

https://downloads.mysql.com/archives/get/p/14/file/mysql-cluster-gpl-7.6.16-linux-glibc2.12-x86_64.tar.gz

通用节点执行项

cd /usr/local/src 
wget https://downloads.mysql.com/archives/get/p/14/file/mysql-cluster-gpl-7.6.16-linux-glibc2.12-x86_64.tar.gz
tar -xf mysql-cluster-gpl-7.6.16-linux-glibc2.12-x86_64.tar.gz  -C /usr/local/
mv  mysql-cluster-gpl-7.6.16-linux-glibc2.12-x86_64 mysql

安装管理节点


1、拷贝命令
cp mysql-cluster/bin/ndb* /usr/local/bin/
命令说明
#ndb_mgm,ndb客户端命令
#ndb_mgmd,ndb管理节点启动命令 
#ndb_mgm是ndb_mgmd(MySQL Cluster Server)的客户端管理工具,通过它可以方便的检查Cluster

2、 配置文件
#创建数据库集群配置文件
mkdir /var/lib/mysql-cluster
cat>>/var/lib/mysql-cluster/config.ini<<EOF
[ndbd default]
NoOfReplicas=2   ##定义在Cluster环境中相同数据的份数,最大为4
DataMemory=2G    ##每个数据节点中给数据分配的内存
IndexMemory=100M  ##每个数据节点中给索引分配的内存
MaxNoOfAttributes=20480 ##该参数用于设置簇中触发程序对象的最大数目。该参数的默认值为768,不修改建表时可能会报708错误

[ndb_mgmd]
NodeId=1
datadir=/var/lib/mysql
HostName=10.1.1.176

[ndbd]
HostName=10.1.1.172
DataDir=/usr/local/mysql/data
NodeId=2

[ndbd]
HostName=10.1.1.173
DataDir=/usr/local/mysql/data
NodeId=3

[mysqld]
HostName=10.1.1.177
NodeId=4

[mysqld]
HostName=10.1.1.178
NodeId=5


#配置参数说明
[NDBD DEFAULT]:表示每个数据节点的默认配置,在每个节点的[NDBD]中不用再写这些选项,只能有一个。
NoOfReplicas:副本数量,数据节点数必须是副本数的整数倍。
[NDB_MGMD]:表示管理节点的配置,只有一个,默认的对其他节点的端口是1186,故服务器需要开放1186端口。
[NDBD]:表示每个数据节点的配置,可以有多个,分别写上不同数据节点的IP地址。
[MYSQLD]:表示SQL节点的配置,可以有多个,分别写上不同SQL节点的IP地址。

3、 启动管理节点
ndb_mgmd -f /var/lib/mysql-cluster/config.ini --initial
MySQL Cluster Management Server mysql-5.7.32 ndb-7.6.16
2023-02-16 13:40:15 [MgmtSrvr] WARNING  -- at line 4: [DB] IndexMemory is deprecated, will use Number bytes on each ndbd(DB) 
node allocated for storing indexes instead

特别注意:(#--initial:第一次启动时加上,其它时候不要加,不然会数据清空,除非是在备份、恢复或配置变化后重启时)

📌(#--initial:第一次启动时加上,其它时候不要加,不然会数据清空,除非是在备份、恢复或配置变化后重启时)

安装数据节点

1、添加配置文件
vim /etc/my.cnf
[mysqld]
ndbcluster
 
datadir=/usr/local/mysql/data
basedir=/usr/local/mysql
character_set_server=utf8
default-storage-engine=ndbcluster
port=3306
 
[mysqld_safe]
log-error=/var/log/mysqld.log
pid-file=/var/run/mysqld/mysqld.pid
 
[mysql_cluster]
ndb-connectstring=10.1.1.176:1186

2、安装mysql数据库
 ##添加MySQL用户
   groupadd mysql
   useradd mysql -g mysql
 ##授权用户
   cd /usr/local/mysql/
   chown -R root .
 ##创建data目录,并把data目录设置所有者为mysql
   mkdir data
   chown -R mysql data
 #把mysql的目录改成所属组为mysql
    chgrp -R mysql .

3、初始化mysql
   cd /usr/local/mysql/bin
   ./mysqld --initialize --user=mysql --basedir=/usr/local/mysql/ --datadir=/usr/local/mysql/data/

出现问题

原因:系统中缺少相应的依赖包

解决办法:

apt install  libaio-dev
#初始成功提示
root@podC:/usr/local/mysql/bin# ./mysqld --initialize --user=mysql --basedir=/usr/local/mysql/ --datadir=/usr/local/mysql/data/
2023-02-20T07:48:55.535477Z 0 [Warning] TIMESTAMP with implicit DEFAULT value is deprecated. Please use --explicit_defaults_for_timestamp server option (see documentation for more details).
2023-02-20T07:48:55.830272Z 0 [Warning] InnoDB: New log files created, LSN=45790
2023-02-20T07:48:55.874636Z 0 [Warning] InnoDB: Creating foreign key constraint system tables.
2023-02-20T07:48:55.932568Z 0 [Warning] No existing UUID has been found, so we assume that this is the first time that this server has been started. Generating a new UUID: 06ffd8da-b0f3-11ed-a20d-005056b68ebe.
2023-02-20T07:48:55.934077Z 0 [Warning] Gtid table is not ready to be used. Table 'mysql.gtid_executed' cannot be opened.
2023-02-20T07:48:56.732318Z 0 [Warning] CA certificate ca.pem is self signed.
2023-02-20T07:48:57.010025Z 1 [Note] A temporary password is generated for root@localhost: atlyOl9ktN+f

##其他可能出现的问题
cd /usr/local/mysql
./bin/mysqld --initialize --user=mysql --basedir=/usr/local/mysql/ --datadir=/usr/local/mysql/data/ 初始化无显示提示。


4、设置mysql服务开机自启动
cp support-files/mysql.server /etc/init.d/  ##mysql.server不用改名为mysqld

systemctl daemon-reload

##启动mysqld
systemctl start mysqld
##注意此刻启动的是mysqld,而不是MySQL,对应的启动文件为/etc/init.d/mysql.server 
##查看mysqld状态
oot@podB:/etc/init.d# systemctl status mysqld.service 
● mysqld.service
   Loaded: not-found (Reason: No such file or directory)
   Active: active (running) since Mon 2023-02-20 13:43:38 CST; 4h 55min ago
   CGroup: /system.slice/mysqld.service
           ├─14368 /bin/sh /usr/local/mysql/bin/mysqld_safe --datadir=/usr/local/mysql/data --pid-file=/usr/local/mysql/data/podB.pid
           └─14556 /usr/local/mysql/bin/mysqld --basedir=/usr/local/mysql --datadir=/usr/local/mysql/data --plugin-dir=/usr/local/mysql/lib/plugin --user=mysql --log-error=/var/l

Feb 20 13:43:03 podB systemd[1]: Starting LSB: start and stop MySQL...
Feb 20 13:43:38 podB mysqld[14349]: Starting MySQL................................... *
Feb 20 13:43:38 podB systemd[1]: Started LSB: start and stop MySQL.

5、修改mysql密码
root@podB:/usr/local/mysql/bin# ./mysql -uroot -p 
Enter password: 
Welcome to the MySQL monitor.  Commands end with ; or \g.
Your MySQL connection id is 4
Server version: 5.7.32-ndb-7.6.16-cluster-gpl

Copyright (c) 2000, 2020, Oracle and/or its affiliates. All rights reserved.

Oracle is a registered trademark of Oracle Corporation and/or its
affiliates. Other names may be trademarks of their respective
owners.

Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.

mysql>set password for root@localhost = password('ytd2020')
6、启动数据节点
cd /usr/local/mysql
root@podB:/usr/local/mysql/bin# ./ndbd --initial
2023-02-21 09:37:28 [ndbd] INFO     -- Angel connected to '10.1.1.176:1186'
2023-02-21 09:37:28 [ndbd] INFO     -- Angel allocated nodeid: 2


特别注意:仅应在首次启动ndbd时,或在备份/恢复数据或配置文件发生变化后重启ndbd时使用“--initial”参数。因为该参数会使节点删除由早期ndbd实例创建的、用于恢复的任何文件,包括用于恢复的日志文件。

📌注意,仅应在首次启动ndbd时,或在备份/恢复数据或配置文件发生变化后重启ndbd时使用“--initial”参数。因为该参数会使节点删除由早期ndbd实例创建的、用于恢复的任何文件,包括用于恢复的日志文件。

配置安装sql节点

1、配置my.cnf文件
vim /etc/my.cnf
[mysqld]
ndbcluster
datadir=/usr/local/mysql/data
basedir=/usr/local/mysql
character_set_server=utf8
default-storage-engine=ndbcluster
port=3306

[mysqld_safe]
log-error=/var/log/mysqld.log
pid-file=/var/run/mysqld/mysqld.pid
 
[mysql_cluster]
ndb-connectstring=10.1.1.176:1186

##添加用户 
groupadd mysql
useradd mysql -g mysql
##授权
cd /usr/local/mysql/
chown -R root .
mkdir data
chown -R mysql data
chgrp -R mysql .
##安装依赖
cd /usr/local/mysql/bin
apt install  libaio-dev

##初始化mysql
root@mysql_test2:/usr/local/mysql/bin# ./mysqld --initialize --user=mysql --basedir=/usr/local/mysql/ --datadir=/usr/local/mysql/data/
2023-02-21T01:51:26.488496Z 0 [Warning] TIMESTAMP with implicit DEFAULT value is deprecated. Please use --explicit_defaults_for_timestamp server option (see documentation for more details).
2023-02-21T01:51:26.675047Z 0 [Warning] InnoDB: New log files created, LSN=45790
2023-02-21T01:51:26.709913Z 0 [Warning] InnoDB: Creating foreign key constraint system tables.
2023-02-21T01:51:26.766154Z 0 [Warning] No existing UUID has been found, so we assume that this is the first time that this server has been started. Generating a new UUID: 40b6898a-b18a-11ed-b845-005056b6220f.
2023-02-21T01:51:26.767294Z 0 [Warning] Gtid table is not ready to be used. Table 'mysql.gtid_executed' cannot be opened.
2023-02-21T01:51:27.937265Z 0 [Warning] CA certificate ca.pem is self signed.
2023-02-21T01:51:28.155398Z 1 [Note] A temporary password is generated for root@localhost: MistWZ/t9suM

2、加入开机自启动
cp support-files/mysql.server /etc/init.d/  ##mysql.server不用改名为mysqld

systemctl daemon-reload

systemctl start mysqld
root@mysql_test2:/usr/local/src# systemctl status mysqld.service 
● mysqld.service - LSB: start and stop MySQL
   Loaded: loaded (/etc/init.d/mysqld; bad; vendor preset: enabled)
   Active: active (running) since Tue 2023-02-21 10:19:39 CST; 47s ago
     Docs: man:systemd-sysv-generator(8)
  Process: 21998 ExecStart=/etc/init.d/mysqld start (code=exited, status=0/SUCCESS)
    Tasks: 32
   Memory: 172.5M
      CPU: 592ms
   CGroup: /system.slice/mysqld.service
   
3、修改MySQL密码
./bin/mysql -uroot -p
Enter password: 
Welcome to the MySQL monitor.  Commands end with ; or \g.
Your MySQL connection id is 4
Server version: 5.7.32-ndb-7.6.16-cluster-gpl

Copyright (c) 2000, 2020, Oracle and/or its affiliates. All rights reserved.

Oracle is a registered trademark of Oracle Corporation and/or its
affiliates. Other names may be trademarks of their respective
owners.

Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.
set password for root@localhost = password('ytd2020');


4、管理节点查看集群状态
root@mysql_test1:/var/lib/mysql-cluster# ndb_mgm
-- NDB Cluster -- Management Client --

ndb_mgm> show
Cluster Configuration
---------------------
[ndbd(NDB)]  2 node(s)
id=2  @10.1.1.172  (mysql-5.7.32 ndb-7.6.16, Nodegroup: 0, *)
id=3  @10.1.1.173  (mysql-5.7.32 ndb-7.6.16, Nodegroup: 0)

[ndb_mgmd(MGM)]  1 node(s)
id=1  @10.1.1.176  (mysql-5.7.32 ndb-7.6.16)

[mysqld(API)]  2 node(s)
id=4  @10.1.1.177  (mysql-5.7.32 ndb-7.6.16)
id=5  @10.1.1.178  (mysql-5.7.32 ndb-7.6.16)

查看集群状态

集群的启动顺序为:管理节点》数据节点》SQL节点

集群停止顺序为:SQL节点》数据节点》管理节点

root@mysql_test1:/var/lib/mysql-cluster# ndb_mgm
-- NDB Cluster -- Management Client --

ndb_mgm> show
Cluster Configuration
---------------------
[ndbd(NDB)]  2 node(s)
id=2  @10.1.1.172  (mysql-5.7.32 ndb-7.6.16, Nodegroup: 0, *)
id=3  @10.1.1.173  (mysql-5.7.32 ndb-7.6.16, Nodegroup: 0)

[ndb_mgmd(MGM)]  1 node(s)
id=1  @10.1.1.176  (mysql-5.7.32 ndb-7.6.16)

[mysqld(API)]  2 node(s)
id=4  @10.1.1.177  (mysql-5.7.32 ndb-7.6.16)
id=5  @10.1.1.178  (mysql-5.7.32 ndb-7.6.16)

##表明集群正常

数据测试

sql节点插入数据

本次操作连接10.1.1.177机器插入数据

root@mysql_test2:/usr/local/src# mysql -uroot -p
Enter password: 
Welcome to the MySQL monitor.  Commands end with ; or \g.
Your MySQL connection id is 5
Server version: 5.7.32-ndb-7.6.16-cluster-gpl MySQL Cluster Community Server (GPL)

Copyright (c) 2000, 2020, Oracle and/or its affiliates. All rights reserved.

Oracle is a registered trademark of Oracle Corporation and/or its
affiliates. Other names may be trademarks of their respective
owners.

Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.
mysql> create database ytd_erp_test;
Query OK, 1 row affected (0.03 sec)

mysql> create database ytd_order_test;
Query OK, 1 row affected (0.05 sec)

mysql> use ytd_erp_test;
Database changed
mysql> create table sys_myfirst(id varchar(36) primary key, name varchar(100), memo varchar(255));
Query OK, 0 rows affected (0.10 sec)

mysql> insert into sys_myfirst(id, name, memo) values('1','test1','hello world!');
Query OK, 1 row affected (0.02 sec)

mysql> insert into sys_myfirst(id, name, memo) values('2','test2','hello world haha!');
Query OK, 1 row affected (0.00 sec)

mysql> insert into sys_myfirst(id, name, memo) values('3','test3','hello world hehe!');
Query OK, 1 row affected (0.00 sec)

mysql> select * from sys_myfirst;
+----+-------+-------------------+
| id | name  | memo              |
+----+-------+-------------------+
| 1  | test1 | hello world!      |
| 3  | test3 | hello world hehe! |
| 2  | test2 | hello world haha! |
+----+-------+-------------------+
3 rows in set (0.00 sec)

mysql> select * from sys_myfirst;
+----+-------+-------------------+
| id | name  | memo              |
+----+-------+-------------------+
| 2  | test2 | hello world haha! |
| 1  | test1 | hello world!      |
| 3  | test3 | hello world hehe! |
+----+-------+-------------------+
3 rows in set (0.00 sec)

##这里每次查找出来的数据顺序不一样,其原因不难想到是,查找的数据是两个数据库来回切换导致的。

在10.1.1.178中查询数据

root@mysql_test3:/usr/local/mysql# mysql -uroot -p
Enter password: 
Welcome to the MySQL monitor.  Commands end with ; or \g.
Your MySQL connection id is 6
Server version: 5.7.32-ndb-7.6.16-cluster-gpl MySQL Cluster Community Server (GPL)

Copyright (c) 2000, 2020, Oracle and/or its affiliates. All rights reserved.

Oracle is a registered trademark of Oracle Corporation and/or its
affiliates. Other names may be trademarks of their respective
owners.

Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.

mysql> use ytd_erp_test;
Reading table information for completion of table and column names
You can turn off this feature to get a quicker startup with -A

Database changed
mysql> 
mysql> select * from sys_myfirst;
+----+-------+-------------------+
| id | name  | memo              |
+----+-------+-------------------+
| 1  | test1 | hello world!      |
| 3  | test3 | hello world hehe! |
| 2  | test2 | hello world haha! |
+----+-------+-------------------+
3 rows in set (0.01 sec)

mysql> 
mysql> select * from sys_myfirst;
+----+-------+-------------------+
| id | name  | memo              |
+----+-------+-------------------+
| 2  | test2 | hello world haha! |
| 1  | test1 | hello world!      |
| 3  | test3 | hello world hehe! |
+----+-------+-------------------+
3 rows in set (0.01 sec)

mysql> SHOW ENGINES\G
*************************** 1. row ***************************
      Engine: ndbcluster
     Support: DEFAULT
     Comment: Clustered, fault-tolerant tables
Transactions: YES
          XA: NO
  Savepoints: NO
*************************** 2. row ***************************
      Engine: MRG_MYISAM
     Support: YES
     Comment: Collection of identical MyISAM tables
Transactions: NO
          XA: NO
  Savepoints: NO
*************************** 3. row ***************************
      Engine: InnoDB
     Support: YES
     Comment: Supports transactions, row-level locking, and foreign keys
Transactions: YES
          XA: YES
  Savepoints: YES
*************************** 4. row ***************************
      Engine: ndbinfo
     Support: YES
     Comment: MySQL Cluster system information storage engine
Transactions: NO
          XA: NO
  Savepoints: NO
*************************** 5. row ***************************
      Engine: MyISAM
     Support: YES
     Comment: MyISAM storage engine
Transactions: NO
          XA: NO
  Savepoints: NO
*************************** 6. row ***************************
      Engine: CSV
     Support: YES
     Comment: CSV storage engine
Transactions: NO
          XA: NO
  Savepoints: NO
*************************** 7. row ***************************
      Engine: ARCHIVE
     Support: YES
     Comment: Archive storage engine
Transactions: NO
          XA: NO
  Savepoints: NO
*************************** 8. row ***************************
      Engine: PERFORMANCE_SCHEMA
     Support: YES
     Comment: Performance Schema
Transactions: NO
          XA: NO
  Savepoints: NO
*************************** 9. row ***************************
      Engine: FEDERATED
     Support: NO
     Comment: Federated MySQL storage engine
Transactions: NULL
          XA: NULL
  Savepoints: NULL
*************************** 10. row ***************************
      Engine: BLACKHOLE
     Support: YES
     Comment: /dev/null storage engine (anything you write to it disappears)
Transactions: NO
          XA: NO
  Savepoints: NO
*************************** 11. row ***************************
      Engine: MEMORY
     Support: YES
     Comment: Hash based, stored in memory, useful for temporary tables
Transactions: NO
          XA: NO
  Savepoints: NO
##ndbcluster存储引擎已启用
mysql> CREATE TABLE ctest (i INT) ENGINE=NDBCLUSTER;
Query OK, 0 rows affected (0.16 sec)

mysql> 
mysql> SHOW CREATE TABLE ctest \G
*************************** 1. row ***************************
       Table: ctest
Create Table: CREATE TABLE `ctest` (
  `i` int(11) DEFAULT NULL
) ENGINE=ndbcluster DEFAULT CHARSET=utf8
1 row in set (0.00 sec)


管理节点查看各节点分配内存使用情况命令

ndb_mgm> ALL REPORT MEMORY
Node 2: Data usage is 0%(16 32K pages of total 68737)
Node 2: Index usage is 0%(7 32K pages of total 68728)
Node 3: Data usage is 0%(16 32K pages of total 68737)
Node 3: Index usage is 0%(7 32K pages of total 68728)

备份测试

在MySQL Cluster集群上,可以在管理节点上使用start backup命令实现数据库的在线备份,在还原时可以使用ndb_restore命令来进行数据库的还原。

mysql cluster类似于一种快照备份。

mysql cluster备份数据库可以生成三种格式的备份文件

  • 元数据,表定义以及其他对象的元数据
    BACKUP-backup-id.node_id.ctl
    ctl控制文件存储表定义以及其他对象的元数据(metadata)。
    
  • data数据文件,保存的是表中的记录行,由于数据节点分片的原因,没有节点上文件的数据是不一致的。
    BACKUP-backup-id.node_id.data
    data数据文件,保存的是表中的记录行,由于数据节点分片的原因,没有节点上文件的数据是不一致的。
    
  • log日志,保存已提交的事物记录
    BACKUP-backup-id.node_id.log
    log日志文件保存已提交的事物记录。
    

备份命令

START BACKUP [backup_id] [wait_option] [snapshot_option]

wait_option:
WAIT {STARTED | COMPLETED} | NOWAIT

snapshot_option:
SNAPSHOTSTART | SNAPSHOTEND

wait_option: 执行命令后是否将命令控制权返回给用户
- WAIT STARTED: 表示一旦备份开始,就把控制交给用户
- NOTWAIT: 表示用户一执行命令,就把控制权返回给用户
- WAIT COMPLETED: 表示需要等备份全部结束才把控制权交还给用户。默认选项

snapshot_option
- SNAPSHOTSTART: 表示备份文件的内容同开始备份时的数据库快照一致
- SNAPSHOTEND: 表示备份文件的内容同备份结束时的数据库快照一致,默认选项

##取消/中止备份命令
 ABORT BACKUP
 

注意事项

对于大数据量的备份,调整以下参数:

在config.ini的[NDBD DEFAULT]或者[NDBD]组中调整参数

  • BackupDataBufferSize:将数据写入磁盘之前用于对数据进行缓冲处理的内存量。
  • BackupLogBufferSzie: 将日志记录写入磁盘之前用于对其进行缓冲处理的内存量。
  • BackupMemory: 在数据库节点中为备份分配的总内存。它应是分配给备份数据缓冲的内存和分配给日志缓冲的内存之和。
  • BackupWriteSize:每次写入磁盘的块大小,适用于备份数据缓冲和备份日志缓冲。

备份还原命令:

ndb_restore [-c connection_string] -n node_id -b backup_id [-m] -r --backup-path=/path/to/backup/files

##常用参数说明
--exclude-databases=list ##要排除的一个或多个数据库的列表(包括未命名的数据库)
--exclude-tables=list  ##要排除的一个或多个表的列表(包括同一数据库中的表) 未命名);每个表引用必须包含 数据库名称
-r ##使用NDB API将表数据和日志还原到NDB群集中 (基于mysql5.7)
-m ##使用NDB API将元数据还原到NDB群集 (基于mysql5.7) 
-n ##定义的节点ID

使用NDB_RESTORE初始化用于循环复制的NDB群集后,充当复制副本的SQL节点上的二进制日志不会自动创建,必须手动创建它们。要创建二进制日志,请在运行Start Slave之前在该SQL节点上发出一条show Tables语句。这是NDB群集中的已知问题。

备份测试

##开始备份
ndb_mgm> start backup
Waiting for completed, this may take several minutes
Node 2: Backup 1 started from node 1
Node 2: Backup 1 started from node 1 completed
 StartGCP: 12258 StopGCP: 12261
 #Records: 2065 #LogRecords: 0
 Data: 52244 bytes Log: 0 bytes
ndb_mgm> start backup
Waiting for completed, this may take several minutes
Node 2: Backup 2 started from node 1
Node 2: Backup 2 started from node 1 completed
 StartGCP: 12271 StopGCP: 12274
 #Records: 2065 #LogRecords: 0
 Data: 52244 bytes Log: 0 bytes
 
##查看备份目录
root@podC:/usr/local/mysql/data/BACKUP# ll
total 16
drwxr-x--- 4 root  root  4096 Feb 21 17:29 ./
drwxr-xr-x 8 mysql mysql 4096 Feb 21 17:28 ../
drwxr-x--- 2 root  root  4096 Feb 21 17:28 BACKUP-1/
drwxr-x--- 2 root  root  4096 Feb 21 17:29 BACKUP-2/

root@podC:/usr/local/mysql/data/BACKUP/BACKUP-1# ll
total 64
drwxr-x--- 2 root root  4096 Feb 21 17:28 ./
drwxr-x--- 4 root root  4096 Feb 21 17:29 ../
-rw-r--r-- 1 root root 26316 Feb 21 17:28 BACKUP-1-0.3.Data
-rw-r--r-- 1 root root 23784 Feb 21 17:28 BACKUP-1.3.ctl
-rw-r--r-- 1 root root    52 Feb 21 17:28 BACKUP-1.3.log

备份和还原测试

 ##sql节点上面录入数据: 建立测试的数据库和表
mysql> CREATE DATABASE bg1;
Query OK, 1 row affected (0.03 sec)

mysql> use bg1;
Database changed
mysql> 
mysql> CREATE TABLE bgt1 (id INT,`name` VARCHAR(20),PRIMARY KEY(`id`))ENGINE=NDBCLUSTER;
Query OK, 0 rows affected (0.12 sec)

mysql> 
mysql> INSERT INTO bgt1 VALUES(1,'zhang1'),(2,'zhang2'),(3,'zhang3'),(4,'zhang4');
Query OK, 4 rows affected (0.00 sec)
Records: 4  Duplicates: 0  Warnings: 0


##管理节点开启备份
ndb_mgm> start backup 5
Waiting for completed, this may take several minutes
Node 2: Backup 5 started from node 1
Node 2: Backup 5 started from node 1 completed
 StartGCP: 2399 StopGCP: 2402
 #Records: 2074 #LogRecords: 0
 Data: 52836 bytes Log: 0 bytes


##sql节点插入数据
mysql> INSERT INTO bgt1 VALUES(5,'zhang5'),(6,'zhang6');
Query OK, 2 rows affected (0.01 sec)
Records: 2  Duplicates: 0  Warnings: 0

mysql> flush logs;
Query OK, 0 rows affected (0.00 sec)

mysql> INSERT INTO bgt1 VALUES(7,'zhang7'),(8,'zhang8');
Query OK, 2 rows affected (0.00 sec)
Records: 2  Duplicates: 0  Warnings: 0

##删掉SQL节点的数据。
mysql> drop database bg;
Query OK, 0 rows affected (0.05 sec)


##关闭MYSQLD服务器
root@mysql_test2:~# systemctl stop mysqld.service
root@mysql_test3:~# systemctl stop mysql.service 

##重新启动管理节点
ndb_mgm> shutdown
Node 3: Cluster shutdown initiated
Node 2: Cluster shutdown initiated
Node 3: Node shutdown completed.
Node 2: Node shutdown completed.
3 NDB Cluster node(s) have shutdown.
Disconnecting to allow management server to shutdown.
ndb_mgm> exit
root@mysql_test1:~# ndb_mgmd -f /var/lib/mysql-cluster/config.ini --reload
MySQL Cluster Management Server mysql-5.7.32 ndb-7.6.16

##重新启动数据节点
root@podB:/usr/local/mysql/bin# ./ndbd --initial
2023-02-23 09:14:53 [ndbd] INFO     -- Angel connected to '10.1.1.176:1186'
2023-02-23 09:14:53 [ndbd] INFO     -- Angel allocated nodeid: 2
root@podC:/usr/local/mysql/bin# ./ndbd --initial
2023-02-23 09:15:21 [ndbd] INFO     -- Angel connected to '10.1.1.176:1186'
2023-02-23 09:15:21 [ndbd] INFO     -- Angel allocated nodeid: 3
注意:此时数据节点重新加入时要添加—initial参数,不添加恢复数据会失败


📌注意:此时数据节点重新加入时要添加—initial参数,不添加恢复数据会失败。

##重新启动sql节点
root@mysql_test2:~# systemctl start mysqld.service 
root@mysql_test3:~# systemctl start  mysqld.service

##数据节点恢复数据
root@podB:/usr/local/mysql/bin# ./ndb_restore -n2 -b5 -m --backup_path=/usr/local/mysql/data/BACKUP/BACKUP-5
Nodeid = 2
Backup Id = 5
backup path = /usr/local/mysql/data/BACKUP/BACKUP-5
2023-02-23 09:26:01 [restore_metadata] Read meta data file header
Opening file '/usr/local/mysql/data/BACKUP/BACKUP-4/BACKUP-5.2.ctl'
File size 25008 bytes
Backup version in files: ndb-6.3.11 ndb version: mysql-5.7.32 ndb-7.6.16
2023-02-23 09:26:01 [restore_metadata] Load content
Start GCP of Backup: 28188
Stop GCP of Backup: 28191
2023-02-23 09:26:01 [restore_metadata] Get number of Tables
2023-02-23 09:26:01 [restore_metadata] Validate Footer
Failed to initialize consumers
此时恢复报错

原因:由于集群备份恢复基于ndb_restore工具作为自己的 api 节点进行连接,因此需要单独定义一个api插槽供其使用。

定义一个额外的 api 节点插槽,或者只是停止 数据节点mysql 以释放已经定义的插槽。

[ndbd default]
NoOfReplicas=2
DataMemory=2G
IndexMemory=100M

[ndb_mgmd]
NodeId=1
datadir=/var/lib/mysql
HostName=10.1.1.176

[ndbd]
HostName=10.1.1.172
DataDir=/usr/local/mysql/data
NodeId=2

[ndbd]
HostName=10.1.1.173
DataDir=/usr/local/mysql/data
NodeId=3

[mysqld]
HostName=10.1.1.177
NodeId=4

[mysqld]
HostName=10.1.1.178
NodeId=5

[mysqld]

##添加红色标记部分

数据节点恢复测试,问题依旧。
ndb_mgm> show
Cluster Configuration
---------------------
[ndbd(NDB)]  2 node(s)
id=2  @10.1.1.172  (mysql-5.7.32 ndb-7.6.16, Nodegroup: 0, *)
id=3  @10.1.1.173  (mysql-5.7.32 ndb-7.6.16, Nodegroup: 0)

[ndb_mgmd(MGM)]  1 node(s)
id=1  @10.1.1.176  (mysql-5.7.32 ndb-7.6.16)

[mysqld(API)]  3 node(s)
id=4  @10.1.1.177  (mysql-5.7.32 ndb-7.6.16)
id=5  @10.1.1.178  (mysql-5.7.32 ndb-7.6.16)
id=6  @10.1.1.173  (mysql-5.7.32 ndb-7.6.16)
#检查发现数据节点存在mysqld,停止mysqld后进行测试

##由于数据分散在各个数据节点,所以,需要在每个数据节点恢复数据

root@podB:/usr/local/mysql/bin# ./ndb_restore -n2 -b5  -r -m --backup_path=/usr/local/mysql/data/BACKUP/BACKUP-5
Nodeid = 2
Backup Id = 5
backup path = /usr/local/mysql/data/BACKUP/BACKUP-5
2023-02-23 11:10:51 [restore_metadata] Read meta data file header
Opening file '/usr/local/mysql/data/BACKUP/BACKUP-5/BACKUP-5.2.ctl'
File size 26868 bytes
Backup version in files: ndb-6.3.11 ndb version: mysql-5.7.32 ndb-7.6.16
2023-02-23 11:10:51 [restore_metadata] Load content
Start GCP of Backup: 2399
Stop GCP of Backup: 2402
2023-02-23 11:10:51 [restore_metadata] Get number of Tables
2023-02-23 11:10:51 [restore_metadata] Validate Footer
Connected to ndb!!
2023-02-23 11:10:52 [restore_metadata] Restore objects (tablespaces, ..)
2023-02-23 11:10:52 [restore_metadata] Restoring tables
Successfully restored table `ytd_erp_test/def/City`
Successfully restored table event REPL$ytd_erp_test/City
Successfully restored table `ytd_erp_test/def/bgt1`
Successfully restored table event REPL$ytd_erp_test/bgt1
Successfully restored table `bg1/def/bgt1`
Successfully restored table event REPL$bg1/bgt1
2023-02-23 11:10:52 [restore_metadata] Save foreign key info
Successfully created index `PRIMARY` on `bgt1`
Successfully created index `PRIMARY` on `bgt1`
Successfully created index `PRIMARY` on `City`
Create foreign keys
Create foreign keys done
2023-02-23 11:10:52 [restore_data] Start restoring table data
2023-02-23 11:10:52 [restore_data] Read data file header
Opening file '/usr/local/mysql/data/BACKUP/BACKUP-5/BACKUP-5-0.2.Data'
File size 26892 bytes
2023-02-23 11:10:52 [restore_data] Restore fragments
_____________________________________________________
Processing data in table: mysql/def/ndb_index_stat_sample(8) fragment 0
  Skipping fragment
_____________________________________________________
Processing data in table: sys/def/NDB$EVENTS_0(3) fragment 0
  Skipping fragment
_____________________________________________________
Processing data in table: ytd_erp_test/def/City(11) fragment 0
_____________________________________________________
Processing data in table: mysql/def/ndb_apply_status(6) fragment 0
  Skipping fragment
_____________________________________________________
Processing data in table: mysql/def/ndb_index_stat_head(7) fragment 0
  Skipping fragment
_____________________________________________________
Processing data in table: ytd_erp_test/def/bgt1(14) fragment 0
_____________________________________________________
Processing data in table: mysql/def/NDB$BLOB_4_3(5) fragment 0
  Skipping fragment
_____________________________________________________
Processing data in table: sys/def/SYSTAB_0(2) fragment 0
_____________________________________________________
Processing data in table: bg1/def/bgt1(10) fragment 0
_____________________________________________________
Processing data in table: mysql/def/ndb_schema(4) fragment 0
  Skipping fragment
2023-02-23 11:10:52 [restore_log] Read log file header
Opening file '/usr/local/mysql/data/BACKUP/BACKUP-5/BACKUP-5.2.log'
File size 52 bytes
2023-02-23 11:10:52 [restore_log] Restore log entries
Restored 3 tuples and 0 log entries


root@podC:/usr/local/mysql/bin# ./ndb_restore -n3 -b5 -r -m  --backup_path=/usr/local/mysql/data/BACKUP/BACKUP-5
Nodeid = 3
Backup Id = 5
backup path = /usr/local/mysql/data/BACKUP/BACKUP-5
2023-02-23 10:31:50 [restore_metadata] Read meta data file header
Opening file '/usr/local/mysql/data/BACKUP/BACKUP-5/BACKUP-5.3.ctl'
File size 25008 bytes
Backup version in files: ndb-6.3.11 ndb version: mysql-5.7.32 ndb-7.6.16
2023-02-23 10:31:50 [restore_metadata] Load content
Start GCP of Backup: 28188
Stop GCP of Backup: 28191
2023-02-23 10:31:50 [restore_metadata] Get number of Tables
2023-02-23 10:31:50 [restore_metadata] Validate Footer
Connected to ndb!!
2023-02-23 10:31:51 [restore_metadata] Restore objects (tablespaces, ..)
2023-02-23 10:31:51 [restore_metadata] Restoring tables
Create table `bg/def/bgt1` failed: 721: Schema object with given name already exists
Restore: Failed to restore table: `bg/def/bgt1` ... Exiting 
出现报错

原因:由于在数据节点(podB)中已经恢复了元数据,所以,其他节点恢复数据时不需要-m参数

root@podC:/usr/local/mysql/bin# ./ndb_restore -n3 -b5  -r  --backup_path=/usr/local/mysql/data/BACKUP/BACKUP-5
Nodeid = 3
Backup Id = 5
backup path = /usr/local/mysql/data/BACKUP/BACKUP-5
2023-02-23 11:12:52 [restore_metadata] Read meta data file header
Opening file '/usr/local/mysql/data/BACKUP/BACKUP-5/BACKUP-5.3.ctl'
File size 26868 bytes
Backup version in files: ndb-6.3.11 ndb version: mysql-5.7.32 ndb-7.6.16
2023-02-23 11:12:52 [restore_metadata] Load content
Start GCP of Backup: 2399
Stop GCP of Backup: 2402
2023-02-23 11:12:52 [restore_metadata] Get number of Tables
2023-02-23 11:12:52 [restore_metadata] Validate Footer
Connected to ndb!!
2023-02-23 11:12:52 [restore_metadata] Restore objects (tablespaces, ..)
2023-02-23 11:12:52 [restore_metadata] Restoring tables
2023-02-23 11:12:52 [restore_metadata] Save foreign key info
2023-02-23 11:12:52 [restore_data] Start restoring table data
2023-02-23 11:12:52 [restore_data] Read data file header
Opening file '/usr/local/mysql/data/BACKUP/BACKUP-5/BACKUP-5-0.3.Data'
File size 26600 bytes
2023-02-23 11:12:52 [restore_data] Restore fragments
_____________________________________________________
Processing data in table: mysql/def/ndb_index_stat_sample(8) fragment 1
  Skipping fragment
_____________________________________________________
Processing data in table: sys/def/NDB$EVENTS_0(3) fragment 1
  Skipping fragment
_____________________________________________________
Processing data in table: ytd_erp_test/def/City(11) fragment 1
_____________________________________________________
Processing data in table: mysql/def/ndb_apply_status(6) fragment 1
  Skipping fragment
_____________________________________________________
Processing data in table: mysql/def/ndb_index_stat_head(7) fragment 1
  Skipping fragment
_____________________________________________________
Processing data in table: ytd_erp_test/def/bgt1(14) fragment 1
_____________________________________________________
Processing data in table: mysql/def/NDB$BLOB_4_3(5) fragment 1
  Skipping fragment
_____________________________________________________
Processing data in table: sys/def/SYSTAB_0(2) fragment 1
_____________________________________________________
Processing data in table: bg1/def/bgt1(10) fragment 1
_____________________________________________________
Processing data in table: mysql/def/ndb_schema(4) fragment 1
  Skipping fragment
2023-02-23 11:12:52 [restore_log] Read log file header
Opening file '/usr/local/mysql/data/BACKUP/BACKUP-5/BACKUP-5.3.log'
File size 52 bytes
2023-02-23 11:12:52 [restore_log] Restore log entries
Restored 9 tuples and 0 log entries

##sql节点查看数据
mysql> show databases;
+--------------------+
| Database           |
+--------------------+
| information_schema |
| mysql              |
| ndbinfo            |
| performance_schema |
| sys                |
| ytd_erp_test       |
| ytd_order_test     |
+--------------------+
7 rows in set (0.00 sec)

##没有库,需要重新建库。
mysql> create database bg1;
Query OK, 1 row affected (0.06 sec)

mysql> use bg1;
Reading table information for completion of table and column names
You can turn off this feature to get a quicker startup with -A

Database changed
mysql> 
mysql> show tables;
+---------------+
| Tables_in_bg1 |
+---------------+
| bgt1          |
+---------------+
1 row in set (0.00 sec)
mysql> select * from bgt1;
+----+--------+
| id | name   |
+----+--------+
|  1 | zhang1 |
|  2 | zhang2 |
|  4 | zhang4 |
|  3 | zhang3 |
+----+--------+
4 rows in set (0.01 sec)
##建库后查询数据恢复

数据引擎测试

1、查看节点数据库

##节点2
root@mysql_test2:~# mysql -uroot -p
Enter password: 
Welcome to the MySQL monitor.  Commands end with ; or \g.
Your MySQL connection id is 4
Server version: 5.7.32-ndb-7.6.16-cluster-gpl MySQL Cluster Community Server (GPL)

Copyright (c) 2000, 2020, Oracle and/or its affiliates. All rights reserved.

Oracle is a registered trademark of Oracle Corporation and/or its
affiliates. Other names may be trademarks of their respective
owners.

Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.

mysql> show databases;
+--------------------+
| Database           |
+--------------------+
| information_schema |
| bg1                |
| mysql              |
| ndbinfo            |
| performance_schema |
| sys                |
| ytd_erp_test       |
| ytd_order_test     |
+--------------------+
8 rows in set (0.00 sec)
##节点3
root@mysql_test3:~# mysql -uroot -p
Enter password: 
Welcome to the MySQL monitor.  Commands end with ; or \g.
Your MySQL connection id is 4
Server version: 5.7.32-ndb-7.6.16-cluster-gpl MySQL Cluster Community Server (GPL)

Copyright (c) 2000, 2020, Oracle and/or its affiliates. All rights reserved.

Oracle is a registered trademark of Oracle Corporation and/or its
affiliates. Other names may be trademarks of their respective
owners.

Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.

mysql> show databases;
+--------------------+
| Database           |
+--------------------+
| information_schema |
| bg1                |
| mysql              |
| ndbinfo            |
| performance_schema |
| sys                |
| ytd_erp_test       |
| ytd_order_test     |
+--------------------+
8 rows in set (0.00 sec)


非 NDB 存储引擎

##节点2执行
mysql> use ytd_erp_test;
Reading table information for completion of table and column names
You can turn off this feature to get a quicker startup with -A

Database changed
mysql> 
mysql> create table t1 (id int,name char(10)) engine=innodb;
Query OK, 0 rows affected (0.01 sec)

mysql> insert into t1 (id,name) values(1,'a'),(2,'b');
Query OK, 2 rows affected (0.00 sec)
Records: 2  Duplicates: 0  Warnings: 0

mysql> select * from t1;
+------+------+
| id   | name |
+------+------+
|    1 | a    |
|    2 | b    |
+------+------+
2 rows in set (0.00 sec)

##节点3查询数据
mysql> use ytd_erp_test;
Reading table information for completion of table and column names
You can turn off this feature to get a quicker startup with -A

mysql> select * from t1;
ERROR 1146 (42S02): Table 'ytd_erp_test.t1' doesn't exist

对于 InnoDB 存储引擎的表 MySQL Cluster 集群环境不支持同步功能。

NDB 存储引擎

##节点2上建表
mysql> create table t2 (id int,name char(10)) engine=ndb;
Query OK, 0 rows affected (0.16 sec)

mysql> 
mysql> insert into t2(id,name) values(1,'a'),(2,'b');
Query OK, 2 rows affected (0.00 sec)
Records: 2  Duplicates: 0  Warnings: 0

mysql> 
mysql> select * from t2;
+------+------+
| id   | name |
+------+------+
|    1 | a    |
|    2 | b    |
+------+------+
2 rows in set (0.00 sec)

##节点3执行
mysql> select * from t2;
+------+------+
| id   | name |
+------+------+
|    2 | b    |
|    1 | a    |
+------+------+
2 rows in set (0.01 sec)
##NDB引擎正常同步

mysql> update t2 set name='bbb' where id=2;
Query OK, 1 row affected (0.01 sec)
Rows matched: 1  Changed: 1  Warnings: 0

##节点2查询
mysql> select * from t2;
+------+------+
| id   | name |
+------+------+
|    2 | bbb  |
|    1 | a    |
+------+------+
2 rows in set (0.00 sec)


系统优化项

为了连接方便,MySQL加入到环境变量中

vim /etc/profile

export MYSQL_HOME=/usr/local/mysql
export PATH=$PATH:$MYSQL_HOME/bin

source /etc/profile

日志管理

MySQL Cluster 集群日志主要分为集群日志、节点日志:

  • 集群日志文件存储于管理节点上,用来记录整个集群的运行情况,如各个节点的连通性等,以及所有节点的运行情况。
  • 节点日志文件存储于单独的某个节点上,只是用来记录本地节点上的服务运行情况

集群日志文件

集群日志文件默认位于管理节点上的 datadir 目录下

[ndb_mgmd]
NodeId=1
datadir=/var/lib/mysql
HostName=10.1.1.176


root@mysql_test1:/var/lib/mysql# ll /var/lib/mysql
-rw-r--r--  1 root  root    717191 Feb 23 13:57 ndb_1_cluster.log
-rw-r--r--  1 root  root   1000154 Feb 21 19:41 ndb_1_cluster.log.1
-rw-r--r--  1 root  root   1000224 Feb 21 23:22 ndb_1_cluster.log.2
-rw-r--r--  1 root  root   1000224 Feb 22 03:03 ndb_1_cluster.log.3
-rw-r--r--  1 root  root   1000224 Feb 22 06:44 ndb_1_cluster.log.4
-rw-r--r--  1 root  root   1000106 Feb 22 12:39 ndb_1_cluster.log.5
-rw-r--r--  1 root  root       312 Feb 23 13:56 ndb_1_out.log

##查卡日志
root@mysql_test1:/var/lib/mysql# tail -50 ndb_1_cluster.log
2023-02-23 13:57:03 [MgmtSrvr] INFO     -- Node 2: Restore Database from disk Completed
2023-02-23 13:57:03 [MgmtSrvr] INFO     -- Node 2: Start phase 4 completed (system restart)
2023-02-23 13:57:03 [MgmtSrvr] INFO     -- Node 3: Start phase 4 completed (system restart)
2023-02-23 13:57:03 [MgmtSrvr] INFO     -- Node 2: Make On-line Database recoverable by waiting for LCP Starting, LCP id = 3
2023-02-23 13:57:03 [MgmtSrvr] INFO     -- Node 2: Local checkpoint 3 started. Keep GCI = 1 oldest restorable GCI = 2
2023-02-23 13:57:03 [MgmtSrvr] INFO     -- Node 2: LDM(0): Completed LCP, #frags = 22 #records = 2076, #bytes = 69388
2023-02-23 13:57:03 [MgmtSrvr] INFO     -- Node 3: LDM(0): Completed LCP, #frags = 22 #records = 2076, #bytes = 69388
2023-02-23 13:57:03 [MgmtSrvr] INFO     -- Node 2: Local checkpoint 3 completed
2023-02-23 13:57:03 [MgmtSrvr] INFO     -- Node 2: Make On-line Database recoverable by waiting for LCP Completed, LCP id = 3
2023-02-23 13:57:03 [MgmtSrvr] INFO     -- Node 2: Start phase 5 completed (system restart)
2023-02-23 13:57:03 [MgmtSrvr] INFO     -- Node 3: Start phase 5 completed (system restart)
2023-02-23 13:57:03 [MgmtSrvr] INFO     -- Node 2: Start phase 6 completed (system restart)
2023-02-23 13:57:03 [MgmtSrvr] INFO     -- Node 3: Start phase 6 completed (system restart)
2023-02-23 13:57:03 [MgmtSrvr] INFO     -- Node 2: President restarts arbitration thread [state=1]
2023-02-23 13:57:03 [MgmtSrvr] INFO     -- Node 2: Start phase 7 completed (system restart)
2023-02-23 13:57:03 [MgmtSrvr] INFO     -- Node 3: Start phase 7 completed (system restart)
2023-02-23 13:57:03 [MgmtSrvr] INFO     -- Node 2: Start phase 8 completed (system restart)
2023-02-23 13:57:03 [MgmtSrvr] INFO     -- Node 3: Start phase 8 completed (system restart)
2023-02-23 13:57:03 [MgmtSrvr] INFO     -- Node 2: Node 1: API mysql-5.7.32 ndb-7.6.16
2023-02-23 13:57:03 [MgmtSrvr] INFO     -- Node 3: Node 1: API mysql-5.7.32 ndb-7.6.16
2023-02-23 13:57:03 [MgmtSrvr] INFO     -- Node 3: Prepare arbitrator node 1 [ticket=5c29000166adfb0a]
2023-02-23 13:57:04 [MgmtSrvr] INFO     -- Node 2: Started arbitrator node 1 [ticket=5c29000166adfb0a]
2023-02-23 13:57:05 [MgmtSrvr] INFO     -- Node 3: Start phase 9 completed (system restart)
2023-02-23 13:57:05 [MgmtSrvr] INFO     -- Node 2: Start phase 9 completed (system restart)
2023-02-23 13:57:05 [MgmtSrvr] INFO     -- Node 2: Start phase 50 completed (system restart)
2023-02-23 13:57:05 [MgmtSrvr] INFO     -- Node 3: Start phase 50 completed (system restart)
2023-02-23 13:57:05 [MgmtSrvr] INFO     -- Node 2: Start phase 101 completed (system restart)
2023-02-23 13:57:05 [MgmtSrvr] INFO     -- Node 3: Start phase 101 completed (system restart)
2023-02-23 13:57:05 [MgmtSrvr] INFO     -- Node 2: Started (mysql-5.7.32 ndb-7.6.16)
2023-02-23 13:57:05 [MgmtSrvr] INFO     -- Node 3: Started (mysql-5.7.32 ndb-7.6.16)
2023-02-23 13:57:05 [MgmtSrvr] INFO     -- Node 3: Communication to Node 4 opened
2023-02-23 13:57:05 [MgmtSrvr] INFO     -- Node 3: Communication to Node 5 opened
2023-02-23 13:57:05 [MgmtSrvr] INFO     -- Node 3: Communication to Node 6 opened
2023-02-23 13:57:05 [MgmtSrvr] INFO     -- Node 2: Communication to Node 4 opened
2023-02-23 13:57:05 [MgmtSrvr] INFO     -- Node 2: Communication to Node 5 opened
2023-02-23 13:57:05 [MgmtSrvr] INFO     -- Node 2: Communication to Node 6 opened
2023-02-23 13:57:25 [MgmtSrvr] INFO     -- Alloc node id 4 succeeded
2023-02-23 13:57:25 [MgmtSrvr] INFO     -- Nodeid 4 allocated for API at 10.1.1.177
2023-02-23 13:57:25 [MgmtSrvr] INFO     -- Node 4: mysqld --server-id=0
2023-02-23 13:57:26 [MgmtSrvr] INFO     -- Node 3: Node 4 Connected
2023-02-23 13:57:26 [MgmtSrvr] INFO     -- Node 2: Node 4 Connected
2023-02-23 13:57:26 [MgmtSrvr] INFO     -- Node 2: Node 4: API mysql-5.7.32 ndb-7.6.16
2023-02-23 13:57:26 [MgmtSrvr] INFO     -- Node 3: Node 4: API mysql-5.7.32 ndb-7.6.16
2023-02-23 13:57:34 [MgmtSrvr] INFO     -- Alloc node id 5 succeeded
2023-02-23 13:57:34 [MgmtSrvr] INFO     -- Nodeid 5 allocated for API at 10.1.1.178
2023-02-23 13:57:34 [MgmtSrvr] INFO     -- Node 5: mysqld --server-id=0
2023-02-23 13:57:35 [MgmtSrvr] INFO     -- Node 2: Node 5 Connected
2023-02-23 13:57:35 [MgmtSrvr] INFO     -- Node 3: Node 5 Connected
2023-02-23 13:57:35 [MgmtSrvr] INFO     -- Node 2: Node 5: API mysql-5.7.32 ndb-7.6.16
2023-02-23 13:57:35 [MgmtSrvr] INFO     -- Node 3: Node 5: API mysql-5.7.32 ndb-7.6.16

##可以集群日志文件中记录了每个数据节点及每个 SQL 节点的运行情况
##关于集群日志命令
clusterlog off:关闭集群日志功能
clusterlog on:开启集群日志功能
clusterlog info:查看当前日志级别

日志级别 事件定义
ALERT 应立刻更正的情况,如损坏的系统数据库
CRITICAL 临界状况,如设备错误或资源不足
ERROR 应予以更正的状况,如配置错误
WARNING 不能称为错误的情况,但仍需要特别处理
INFO 通报性信息
DEBUG 调试信息
默认日志级别
ndb_mgm> clusterlog info
Severities enabled: INFO WARNING ERROR CRITICAL ALERT 

节点日志文件

root@podB:/usr/local/mysql/data# tail -30 ndb_2_out.log 
2023-02-23 13:57:03 [ndbd] INFO     -- Start phase 5 completed
2023-02-23 13:57:03 [ndbd] INFO     -- Phase 5 waited for local checkpoint to complete
2023-02-23 13:57:03 [ndbd] INFO     -- Grant nodes to start phase: 6, nodes: 000000000000000c
2023-02-23 13:57:03 [ndbd] INFO     -- Start phase 6 completed
2023-02-23 13:57:03 [ndbd] INFO     -- Phase 6 updated blocks about that we've now reached the started state.
2023-02-23 13:57:03 [ndbd] INFO     -- Grant nodes to start phase: 7, nodes: 000000000000000c
2023-02-23 13:57:03 [ndbd] INFO     -- President restarts arbitration thread [state=1]
2023-02-23 13:57:03 [ndbd] INFO     -- Activating bucket 0 in SUMA
2023-02-23 13:57:03 [ndbd] INFO     -- Start phase 7 completed
2023-02-23 13:57:03 [ndbd] INFO     -- Phase 7 mainly activated the asynchronous change events process, and some other background processes
2023-02-23 13:57:03 [ndbd] INFO     -- Grant nodes to start phase: 8, nodes: 000000000000000c
2023-02-23 13:57:03 [ndbd] INFO     -- Start NDB start phase 7
2023-02-23 13:57:03 [ndbd] INFO     -- Foreign Key enabling Starting
2023-02-23 13:57:03 [ndbd] INFO     -- Foreign key enabling Completed
2023-02-23 13:57:03 [ndbd] INFO     -- NDB start phase 7 completed
2023-02-23 13:57:03 [ndbd] INFO     -- Start phase 8 completed
2023-02-23 13:57:03 [ndbd] INFO     -- Phase 8 enabled foreign keys and waited forall nodes to complete start up to this point
2023-02-23 13:57:03 [ndbd] INFO     -- Grant nodes to start phase: 9, nodes: 000000000000000c
2023-02-23 13:57:04 [ndbd] INFO     -- Started arbitrator node 1 [ticket=5c29000166adfb0a]
2023-02-23 13:57:05 [ndbd] INFO     -- Restart complete, updated local sysfile
2023-02-23 13:57:05 [ndbd] INFO     -- Start phase 9 completed
2023-02-23 13:57:05 [ndbd] INFO     -- Phase 9 enabled APIs to start connecting
2023-02-23 13:57:05 [ndbd] INFO     -- Grant nodes to start phase: 10, nodes: 000000000000000c
2023-02-23 13:57:05 [ndbd] INFO     -- Start phase 50 completed
2023-02-23 13:57:05 [ndbd] INFO     -- Grant nodes to start phase: 51, nodes: 000000000000000c
2023-02-23 13:57:05 [ndbd] INFO     -- Start phase 101 completed
2023-02-23 13:57:05 [ndbd] INFO     -- Phase 101 was used by SUMA to take over responsibility for sending some of the asynchronous change events
2023-02-23 13:57:05 [ndbd] INFO     -- Grant nodes to start phase: 102, nodes: 000000000000000c
2023-02-23 13:57:05 [ndbd] INFO     -- Node started
2023-02-23 13:57:26 [ndbd] INFO     -- Allocate event buffering page chunk in SUMA, 16 pages, first page ref = 3366

扩展项

使用MySQL的应用程序可以使用标准API来访问NDB表。重要的是 请记住,应用程序必须访问 SQL 节点,而不是管理或数据节点。

管理节点配置文件选项

Arbitration: 应如何进行仲裁以避免脑裂 节点发生故障时的问题。

ArbitrationTimeout: 数据库分区等待的最长时间(毫秒) 仲裁信号。

BackupDataBufferSize: 用于备份的数据缓冲区的默认大小(以字节为单位)。

BackupDataDir: 存储备份的位置的路径。请注意字符串“/备份” 始终附加到此设置,以便 *有效* 默认值为 FileSystemPath/BACKUP。

BackupDiskWriteSpeedPct: 设置数据节点分配的最大写入速度的百分比 (MaxDiskWriteSpeed) 在启动时为 LCP 保留 备份。

BackupLogBufferSize: 用于备份的日志缓冲区的默认大小(以字节为单位)。

BackupMaxWriteSize: 备份进行的文件系统写入的最大大小(在 字节)。

BackupMemory: 为每个节点的备份分配的总内存(以字节为单位)。

BackupReportFrequency: 备份期间备份状态报告的频率(以秒为单位)。

BackupWriteSize: 备份进行的文件系统写入的默认大小(在 字节)。

BatchSizePerLocalScan: 用于计算保留扫描的锁定记录数 锁。

BuildIndexThreads: 用于构建有序索引的线程数 系统或节点重新启动。在运行时也适用 ndb_restore --重建索引。将此参数设置为 0 禁用有序索引的多线程构建。

CompressedBackup: 使用 zlib 在写入备份时压缩备份。

CompressedLCP: 使用 zlib 编写压缩的 LCP。
                               
ConnectCheckIntervalDelay: 数据节点连接检查阶段之间的时间。数据节点 1 间隔后被视为可疑,2 后死亡 没有响应的间隔。

CrashOnCorruptedTuple: 启用后,每当检测到节点时,都会强制节点关闭 损坏的元组。

DataDir: 此节点的数据目录。

DataMemory: 每个数据节点上分配用于存储的字节数 数据;取决于可用的系统 RAM 和大小 索引内存。

DefaultHashMapSize: 设置大小(以存储桶为单位)以用于表哈希映射。三 支持的值:0、240 和 3840。

DictTrace: 启用 DBDICT 调试;用于新开发银行的发展。

DiskIOThreadPool: 用于文件访问的未绑定线程数,适用于磁盘 仅数据。

Diskless: 在不使用磁盘的情况下运行。

DiskPageBufferEntries: 要在 DiskPageBufferMemory 中分配的内存;非常大的磁盘 事务可能需要增加此值。

DiskPageBufferMemory: 为磁盘页面分配的每个数据节点上的字节数 缓冲区缓存。

DiskSyncSize: 在强制同步之前写入文件的数据量。

EnablePartialLcp: 启用部分 LCP(真);如果禁用(假),则全部 LCP 写入完整的检查点。

EnableRedoControl: 启用自适应检查点速度以控制重做日志 用法。

EventLogBufferSize: 数据中NDB日志事件的循环缓冲区的大小 节点。

ExecuteOnComputer: 引用前面定义的计算机的字符串。

ExtraSendBufferMemory: 除了任何已分配的内存外,还用于发送缓冲区 通过 TotalSendBufferMemory 或 SendBufferMemory。默认 (0) 允许最大 16MB。

FileSystemPath: 数据节点存储其数据的目录的路径(目录 必须存在)。

FileSystemPathDataFiles: 数据节点存储其磁盘数据的目录的路径 文件。默认值为文件系统路径DD(如果已设置);否则 如果设置了文件系统路径,则使用它;否则,值 使用数据目录。

FileSystemPathDD: 数据节点存储其磁盘数据的目录的路径,以及 撤消文件。默认值为文件系统路径(如果已设置); 否则,将使用 DataDir 的值。

FileSystemPathUndoFiles: 数据节点存储其撤消文件的目录的路径 磁盘数据。默认值为文件系统路径DD(如果已设置); 否则,如果设置了文件系统路径,则使用它;否则 使用数据目录的值。

FragmentLogFileSize: 每个重做日志文件的大小。

HeartbeatIntervalDbApi: API 节点-数据节点检测信号之间的时间。(接口连接 错过 3 次心跳后关闭)。

HeartbeatIntervalDbDb: 数据节点到数据节点心跳之间的时间;数据节点 在错过 3 次心跳后被认为是死亡的。

HeartbeatOrder: 设置数据节点相互检查检测信号的顺序 用于确定给定节点是否仍处于活动状态,并且 已连接到群集。对于所有数据节点,必须为零,或者 所有数据节点的不同非零值;看 文档以获取进一步指导。

HostName: 此数据节点的主机名或 IP 地址。

IndexMemory: 每个数据节点上分配用于存储的字节数 指标;取决于可用的系统 RAM 和大小 数据内存。

IndexStatAutoCreate: 索引时启用/禁用自动统计信息收集 被创建。

IndexStatAutoUpdate: 监控索引的变化并触发自动统计 更新。

IndexStatSaveScale: 用于确定存储索引大小的比例因子 统计学。

IndexStatSaveSize: 每个索引保存的统计信息的最大大小(以字节为单位)。

IndexStatTriggerPct: 索引的 DML 操作中的阈值百分比变化 统计信息更新。价值按比例缩小 IndexStatTriggerScale.

IndexStatTriggerScale: 将 IndexStatTriggerPct 缩减此数量,再乘以 索引大小的底数为 2,用于大索引。设置为 0 到 禁用缩放。

IndexStatUpdateDelay: 自动索引统计信息更新之间的最小延迟 给定索引。0 表示无延迟。

InitFragmentLogFiles: 使用稀疏或完整格式初始化片段日志文件。

InitialLogFileGroup: 描述在初始期间创建的日志文件组 开始。有关格式,请参阅文档。

InitialNoOfOpenFiles: 每个数据节点打开的初始文件数。(一个线程是 按文件创建)。

InitialTablespace: 描述在初始启动期间创建的表空间。 有关格式,请参阅文档。

InsertRecoveryWork: 用于插入行的恢复工作百分比;没有 除非使用部分本地检查点,否则效果。

LateAlloc: 连接到管理服务器后分配内存 已经成立。

LcpScanProgressTimeout: 本地检查点片段扫描可以达到的最长时间 在节点关闭之前停止,以确保系统范围的 LCP 进展。使用 0 禁用。

LockExecuteThreadToCPU: 以逗号分隔的 CPU ID 列表。

LockMaintThreadsToCPU: 指示哪个 CPU 运行维护线程的 CPU ID。

LockPagesInMainMemory: 0=禁用锁定,1=内存分配后锁定,2=锁定 在内存分配之前。

LogLevelCheckpoint: 打印的本地和全局检查点信息的日志级别 到标准输出。

LogLevelCongestion: 打印到标准输出的拥塞信息级别。

LogLevelConnection: 打印到的节点连接/断开连接信息的级别 标准输出。

LogLevelError: 传输器,心跳错误打印到标准输出。

LogLevelInfo: 打印到标准输出的检测信号和日志信息。

LogLevelNodeRestart: 打印的节点重启级别和节点故障信息 到标准输出。

LogLevelShutdown: 打印到 stdout 的节点关闭信息级别。

LogLevelStartup: 打印到 stdout 的节点启动信息的级别。

LogLevelStatistic: 事务、操作和传输器信息的级别 打印到标准输出。

LongMessageBuffer: 在每个数据节点上为内部分配的字节数 长消息。

MaxAllocate: 不再使用;没有效果。

MaxBufferedEpochs: 允许订阅节点可能滞后的纪元编号 落后(未处理的纪元)。超出导致滞后 要断开连接的订阅者。

MaxBufferedEpochBytes: 为缓冲纪元分配的总字节数。

MaxDiskWriteSpeed: 每秒可写入的最大字节数 LCP 和备份(未进行重新启动)。

MaxDiskWriteSpeedOtherNodeRestart: 每秒可写入的最大字节数 LCP 和备份,当另一个节点重新启动时。

MaxDiskWriteSpeedOwnRestart: 每秒可写入的最大字节数 此节点重新启动时的 LCP 和备份。

MaxFKBuildBatchSize: 用于生成外键的最大扫描批大小。 增加此值可能会加快外键的生成速度 但也会影响正在进行的流量。

MaxDMLOperationsPerTransaction: 限制交易规模;如果需要,中止事务 不止这么多 DML 操作。

MaxLCPStartDelay: LCP 轮询检查点互斥锁的时间(以秒为单位) 允许其他数据节点完成元数据 同步),在将自身置于锁定队列之前 并行恢复表数据。

MaxNoOfAttributes: 建议数据库中存储的属性总数(总和 在所有表上)。

MaxNoOfConcurrentIndexOperations: 可以执行的索引操作总数 同时在一个数据节点上。

MaxNoOfConcurrentOperations: 事务中的最大操作记录数 协调者。

MaxNoOfConcurrentScans: 在数据节点上并发执行的最大扫描数。

MaxNoOfConcurrentSubOperations: 最大并发订阅者操作数。

MaxNoOfConcurrentTransactions: 并发执行的最大事务数 此数据节点,可以 并发执行是此值乘以数据数 群集中的节点。

MaxNoOfFiredTriggers: 可以同时触发一个触发器的总数 数据节点。

MaxNoOfLocalOperations: 在此数据上定义的最大操作记录数 节点。

MaxNoOfLocalScans: 对此数据并行扫描的最大碎片数 节点。

MaxNoOfOpenFiles: 每个数据节点打开的最大文件数。(一个线程是 按文件创建)。

MaxNoOfOrderedIndexes: 可在 中定义的有序索引总数 系统。

MaxNoOfSavedMessages: 要在错误日志中写入的最大错误消息数和 要保留的最大跟踪文件数。

MaxNoOfSubscribers: 最大订阅者数。

MaxNoOfSubscriptions: 最大订阅数(默认值 0 = 最大表数)。

MaxNoOfTables: 建议数据库中存储的NDB表总数。

MaxNoOfTriggers: 可在系统中定义的触发器总数。

MaxNoOfUniqueHashIndexes: 可在 中定义的唯一哈希索引总数 系统。

MaxParallelCopyInstances: 节点重新启动期间的并行副本数。默认值为 0,在两个节点上使用 LDM 数,最大值为 16.

MaxParallelScansPerFragment: 每个片段的最大并行扫描数。一旦这个 达到限制,扫描被序列化。

MaxReorgBuildBatchSize: 用于重组表的最大扫描批大小 分区。增加此值可能会加快表 分区重组,但影响正在进行的流量,因为 井。

MaxStartFailRetries: 数据节点在启动时失败时的最大重试次数,需要 停止错误 = 0。设置为 0 会导致启动尝试 无限期地继续。

MaxUIBuildBatchSize: 用于构建唯一密钥的最大扫描批大小。 增加此值可能会加快唯一键的生成速度,但 也会影响正在进行的流量。

MemReportFrequency: 内存报告的频率(以秒为单位);0 = 仅在以下情况下报告 超出百分比限制。

MinDiskWriteSpeed: 每秒可写入的最小字节数 LCP 和备份。

MinFreePct: 要保留的内存资源百分比 重新 启动。

NodeGroup: 数据节点所属的节点组;仅在以下期间使用群集的初始启动。

NodeId: 集群中所有节点中唯一标识数据节点的编号簇。

NoOfFragmentLogFiles: 16 个文件集中每个文件中的 4 MB 重做日志文件数 属于数据节点。

NoOfReplicas: 数据库中所有数据的副本数。

Numa: (仅限 Linux;需要 libnuma)控制 NUMA 支持。 设置为 0 允许系统确定交错的使用 通过数据节点过程;1表示由数据决定 节点。

ODirect: 尽可能使用O_DIRECT文件读取和写入。

ODirectSyncFlag: O_DIRECT写入被视为同步写入;忽视 如果未启用 ODirect,则 InitFragmentLogFiles 设置为 稀疏,或两者兼而有之。

RealtimeScheduler: 如果为 true,则数据节点线程被调度为实时 线程。默认值为假。

RecoveryWork: LCP 文件的存储开销百分比:更大的价值 意味着正常操作中的工作量更少,在操作期间工作更多 恢复。

RedoBuffer: 分配给写入重做的每个数据节点上的字节数 原木。

RedoOverCommitCounter: 当 RedoOverCommitLimit 被多次超过时, 事务中止,操作处理方式为 由 DefaultOperationRedoProblemAction 指定。

RedoOverCommitLimit: 每次刷新当前重做缓冲区需要更长的时间 比这多少秒,这有的次数 发生与RedoOverCommitCounter进行了比较。

ReservedSendBufferMemory: 此参数存在于NDB代码中,但未启用。

RestartOnErrorInsert: 由插入错误(当 已启用停止错误)。

SchedulerExecutionTimer: 之前在调度程序中执行的微秒数 发送。

SchedulerResponsiveness: 设置NDB调度程序响应优化0-10;更高的值 提供更好的响应时间,但吞吐量较低。

SchedulerSpinTimer: 之前在调度程序中执行的微秒数 睡眠。

ServerPort: 用于为传入连接设置传输器的端口 从 API 节点。

SharedGlobalMemory: 每个数据节点上分配给任何数据节点的总字节数 用。

StartFailRetryDelay: 在重试之前,启动失败后延迟(以秒为单位); 需要停止错误 = 0。

StartFailureTimeout: 终止前等待的毫秒。(0=永远等待)。

StartNoNodeGroupTimeout: 等待没有节点组的节点的时间,然后再尝试 开始(0=永远)。

StartPartialTimeout: 在尝试在没有全部的情况下开始之前等待的毫秒数 节点。(0=永远等待)。

StartPartitionedTimeout: 尝试开始分区之前等待的毫秒数。 (0=永远等待)。

StartupStatusReportFrequency: 启动期间状态报告的频率。

StopOnError: 设置为 0 时,数据节点会自动重启和恢复 以下节点故障。

StringMemory: 字符串内存的默认大小(0 到 100 = 最大值的百分比,101+ = 实际字节数)。

TcpBind_INADDR_ANY: 绑定IP_ADDR_ANY以便可以从 任何地方(对于自动生成的连接)。

TimeBetweenEpochs: 纪元之间的时间(用于复制的同步)。

TimeBetweenEpochsTimeout: 纪元之间的时间超时。“超出原因”节点 关闭。

TimeBetweenGlobalCheckpoints: 组将事务提交到磁盘之间的时间。

TimeBetweenGlobalCheckpointsTimeout: 将事务组提交到磁盘的最小超时。

TimeBetweenInactiveTransactionAbortCheck: 检查非活动事务之间的时间。

TimeBetweenLocalCheckpoints: 拍摄数据库快照之间的时间(以 以 2 为底的字节对数)。

TimeBetweenWatchDogCheck: 数据节点内执行检查之间的时间。

TimeBetweenWatchDogCheckInitial: 数据节点内执行检查之间的时间(提前启动) 分配内存的阶段)。

TotalSendBufferMemory: 用于所有传输器发送缓冲区的总内存。

TransactionBufferMemory: 键和属性数据的动态缓冲区空间(以字节为单位) 为每个数据节点分配。

TransactionDeadlockDetectionTimeout: 事务事务可以在数据节点内执行的时间。这 是事务协调器等待每个数据的时间 参与事务执行请求的节点。如果 数据节点花费的时间超过此量,事务 已中止。

TransactionInactiveTimeout: 应用程序在执行另一个应用程序之前等待的毫秒数 交易的一部分。这是时间事务协调器 等待应用程序执行或发送另一个部件 (查询、语句)的交易。如果申请也需要 很多时间,然后事务中止。超时 = 0 表示 该应用程序永远不会超时。

TwoPassInitialNodeRestartCopy: 在初始节点重新启动期间分 2 次复制数据,这 支持多线程构建有序索引 重新 启动。

UndoDataBuffer: 闲置;没有效果。

UndoIndexBuffer: 闲置;没有效果。

UseShm: 在此数据节点和 API 之间使用共享内存连接 节点也在此主机上运行。

## 以下参数特定于 ndbmtd:

MaxNoOfExecutionThreads: 仅对于 ndbmtd,请指定最大执行次数 线程。

NoOfFragmentLogParts: 属于此数据节点的重做日志文件组数。

ThreadConfig: 用于配置多线程数据节点 (ndbmtd)。 默认值为空字符串;有关语法和文档,请参阅文档 其他信息。


问题项

1、mysql更改数据目录后无法启动问题

查看MySQL的错误日志

解决办法

1、在MySQL的systemd中添加限制
vim /lib/systemd/system/mysql.service
[Service]
LimitNOFILE=65535
2、在/etc下修改系统的句柄数
vim /etc/security/limits.conf

* soft nofile 65535
* hard nofile 65535


sysctl -p 

1、修改目录后添加授权
chown -R mysql.mysql data
修改了my.cnf中的datadir的值
chown和chmod了数次新数据目录或者其父路径的属主和权限
2、重启后问题依然存在
原因:1、centos中selinux开启后,修改MySQL的数据目录后重启会失败
2、apparmor,对mysql所能使用的目录权限做了限制
vim /etc/apparmor.d/usr.sbin.mysqld 

添加新数据目录

systemctl daemon-reload 
systemctl restart apparmor


2、初始化MySQL错误

原因:系统中没有安装libaio

解决办法:

apt install  libaio-dev

3、启动MySQL错误

systemctl start mysql
Failed to start mysql.service: Unit mysql.service is masked.

原因:机器MySQL卸载不干净,导致启动服务屏蔽,不能启动

root@podB:/etc/init.d# systemctl unmask mysql.service
Removed symlink /etc/systemd/system/mysql.service.

##重启服务

4、mysql启动报错

#MySQL集群中先停止mysql数据节点后重启出现错误 
The server quit without updating PID file!

原因有很多。

1、可能是/usr/local/mysql/data/mysql.pid文件没有写的权限

解决方法 :给予权限,执行 “chown -R mysql:mysql /var/data” “chmod -R 755 /usr/local/mysql/data” 然后重新启动mysqld!

此方式未解决

2、可能进程里已经存在mysql进程 解决方法:用命令“ps -ef|grep mysqld”查看是否有mysqld进程,如果有使用“kill -9 进程号”杀死,然后重新启动mysqld!

此方式未解决

3、可能是第二次在机器上安装mysql,有残余数据影响了服务的启动。

解决方法:去mysql的数据目录/data看看,如果存在mysql-bin.index,就赶快把它删除掉吧,它就是罪魁祸首了

此方式不适用

4、mysql在启动时没有指定配置文件时会使用/etc/my.cnf配置文件,请打开这个文件查看在[mysqld]节下有没有指定数据目录(datadir)。

解决方法:请在[mysqld]下设置这一行:datadir = /usr/local/mysql/data

5、skip-federated字段问题

解决方法:检查一下/etc/my.cnf文件中有没有没被注释掉的skip-federated字段,如果有就立即注释掉吧。

此方案不适用

6、错误日志目录不存在

解决方法:使用“chown” “chmod”命令赋予mysql所有者及权限

此方案不适用

5、sql节点建表时异常

mysql> use bg;
Database changed
mysql> CREATE TABLE bgt1 (id INT,`name` VARCHAR(20),PRIMARY KEY(`id`))ENGINE=NDBCLUSTER;
ERROR 1296 (HY000): Got error 781 'Invalid schema transaction key from NDB API' from NDBCLUSTER

原因:数据节点连接异常,管理节点出现以下提示

ndb_mgm> Node 2: Forced node shutdown completed. Caused by error 2815: 'File not found(Ndbd file system inconsistency error, please report a bug). Ndbd file system error, restart node initial'.

解决办法

重新连接数据节点

cd /usr/local/mysql/bin
./ndbd --initial


##注意事项,正式环境中非首次连接不用initial参数,否则集群数据易丢失。

mysql初始化后启动正常时目录权限

root@podB:/usr/local/mysql# ll
total 432
drwxr-xr-x 11 root  mysql   4096 Feb 22 16:13 ./
drwxr-xr-x 13 root  root    4096 Feb 16 17:56 ../
drwxr-xr-x  2 root  mysql   4096 Feb 17 11:33 bin/
drwxr-xr-x  6 mysql mysql   4096 Feb 22 16:56 data/
drwxr-xr-x  2 root  mysql   4096 Feb 17 11:33 docs/
drwxr-xr-x  4 root  mysql   4096 Feb 17 11:33 include/
drwxr-xr-x  5 root  mysql   4096 Feb 17 11:33 lib/
-rw-r--r--  1 root  mysql 385412 Feb 17 11:33 LICENSE
drwxr-xr-x  4 root  mysql   4096 Feb 17 11:33 man/
drwxr-xr-x 10 root  mysql   4096 Feb 17 11:33 mysql-test/
-rw-r--r--  1 root  mysql    587 Feb 17 11:33 README
-rw-r--r--  1 root  mysql    587 Feb 17 11:33 README-test
drwxr-xr-x 31 root  mysql   4096 Feb 17 11:33 share/
drwxr-xr-x  2 root  mysql   4096 Feb 17 11:54 support-files/

root@podB:/usr/local/mysql/data# ll
total 122956
drwxr-xr-x  6 mysql mysql     4096 Feb 22 16:56 ./
drwxr-xr-x 11 root  mysql     4096 Feb 22 16:13 ../
-rw-r-----  1 mysql mysql       56 Feb 22 16:54 auto.cnf
-rw-------  1 mysql mysql     1680 Feb 22 16:54 ca-key.pem
-rw-r--r--  1 mysql mysql     1140 Feb 22 16:54 ca.pem
-rw-r--r--  1 mysql mysql     1140 Feb 22 16:54 client-cert.pem
-rw-------  1 mysql mysql     1680 Feb 22 16:54 client-key.pem
-rw-r-----  1 mysql mysql      440 Feb 22 16:54 ib_buffer_pool
-rw-r-----  1 mysql mysql 12582912 Feb 22 16:56 ibdata1
-rw-r-----  1 mysql mysql 50331648 Feb 22 16:56 ib_logfile0
-rw-r-----  1 mysql mysql 50331648 Feb 22 16:54 ib_logfile1
-rw-r-----  1 mysql mysql 12582912 Feb 22 16:56 ibtmp1
drwxr-x---  2 mysql mysql     4096 Feb 22 16:54 mysql/
drwxr-x---  2 mysql mysql     4096 Feb 22 16:54 ndbinfo/
drwxr-x---  2 mysql mysql     4096 Feb 22 16:54 performance_schema/
-rw-r-----  1 mysql mysql        6 Feb 22 16:56 podB.pid
-rw-------  1 mysql mysql     1680 Feb 22 16:54 private_key.pem
-rw-r--r--  1 mysql mysql      452 Feb 22 16:54 public_key.pem
-rw-r--r--  1 mysql mysql     1140 Feb 22 16:54 server-cert.pem
-rw-------  1 mysql mysql     1676 Feb 22 16:54 server-key.pem
drwxr-x---  2 mysql mysql    12288 Feb 22 16:54 sys/


apparmor的介绍

AppArmor(Application Armor)是Linux内核的一个安全模块,AppArmor允许系统管理员将每个程序与一个安全配置文件关联,从而限制程序的功能。简单的说,AppArmor是与SELinux类似的一个访问控制系统,通过它你可以指定程序可以读、写或运行哪些文件,是否可以打开网络端口等。作为对传统Unix的自主访问控制模块的补充,AppArmor提供了强制访问控制机制,它已经被整合到2.6版本的Linux内核中。

AppArmor是 Ubuntu 的默认选择,但在默认情况下,系统自带安装的profile配置文件很少,通过命令:sudo apt install apparmor-profiles,可以安装额外的AppArmor-profile文件。在Ubuntu下通过命令sudo apparmor_status可以查看当前AppArmor的状态。 Apparmor的profile配置文件均保存在目录/etc/apparmor.d,对应的日志文件记录在/var/log/messages。

apparmor的工作模式

enforcement

Enforcement – 在这种模式下,配置文件里列出的限制条件都会得到执行,并且对于违反这些限制条件的程序会进行日志记录。

Complain

在这种模式下,配置文件里的限制条件不会得到执行,Apparmor只是对程序的行为进行记录。例如程序可以写一个在配置文件里注明只读的文件,但Apparmor不会对程序的行为进行限制,只是进行记录。

apparmor的访问控制和资源限制

(1)文件系统的访问控制

Apparmor可以对某一个文件,或者某一个目录下的文件进行访问控制

可读、可写、可扩展、可链接等(还有可执行x在表中没有列出)……

(2)资源限制

Apparmor可以提供类似系统调用setrlimit一样的方式来限制程序可以使用的资源。要限制资源,可在配置文件中这样写:

set rlimit [resource] <= [value],

其resource代表某一种资源,value代表某一个值,

要对程序可以使用的虚拟内存做限制时,可以这样写:

set rlimit as<=1M, (可以使用的虚拟内存最大为1M)

注意:Apparmor可以对程序要使用多种资源进行限制(fsize,data,stack,core,rss,as,memlock,msgqueue``等),但暂不支持对程序可以使用``CPU``时间进行限制。(现在``OJ``一般都对``ACMer``提交的程序的运行时间有严格的限制,所以要将``Apparmor``用于``OJ``后台安全模块,必须自己另外实现对``CPU``时间的限制。)

https://www.bbsmax.com/A/kPzOZpbZdx/

https://www.cnblogs.com/Lqdream/p/16918704.html

(3)访问网络

Apparmor``可以程序是否可以访问网络进行限制,在配置文件里的语法是:

network [ [domain] [type] [protocol] ]

要让程序可以进行所有的网络操作,只需在配置文件中写:

network,

要允许程序使用在IPv4下使用TCP协议,可以这样写:

network inet tcp,

配置文件的编写

编写完配置文件后,要把文件放到/etc/apparmor.d这个目录下,其实有更方便的方法,直接在命令行里面用:

sudo aa- genprof [filename]   (aa- genprof 需要安装apparmor-utils )

就可以为指定的程序创建一个配置文件,并把它放到该目录。

建立的内容配置

# Last Modified: Mon Feb 10 17:08:27 2020
#include <tunables/global>

/usr/bin/nmcli {
  #include <abstractions/base>

  /lib/x86_64-linux-gnu/ld-*.so mr,
  /usr/bin/nmcli mr,

}

##注意,该文件默认使用enforcement模式,要修改模式,只需将配置文件改为:

# Last Modified: Mon Feb 10 17:08:27 2020
#include <tunables/global>

/usr/bin/nmcli  flags=(complain){
  #include <abstractions/base>

  /lib/x86_64-linux-gnu/ld-*.so mr,
  /usr/bin/nmcli mr,

}

##重载生效
sudo systemctl reload apparmor.service 

解决办法

root@podB:/etc/init.d# systemctl start mysql
Failed to start mysql.service: Unit mysql.service is masked.
root@podB:/etc/init.d# systemctl unmask mysql.service
Removed symlink /etc/systemd/system/mysql.service.
posted @   起落架第三个着陆灯  阅读(107)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 全程不用写代码,我用AI程序员写了一个飞机大战
· DeepSeek 开源周回顾「GitHub 热点速览」
· 记一次.NET内存居高不下排查解决与启示
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· .NET10 - 预览版1新功能体验(一)
点击右上角即可分享
微信分享提示