2011-05-19 83 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