MongoDB 集羣搭建

MongoDB 集羣搭建

概念理解

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

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

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

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

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

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

簡單瞭解以後,咱們能夠這樣總結一下,應用請求mongos來操做mongodb的增刪改查,配置服務器存儲數據庫元信息,而且和mongos作同步,數據最終存入在shard(分片)上,爲了防止數據丟失同步在副本集中存儲了一份,仲裁在數據存儲到分片的時候決定存儲到哪一個節點。bash

環境準備

  • 系統:CentOS 7.4
  • 服務器:192.168.16.150、192.168.16.15一、192.168.16.152
  • 安裝包:mongodb-linux-x86_64-rhel70-3.4.9.tgz

服務器規劃:服務器

150 151 152
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 主節點

端口分配:app

mongos:20000
config:21000
shard1:27001
shard2:27002
shard3:27003

集羣搭建

1、安裝MongoDB

# 下載 MongoDB
$ cd /opt
$ wget https://fastdl.mongodb.org/linux/mongodb-linux-x86_64-rhel70-3.4.9.tgz

# 解壓
$ tar -zxvf mongodb-linux-x86_64-rhel70-3.4.9.tgz
$ ln -s /opt/mongodb-linux-x86_64-rhel70-3.4.9 /opt/mongodb

# 建立目錄
$ mkdir -p /opt/mongodb/conf
$ mkdir -p /data/mongodb/mongos/log
$ mkdir -p /data/mongodb/{config,shard1,shard2,shard3}/{data,log}

# 配置環境變量
$ vim /etc/profile.d/mongodb.sh
#!/bin/bash
export MONGODB_HOME=/opt/mongodb
export PATH=$PATH:$MONGODB_HOME/bin
$ source /etc/profile.d/mongodb.sh

# 驗證
$ mongod -version

2、Config Server 配置

1. 配置並啓動服務

$ vim /opt/mongodb/conf/config.conf

sharding:
    clusterRole: configsvr
replication:
    replSetName: config        

# log
systemLog:
  destination: file
  logAppend: true
  path: /data/mongodb/config/log/config.log
 
# data
storage:
  dbPath: /data/mongodb/config/data
  journal:
    enabled: true

# process
processManagement:
  fork: true
  pidFilePath: /var/run/configsrv.pid
 
# network
net:
  port: 21000
  bindIp: 192.168.16.150

更多參數配置請參閱:參數配置運維

注意修改bindIp,並在三臺服務器上啓動 Config Server 服務

$ mongod --config /opt/mongodb/conf/config.conf

2. 鏈接並配置服務

選擇任意服務器進行鏈接

$ mongo --host 192.168.16.150 --port 21000

使用 rs.initiate() 方法來初始化

  • _id:必須匹配配置的 replication.replSetName 值
  • member:所有的副本集
  • configsvr:對於 config server 副本集,該值必須爲 true
# 初始化副本集
> rs.initiate(
  {
    _id: "config",
    configsvr: true,
    members: [
      { _id : 0, host : "192.168.16.150:21000" },
      { _id : 1, host : "192.168.16.151:21000" },
      { _id : 2, host : "192.168.16.152:21000" }
    ]
  }
)

# 查看分區狀態
> rs.status()

# 退出
> quit()

3、Shard 配置

1. 配置並啓動服務

# 配置
$ vim /opt/mongodb/conf/shard1.conf

sharding:
    clusterRole: shardsvr
replication:
    replSetName: shard1

# log
systemLog:
  destination: file
  logAppend: true
  path: /data/mongodb/shard1/log/shard1.log
 
# data
storage:
  dbPath: /data/mongodb/shard1/data
  journal:
    enabled: true
  wiredTiger:
    engineConfig:
       cacheSizeGB: 1

# process
processManagement:
  fork: true 
  pidFilePath: /var/run/shard1.pid
 
# network
net:
  port: 27001
  bindIp: 192.168.16.150

更多參數配置請參閱:參數配置

注意修改bindIp,並在三臺服務器上啓動 Shard 服務

$ mongod --config /opt/mongodb/conf/shard1.conf

2. 鏈接並配置服務

選擇任意服務器進行鏈接

$ mongo --host 192.168.16.150 --port 27001

使用 rs.initiate() 方法來初始化

  • _id:必須匹配配置的 replication.replSetName 值
  • member:所有的副本集
