CentOS7+Docker+MangoDB下部署簡單的MongoDB分片集群


簡單的在Docker上快速部署MongoDB分片集群

前言

文中使用的環境如下

OS:CentOS Linux release 7.5.1804 (Core)

Docker:Docker version 18.06.1-ce, build e68fc7a

docker image中的MongoDB :v4.0.4

第一步:拉取鏡像

docker pull mongo

執行 docker images 得到如下結果,證明鏡像已經拉取完畢

[root@VM_0_7_centos ~]# docker images
REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
mongo               latest              525bd2016729        2 weeks ago         383MB

第二步:創建配置服務復制集和分片復制集

創建配置服務復制集

docker run --name configsvr0 -d mongo --configsvr --replSet "rs_configsvr"  --bind_ip_all
docker run --name configsvr1 -d mongo --configsvr --replSet "rs_configsvr"  --bind_ip_all
docker run --name configsvr2 -d mongo --configsvr --replSet "rs_configsvr"  --bind_ip_all

創建分片0復制集

docker run --name shardsvr00 -d mongo --shardsvr --replSet "rs_shardsvr0"  --bind_ip_all
docker run --name shardsvr01 -d mongo --shardsvr --replSet "rs_shardsvr0"  --bind_ip_all
docker run --name shardsvr02 -d mongo --shardsvr --replSet "rs_shardsvr0"  --bind_ip_all

創建分片1復制集

docker run --name shardsvr10 -d mongo --shardsvr --replSet "rs_shardsvr1"  --bind_ip_all
docker run --name shardsvr11 -d mongo --shardsvr --replSet "rs_shardsvr1"  --bind_ip_all
docker run --name shardsvr12 -d mongo --shardsvr --replSet "rs_shardsvr1"  --bind_ip_all

執行 docker ps 得到如下結果,證明配置服務和分片集都成功啟動了

[root@VM_0_7_centos ~]# docker ps
CONTAINER ID        IMAGE               COMMAND                  CREATED              STATUS              PORTS               NAMES
5e1f9851e714        mongo               "docker-entrypoint.s…"   21 seconds ago       Up 20 seconds       27017/tcp           shardsvr12
a015c3b1c001        mongo               "docker-entrypoint.s…"   29 seconds ago       Up 29 seconds       27017/tcp           shardsvr11
4a9b33a8b641        mongo               "docker-entrypoint.s…"   36 seconds ago       Up 36 seconds       27017/tcp           shardsvr10
8ceef0e613a0        mongo               "docker-entrypoint.s…"   57 seconds ago       Up 57 seconds       27017/tcp           shardsvr02
e25eb6431963        mongo               "docker-entrypoint.s…"   About a minute ago   Up About a minute   27017/tcp           shardsvr01
d2746bfd295b        mongo               "docker-entrypoint.s…"   About a minute ago   Up About a minute   27017/tcp           shardsvr00
d4709d527fb8        mongo               "docker-entrypoint.s…"   10 minutes ago       Up 10 minutes       27017/tcp           configsvr2
50b2a3a3487a        mongo               "docker-entrypoint.s…"   10 minutes ago       Up 10 minutes       27017/tcp           configsvr1
95e1549af67a        mongo               "docker-entrypoint.s…"   10 minutes ago       Up 10 minutes       27017/tcp           configsvr0

執行 docker inspect -f '{{.Name}} - {{.NetworkSettings.IPAddress }}' $(docker ps -aq) 得到我們剛剛啟動的容器的名稱和ip列表

[root@VM_0_7_centos ~]# docker inspect -f '{{.Name}} - {{.NetworkSettings.IPAddress }}' $(docker ps -aq)
/shardsvr12 - 172.17.0.10
/shardsvr11 - 172.17.0.9
/shardsvr10 - 172.17.0.8
/shardsvr02 - 172.17.0.7
/shardsvr01 - 172.17.0.6
/shardsvr00 - 172.17.0.5
/configsvr2 - 172.17.0.4
/configsvr1 - 172.17.0.3
/configsvr0 - 172.17.0.2

第三步:初始化配置復制集和分片復制集

執行以下指令(分步執行)進入配置集的第一個容器並初始化配置集

ps:使用--configsvr構建的配置容器默認的端口是27019

docker exec -it configsvr0 bash
mongo --host 172.17.0.2 --port 27019

rs.initiate(
  {
    _id: "rs_configsvr",
    configsvr: true,
    members: [
      { _id : 0, host : "172.17.0.2:27019" },
      { _id : 1, host : "172.17.0.3:27019" },
      { _id : 2, host : "172.17.0.4:27019" }
    ]
  }
)

執行效果如下

[root@VM_0_7_centos ~]# docker exec -it configsvr0 bash
root@95e1549af67a:/# mongo --host 172.17.0.2 --port 27019
MongoDB shell version v4.0.4
connecting to: mongodb://172.17.0.2:27019/
Implicit session: session { "id" : UUID("a8eacad5-85bb-450f-a4c9-855009f8bceb") }
MongoDB server version: 4.0.4
Welcome to the MongoDB shell.
For interactive help, type "help".
For more comprehensive documentation, see
        http://docs.mongodb.org/
