MongoDB分片集羣部署

一、環境說明

1、我們prod環境MongoDB的集羣架構是做的分片集羣的部署,但是目前我們沒有分片,即所有數據都在一個分片上,後期如果數量大,需要分配,集羣隨時可以分片,對業務方透明
2、各個角色的部署情況

角色 IP 端口 複製集名稱
mongos 172.21.244.101,172.21.244.102,172.21.244.94 27000
config server 172.21.244.101,172.21.244.102,172.21.244.94 27100 repl_configsvr
存儲節點(shard) 172.21.244.101,172.21.244.102,172.21.244.94 27101 shard1

3、MongoDB版本

mongos> db.version()
4.0.4-62-g7e345a7

二、基礎信息準備

0、系統優化


echo "never" >/sys/kernel/mm/transparent_hugepage/enabled
echo "never" >/sys/kernel/mm/transparent_hugepage/defrag

1、下載MongoDB二進制文件

cd /chj/app
wget ops.chehejia.com:9090/pkg/chj_mongodb_4.0.4.tar.gz
tar -zxvf chj_mongodb_4.0.4.tar.gz

2、相關目錄建立

#建立base目錄
mkdir /chj/data/mongodb/chj_db
#把MongoDB二進制文件移動到base目錄下的bin文件夾
mv chj_mongodb_4.0.4/bin /chj/data/mongodb/chj_db/bin
#建立認證文件目錄
mkdir /chj/data/mongodb/chj_db/auth
#建立配置文件目錄
mkdir /chj/data/mongodb/chj_db/conf
#建立config server的data和日誌目錄
mkdir /chj/data/mongodb/chj_db/config/data -p
mkdir /chj/data/mongodb/chj_db/config/log
#建立mongos的日誌目錄
mkdir /chj/data/mongodb/chj_db/mongos/log -p
#建立數據節點data和日誌目錄 
mkdir /chj/data/mongodb/chj_db/shard1/data -p
mkdir /chj/data/mongodb/chj_db/shard1/log

3、相關配置文件編寫
A、mongos的配置文件編寫

vim /chj/data/mongodb/chj_db/conf/mongos.conf
systemLog:
  destination: file
  logAppend: true
  path: /chj/data/mongodb/chj_db/mongos/log/mongos.log

processManagement:
  fork: true  # fork and run in background
  pidFilePath: /chj/data/mongodb/chj_db/mongos/log/mongos.pid  # location of pidfile
  timeZoneInfo: /usr/share/zoneinfo

net:
  port: 27000
  bindIpAll: true
  maxIncomingConnections: 1000
  unixDomainSocket:
    enabled: true
    pathPrefix: /chj/data/mongodb/chj_db/mongos/log
    filePermissions: 0700

security:
  keyFile: /chj/data/mongodb/chj_db/auth/keyfile.key
#  authorization: enabled

#replication:

sharding:
  configDB: repl_configsvr/172.21.244.101:27100,172.21.244.102:27100,172.21.244.94:27100

B、config server的配置文件編寫

vim /chj/data/mongodb/chj_db/conf/config.conf
systemLog:
  destination: file
  logAppend: true
  path: /chj/data/mongodb/chj_db/config/log/congigsrv.log

storage:
  dbPath: /chj/data/mongodb/chj_db/config/data
  journal:
    enabled: true
  wiredTiger:
    engineConfig:
      directoryForIndexes: true

processManagement:
  fork: true  # fork and run in background
  pidFilePath: /chj/data/mongodb/chj_db/config/log/configsrv.pid  # location of pidfile
  timeZoneInfo: /usr/share/zoneinfo

net:
  port: 27100
  bindIp: 0.0.0.0  # Enter 0.0.0.0,:: to bind to all IPv4 and IPv6 addresses or, alternatively, use the net.bindIpAll setting.
  #bindIpAll: true
  maxIncomingConnections: 1000
  unixDomainSocket:
    enabled: true
    pathPrefix: /chj/data/mongodb/chj_db/config/data
    filePermissions: 0700

security:
  keyFile: /chj/data/mongodb/chj_db/auth/keyfile.key
  authorization: enabled

