2011-05-19 86 views
4

我有简单的主/从配置。我的生产箱上都有8GB的RAM。 我只使用Master for Writes而只使用Slave作为Reads。但是在这个周末我跑了一个工作,在master上插入数据,这个数据应该被复制到slave上。由于这种情况,我的奴隶在主人身后花了将近15-16小时的时间,当我从奴隶那里读到它时,它给我的报告造成了很大的麻烦,奴隶没有更新信息。MySQL复制简单的主/从复制

对于这一点,我有几个疑问:

  1. 是否有正当理由的,为什么要使用奴隶读取和不掌握(我主人后非常5分钟写。)和一些工作是从奴隶读取的时间表。

  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  |   | 

回答

2

我们也有类似的情况,这一点,但我们从落后3天或4天的大师身后有时和别人完全跟上时代的。

我们解决这个问题的方法是测试生成的每个页面顶部的从站状态(或预定作业的脚本),如果“主站之后的秒数”大于我们决定的任意数量,在主页上查找该页面/作业的所有查询。如果主人身后的秒数在我们允许的时间范围内(通常为零),那么我们知道在从服务器上启动查询是安全的。

然后,这被扩大到决定哪个奴隶在我们有多个(有点软件负载平衡器!)的时候触发查询。

最后,我们重新设计了架构和插入查询,以确保比从落后结束了是一个很小的问题......

有一两件事你可以做的是尽量大块你插入到小批量所以单个插入不需要太长时间,允许从站在主站忙于下一站时启动插入。

希望这会有所帮助。

戴夫

+0

谢谢戴夫。但我不能要求我的奴隶选择等待......因为我需要为每天和每天的每个小时生成报告......所以我从奴隶读取的信息。我认为检查参数“Second Behind Master”的想法很好,因此可以在主控上插入插入内容,这样就不会出现如此大的差异。 – 2011-05-19 09:20:25

+0

我还有一个关于主/从配置的查询,如果我从主站读取和写入,会发生什么。 – 2011-05-19 09:21:53

+0

对不起,在运行读取查询之前,我的意思不是奴隶们必须等待,我的意思是我们的系统在奴隶落后的情况下直接在主人处开启读取查询。在主设备上读取和写入是完全正确的(这只是一个单一的服务器体系结构,然后......)通过我们的设置,您可以获得两全其美的体验。如果从站是最新的,则在从站上执行读操作,否则它们在主站上执行。希望这能说明问题? – 2011-05-19 09:30:04