【问题标题】:mysql data sharding geographicallymysql数据分片地理
【发布时间】:2021-08-09 13:11:20
【问题描述】:

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

如果我要将用户的 emails 保存在 users 表中 - 我需要以某种方式将美国和欧盟人员的数据分开。示例mysql 表:

CREATE TABLE users(
        id INT NOT NULL AUTO_INCREMENT, 
        PRIMARY KEY(id),
        name VARCHAR(30), 
        email VARCHAR(30), 
        otherSensetiveData VARCHAR(30))
  • 有 2 台服务器是否正常 - 1 台在欧洲,2 台在美国?
  • 在这种情况下自动增量如何工作并加入选择/事务?

总的来说,我只想知道如何解决这个问题。

【问题讨论】:

  • MySQL 没有内置的分片支持。你想用它做什么?

标签: mysql sharding acid


【解决方案1】:

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

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

至少有四种流行的解决方案来生成全球唯一的 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)
    );
    
  • 不要使用 MySQL 的内置自动增量功能,而是创建一个全球唯一的 id 生成器服务,美国和欧盟的应用程序实例都会调用该服务来获取下一个 id。这是客户端应用程序应该调用的东西,然后将值作为查询参数传递给 INSERT 语句。如果远程端在每次 INSERT 时调用此服务的速度太慢,那么远程应用程序可能会提前获取一批 id 值并将它们存储在本地,始终保持“供应”的 id 值以供使用。

  • 使用UUID 或全局唯一字符串。这部分是由 MySQL 实例的服务器 ID 编码的,因此它必然是唯一的。您可以在 MySQL 数据库中使用触发器来使用 UUID 填充主键。

    CREATE TRIGGER t BEFORE INSERT on users FOR EACH ROW SET id = UUID();
    

分片是一个复杂的主题,您需要选择最适合您的应用的解决方案。

我建议您先咨询熟悉 GDPR 的合格法律专业人士,以确认您确实需要数据驻留。根据https://www.mcafee.com/blogs/enterprise/data-security/data-residency-a-concept-not-found-in-the-gdpr/ 之类的文章(尽管该文章不是法律建议),在某些情况下,您不会这样做。

【讨论】:

    猜你喜欢
    • 2010-10-23
    • 2011-09-08
    • 2012-01-31
    • 1970-01-01
    • 2011-04-20
    • 2011-05-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多