mongodb實戰 單節點轉集群

2021-10-02 17:32:53 字數 3810 閱讀 1109

環境:

mongo版本:3.2.22

cnegtos6.5

第一部分:當前單節點情況分析

當前的單機,是使用常規的mongodb啟動方法,與集群版資料庫,埠等都不一致,資料庫是匯入的,沒有辦法做到拓展。

需要將當前節點重新搭建,使其資料庫,和使用埠同集群的一致,方便單機向集群的拓展。

經過網上資料查詢,發現單機節點的搭建有3種形式:

在單機上啟動乙個mongo例項(現在我們使用)

參考:在單機上以副本集的方式啟動乙個mongo例項(將選用這一種方式建立單節點)

參考:在單機上開多個埠和目錄,直接組成乙個集群在單機上執行

根據我的專案需求,決定使用第二種,方便進行拓展。

第二部分:建立單節點(以副本集的形式存在的單節點)

安裝mongo軟體

建立所需的目錄,檔案

編輯配置檔案

啟動mongo例項

修改hostname:

vim /etc/hosts

改為修改完重啟

副本集初始化

rs.initiate()

因為是單節點的副本集,所以上來就是主節點了。

建立資料庫

驗證單節點

第三部分:建立單節點(以分片集群的形式存在的單節點---使用配置檔案啟動方式)

參考:第四部分:建立單節點(以分片集群的形式存在的單節點---使用命令指令碼啟動方式)

第五部分:建立單節點(以副本集群的形式存在的單節點---多個程序的副本,與單個程序區別)

分別建立三個目錄r2,r3,r4

mkdir r2 r3 r4

按照如下命令啟動,注意副本集的名字不變,但是日誌目錄和資料存放目錄要發生相應的變化

啟動之後進行副本集配置

config=,,] } rs.initiate(config)

路由配置

use admin db.runcommand();

資料庫配置

分片,資料庫配置參考init_mongodb_gluster.sh和data.sh指令碼

第六部分:建立單節點(以副本集+分片集的形式存在的單節點---單個例項程序的副本,注意與第二部分的單個程序區別)

按照如下命令啟動

進行副本集配置

config=] }

rs.initiate(config)

進行分片集配置

/opt/mongodb/bin/mongo --port 30000 << eof use admin db.runcommand(); use adbox use fbbox use admin db.runcommand(); db.runcommand(); exit eof

/opt/mongodb/bin/mongo --port 30000 << eof use adbox db.createuser( ,,] }) db.auth("dev","dev") use fbbox db.createuser( ,,] }) db.auth("dev","dev") use admin db.createuser( ,,] }) db.auth("admin","admin") exit eof

執行php56 /var/www/core/tool/toolinit.php

開啟網頁確認是否成功

使用第五部分建立單節點,進行轉集群操作

第七部分:單節點轉集群

猜想:現在有兩種單節點的建立方法

單節點單例項方式,上面的第六部分

單節點多例項方式,上面的第五部分

對於a情況,將單節點轉成集群,需要再新增2個節點,即可形成乙個具有仲裁功能的集群

對於b情況,將單節點轉成集群,需要再新增4個節點,因為mongo的仲裁需要有過半的節點存在,當多例項節點掛掉以後,還要推舉出新節點,就需要4個存活的節點存在,才能形成乙個具有仲裁功能的集群

驗證a:

按照第六部分的操作步驟,現在乙個節點上建立單機例項

新新增兩個節點(不啟動路由程序),由於是單節點拓展,所以1中的節點就是主節點,在主節點中新增兩個節點

r4:primary> rs.add("192.168.1.65:29017")

r4:primary> rs.add("192.168.1.66:29017")

檢視集群狀態,等待節點變成從節點狀態

新節點啟動路由程序,新增路由

其實這裡不需要新增路由,使用副本集和分片集一條命令啟動的方式,新增了新的副本之後,自然就會在路由中新增,只需要等待即可

具體原因未知。

到這一步,通過第七部分的2操作,確定副本集生效,每一台節點的表內都有同樣的資料內容

等待新新增的節點變為從節點(此過程很漫長,資料越多時間越久)

在主節點上kill掉mongos,重啟mongos,將指向的配置ip由乙個變為三個

使用mongodump備份主節點的配置

新增從節點啟動配置服務,不啟動路由

在主節點將備份的配置資料匯入兩個從節點

兩個從節點啟動帶3ip的路由服務

這是會遇到第七部分第4個問題,解決即可

單機轉集群完畢

第七部分:問題解決

當路由由1個ip改為3個ip時,會報error: child process failed, exited with error number 5的錯誤,需做如下修改:

解決方法:

則需要將集群的配置匯入到新節點中,路由會成功啟動

function sync_config_from_master():20001 -d config -o /tmp/config /opt/mongodb/bin/mongorestore --host $:20001 -d config /tmp/config/config }

localip為集群內某一節點的ip,add_ip為新新增的節點ip

之後重啟路由即可。

檢視副本集是否生效

show dbs use dbname show collections db.coll.stats()

sharded欄位為true表示可分片。

插入資料到集合

for (i=1;i<=10000;i++) db.haha.insert()

檢視集合內資料數量

db.haha.count()

解決php56 /var/www/core/tool/toolinit.php執行失敗,網頁500錯誤

原因:php初始化失敗-》mongodb配置錯誤-》修改配置toolinit.php檔案

參考:**中的第22條

4. 在配置檔案恢復之後,會報如下錯誤

caused by :: mongos specified a different config database string : stored

解決方法:重啟mongod服務即可,三颱機器全部重啟

5. 當節點報mongos specified a different config 並且報could not find member to sync from時,可以檢視一下連線路由的ip是不是127.0.0.1,需要換成本地ip才行

如果做完上述操作,還是不能使用,報could not find member to sync from,則去檢查mongo資料庫的許可權,確保資料庫的資料夾的許可權時mongo,資料夾內的許可權為777許可權。

如果都沒有問題,這個可能等一會會好。

總結:到此,我們的需求,建立單節點,和單節點轉集群均都實現,然後集群的水平拓展也已實現,這樣乙個完整的鏈就形成了閉環。

在完成過程中,遇到了大量的問題,其實答案在我們查詢資料時已經很早的反覆出現,但是我們不懂其原理,沒有將一句文字與實際問題關聯起來,導致解決問題緩慢,磕磕絆絆。

解決問題的時候要多檢視日誌,尤其的開源的大型軟體,然後結合網上查詢資料,基本所有問題都可以解決。

搭建ceph集群(單節點)

軟體環境 centos7 x64 ceph版本 ceph deploy v1.5.37 ceph version 10.2.9 步驟1.修改主機名 即節點名 1 sed i hostname d etc sysconfig network echo hostname 主機名 etc sysconfi...

Docker安裝部署單節點MongoDB

docker pull docker.io mongo latestdocker run name mongo p 27017 27017 d docker.io mongo latest auth 首先建立資料夾用於掛載目錄 mkdir p docker mongo 賦予許可權 chmod 777...

如何建立MongoDB單節點例項

操作步驟 登入mongodb管理控制台。在左側導航欄,單擊副本集例項列表。在副本集例項列表頁面,單擊新建例項。選擇副本集 包年包月 或副本集 按量付費 選擇例項配置,引數說明如下表所示。單擊立即購買,進入訂單確認頁面。在確認訂單頁面,閱讀並勾選雲資料庫mongodb版服務協議,根據提示完成支付流程。...