Ale*_*lex 3 mysql sharding acid
按区域进行数据分片的常用方法是什么?又名 GDPR 执法 - 欧盟数据保留在欧盟。
如果我要将用户保存email在users表中 - 我需要以某种方式将美国和欧盟用户的数据分开。示例mysql表:
CREATE TABLE users(
id INT NOT NULL AUTO_INCREMENT,
PRIMARY KEY(id),
name VARCHAR(30),
email VARCHAR(30),
otherSensetiveData VARCHAR(30))
Run Code Online (Sandbox Code Playgroud)
一般来说,我只是想知道如何解决这个问题。
如果您在欧盟有数据驻留要求,那么您要么需要两台服务器,要么需要将所有数据存储在欧盟。
如果您对数据进行分片(将其分割到多个服务器上),那么唯一键通常会带来一些复杂性。
至少有四种流行的解决方案可以生成全局唯一的 id 值:
auto_increment_increment使用自动增量,但通过使用设置为分片数量并auto_increment_offset设置为 0 到分片数量之间的不同值来确保它们不会分配相同的 id 值。例如,如果您有 2 个分片,则auto_increment_increment两个分片上的值均设置为 2,auto_increment_offset美国分片上的值设置为 0,欧盟分片上的值设置为 1。
使用复合主键,一列自动递增,另一列限制为不同的 shardid。您可以在每个分片上以不同的方式定义表。
CREATE TABLE users(
id INT NOT NULL AUTO_INCREMENT,
shardid INT NOT NULL CHECK (shardid = 1),
PRIMARY KEY(id, shardid)
);
Run Code Online (Sandbox Code Playgroud)
不要使用 MySQL 的内置自动增量功能,而是创建一个全局唯一的 id 生成器服务,美国和欧盟应用程序实例都会调用该服务来获取下一个 id。这是客户端应用程序应该调用的内容,然后将该值作为查询参数传递给 INSERT 语句。如果远程端在每次插入时调用此服务太慢,则远程应用程序可能会提前获取一批 id 值并将它们存储在本地,始终保留 id 值的“供应”以供使用。
使用UUID或全局唯一字符串。这部分是由 MySQL 实例的服务器 ID 编码的,因此它必然是唯一的。您可以在 MySQL 数据库中使用触发器来用 UUID 填充主键。
CREATE TRIGGER t BEFORE INSERT on users FOR EACH ROW SET id = UUID();
Run Code Online (Sandbox Code Playgroud)
分片是一个复杂的主题,您需要选择最适合您的应用程序的解决方案。
我建议您首先与熟悉 GDPR 的合格法律专业人士交谈,以确认您确实有数据驻留的要求。在某些情况下,您不需要,根据https://www.mcafee.com/blogs/enterprise/data-security/data-residency-a-concept-not-found-in-the-gdpr/等文章(尽管那篇文章不是法律建议)。