Mongodb 複本集搭建問題總結及解決辦法_MongoDB

來源:互聯網
上載者:User

Mongodb 複本集搭建問題總結及解決辦法

Mongodb資料庫的複本集是由多台伺服器組成,基中一台是主節點,其它為從節點,如果主節點宕機就自動切換到任意一個從節點。如果以前的主節點修複完成和正常運行就自動變成從節點,從節點不能查詢資料。也可以在一台伺服器裝多個Mongodb連接埠不一樣。

在我以往的認知中,一個系統一旦正式上線,多半不會輕易的遷移伺服器,尤其是那種涉及到多個關聯應用,涉及到多台硬體伺服器的系統,因為這種遷移將是牽一髮而動全身的。

但是,卻仍然有這種情況存在,就如我這幾天主要負責的事,就是一個系統的全部伺服器遷移中的部分機器遷移,還有一部分由別人負責。

這個系統涉及到flume資料擷取,storm資料分析,rabbitmq訊息分發,ehcache緩衝提升系統效能,MongoDB複本集儲存資料,tomcat管理系統應用等,架構基本如下:

而這裡我主要負責的是rabbitmq、tomcat、ehcache、mongodb,這裡邊tomcat、ehcache的安裝和配置都比較簡單,只是rabbitmq需要依賴於erlang。而erlang又需要依賴一些其他的東西,這些東西需要root許可權執行yum,而我們沒有root許可權,於是稍微花了一點點功夫。

除此之外,mongodb複本集的再次搭建也稍微遇到了一點點問題,不過好在一切還是按照預料中發展的,以前沒遇到過的問題也通過經驗猜想完美解決。

之所以mongodb複本集搭建會遇到一些問題,大部分原因是因為這次並非親自動手,而是由所帶的新人操作。
首先,按照我給的文檔他一步步的操作下去,結果在連接埠上,不知道是因為習慣還是因為什麼,他所設定的連接埠並不是我們要求的連接埠。

那麼這時候當我要求他改成要求的連接埠時,他有些茫然,不知道是應該把所有配置刪了重配,還是要怎樣。

由於時間關係,於是我給他提供了一個方案,就是直接使用配置優先順序的方式改掉連接埠。之前我寫過的複本集搭建的文檔中應該有說過優先順序怎麼改,大體上是下邊三步:

config=rs.conf()config.members[0].priority=2rs.reconfig(config)

那麼根據這個,我們設想的改連接埠應該是下邊這樣(下邊ip和連接埠只是隨便假設的,生產環境自然不能隨便透漏):

config=rs.conf()config.members[0].host="192.168.117.88:37017"rs.reconfig(config)

但是結果呢,在第三步的時候拋出異常,遺憾的是當時只為瞭解決問題而沒有截圖,忘記具體是什麼異常了,但大體意思是說這個連接埠的成員不存在。
於是,我又給他提供了第二個方案,那就是先把三個成員中非主服務的任意一個從成員中刪除:

rs.remove("ip:port")

然後把這台機的連接埠改為我們需要的37017,之後再使用增加成員的命令添加進來:

rs.add("ip:port")

然後就這樣操作三次後,三台伺服器的連接埠都成功修改成要求的連接埠。

這個過程中,當修改到主服務的時候,因為一開始設定了最高優先順序,因此需要把另外一台先設定成更高的優先順序操作。
問題就這樣解決了,只不過事後我又想了想,似乎這種方案並非是最優最簡潔的,因為當時沒有細想第一種方案中那個問題的原因,後來一想,多半是因為那台機還是原連接埠沒有被重啟。

如果我們先把非主服務機器的連接埠都改好重啟,那麼再次用第一種方案進行應該也是可行的,而且還會比第二種方案簡單,有機會了一定要試試。

本以為這樣就可以了,然後沒想到的是,當我們都遷移完成後,被告知那些機器都是測試服務網段的,要改成生產網段。
於是乎,所有的機器ip全部變了,以至於我們的mongodb複本集又要重新設定。

但是這一次比較麻煩的是,之前那次改連接埠是因為我至少可以保證有兩台機還是正常啟動並執行,可以操作rs命令,但是這一次ip一變,我三台機都無法正常成為主服務,以至於rs命令失效。

幾番折騰,始終沒有想出好的方案,於是只好把data目錄下的內容盡數刪除,然後真正的重新設定一遍。
然而,在這位新手的操作下,配置的過程中,把本該是如下的命令:

config={_id:”reptest”,members:[{_id:0,host:”192.168.0.160:57017”},{_id:1,host:”192.168.0.211:57017”},{_id:,host:”192.168.0.213:57017”}]}rs.initiate(config)

弄成了這樣:

config={_id:”reptest”,members:[{_id:0,host:”192.168.0.160:57017”},{_id:1,host:”192.168.0.211:57017”},{_id:,host:”192.168.0.213:57017”}]}rs.initiate()

也就是說這裡他雖然給config賦值了,但是再載入的時候竟然沒有使用,這也怪了忘了告訴他之前發現的一個問題。

通常我們在window系統上操作Linux上的應用,都會使用crt或者putty這些工具,這兩個工具各有優劣,而我發現當我們進入mongo shell中操作時,這兩個工具是有區別的,使用putty就可以回退,而crt就不能再mongodb shell中回退。

因此當他敲完rs.initiate(),想要回到括弧裡加上config時,已經沒了回頭路,只能硬著頭皮斷行符號。

而這時候,rs.initiate()只能執行一次,接下來和我文檔中的操作不一樣了,又該怎麼辦呢?

經過上一個問題,這個問題貌似就很好解決的,怎麼辦呢,我覺得還是可以使用rs.add和修改配置的方式解決,然後把這個想法告訴他,他照此操作後,果然一次搞定!

好了,這次的兩個問題基本就這樣解決了,不知其他朋友們,是否對這種情況還有更好的解決方案?歡迎留言解惑。

感謝閱讀,希望能協助到大家,謝謝大家對本站的支援!

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.