Questions? Try the support group
        http://groups.google.com/group/mongodb-user
Server has startup warnings: 
2018-12-05T03:25:52.144+0000 I STORAGE  [initandlisten] 
2018-12-05T03:25:52.144+0000 I STORAGE  [initandlisten] ** WARNING: Using the XFS filesystem is strongly recommended with the WiredTiger storage engine
2018-12-05T03:25:52.144+0000 I STORAGE  [initandlisten] **          See http://dochub.mongodb.org/core/prodnotes-filesystem
2018-12-05T03:25:53.213+0000 I CONTROL  [initandlisten] 
2018-12-05T03:25:53.213+0000 I CONTROL  [initandlisten] ** WARNING: Access control is not enabled for the database.
2018-12-05T03:25:53.213+0000 I CONTROL  [initandlisten] **          Read and write access to data and configuration is unrestricted.
2018-12-05T03:25:53.213+0000 I CONTROL  [initandlisten] 
2018-12-05T03:25:53.213+0000 I CONTROL  [initandlisten] 
2018-12-05T03:25:53.213+0000 I CONTROL  [initandlisten] ** WARNING: /sys/kernel/mm/transparent_hugepage/enabled is 'always'.
2018-12-05T03:25:53.213+0000 I CONTROL  [initandlisten] **        We suggest setting it to 'never'
2018-12-05T03:25:53.213+0000 I CONTROL  [initandlisten] 
2018-12-05T03:25:53.213+0000 I CONTROL  [initandlisten] ** WARNING: /sys/kernel/mm/transparent_hugepage/defrag is 'always'.
2018-12-05T03:25:53.213+0000 I CONTROL  [initandlisten] **        We suggest setting it to 'never'
2018-12-05T03:25:53.213+0000 I CONTROL  [initandlisten] 
---
Enable MongoDB's free cloud-based monitoring service, which will then receive and display
metrics about your deployment (disk utilization, CPU, operation statistics, etc).

The monitoring data will be available on a MongoDB website with a unique URL accessible to you
and anyone you share the URL with. MongoDB may use this information to make product
improvements and to suggest MongoDB products and deployment options to you.

To enable free monitoring, run the following command: db.enableFreeMonitoring()
To permanently disable this reminder, run the following command: db.disableFreeMonitoring()
---

> rs.initiate(
...   {
...     _id: "rs_configsvr",
...     configsvr: true,
...     members: [
...       { _id : 0, host : "172.17.0.2:27019" },
...       { _id : 1, host : "172.17.0.3:27019" },
...       { _id : 2, host : "172.17.0.4:27019" }
...     ]
...   }
... )
{
        "ok" : 1,
        "operationTime" : Timestamp(1543989131, 1),
        "$gleStats" : {
                "lastOpTime" : Timestamp(1543989131, 1),
                "electionId" : ObjectId("000000000000000000000000")
        },
        "lastCommittedOpTime" : Timestamp(0, 0),
        "$clusterTime" : {
                "clusterTime" : Timestamp(1543989131, 1),
                "signature" : {
                        "hash" : BinData(0,"AAAAAAAAAAAAAAAAAAAAAAAAAAA="),
                        "keyId" : NumberLong(0)
                }
        }
}

可以看到執行中有警告,大意是我們沒有配置訪問限制和和一些建議的配置,此處略過這些警告

如何退出MangoDB/容器的命令行?當然是exit啊!

同理,我們初始化兩個分片集:

ps:使用--shardsvr構建的分片容器默認的端口是27018

docker exec -it shardsvr00 bash
mongo --host 172.17.0.5 --port 27018

rs.initiate(
  {
    _id : "rs_shardsvr0",
    members: [
      { _id : 0, host : "172.17.0.5:27018" },
      { _id : 1, host : "172.17.0.6:27018" },
      { _id : 2, host : "172.17.0.7:27018" }
    ]
  }
)
docker exec -it shardsvr10 bash
mongo --host 172.17.0.8 --port 27018

rs.initiate(
  {
    _id: "rs_shardsvr1",
    members: [
      { _id : 0, host : "172.17.0.8:27018" },
      { _id : 1, host : "172.17.0.9:27018" },
      { _id : 2, host : "172.17.0.10:27018" }
    ]
  }
)

第四步:創建集群入口並關聯配置集

ps:默認是mongod(分片處理模式),我們需要將起修改為mongos(路由模式),負責路由和協調操作,使得集群像一個整體的系統

docker run --name mongos0 -d --entrypoint "mongos" mongo --configdb rs_configsvr/172.17.0.2:27019,172.17.0.3:27019,172.17.0.4:27019 --bind_ip_all

同樣執行 docker inspect -f '{{.Name}} - {{.NetworkSettings.IPAddress }}' $(docker ps -aq) 得到容器的名稱和ip的對應列表,並獲得mongo0容器的ip為172.17.0.11

第五步:在集群入口(路由)上掛載分片集

ps:容器默認的端口是27017

