2013-08-02 33 views
1

我想了解mongodb讀取語義。根據文檔,除非您更改readpreferences,否則它始終是副本集中的主服務器。mongodb readpreference和讀取語義

我的設置: 的Linux VM:4GB內存,1個核心,在相同的虛擬機上運行3個蒙戈實例(!我知道這是一個糟糕的設置,但是這就是我從OPS得到了現在)

我只是監控內存使用情況,日誌等,而我從Java驅動程序運行以下mongo查詢。

這是我看到:

ReadPreference.PrimaryPreferred:

頂部

PID    USER  PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND 
17874(primary)  mongod 20 0 43.0g 1.3g 1.1g S 14.3 36.0 109:06.71 mongod                                          
18048(secondary-1) mongod 20 0 42.7g 690m 88m S 0.3 18.0 28:45.09 mongod                                          
18207(secondary-2) mongod 20 0 42.7g 641m 60m S 0.3 16.7 28:53.13 mongod 

日誌

主要-1

Fri Aug 2 21:35:39.416 [initandlisten] connection accepted from 10.10.1.57:54306 #11927 (40 connections now open) 
Fri Aug 2 21:44:16.332 [initandlisten] connection accepted from 10.10.1.57:54376 #11963 (41 connections now open) 
Fri Aug 2 21:44:16.348 [initandlisten] connection accepted from 10.10.1.57:54377 #11964 (42 connections now open) 
Fri Aug 2 21:44:16.414 [initandlisten] connection accepted from 10.10.1.57:54380 #11965 (43 connections now open) 

二次-1

Fri Aug 2 20:03:43.066 [conn11270] end connection 10.10.1.57:53547 (20 connections now open) 
Fri Aug 2 20:03:43.066 [conn11271] end connection 10.10.1.57:53551 (19 connections now open) 
Fri Aug 2 21:44:16.331 [initandlisten] connection accepted from 10.10.1.57:54374 #11776 (19 connections now open) 
Fri Aug 2 21:44:16.350 [initandlisten] connection accepted from 10.10.1.57:54378 #11777 (20 connections now open) 

二次-2

Fri Aug 2 20:03:43.065 [conn11271] end connection 10.10.1.57:53552 (20 connections now open) 
Fri Aug 2 20:03:43.066 [conn11270] end connection 10.10.1.57:53549 (19 connections now open) 
Fri Aug 2 21:44:16.331 [initandlisten] connection accepted from 10.10.1.57:54375 #11776 (19 connections now open) 
Fri Aug 2 21:44:16.352 [initandlisten] connection accepted from 10.10.1.57:54379 #11777 (20 connections now open) 

ReadPreference.Secondary:

頂部

PID    USER  PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND                                         
18048(secondary-1) mongod 20 0 42.7g 1.1g 517m S 7.3 29.2 29:28.00 mongod                                          
17874(primary)  mongod 20 0 43.0g 1.0g 777m S 0.3 26.7 112:57.05 mongod                                          
18207(secondary-2) mongod 20 0 42.7g 617m 37m S 0.3 16.1 28:59.08 mongod 

日誌

==> mongod_rs0-0.log < ==

Fri Aug 2 22:19:01.056 [conn12118] end connection 10.10.10.201:52558 (34 connections now open) 
Fri Aug 2 22:19:01.057 [initandlisten] connection accepted from 10.10.10.201:52564 #12120 (35 connections now open) 

==> mongod_rs0-1.log < ==

Fri Aug 2 22:19:04.038 [conn11925] end connection 10.10.10.201:46443 (15 connections now open) 
Fri Aug 2 22:19:04.039 [initandlisten] connection accepted from 10.10.10.201:46449 #11927 (16 connections now open) 

==> mongod_rs0-2.log < ==

Fri Aug 2 22:19:04.050 [conn11925] end connection 10.10.10.201:37641 (14 connections now open) 
Fri Aug 2 22:19:04.050 [initandlisten] connection accepted from 10.10.10.201:37647 #11927 (15 connections now open) 

我的問題是:

  1. 在這兩種情況下,CPU使用率都反映了您的readpreferences,但我不太瞭解日誌。爲什麼當我查詢時它會在每個實例上打開連接?
  2. 爲什麼小學保持更多沒有。即使readpreference是SecondaryPreferred也是如此。
  3. 每個實例上的tcpdump都處於活動狀態。其中2人應該閒置,對吧?沒有其他客戶端/進程調用這個集羣。

回答

1

到主服務器和備份服務器的連接甚至可能不會您的客戶端連接和查詢服務器。主服務器和輔助服務器需要保持相互連接,以便a)主服務器上的寫入可以在副服務器上進行復制; b)所有服務器都可以確保仍然有主服務器可用。

例如,我有三臺服務器副本設置和現在在我的筆記本電腦上運行,但沒有連接到它或查詢它的過程,並在主日誌說:

[conn15939] end connection 127.0.0.1:50584 (6 connections now open) 
[initandlisten] connection accepted from 127.0.0.1:50597 #15941 (7 connections now open) 

在輔助中,我擁有這種連接數的一半。這是因爲次要只需要連接到其主要,但主要將連接來自所有次要。