mysql - 在mysql中使用读复制

标签 mysql replication scaling database-replication

我有一个 mysql 数据库,每天大约有 1.5 亿次插入,保留期约为 60 天。

  1. 每条记录都在 id 上建立索引。
  2. 每次更新如下:
    1. 查看记录是否存在。如果是,用新数据更新它。
    2. 或者创建数据。
  3. 删除超过 60 天前创建的记录。

我的主要用例如下:

运行一些批量查询。例如:

Select (*) from table where prop=val1 and prop2=val2 etc

将返回大量记录,例如。 1M

以下方法好吗:

  1. 拥有一个仅在 id 上建立索引的主数据库。保留 60 天。
  2. 拥有只读副本数据库。该数据库将在许多列上建立索引
  3. 所有批量查询都将针对只读副本数据库运行。

这是一个好的解决方案吗?

编辑: 我计划使用 Amazon RDS DB,并在他们的文档中找到了这个:

 Q: Can my Read Replicas only accept database read operations?

Read Replicas are designed to serve read traffic. However, there may be use cases where advanced users wish to complete Data Definition Language (DDL) SQL statements against a Read Replica. Examples might include adding a database index to a Read Replica that is used for business reporting, without adding the same index to the corresponding source DB Instance. If you wish to enable operations other than reads for a given Read Replica, you will need to modify the active DB Parameter Group for the Read Replica, setting the “read_only” parameter to “0.”

最佳答案

回答你的问题:

Is following approach good:

  1. Have a master DB with index on id only. Have a retention of 60 days.
  2. Have Read Replica DB. This DB will be indexed on many columns
  3. All bulk queries will be run against read replica DB.

Is this a good solution?

已更新

根据我的看法和经验,不。

从技术上讲,此解决方案可能有效,但实际上不适合生产使用。 mysql内置的主从复制,只有当从库中的表与主库中的表具有相同的布局时才有效。

您将拥有大约 90 亿条记录 (150 x 60)。我的估计是在磁盘上,这可能需要 1TB(每条记录的大小相当于一条推文)。 1.5 亿次插入和 1.5 亿次删除(过期记录)肯定会使索引碎片化,插入速度变慢,需要经常重建。

当您需要多个只读副本时,事情会变得越来越复杂,这是生态系统的自然演变。

如果您每天有 1.5 亿次插入,您应该考虑 NOSQL 数据库。 Mongodb过去也支持 Innodb,不确定是否仍然支持。

如果你想坚持使用像 MySQL 这样的 RDBMS,你应该使用像 Database Sharding 这样的策略。 .在此策略中,您以负载分布在 MySQL 实例集群中的方式对数据进行分段。

与分片相比,可扩展性稍差的是使用存储引擎,例如 MyISAM . MyISAM 不完全符合 ACID 但提供了很好的性能。它支持并发插入。

关于mysql - 在mysql中使用读复制,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18591627/

相关文章:

android - 将 ImageView 中的图像右对齐并垂直居中

php - php根据角色将用户重定向到不同的页面

mysql - MYSQL中的交叉应用

mysql - 您如何在 Grails(在 Tomcat 上)中使用 MySQL 复制驱动程序?

android - 如何允许所有 HTTPS URL 在 CouchbaseLite Android 中同步

CSS - 缩放元素和图像 rel。使用 % 到窗口大小

mysql - 自动更新和缓存 View

mysql - 在 MySQL REGEXP 中使用非捕获组

mongodb - mongo : ERROR: child process failed, 退出,错误号 100

包含不同长度文本的两个标签的 WPF/XAML 布局,同时保持相同大小的字体缩放