mongodb 3.4 叢集搭建:分區+複本集

來源:互聯網
上載者:User

標籤:comm   har   提高   .com   width   tpi   print   監視   ...   

mongodb是最常用的nodql資料庫,在資料庫排名中已經上升到了前六。這篇文章介紹如何搭建高可用的mongodb(分區+副本)叢集。

在搭建叢集之前,需要首先瞭解幾個概念:路由,分區、複本集、設定管理員等。

相關概念

先來看一張圖:

可以看到有四個組件:mongos、config server、shard、replica set。

mongos,資料庫叢集請求的入口,所有的請求都通過mongos進行協調,不需要在應用程式添加一個路由選取器,mongos自己就是一個請求分發中心,它負責把對應的資料請求請求轉寄到對應的shard伺服器上。在生產環境通常有多mongos作為請求的入口,防止其中一個掛掉所有的mongodb請求都沒有辦法操作。

config server,顧名思義為設定管理員,儲存所有資料庫元資訊(路由、分區)的配置。mongos本身沒有實體儲存體分區伺服器和資料路由資訊,只是緩衝在記憶體裡,設定管理員則實際儲存這些資料。mongos第一次啟動或者關掉重啟就會從 config server 載入配置資訊,以後如果設定管理員資訊變化會通知到所有的 mongos 更新自己的狀態,這樣 mongos 就能繼續準確路由。在生產環境通常有多個 config server 設定管理員,因為它儲存了分區路由的中繼資料,防止資料丟失!

shard,分區(sharding)是指將資料庫拆分,將其分散在不同的機器上的過程。將資料分散到不同的機器上,不需要功能強大的伺服器就可以儲存更多的資料和處理更大的負載。基本思想就是將集合切成小塊,這些塊分散到若干片裡,每個片只負責總資料的一部分,最後通過一個均衡器來對各個分區進行均衡(資料移轉)。

replica set,中文翻譯複本集,其實就是shard的備份,防止shard掛掉之後資料丟失。複製提供了資料的冗餘備份,並在多個伺服器上儲存資料副本,提高了資料的可用性, 並可以保證資料的安全性。

仲裁者(Arbiter),是複製集中的一個MongoDB執行個體,它並不儲存資料。仲裁節點使用最小的資源並且不要求硬體裝置,不能將Arbiter部署在同一個資料集節點中,可以部署在其他應用伺服器或者監視伺服器中,也可部署在單獨的虛擬機器中。為了確保複製集中有奇數的投票成員(包括primary),需要添加仲裁節點做為投票,否則primary不能運行時不會自動切換primary。

簡單瞭解之後,我們可以這樣總結一下,應用請求mongos來操作mongodb的增刪改查,設定管理員儲存資料庫元資訊,並且和mongos做同步,資料最終存入在shard(分區)上,為了防止資料丟失同步在複本集中儲存了一份,仲裁在資料存放區到分區的時候決定儲存到哪個節點。

環境準備

系統系統 centos6.5

三台伺服器:192.168.0.75/84/86

安裝包: mongodb-linux-x86_64-3.4.6.tgz

伺服器規劃

伺服器75 伺服器84 伺服器86
mongos mongos mongos
config server config server config server
shard server1 主節點 shard server1 副節點 shard server1 仲裁
shard server2 仲裁 shard server2 主節點 shard server2 副節點
shard server3 副節點 shard server3 仲裁 shard server3 主節點

連接埠分配:

mongos:20000config:21000shard1:27001shard2:27002shard3:27003
叢集搭建1、安裝mongodb
#解壓tar -xzvf mongodb-linux-x86_64-3.4.6.tgz -C /usr/local/#改名mv mongodb-linux-x86_64-3.4.6 mongodb

分別在每台機器建立conf、mongos、config、shard1、shard2、shard3六個目錄,因為mongos不儲存資料,只需要建立記錄檔目錄即可。

mkdir -p /usr/local/mongodb/confmkdir -p /usr/local/mongodb/mongos/logmkdir -p /usr/local/mongodb/config/datamkdir -p /usr/local/mongodb/config/logmkdir -p /usr/local/mongodb/shard1/datamkdir -p /usr/local/mongodb/shard1/logmkdir -p /usr/local/mongodb/shard2/datamkdir -p /usr/local/mongodb/shard2/logmkdir -p /usr/local/mongodb/shard3/datamkdir -p /usr/local/mongodb/shard3/log

配置環境變數