replication:
  replSetName: repl_configsvr
sharding:
  clusterRole: configsvr

C、存儲節點的配置文件編寫

vim /chj/data/mongodb/chj_db/conf/shard1.conf
systemLog:
  destination: file
  logAppend: true
  path: /chj/data/mongodb/chj_db/shard1/log/shard1.log

storage:
  dbPath: /chj/data/mongodb/chj_db/shard1/data
  journal:
    enabled: true
  wiredTiger:
    engineConfig:
      directoryForIndexes: true

processManagement:
  fork: true  # fork and run in background
  pidFilePath: /chj/data/mongodb/chj_db/shard1/log/shard1.pid  # location of pidfile
  timeZoneInfo: /usr/share/zoneinfo

net:
  port: 27101
  bindIp: 0.0.0.0  # Enter 0.0.0.0,:: to bind to all IPv4 and IPv6 addresses or, alternatively, use the net.bindIpAll setting.
  #bindIpAll: true
  maxIncomingConnections: 1000
  unixDomainSocket:
    enabled: true
    pathPrefix: /chj/data/mongodb/chj_db/shard1/data
    filePermissions: 0700

security:
  keyFile: /chj/data/mongodb/chj_db/auth/keyfile.key
  authorization: enabled

replication:
  replSetName: shard1
sharding:
  clusterRole: shardsvr

4、生產key認證文件

echo "chj123456" >/chj/data/mongodb/chj_db/auth/keyfile.key
#設置文件的權限爲400,不然服務無法啓動
chmod 400 /chj/data/mongodb/chj_db/auth/keyfile.key

三、集羣初始化
1、啓動 config server 服務

/chj/data/mongodb/chj_db/bin/mongod -f /chj/data/mongodb/chj_db/conf/config.conf
2、初始化config server集羣

#登錄其中一個config server節點
/chj/data/mongodb/chj_db/bin/mongo --port 27100
#配置集羣
config = { _id:"repl_configsvr",members:[ {_id:0,host:"172.21.244.101:27100"}, {_id:1,host:"172.21.244.102:27100"}, {_id:2,host:"172.21.244.94:27100"}] }
#初始化集羣
rs.initiate(config)
PS:
結果輸出如下,說明集羣初始化成功,可以通過rs.status()命令查看集羣狀態
{
        "ok" : 1,
        "$gleStats" : {
                "lastOpTime" : Timestamp(1557538260, 1),
                "electionId" : ObjectId("000000000000000000000000")
        },
        "lastCommittedOpTime" : Timestamp(0, 0)
}

3、啓動存儲節點服務

/chj/data/mongodb/chj_db/bin/mongod -f /chj/data/mongodb/chj_db/conf/shard1.conf
4、初始化存儲集羣

#登錄你希望是主節點的服務器
/chj/data/mongodb/chj_db/bin/mongo --port 27101
#配置集羣
config = { _id:"shard1",members:[ {_id:0,host:"172.21.244.101:27101"}, {_id:1,host:"172.21.244.102:27101"},{_id:2,host:"172.21.244.94:27101",arbiterOnly:true}] }
#初始化集羣
rs.initiate(config)
PS:
結果輸出如下,說明集羣初始化成功,可以通過rs.status()命令查看集羣狀態
{ "ok" : 1 }

5、添加存儲集羣的管理賬號

登錄主節點
/chj/data/mongodb/chj_db/bin/mongo --port 27101
use admin
db.createUser(
{
user: "root",
pwd: "123456",
roles: [ { role: "root", db: "admin" } ]
}
)

6、啓動mongos 服務

/chj/data/mongodb/chj_db/bin/mongos -f /chj/data/mongodb/chj_db/conf/mongos.conf
7、添加config server的管理賬號

登錄任意一個mongos節點
/chj/data/mongodb/chj_db/bin/mongo --port 27000
use admin
db.createUser(
{
user: "root",
pwd: "123456",
roles: [ { role: "root", db: "admin" } ]
}
)

8、把存儲節點添加到mongos


