如果只是搭建一個mongodb replica set, 比如1主2從+1裁決, 不使用mongos和configsrv或者mongoproxy, 那麼在PHP中連接mongodb的時候, 需要在options中顯式指定 replicaSet,除以此外, 還有一點讓人非常頭痛:
host怎樣寫?
把這四台機器都寫上? 還是只寫一台主服務器?或者寫1主2從?或者怎樣?
事實上,無論你寫幾台機器上去,mongo client都會連接到replica set中並從rs的配置裡面獲取到rs所有服務器的信息,並且嘗試連接全部的服務器……
下面就從各種可能的場景來分析一下利弊:
1) 只寫一台(無論主從)。
無論如何是不可取的。。如果這台機器掛掉,那mongo client還咋連接服務器啊??
2) 全寫或者寫一部分。
仍然無法逃避某些機器掛掉的情況。
而且某些版本的mongo.so對於已經掛掉的服務器還會嘗試連接(用戶名密碼不為空的情況下)。
所以最好不要使用auth認證了。
同時一定要設置連接超時時間為xxx毫秒。
不過,萬一某個機房都掛了。。。每台機器超時xxx毫秒,也夠受的。
php可以使用 connectTimeoutMS與socketTimeoutMS的options。 貌似直接設置 default_socket_timeout沒有什麼效果。
貌似socketTimeoutMs會重試5次。。不知道在哪裡配置的。