vim /etc/profile# 內容export MONGODB_HOME=/usr/local/mongodbexport PATH=$MONGODB_HOME/bin:$PATH# 使立即生效source /etc/profile
2、config server設定管理員

mongodb3.4以後要求設定管理員也棄置站台集,不然叢集搭建不成功。

添加設定檔

vi /usr/local/mongodb/conf/config.conf## 設定檔內容pidfilepath = /usr/local/mongodb/config/log/configsrv.piddbpath = /usr/local/mongodb/config/datalogpath = /usr/local/mongodb/config/log/congigsrv.loglogappend = true bind_ip = 0.0.0.0port = 21000fork = true #declare this is a config db of a cluster;configsvr = true#複本集名稱replSet=configs #設定最大串連數maxConns=20000

啟動三台伺服器的config server

mongod -f /usr/local/mongodb/conf/config.conf

登入任意一台設定管理員,初始化配置複本集

#串連mongo --port 21000#config變數config = {...    _id : "configs",...     members : [...         {_id : 0, host : "192.168.0.75:21000" },...         {_id : 1, host : "192.168.0.84:21000" },...         {_id : 2, host : "192.168.0.86:21000" }...     ]... }#初始化複本集rs.initiate(config)

其中,”_id” : “configs”應與設定檔中配置的 replicaction.replSetName 一致,”members” 中的 “host” 為三個節點的 ip 和 port

3、配置分區複本集(三台機器)設定第一個分區複本集

設定檔

vi /usr/local/mongodb/conf/shard1.conf#設定檔內容#——————————————–pidfilepath = /usr/local/mongodb/shard1/log/shard1.piddbpath = /usr/local/mongodb/shard1/datalogpath = /usr/local/mongodb/shard1/log/shard1.loglogappend = truebind_ip = 0.0.0.0port = 27001fork = true #開啟web監控httpinterface=truerest=true #複本集名稱replSet=shard1 #declare this is a shard db of a cluster;shardsvr = true #設定最大串連數maxConns=20000

啟動三台伺服器的shard1 server

mongod -f /usr/local/mongodb/conf/shard1.conf

登陸任意一台伺服器,初始化複本集

mongo --port 27001#使用admin資料庫use admin#定義複本集配置,第三個節點的 "arbiterOnly":true 代表其為仲裁節點。config = {...    _id : "shard1",...     members : [...         {_id : 0, host : "192.168.0.75:27001" },...         {_id : 1, host : "192.168.0.84:27001" },...         {_id : 2, host : "192.168.0.86:27001” , arbiterOnly: true }...     ]... }#初始化複本集配置rs.initiate(config);
設定第二個分區複本集

設定檔

vi /usr/local/mongodb/conf/shard2.conf#設定檔內容#——————————————–pidfilepath = /usr/local/mongodb/shard2/log/shard2.piddbpath = /usr/local/mongodb/shard2/datalogpath = /usr/local/mongodb/shard2/log/shard2.loglogappend = truebind_ip = 0.0.0.0port = 27002fork = true #開啟web監控httpinterface=truerest=true #複本集名稱replSet=shard2 #declare this is a shard db of a cluster;shardsvr = true #設定最大串連數maxConns=20000

啟動三台伺服器的shard2 server

mongod -f /usr/local/mongodb/conf/shard2.conf

登陸任意一台伺服器,初始化複本集

mongo --port 27002#使用admin資料庫use admin#定義複本集配置config = {...    _id : "shard2",...     members : [...         {_id : 0, host : "192.168.0.75:27002"  , arbiterOnly: true },...         {_id : 1, host : "192.168.0.84:27002" },...         {_id : 2, host : "192.168.0.86:27002" }...     ]... }#初始化複本集配置rs.initiate(config);
設定第三個分區複本集

設定檔

vi /usr/local/mongodb/conf/shard3.conf#設定檔內容#——————————————–pidfilepath = /usr/local/mongodb/shard3/log/shard3.piddbpath = /usr/local/mongodb/shard3/datalogpath = /usr/local/mongodb/shard3/log/shard3.loglogappend = truebind_ip = 0.0.0.0port = 27003fork = true #開啟web監控httpinterface=truerest=true #複本集名稱replSet=shard3 #declare this is a shard db of a cluster;shardsvr = true #設定最大串連數maxConns=20000

啟動三台伺服器的shard3 server

mongod -f /usr/local/mongodb/conf/shard3.conf

