目录
-
一、导读
DBLE是一款应用较为广泛的开源分布式数据库中间件产品。本文主要结合实际生产中的案例,介绍DBLE缓存机制、缓存使用限制、以及缓存种类。下面将通过使用DBLE进行主键更新查询操作,返回结果异常的实际案例来进行演示分析。
-
二、现象描述
前期开发同学反馈在进行数据修正时,查询丢失部分数据。A表进行了数据的分片,分片方式为hash,分片节点数量为2。首先连接DBLE在表A中插入主键值1和主键值2两条数据,使其分布在不同分片上。更新主键值1为2(两条数据不在同一分片上不会产生主键冲突),根据主键值2进行查询,只返回一条数据,丢失更新后数据。现将问题复现如下。
2.1环境及版本
DBLE版本:2.19.11.99
MySQL版本:5.7.28
涉及分片表:test
主键为mobile_no
分片字段为user_code
分片拆分规则:hash
节点数量:2
2.2表结构示例
create table test(
mobile_no varchar(32) not null,
user_code varchar(32) not null,
PRIMARY KEY (mobile_no),
INDEX idx_usercode(user_code)
) ENGINE=InnoDB CHARACTER SET =utf8mb4;
2.3查询结果异常模拟
- 通过DBLE插入两条数据使其分别分布在node1、node2分片上。
mysql> insert into test values(13600000001,0);
Query OK, 1 row affected (0.00 sec)
mysql> insert into test values(13800000002,1);
Query OK, 1 row affected (0.00 sec)
2)根据主键查询(缓存主键信息)
mysql> select * from test where mobile_no=13600000001;
+-------------+-----------+
| mobile_no | user_code |
+-------------+-----------+
| 13600000001 | 0 |
+-------------+-----------+
1 row in set (0.00 sec)
mysql> select * from test where mobile_no=13800000002;
+-------------+-----------+
| mobile_no | user_code |
+-------------+-----------+
| 13800000002 | 1 |
+-------------+-----------+
1 row in set (0.00 sec)
3)更新主键并查询(因所处不同分片,主键不产生冲突),执行计划查询分发到所有节点,查询结果符合预期。
mysql> update test se