docker exec -it mongos0 bash
mongo --host 172.17.0.11 --port 27017
sh.addShard("rs_shardsvr0/172.17.0.5:27018,172.17.0.6:27018,172.17.0.7:27018")
sh.addShard("rs_shardsvr1/172.17.0.8:27018,172.17.0.9:27018,172.17.0.10:27018")

測試

進入路由容器創建test數據庫並啟用分片

docker exec -it mongos0 bash
mongo --host 172.17.0.11 --port 27017
sh.enableSharding("test")

分片 Collection
對 test.order 的 _id 字段進行哈希分片:

sh.shardCollection("test.order", {"_id": "hashed" })

插入10000條數據測試下

mongos> use test
switched to db test
mongos> for (i = 1; i <= 10000; i=i+1){
    db.order.insert({'price': 1})
 }
WriteResult({ "nInserted" : 1 })


mongos> db.order.find().count()
10000

到分片數據庫看下情況

root@9748cd0dfa2c:/# mongo --host 172.17.0.8 --port 27018

rs_shardsvr1:PRIMARY> db.order.count()
4966
rs_shardsvr1:PRIMARY>exit

root@9748cd0dfa2c:/# mongo --host 172.17.0.5 --port 27018

rs_shardsvr0:PRIMARY> db.order.count()
5034

可以看到已經得到預期效果
那么備份呢?(備份默認情況下不允許讀取,需要執行db.getMongo().setSlaveOk()來允許讀取)

root@9748cd0dfa2c:/# mongo --host 172.17.0.6 --port 27018

rs_shardsvr0:SECONDARY> db.getMongo().setSlaveOk()

rs_shardsvr0:SECONDARY> db.order.count()
5034

可以看到備份已經重新寫入

啟動mongo實例時的可用參數,僅供參考

  • 基本配置

--quiet # 安靜輸出
--port arg # 指定服務端口號,默認端口27017
--bind_ip arg # 綁定服務IP,若綁定127.0.0.1,則只能本機訪問,不指定默認本地所有IP
--logpath arg # 指定MongoDB日志文件,注意是指定文件不是目錄
--logappend # 使用追加的方式寫日志
--pidfilepath arg # PID File 的完整路徑,如果沒有設置,則沒有PID文件
--keyFile arg # 集群的私鑰的完整路徑,只對於Replica Set 架構有效
--unixSocketPrefix arg # UNIX域套接字替代目錄,(默認為 /tmp)
--fork # 以守護進程的方式運行MongoDB,創建服務器進程
--auth # 啟用驗證
--cpu # 定期顯示CPU的CPU利用率和iowait
--dbpath arg # 指定數據庫路徑
--diaglog arg # diaglog選項 0=off 1=W 2=R 3=both 7=W+some reads
--directoryperdb # 設置每個數據庫將被保存在一個單獨的目錄
--journal # 啟用日志選項,MongoDB的數據操作將會寫入到journal文件夾的文件里
--journalOptions arg # 啟用日志診斷選項
--ipv6 # 啟用IPv6選項
--jsonp # 允許JSONP形式通過HTTP訪問(有安全影響)
--maxConns arg # 最大同時連接數 默認2000
--noauth # 不啟用驗證
--nohttpinterface # 關閉http接口,默認關閉27018端口訪問
--noprealloc # 禁用數據文件預分配(往往影響性能)
--noscripting # 禁用腳本引擎
--notablescan # 不允許表掃描
--nounixsocket # 禁用Unix套接字監聽
--nssize arg (=16) # 設置信數據庫.ns文件大小(MB)
--objcheck # 在收到客戶數據,檢查的有效性,
--profile arg # 檔案參數 0=off 1=slow, 2=all
--quota # 限制每個數據庫的文件數,設置默認為8
--quotaFiles arg # number of files allower per db, requires --quota
--rest # 開啟簡單的rest API
--repair # 修復所有數據庫run repair on all dbs
--repairpath arg # 修復庫生成的文件的目錄,默認為目錄名稱dbpath
--slowms arg (=100) # value of slow for profile and console log
--smallfiles # 使用較小的默認文件
--syncdelay arg (=60) # 數據寫入磁盤的時間秒數(0=never,不推薦)
--sysinfo # 打印一些診斷系統信息
--upgrade # 如果需要升級數據庫

  • Replicaton 參數

--fastsync # 從一個dbpath里啟用從庫復制服務,該dbpath的數據庫是主庫的快照,可用於快速啟用同步
--autoresync # 如果從庫與主庫同步數據差得多,自動重新同步,
--oplogSize arg # 設置oplog的大小(MB)

  • 主/從參數

--master # 主庫模式
--slave # 從庫模式
--source arg # 從庫端口號
--only arg # 指定單一的數據庫復制
--slavedelay arg # 設置從庫同步主庫的延遲時間

  • Replica set(副本集)選項:

--replSet arg # 設置副本集名稱

  • Sharding(分片)選項

--configsvr # 聲明這是一個集群的config服務,默認端口27019,默認目錄/data/configdb
--shardsvr # 聲明這是一個集群的分片,默認端口27018
--noMoveParanoia # 關閉偏執為moveChunk數據保存?

練習過程參考了Jay54520的博客: 查看原文


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM