我有简单的主/从配置。我的两个生产盒上都有 8GB 的 RAM。 我只使用 Master 进行写入,而使用 slave 进行读取。但是在周末,我做了一项工作,就是在主服务器上插入数据,这些数据应该被复制到从服务器上。由于我的奴隶落后于主人将近 15-16 个小时,这给我的报告带来了很大的麻烦,因为我正在从奴隶那里读取报告,而奴隶没有更新信息。
关于这个我有几个疑问:
为什么应该使用 slave 进行读取而不是 master 有任何合理的理由吗?(我的 master 在 5 分钟后写入。)并且一些作业安排从 slave 读取。
我有 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/