登陸任意一台伺服器,初始化複本集

mongo --port 27003#使用admin資料庫use admin#定義複本集配置config = {...    _id : "shard3",...     members : [...         {_id : 0, host : "192.168.0.75:27003" },...         {_id : 1, host : "192.168.0.84:27003" , arbiterOnly: true},...         {_id : 2, host : "192.168.0.86:27003" }...     ]... }#初始化複本集配置rs.initiate(config);
4、配置路由伺服器 mongos

先啟動設定管理員和分區伺服器,後啟動路由執行個體啟動路由執行個體:(三台機器)

vi /usr/local/mongodb/conf/mongos.conf#內容pidfilepath = /usr/local/mongodb/mongos/log/mongos.pidlogpath = /usr/local/mongodb/mongos/log/mongos.loglogappend = truebind_ip = 0.0.0.0port = 20000fork = true#監聽的設定管理員,只能有1個或者3個 configs為設定管理員的複本集名字configdb = configs/192.168.0.75:21000,192.168.0.84:21000,192.168.0.86:21000 #設定最大串連數maxConns=20000

啟動三台伺服器的mongos server

mongod -f /usr/local/mongodb/conf/mongos.conf
5、啟用分區

目前搭建了mongodb設定管理員、路由伺服器,各個分區伺服器,不過應用程式串連到mongos路由伺服器並不能使用分區機制,還需要在程式裡設定分區配置,讓分區生效。

登陸任意一台mongos

mongo --port 20000#使用admin資料庫user  admin#串聯路由伺服器與分配複本集sh.addShard("shard1/192.168.0.75:27001,192.168.0.84:27001,192.168.0.86:27001")sh.addShard("shard2/192.168.0.75:27002,192.168.0.84:27002,192.168.0.86:27002")sh.addShard("shard3/192.168.0.75:27003,192.168.0.84:27003,192.168.0.86:27003")#查看叢集狀態sh.status()
6、測試

目前佈建服務、路由服務、分區服務、複本集服務都已經串聯起來了,但我們的目的是希望插入資料,資料能夠自動分區。串連在mongos上,準備讓指定的資料庫、指定的集合分區生效。

#指定testdb分區生效db.runCommand( { enablesharding :"testdb"});#指定資料庫裡需要分區的集合和片鍵db.runCommand( { shardcollection : "testdb.table1",key : {id: 1} } )

我們設定testdb的 table1 表需要分區,根據 id 自動分區到 shard1 ,shard2,shard3 上面去。要這樣設定是因為不是所有mongodb 的資料庫和表 都需要分區!

測試分區配置結果

mongo  127.0.0.1:20000#使用testdbuse  testdb;#插入測試資料for (var i = 1; i <= 100000; i++)db.table1.save({id:i,"test1":"testval1"});#查看分區情況如下,部分無關資訊省掉了db.table1.stats();{        "sharded" : true,        "ns" : "testdb.table1",        "count" : 100000,        "numExtents" : 13,        "size" : 5600000,        "storageSize" : 22372352,        "totalIndexSize" : 6213760,        "indexSizes" : {                "_id_" : 3335808,                "id_1" : 2877952        },        "avgObjSize" : 56,        "nindexes" : 2,        "nchunks" : 3,        "shards" : {                "shard1" : {                        "ns" : "testdb.table1",                        "count" : 42183,                        "size" : 0,                        ...                        "ok" : 1                },                "shard2" : {                        "ns" : "testdb.table1",                        "count" : 38937,                        "size" : 2180472,                        ...                        "ok" : 1                },                "shard3" : {                        "ns" : "testdb.table1",                        "count" :18880,                        "size" : 3419528,                        ...                        "ok" : 1                }        },        "ok" : 1}

可以看到資料分到3個分區,各自分區數量為: shard1 “count” : 42183,shard2 “count” : 38937,shard3 “count” : 18880。已經成功了!

後期營運啟動關閉

mongodb的啟動順序是,先啟動設定管理員,在啟動分區,最後啟動mongos.

mongod -f /usr/local/mongodb/conf/config.confmongod -f /usr/local/mongodb/conf/shard1.confmongod -f /usr/local/mongodb/conf/shard2.confmongod -f /usr/local/mongodb/conf/shard3.confmongod -f /usr/local/mongodb/conf/mongos.conf

關閉時,直接killall殺掉所有進程

killall mongodkillall mongos

mongodb 3.4 叢集搭建:分區+複本集

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在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.