MySQL 复制简单的主/从复制

标签 mysql replication master-slave

我有简单的主/从配置。我的两个生产盒上都有 8GB 的​​ RAM。 我只使用 Master 进行写入,而使用 slave 进行读取。但是在周末,我做了一项工作,就是在主服务器上插入数据,这些数据应该被复制到从服务器上。由于我的奴隶落后于主人将近 15-16 个小时,这给我的报告带来了很大的麻烦,因为我正在从奴隶那里读取报告,而奴隶没有更新信息。

关于这个我有几个疑问:

  1. 为什么应该使用 slave 进行读取而不是 master 有任何合理的理由吗?(我的 master 在 5 分钟后写入。)并且一些作业安排从 slave 读取。

  2. 我有 100GB 的表,每天我都会在同一个表上插入百万条记录。所有选择和插入都发生在这张表上。我选择了将数据逐年从该表分离到多个表的方式,以优化该表是否有任何其他方法可以优化并加快该表的执行速度。

如果我有任何不清楚的地方,请告诉我。

表格设计如下:

+----------------+------------------+------+-----+---------------------+----------------+
| Field          | Type             | Null | Key | Default             | Extra          |
+----------------+------------------+------+-----+---------------------+----------------+
| test_id        | int(11) unsigned | NO   | PRI | NULL                | auto_increment |
| prime_id       | int(11) unsigned | NO   | MUL | 0                   |                |
| prime2_id      | int(11) unsigned | NO   | MUL | 0                   |                |
| timestamp      | datetime         | NO   | MUL | 0000-00-00 00:00:00 |                |
| test_time      | int(11)          | NO   |     | 0                   |                |
| status         | int(11)          | NO   |     | 0                   |                |
| component      | int(11) unsigned | NO   |     | 0                   |                |
| c_component    | int(11) unsigned | NO   |     | 0                   |                |
| C2_component   | int(11) unsigned | NO   |     | 0                   |                |
| C3_component   | int(11) unsigned | NO   |     | 0                   |                |
| rt_component   | int(11) unsigned | NO   |     | 0                   |                |
| code           | int(11) unsigned | NO   |     | 0                   |                |
| ip             | int(11) unsigned | YES  |     | 0                   |                |
| step_id        | int(11) unsigned | YES  |     | NULL                |                |
+----------------+------------------+------+-----+---------------------+----------------+
This is the index information of the table:

| Table | Non_unique | Key_name              | Seq_in_index | Column_name | Collation | Cardinality | Sub_part | Packed | Null | Index_type | Comment |
+-------+------------+-----------------------+--------------+-------------+-----------+-------------+----------+--------+------+------------+---------+
| tests |          0 | PRIMARY               |            1 | test_id     | A         |   629448388 |     NULL | NULL   |      | BTREE      |         |
| tests |          1 | ixf_prime_id          |            1 | prime_id    | A         |          14 |     NULL | NULL   |      | BTREE      |         |
| tests |          1 | ixf_prime2_id         |            1 | prime2_id   | A         |          14 |     NULL | NULL   |      | BTREE      |         |
| tests |          1 | ix_timestamp          |            1 | timestamp   | A         |   157362097 |     NULL | NULL   |      | BTREE      |         |
| tests |          1 | ix_prime_id_timestamp |            1 | prime_id    | A         |          14 |     NULL | NULL   |      | BTREE      |         |
| tests |          1 | ix_prime_id_timestamp |            2 | timestamp   | A         |   629448388 |     NULL | NULL   |      | BTREE      |         |

最佳答案

我们遇到过类似的情况,但是我们的 slave 有时比 master 落后 3 或 4 天,而在其他时候则完全是最新的。

我们为解决这个问题所做的是在生成的每个页面(或计划作业的脚本)顶部测试从站状态,如果“落后于主站的秒数”大于我们决定的某个任意数量,我们将解雇所有在主机上查询该页面/作业。如果落后于主服务器的秒数在我们允许的时间限制内(通常为零),那么我们就知道可以安全地向从服务器发出查询。

然后扩展到当我们有多个(某种软件负载均衡器!)时,决定哪个 slave 触发查询。

最终,我们重新设计了架构和插入查询,以确保从延迟最终成为一个非常小的问题...

您可以做的一件事是尝试将您的插入分成更小的批处理,这样单个插入就不会花费太长时间,从而允许从服务器开始插入,而主服务器正忙于下一个插入。

希望这对您有所帮助。

戴夫

关于MySQL 复制简单的主/从复制,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6054974/

相关文章:

mysql - 基本表设计Q

php - 未找到基表或 View - 尽管应该找到

mysql - 恢复 MySQL 表(MyISAM 和 InnoDB)所需的最小文件集

mysql - 需要使我的 Mysql Slave 成为只读服务器

MySQL:同一台服务器上是否可以有多个从属/数据库副本?

django - 如何使用 django 和 postgresql 进行多数据库设置来分离读取和写入?

postgresql - 如何自动将只读事务分派(dispatch)给slave

javascript - mysql 查询数据未通过 ajax 从 php 正确传递到 javascript

c# - 如何从偶尔连接的设备(笔记本电脑)获取数据到后端 SQL Server

mysql - 自己做MySQL行复制的问题