mysql 数据按地理位置分片

Ale*_*lex 3 mysql sharding acid

按区域进行数据分片的常用方法是什么?又名 GDPR 执法 - 欧盟数据保留在欧盟。

如果我要将用户保存emailusers表中 - 我需要以某种方式将美国和欧盟用户的数据分开。示例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)
  • 拥有 2 台服务器(一台在欧盟,第二台在美国)是否正常?
  • 在这种情况下自动增量如何工作并连接选择/事务?

一般来说,我只是想知道如何解决这个问题。

Bil*_*win 5

如果您在欧盟有数据驻留要求,那么您要么需要两台服务器,要么需要将所有数据存储在欧盟。

如果您对数据进行分片(将其分割到多个服务器上),那么唯一键通常会带来一些复杂性。

至少有四种流行的解决方案可以生成全局唯一的 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/等文章(尽管那篇文章不是法律建议)。