首先请注意,Mysql Cluster 不是为 WAN 设计的,通常最好在您的节点之间具有小于 20ms 的传播延迟。
Mysql Cluster 做分片(在数据节点之间平均分配数据)+复制(每个分片数据存储两次)。
如此简单的表格,
| test | CREATE TABLE `test` (
`id` bigint(20) NOT NULL AUTO_INCREMENT,
`v1` char(255) DEFAULT NULL,
PRIMARY KEY (`id`)
) ENGINE=ndbcluster AUTO_INCREMENT=1871780 DEFAULT CHARSET=latin1
如果您检查 information_schema,您将看到该表的分区
mysql> select partition_name,table_rows from information_schema.PARTITIONS where table_name='test' and table_schema='test1';
+----------------+------------+
| partition_name | table_rows |
+----------------+------------+
| p0 | 518667 |
| p1 | 518900 |
| p2 | 517385 |
| p3 | 519050 |
+----------------+------------+
4 rows in set (0.02 sec)
分区 p0,p2 代表数据节点 1,p1,p3 代表节点 2。数据基于主键(或人工键,如果现在定义了主键)分布。
Select 根据这个分区选择要读取的节点,所以如果你使用 explain
mysql> explain partitions select id,v1 from test where id=1\G
*************************** 1. row ***************************
id: 1
select_type: SIMPLE
table: test
partitions: p3
type: eq_ref
possible_keys: PRIMARY
key: PRIMARY
key_len: 8
ref: const
rows: 1
Extra: NULL
1 row in set (0.00 sec)
mysql> explain partitions select id,v1 from test where id=2\G
*************************** 1. row ***************************
id: 1
select_type: SIMPLE
table: test
partitions: p2
type: eq_ref
possible_keys: PRIMARY
key: PRIMARY
key_len: 8
ref: const
rows: 1
Extra: NULL
id=92 的记录将仅从其中一个数据节点(可能是地理分布的节点)中读取,但不幸的是,它不仅适用于 id 92。
最好的方法是为客户 ID 92(在单独的节点上)创建一个单独的表,并重写您的应用程序以从该表/节点读取。要获得对应用程序透明的解决方案,您可以使用Mysql 代理