登錄任意一個mongos節點(如果是在上一步的窗口,需要退出重新登錄)
/chj/data/mongodb/chj_db/bin/mongo --port 27000
use admin
db.auth('root','123456')
#添加分片
sh.addShard('shard1/172.21.244.101:27101,172.21.244.102:27101,172.21.244.94:27101')
#查看分片狀態
sh.status()

四、交付業務方
1、建立應用賬號

登錄任意一個mongos節點
/chj/data/mongodb/chj_db/bin/mongo --port 27000
use admin
db.auth('root','123456')
#切到業務數據庫
use chj_db
#建立讀寫賬號
db.createUser(
{
   user: "chj_db_rw",
   pwd: "123456",
   roles: [
      { role: "readWrite", db: "chj_db" },
      { role: "dbOwner", db: "chj_db" }
   ]
}
)
#建立只讀賬號(根據業務需求確認是否需要)
db.createUser(
{
user: "chj_db_r",
pwd: "123456",
roles: [ { role: "read", db: "chj_db" } ]
}
)

2、交付開發人員信息

連接地址:172.21.244.101:27000,172.21.244.102:27000,172.21.244.94:27000
庫名:chj_db
賬號:chj_db_rw
密碼:123456

五、數據庫啓用分片

如果後期業務量大,需要開啓分片,配置如下

#指定需要分片的數據庫
mongos> sh.enableSharding("chj_db")  
{
        "ok" : 1,
        "operationTime" : Timestamp(1557546835, 3),
        "$clusterTime" : {
                "clusterTime" : Timestamp(1557546835, 3),
                "signature" : {
                        "hash" : BinData(0,"bkrrr8Kxrr9j9udrDc/hURHld38="),
                        "keyId" : NumberLong("6689575940508352541")
                }
        }
}
#在chj_db數據庫和users集合中創建了name和age爲升序的片鍵
mongos> sh.shardCollection("chj_db.users",{name:1,age:1})  
{
        "collectionsharded" : "chj_db.users",
        "collectionUUID" : UUID("59c0b99f-efff-4132-b489-f6c7e3d98f42"),
        "ok" : 1,
        "operationTime" : Timestamp(1557546861, 12),
        "$clusterTime" : {
                "clusterTime" : Timestamp(1557546861, 12),
                "signature" : {
                        "hash" : BinData(0,"UBB1A/YODnmXwG5eAhgNLcKVzug="),
                        "keyId" : NumberLong("6689575940508352541")
                }
        }
}
#查看分片情況
mongos> sh.status()  
--- Sharding Status ---
  sharding version: {
        "_id" : 1,
        "minCompatibleVersion" : 5,
        "currentVersion" : 6,
        "clusterId" : ObjectId("5cd625e0da695346d740f749")
  }
  shards:
        {  "_id" : "shard1",  "host" : "shard1/172.21.244.101:27101,172.21.244.102:27101",  "state" : 1 }
  active mongoses:
        "4.0.4-62-g7e345a7" : 3
  autosplit:
        Currently enabled: yes
  balancer:
        Currently enabled:  yes
        Currently running:  no
        Failed balancer rounds in last 5 attempts:  0
        Migration Results for the last 24 hours:
                No recent migrations
  databases:
        {  "_id" : "chj_db",  "primary" : "shard1",  "partitioned" : true,  "version" : {  "uuid" : UUID("82088bc7-7b98-4033-843d-7058d8d959f6"),  "lastMod" : 1 } }
                chj_db.users
                        shard key: { "name" : 1, "age" : 1 }
                        unique: false
                        balancing: true
                        chunks:
                                shard1  1
                        { "name" : { "$minKey" : 1 }, "age" : { "$minKey" : 1 } } -->> { "name" : { "$maxKey" : 1 }, "age" : { "$maxKey" : 1 } } on : shard1 Timestamp(1, 0)
        {  "_id" : "config",  "primary" : "config",  "partitioned" : true }
                config.system.sessions
                        shard key: { "_id" : 1 }
                        unique: false
                        balancing: true
                        chunks:
                                shard1  1
                        { "_id" : { "$minKey" : 1 } } -->> { "_id" : { "$maxKey" : 1 } } on : shard1 Timestamp(1, 0)
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章