# 使用 admin 數據庫
> use admin

# 初始化副本集,第三個節點的 "arbiterOnly":true 表明其爲仲裁節點
> rs.initiate(
  { 
    _id: "shard1",
    members: [
      {  _id : 0, host : "192.168.16.150:27001" },
      {  _id : 1, host : "192.168.16.151:27001" },
      {  _id : 2, host : "192.168.16.152:27001", arbiterOnly: true }
    ]
  }
)

# 查看分區狀態
> rs.status()

# 退出
> quit()

到這,shard1 就配置好了,shard2 和 shard3 的操做基本同樣,以下:

Shard2(注意修改bindIp

$ vim /opt/mongodb/conf/shard2.conf
sharding:
    clusterRole: shardsvr
replication:
    replSetName: shard2

# log
systemLog:
  destination: file
  logAppend: true
  path: /data/mongodb/shard2/log/shard2.log
 
# data
storage:
  dbPath: /data/mongodb/shard2/data
  journal:
    enabled: true
  wiredTiger:
    engineConfig:
       cacheSizeGB: 1

# process
processManagement:
  fork: true 
  pidFilePath: /var/run/shard2.pid
 
# network
net:
  port: 27002
  bindIp: 192.168.16.150

$ mongod --config /opt/mongodb/conf/shard2.conf
$ mongo --host 192.168.16.150 --port 27002
> use admin
> rs.initiate(
  { 
    _id: "shard2",
    members: [
      {  _id : 0, host : "192.168.16.150:27002", arbiterOnly: true },
      {  _id : 1, host : "192.168.16.151:27002" },
      {  _id : 2, host : "192.168.16.152:27002" }
    ]
  }
)

Shard3(注意修改bindIp

$ vim /opt/mongodb/conf/shard3.conf
sharding:
    clusterRole: shardsvr
replication:
    replSetName: shard3

# log
systemLog:
  destination: file
  logAppend: true
  path: /data/mongodb/shard3/log/shard3.log
 
# data
storage:
  dbPath: /data/mongodb/shard3/data
  journal:
    enabled: true
  wiredTiger:
    engineConfig:
       cacheSizeGB: 1

# process
processManagement:
  fork: true 
  pidFilePath: /var/run/shard3.pid
 
# network
net:
  port: 27003
  bindIp: 192.168.16.150

$ mongod --config /opt/mongodb/conf/shard3.conf
$ mongo --host 192.168.16.150 --port 27003
> use admin
> rs.initiate(
  { 
    _id: "shard3",
    members: [
      {  _id : 0, host : "192.168.16.150:27003" },
      {  _id : 1, host : "192.168.16.151:27003", arbiterOnly: true },
      {  _id : 2, host : "192.168.16.152:27003" }
    ]
  }
)

4、Mongos 配置

1. 配置並啓動服務

# 配置
$ vim /opt/mongodb/conf/mongos.conf

sharding:
  configDB: config/192.168.16.150:21000,192.168.16.151:21000,192.168.16.152:21000

# log
systemLog:
  destination: file
  logAppend: true
  path: /data/mongodb/mongos/log/mongos.log

# process
processManagement:
  fork: true
  pidFilePath: /var/run/mongos.pid
 
# network
net:
  port: 20000
  bindIp: 192.168.16.150

更多參數配置請參閱:參數配置

注意修改bindIp,並在三臺服務器上啓動 Mongos 服務

$ mongos --config /opt/mongodb/conf/mongos.conf

2. 鏈接並配置服務

選擇任意服務器進行鏈接

$ mongo --host 192.168.16.150 --port 20000

使用 rs.initiate() 方法來初始化

  • _id:必須匹配配置的 replication.replSetName 值
  • member:所有的副本集
  • configsvr:對於 config server 副本集,該值必須爲 true
# 使用 admin 數據庫
> use admin

# 串聯路由服務器與分配副本集
> sh.addShard("shard1/192.168.16.150:27001,192.168.16.151:27001,192.168.16.152:27001")
> sh.addShard("shard2/192.168.16.150:27002,192.168.16.151:27002,192.168.16.152:27002")
> sh.addShard("shard3/192.168.16.150:27003,192.168.16.151:27003,192.168.16.152:27003")

# 查看集羣狀態
> sh.status()
--- Sharding Status ---
  sharding version: { 
        "_id" : 1,
        "minCompatibleVersion" : 5,
        "currentVersion" : 6,
        "clusterId" : ObjectId("59ca06fabd3d4cb527e9368d")
}
  shards:
        {   "_id" : "shard1",  "host" : "shard1/192.168.16.150:27001,192.168.16.151:27001",  "state" : 1 }
        {   "_id" : "shard2",  "host" : "shard2/192.168.16.151:27002,192.168.16.152:27002",  "state" : 1 }
        {   "_id" : "shard3",  "host" : "shard3/192.168.16.150:27003,192.168.16.152:27003",  "state" : 1 }
  active mongoses:
        "3.4.9" : 1
 autosplit:
        Currently enabled: yes
  balancer:
        Currently enabled:  yes
        Currently running:  no
                Balancer lock taken at Tue Sep 26 2017 15:51:24 GMT+0800 (CST) by ConfigServer:Balancer
        Failed balancer rounds in last 5 attempts:  0
        Migration Results for the last 24 hours:
                No recent migrations
  databases:
        {   "_id" : "test",  "primary" : "shard3",  "partitioned" : false }
 

# 退出
> quit()

使數據庫分片生效

首先必須鏈接到 mongos 服務,而爲了讓集合(collection)可以分片,先必須使得集合對應的數據庫分片生效,數據庫分片生效後,並不會從新分配數據,而是使得數據庫中集合的分片成爲可能。

使用 sh.enableSharding() 方法讓指定數據庫分片生效

> sh.enableSharding("xxxx")

5、測試

# 讓指定數據庫和指定的集合分片生效
$ mongo --host 192.168.16.150 --port 20000
> sh.enableSharding("testdb")
> sh.shardCollection("testdb.table1", { id: 1})

# 測試
$ mongo  192.168.16.150:20000
> use testdb
# 插入測試數據(當數據量未達到閾值時,是不會進行分割和遷移的)
> for (var i = 1; i <= 2000000; i++) db.table1.save({ id: i, "test1": "testval1"})

# 查看分片狀況
> db.table1.stats()
mongos> db.table1.stats()
mongos> db.table1.stats()
{ 
        "sharded" : true,
        "capped" : false,
        "ns" : "testdb.table1",
        "count" : 2000001,
        "size" : 107000053,
        "storageSize" : 38379520,
        "totalIndexSize" : 51064832,
        "indexSizes" : { 
                "_id_" : 21872640,
                "id_1" : 29192192
        },
        "avgObjSize" : 53.37500081249959,
        "nindexes" : 2,
        "nchunks" : 7,
        "shards" : { 
                "shard1" : { 
                        "ns" : "testdb.table1",
                        "size" : 27000054,
                        "count" : 500001,
                        "avgObjSize" : 54,
                        "storageSize" : 8605696,
                        "capped" : false,
                        "nindexes" : 2,
                        "totalIndexSize" : 11132928,
                        "indexSizes" : { 
                                "_id_" : 4755456,
                                "id_1" : 6377472
                        },
                        "ok" : 1
                },
                "shard2" : { 
                        "ns" : "testdb.table1",
                        "size" : 66499945,
                        "count" : 1249999,
                        "avgObjSize" : 53,
                        "storageSize" : 25427968,
                        "capped" : false,
                        "nindexes" : 2,
                        "totalIndexSize" : 34476032,
                        "indexSizes" : { 
                                "_id_" : 14802944,
                                "id_1" : 19673088
                        },
                        "ok" : 1
                },
                "shard3" : { 
                        "ns" : "testdb.table1",
                        "size" : 13500054,
                        "count" : 250001,
                        "avgObjSize" : 54,
                        "storageSize" : 4345856,
                        "capped" : false,
                        "nindexes" : 2,
                        "totalIndexSize" : 5455872,
                        "indexSizes" : { 
                                "_id_" : 2314240,
                                "id_1" : 3141632
                        },
                        "ok" : 1
                }
        },
        "ok" : 1
}

後期運維

1、啓動及關閉

mongodb的啓動順序是,先啓動配置服務器,再啓動分片,最後啓動mongos

$ mongos --config /opt/mongodb/conf/config.conf
$ mongos --config /opt/mongodb/conf/shard1.conf
$ mongos --config /opt/mongodb/conf/shard2.conf
$ mongos --config /opt/mongodb/conf/shard3.conf
$ mongos --config /opt/mongodb/conf/mongos.conf

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

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