mongodb集羣搭建(分片+副本)

原文地址:https://www.cnblogs.com/ityouknow/p/7344005.htmlhtml

相關概念

先來看一張圖:linux

從圖中能夠看到有四個組件:mongos、config server、shard、replica set。web

mongos,數據庫集羣請求的入口,全部的請求都經過mongos進行協調,不須要在應用程序添加一個路由選擇器,mongos本身就是一個請求分發中心,它負責把對應的數據請求請求轉發到對應的shard服務器上。在生產環境一般有多mongos做爲請求的入口,防止其中一個掛掉全部的mongodb請求都沒有辦法操做。算法

config server,顧名思義爲配置服務器,存儲全部數據庫元信息(路由、分片)的配置。mongos自己沒有物理存儲分片服務器和數據路由信息,只是緩存在內存裏,配置服務器則實際存儲這些數據。mongos第一次啓動或者關掉重啓就會從 config server 加載配置信息,之後若是配置服務器信息變化會通知到全部的 mongos 更新本身的狀態,這樣 mongos 就能繼續準確路由。在生產環境一般有多個 config server 配置服務器,由於它存儲了分片路由的元數據,防止數據丟失!mongodb

shard,分片(sharding)是指將數據庫拆分,將其分散在不一樣的機器上的過程。將數據分散到不一樣的機器上,不須要功能強大的服務器就能夠存儲更多的數據和處理更大的負載。基本思想就是將集合切成小塊,這些塊分散到若干片裏,每一個片只負責總數據的一部分,最後經過一個均衡器來對各個分片進行均衡(數據遷移)。數據庫

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

仲裁者(Arbiter),是複製集中的一個MongoDB實例,它並不保存數據。仲裁節點使用最小的資源而且不要求硬件設備,不能將Arbiter部署在同一個數據集節點中,能夠部署在其餘應用服務器或者監視服務器中,也可部署在單獨的虛擬機中。爲了確保複製集中有奇數的投票成員(包括primary),須要添加仲裁節點作爲投票,不然primary不能運行時不會自動切換primary。centos

簡單瞭解以後,咱們能夠這樣總結一下,應用請求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:20000 config:21000 shard1:27001 shard2:27002 shard3:27003

集羣搭建

一、安裝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、shard一、shard二、shard3六個目錄,由於mongos不存儲數據,只須要創建日誌文件目錄便可。
mkdir -p /usr/local/mongodb/conf
mkdir -p /usr/local/mongodb/mongos/log
mkdir -p /usr/local/mongodb/config/data
mkdir -p /usr/local/mongodb/config/log
mkdir -p /usr/local/mongodb/shard1/data
mkdir -p /usr/local/mongodb/shard1/log
mkdir -p /usr/local/mongodb/shard2/data
mkdir -p /usr/local/mongodb/shard2/log
mkdir -p /usr/local/mongodb/shard3/data
mkdir -p /usr/local/mongodb/shard3/log

配置環境變量

vim /etc/profile
# 內容
export MONGODB_HOME=/usr/local/mongodb
export PATH=$MONGODB_HOME/bin:$PATH
# 使當即生效
source /etc/profile

二、config server配置服務器

mongodb3.4之後要求配置服務器也建立副本集,否則集羣搭建不成功。

添加配置文件

vi /usr/local/mongodb/conf/config.conf

## 配置文件內容
pidfilepath = /usr/local/mongodb/config/log/configsrv.pid
dbpath = /usr/local/mongodb/config/data
logpath = /usr/local/mongodb/config/log/congigsrv.log
logappend = true
 
bind_ip = 0.0.0.0
port = 21000
fork = 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

三、配置分片副本集(三臺機器)

設置第一個分片副本集

配置文件

vi /usr/local/mongodb/conf/shard1.conf

#配置文件內容
#——————————————–
pidfilepath = /usr/local/mongodb/shard1/log/shard1.pid
dbpath = /usr/local/mongodb/shard1/data
logpath = /usr/local/mongodb/shard1/log/shard1.log
logappend = true

bind_ip = 0.0.0.0
port = 27001
fork = true
 
#打開web監控
httpinterface=true
rest=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.pid
dbpath = /usr/local/mongodb/shard2/data
logpath = /usr/local/mongodb/shard2/log/shard2.log
logappend = true

bind_ip = 0.0.0.0
port = 27002
fork = true
 
#打開web監控
httpinterface=true
rest=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.pid
dbpath = /usr/local/mongodb/shard3/data
logpath = /usr/local/mongodb/shard3/log/shard3.log
logappend = true

bind_ip = 0.0.0.0
port = 27003
fork = true
 
#打開web監控
httpinterface=true
rest=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);

四、配置路由服務器 mongos

先啓動配置服務器和分片服務器,後啓動路由實例啓動路由實例:(三臺機器)

vi /usr/local/mongodb/conf/mongos.conf

#內容
pidfilepath = /usr/local/mongodb/mongos/log/mongos.pid
logpath = /usr/local/mongodb/mongos/log/mongos.log
logappend = true

bind_ip = 0.0.0.0
port = 20000
fork = 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

mongos -f /usr/local/mongodb/conf/mongos.conf

五、啓用分片

目前搭建了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()

六、測試

目前配置服務、路由服務、分片服務、副本集服務都已經串聯起來了,但咱們的目的是但願插入數據,數據可以自動分片。鏈接在mongos上,準備讓指定的數據庫、指定的集合分片生效。

mongdb並不會主動去分片,這須要你去手動設置。 因此你會看到以下的命令

#指定testdb分片生效
db.runCommand( { enablesharding :"testdb"});      #這個命令是說testdb這個庫啓用分片
#指定數據庫裏須要分片的集合和片鍵
db.runCommand( { shardcollection : "testdb.table1",key : {id: 1} } )    #這個命令是說對testdb下的table1 進行分片存儲。片鍵是id 分片方式是1 
我並不知道 1 這個分片方式是什麼算法。由於我在這裏用的是hashed(哈希)的分片方式: db.runCommand( { shardcollection : "testdb.table1",key : {id: "hashed"} } )
這樣就能夠了,hashed算法會平均的將你的數據放到各個分片。
值得注意的是 以上的設置 須要在 admin庫中實現。而執行插入命令時 作好切換到testdb,即:use testdb

咱們設置testdb的 table1 表須要分片,根據 id 自動分片到 shard1 ,shard2,shard3 上面去。要這樣設置是由於不是全部mongodb 的數據庫和表 都須要分片!

測試分片配置結果

mongo  127.0.0.1:20000
#使用testdb
use  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.conf
mongod -f /usr/local/mongodb/conf/shard1.conf
mongod -f /usr/local/mongodb/conf/shard2.conf
mongod -f /usr/local/mongodb/conf/shard3.conf
mongod -f /usr/local/mongodb/conf/mongos.conf

關閉時,直接killall殺掉全部進程

killall mongod
killall mongos
相關文章
相關標籤/搜索