我知道使用 NDB 你不能做大的事务,如果你做数据节点可以重新启动到只读模式和损坏的表。
我需要将记录复制到一个新表中,但问题是该表在暂存中包含数百万行,实时服务器甚至是该数量的 10 倍。
我怎样才能将我的副本分成更小的事务,这样我就不会杀死我的服务器?
我知道使用 NDB 你不能做大的事务,如果你做数据节点可以重新启动到只读模式和损坏的表。
我需要将记录复制到一个新表中,但问题是该表在暂存中包含数百万行,实时服务器甚至是该数量的 10 倍。
我怎样才能将我的副本分成更小的事务,这样我就不会杀死我的服务器?
我有一个基本的 MySQL NDB 集群正在运行——它运行良好。Manager、Data、SQL节点都OK。1 个管理器,2 个 SQL 节点,4 个数据节点。2 个数据节点来自初始创建,2 个是我要添加的节点。
在环境方面,这就是我所拥有的(适用于所有节点)。
OS: CentOS 7
SELinux: disabled
firewalld : not installed
MySQL version: mysql-5.6.28
NDB: ndb-7.4.10
配置视图如下所示:
[root@mysql-ndb-manager ~]# ndb_mgm -e "SHOW"
Connected to Management Server at: localhost:1186
Cluster Configuration
---------------------
[ndbd(NDB)] 4 node(s)
id=2 @10.133.16.108 (mysql-5.6.28 ndb-7.4.10, Nodegroup: 0, *)
id=3 @10.133.16.196 (mysql-5.6.28 ndb-7.4.10, Nodegroup: 0)
id=6 @10.133.16.121 (mysql-5.6.28 ndb-7.4.10, Nodegroup: 1)
id=7 @10.133.16.112 (mysql-5.6.28 ndb-7.4.10, Nodegroup: 1)
[ndb_mgmd(MGM)] 1 node(s)
id=1 @10.133.16.179 (mysql-5.6.28 ndb-7.4.10)
[mysqld(API)] 3 node(s)
id=4 @10.133.16.117 (mysql-5.6.28 ndb-7.4.10)
id=5 @10.133.16.180 (mysql-5.6.28 ndb-7.4.10)
id=8 (not connected, accepting connect from any host)
NoOfReplicas 设置为 2,所以这个节点数应该没问题。我很快意识到将 NoOfReplicas 设置为 2 意味着添加一个额外的数据节点不起作用。
如您所见,我有一个可用的节点 ID (8),可以分配给 ndb_desc 等。
我要添加的新节点:
IDs: 6 & 7
据我所知,它们配置正确,但没有关于它们的数据。它们已正确启动并被列为集群的一部分。这是重新分配过程对我不起作用。
这些文档非常容易理解,即它们需要使用 ndb_desc 连接到管理器并更改表结构,以便将数据分发到新节点。
当我运行所需的命令时,我得到这个:
[root@mysql-ndb-manager ~]# ndb_desc -c 10.133.16.179:1186 my_table -d
appdb -p --ndb-nodeid=8
Unable to connect to management server.
NDBT_ProgramExit: 1 - Failed```
我见过其他人有类似的问题,而且几乎总是缺少可以分配的节点 ID。据我所知,我的情况并非如此。
我试过连接管理员的 IP 地址,localhost,127.0.0.1。
我试过本地和远程。我试过使用文档中的确切命令,即它们的数据库和表名,但这不起作用(我猜是预期的)。
我现在唯一的数据如下:
Database: `appdb`
Table: `my_table` (ID auto_increment and `name` char(25))
Data: 14 rows, random names
数据在旧/工作节点之间毫无问题地复制,即我可以在其中一个节点上创建数据库或运行任何 SQL 命令,并且更改会立即反映在另一个节点上。离线节点按预期显示为离线,并在我将它们重新启动时显示为在线。
我还有一个滚动重启脚本,它可以正常工作,所以看起来集群方面没问题。
最后,这是我经理的配置文件:
[ndb_mgmd default]
DataDir=/var/lib/mysql-cluster
[mgm]
HostName=10.133.16.179
[ndbd default]
NoOfReplicas=2
DataMemory=256M
IndexMemory=128M
DataDir=/var/lib/mysql-cluster
[ndbd]
HostName=10.133.16.108
[ndbd]
HostName=10.133.16.196
[mysqld]
HostName=10.133.16.117
[mysqld]
HostName=10.133.16.180
[ndbd]
HostName=10.133.16.121
[ndbd]
HostName=10.133.16.112
[mysqld]
还有什么可能导致这个?
谢谢!
我有两个 MySQL 集群 (NDB),Prod 和 Dev。每个集群包含 SQL 节点、管理节点和数据节点。使用以下文章在一个集群上完成备份:
https://dev.mysql.com/doc/refman/5.7/en/mysql-cluster-backup-using-management-client.html
如何将创建的备份文件导入到单独的MySQL Cluster中?即使用产品数据刷新开发集群。
备份似乎与创建它的集群相关联。有没有办法使用备份文件在单独的集群上进行“恢复”?
我已经安装了三个Oracle Linux 7.3。2 个用于数据节点,1 个用于管理和 SQL API 节点。机器可以互相 ping 通,SSH 工作,“etc/hosts”文件被正确填充:
127.0.0.1 localhost localhost.localdomain localhost4 localhost4.localdomain4
::1 localhost localhost.localdomain localhost6 localhost6.localdomain6
172.16.1.101 mysqld_mgmt_1
172.16.1.103 mysql_data_1
172.16.1.104 mysql_data_2
管理节点在“/var/lib/mysql-cluster/config.ini”文件中有如下配置:
# Options affecting ndbd processes on all data nodes:
[NDBD DEFAULT]
NoOfReplicas=2 # Number of replicas
[ndb_mgmd]
# Management process options:
hostname=mysqld_mgmt_1 # Hostname of the manager
datadir=/var/lib/mysql-cluster # Directory for the log files
[ndbd]
hostname=mysql_data_1 # Hostname of the first data node
datadir=/var/lib/mysql-cluster # Remote directory for the data files
ServerPort=50501
[ndbd]
hostname=mysql_data_2 # Hostname of the second data node
datadir=/var/lib/mysql-cluster # Remote directory for the data files
ServerPort=50502
[mysqld]
# SQL node options:
hostname=mysqld_mgmt_1 # In our case the MySQL server/client is on the same Droplet as the cluster manager
SQL API 节点(与管理相同)在“/etc/my.cnf”文件中具有以下配置:
[mysqld]
ndbcluster # Run NDB storage engine
ndb-connectstring=172.16.1.101
[mysql_cluster]
ndb-connectstring=mysqld_mgmt_1 # IP address for server management node
两个数据节点在每个节点上都有相同的配置文件(“/etc/my.cnf”):
[mysqld]
ndbcluster
ndb-connectstring=172.16.1.101
[mysql_cluster]
ndb-connectstring=172.16.1.101 # IP address of Management Node 1
1. management: ndb_mgmd -f /var/lib/mysql-cluster/config.ini
or with a new config to erase the cache:
ndb_mgmd --initial --config-file=/var/lib/mysql-cluster/config.ini
2. data node 1 and 2: ndbd
3. mysql server: service mysql start
[root@mysqld-mgmt-1 ~]# ndb_mgm
-- NDB Cluster -- Management Client --
ndb_mgm> show
Connected to Management Server at: mysqld_mgmt_1:1186
Cluster Configuration
---------------------
[ndbd(NDB)] 2 node(s)
id=2 @172.16.1.103 (mysql-5.6.37 ndb-7.3.18, Nodegroup: 0, *)
id=3 @172.16.1.104 (mysql-5.6.37 ndb-7.3.18, Nodegroup: 0)
[ndb_mgmd(MGM)] 1 node(s)
id=1 @172.16.1.101 (mysql-5.6.37 ndb-7.3.18)
[mysqld(API)] 1 node(s)
id=4 (not connected, accepting connect from 172.16.1.101)
我可以从服务器节点上的命令行登录到 MySQL(以及从 MySQL Workbench 以及从另一个 VM):
[root@mysqld-mgmt-1 ~]# mysql -u root -p
Enter password:
Welcome to the MySQL monitor. Commands end with ; or \g.
Your MySQL connection id is 2
Server version: 5.6.37-ndb-7.3.18-cluster-gpl MySQL Cluster Community Server (GPL)
Copyright (c) 2000, 2017, 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 engines;
+--------------------+---------+----------------------------------------------------------------+--------------+------+------------+
| Engine | Support | Comment | Transactions | XA | Savepoints |
+--------------------+---------+----------------------------------------------------------------+--------------+------+------------+
| ndbcluster | YES | Clustered, fault-tolerant tables | YES | NO | NO |
| MRG_MYISAM | YES | Collection of identical MyISAM tables | NO | NO | NO |
| MyISAM | YES | MyISAM storage engine | NO | NO | NO |
| ndbinfo | YES | MySQL Cluster system information storage engine | NO | NO | NO |
| CSV | YES | CSV storage engine | NO | NO | NO |
| BLACKHOLE | YES | /dev/null storage engine (anything you write to it disappears) | NO | NO | NO |
| ARCHIVE | YES | Archive storage engine | NO | NO | NO |
| FEDERATED | NO | Federated MySQL storage engine | NULL | NULL | NULL |
| PERFORMANCE_SCHEMA | YES | Performance Schema | NO | NO | NO |
| InnoDB | DEFAULT | Supports transactions, row-level locking, and foreign keys | YES | YES | YES |
| MEMORY | YES | Hash based, stored in memory, useful for temporary tables | NO | NO | NO |
+--------------------+---------+----------------------------------------------------------------+--------------+------+------------+
11 rows in set (0.01 sec)
我创建了一个没有“引擎”参数的示例表,只是为了尝试。我想更改表以使用 ndb 引擎,但我有以下问题:
mysql> use clusterdb;
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> select * from simples;
+----+
| id |
+----+
| 1 |
| 2 |
| 3 |
| 4 |
+----+
4 rows in set (0.00 sec)
mysql> alter table simples engine=ndb;
ERROR 157 (HY000): Could not connect to storage engine
mysql> show warnings;
+---------+------+---------------------------------------------------------------------------------+
| Level | Code | Message |
+---------+------+---------------------------------------------------------------------------------+
| Warning | 1296 | Got error 4009 'Cluster Failure' from NDB. Could not acquire global schema lock |
| Error | 157 | Could not connect to storage engine |
| Error | 1499 | Too many partitions (including subpartitions) were defined |
+---------+------+---------------------------------------------------------------------------------+
3 rows in set (0.00 sec)
mysql> show global status like 'ndb_number_of%';
+--------------------------------+-------+
| Variable_name | Value |
+--------------------------------+-------+
| Ndb_number_of_data_nodes | 2 |
| Ndb_number_of_ready_data_nodes | 0 |
+--------------------------------+-------+
2 rows in set (0.00 sec)
此外,使用“engine=ndb”参数创建表也会失败并给出相同的错误。我看到数据库可以与 InnoDB 引擎一起正常工作,但我需要一个容错(类似)数据库。
在默认安装中,数据在所有数据节点之间不加选择地共享。
是否可以指定某些表只能跨一组特定的数据节点进行复制?
如果是这样,是否需要在这些节点上创建表,或者它们是否可以从其他节点迁移?
这是我的情况:
我得到了超过 10G 的网络日志(大约 3000 万行),我主要用各种条件搜索它。
例如:
select * from tbl
where ip = '123.123.12.3'
and agent = 'mozillar'
and body like '%script%'
随着数据越来越大,一个简单的查询需要几分钟,所以我试图用 MySQL 集群创建一些分布式数据库。
我在 Google 云虚拟机上构建了 1 个管理服务器、1 个 SQL (api) 服务器和 4 个数据节点。每个实例有 2 个 CPU 和 8 GB。
问题:
当我尝试从 .sql 文件恢复数据时,每个插入语句几乎需要 2~3 秒!
3 秒 * 30m 行 = 永远!
选择查询也让我很失望,它比普通 InnoDB 花费了将近 100 倍的时间。
难道我做错了什么?
有没有更好的解决方案适合我的目的?
配置文件
[ndbd default]
NoOfReplicas=2
DataMemory=5G
IndexMemory=128M
MaxNoOfConcurrentOperations=1000000
MaxNoOfLocalOperations=1100000
MaxNoOfConcurrentTransactions=327680
NoOfFragmentLogFiles=256
FragmentLogFileSize=32M
SharedGlobalMemory=512M
DiskPageBufferMemory=512M
DiskIoThreadPool=8
[ndb_mgmd]
NodeId=1
hostname=10.142.0.7
datadir=/var/lib/mysql-cluster/mgmt
[ndbd]
NodeId=11
hostname=10.142.0.8
datadir=/var/lib/mysql-cluster/data1
[ndbd]
NodeId=12
hostname=10.142.0.9
datadir=/var/lib/mysql-cluster/data2
[ndbd]
NodeId=13
hostname=10.142.0.10
datadir=/var/lib/mysql-cluster/data3
[ndbd]
NodeId=14
hostname=10.142.0.11
datadir=/var/lib/mysql-cluster/data4
[mysqld]
NodeId=100
所有节点都按预期连接到管理服务器
-- NDB Cluster -- Management Client --
ndb_mgm> show
Connected to Management Server at: localhost:1186
Cluster Configuration
---------------------
[ndbd(NDB)] 4 node(s)
id=11 @10.142.0.8 (mysql-5.6.29 ndb-7.4.11, Nodegroup: 0, *)
id=12 @10.142.0.9 (mysql-5.6.29 ndb-7.4.11, Nodegroup: 0)
id=13 @10.142.0.10 (mysql-5.6.29 ndb-7.4.11, Nodegroup: 1)
id=14 @10.142.0.11 (mysql-5.6.29 ndb-7.4.11, Nodegroup: 1)
[ndb_mgmd(MGM)] 1 node(s)
id=1 @10.142.0.7 (mysql-5.6.29 ndb-7.4.11)
[mysqld(API)] 1 node(s)
id=100 @10.142.0.2 (mysql-5.6.29 ndb-7.4.11)
附加信息:
Create Table: CREATE TABLE `tbl` (
`no` int(11) NOT NULL AUTO_INCREMENT,
`rule_name` varchar(50) DEFAULT NULL,
`ip` varchar(20) DEFAULT NULL,
`detection_time` datetime NOT NULL,
`uri` text,
`site` varchar(500) DEFAULT NULL,
`country` varchar(50) DEFAULT NULL,
`body` text CHARACTER SET utf8 COLLATE utf8_unicode_ci NOT NULL,
`detection_string` text,
`detection_type` int(11) NOT NULL,
`action` int(11) NOT NULL,
`category` int(10) NOT NULL,
PRIMARY KEY (`no`),
KEY `no` (`no`),
KEY `ip` (`ip`)
) ENGINE=InnoDB AUTO_INCREMENT=21682043 DEFAULT CHARSET=utf8
1 row in set (0.03 sec)
我正在尝试在从属集群上恢复 mysql 集群备份。
当我运行 ndb_restore 命令时,出现以下错误:
$ /usr/local/mysql/bin/ndb_restore -n 6 -b 15 -r ./6
Opening file './6/BACKUP-15.6.log'
File size 1210464 bytes
execute failed: 255: Foreign key constraint violated: No parent row found
NDBT_ProgramExit: 1 - Failed
我怎样才能跳过外键错误?
据我所知,mysqld 进程是 MySQl 集群的一种路由器。它将请求定向到正确的 ndbd 节点。
假设我在 3 台不同的机器上有 3 个 ndbd 节点并且我不使用复制。我需要多少个 mysqld 进程?我会说一个?对我来说,它就像一个主从架构(与 mongodb 相当)但我看到了每个 ndbd 节点也有一个 mysqld 进程的配置。为什么?
我已成功设置 ndbcluster 版本 7.1.26。这包含 2 个数据节点 [NDBD]、2 个 mysql [MYSQLD] 节点和一个管理 [MGMD] 节点。复制成功。我的 Web 应用程序部署在 JBoss-5.0.1 中,并使用 JNDI 连接资源,这些连接资源在应用程序特定的 ds.xml 文件中以负载平衡的 url 形式指定,例如 jbdc:mysql:loadbalance:host1:port1,host2:port2/databaseName。
host1 :指的是第一个 mysqld 节点,port1 指的是它运行的端口。host2 :指的是第二个 mysqld 节点,port2 指的是它运行的端口。
当两个 [MySQLD] 节点都启动并运行时,一切正常,集群响应良好,复制数据,数据检索操作也正常工作。
但是,当任何 [MySQLD] 节点出现故障时,就会出现问题。数据被插入/更新/复制,但应用程序无法从集群中检索数据,网页仍然忙于工作,这意味着忙于检索数据。一旦关闭的节点启动,它就会正确响应并且应用程序继续前进并显示从集群检索的数据。
在 JBoss 5.0.1 启动时,它在类 LoadBalancingConnectionProxy.invoke(LoadBalancingConnectionProxy.java:439) 中出现 NullPointerException。告诉我上述异常是否在上述解释的问题中起作用。
如果有人遇到过上述问题,并且对这些问题有任何解决方案,请告诉我。
谢谢并恭祝安康。