天天看點

mongodb搭建以及分片下載下傳至此 mongo安裝完成 下面搞mongo分片

下載下傳

MongoDB 官方下載下傳位址:https://www.mongodb.com/download-center#community

下載下傳後解壓到app目錄下

tar -zxvf  mongodb-linux-x86_64-rhel70-4.4.3.tgz -C /app
           

修改檔案夾名稱

mv mongodb-linux-x86_64-rhel70-4.4.3 mongodb-4.4.3
           

進入根目錄

mkdir log

mkdir data

vim conf/mongo.conf
           

配置

logpath=/app/mongodb-4.4.3/log/mongo.log  # 日志檔案



dbpath =/app/mongodb-4.4.3/data # 資料檔案

#錯誤日志采用追加模式
logappend=true
#啟用日志檔案,預設啟用
journal=true
#這個選項可以過濾掉一些無用的日志資訊,若需要調試使用請設定為false
quiet=true
#端口号 預設為27017
port=27017
#允許遠端通路
bind_ip=0.0.0.0
#開啟子程序
fork=true
#開啟認證,必選先添加使用者,  如果不需要驗證這裡改成false
auth=true
~              
           

啟動mongo 并設定密碼

mongo
MongoDB shell version v4.4.3
connecting to: mongodb://127.0.0.1:27017/?compressors=disabled&gssapiServiceName=mongodb
Implicit session: session { "id" : UUID("2eeb129e-26f3-418c-afd9-72867bf20118") }
MongoDB server version: 4.4.3
> use admin
switched to db admin
> db.createUser({user:"admin",pwd:"password",roles:["root"]})
Successfully added user: { "user" : "admin", "roles" : [ "root" ] }
           

下次登入後 如果不驗證 則資料是查不到的

#驗證語句
db.auth('root','123456')
           

至此 mongo安裝完成 下面搞mongo分片

mongo分片介紹

mongodb搭建以及分片下載下傳至此 mongo安裝完成 下面搞mongo分片
① 配置伺服器。是一個獨立的mongod程序,儲存叢集和分片的中繼資料,即各分片包含了哪些資料的資訊。最先開始建立,啟用日志功能。像啟動普通的mongod一樣啟動配置伺服器,指定configsvr選項。不需要太多的空間和資源,配置伺服器的1KB空間相當于真是資料的200MB。儲存的隻是資料的分布表。當服務不可用,則變成隻讀,無法分塊、遷移資料。
② 路由伺服器。即mongos,起到一個路由的功能,供程式連接配接。本身不儲存資料,在啟動時從配置伺服器加載叢集資訊,開啟mongos程序需要知道配置伺服器的位址,指定configdb選項。
③ 分片伺服器。是一個獨立普通的mongod程序,儲存資料資訊。可以是一個副本集也可以是單獨的一台伺服器。
           

      在部署之前先明白片鍵的意義,一個好的片鍵對分片至關重要。片鍵必須是一個索引,資料根據這個片鍵進行拆分分散。通過sh.shardCollection加會自動建立索引。一個自增的片鍵對寫入和資料均勻分布就不是很好,因為自增的片鍵總會在一個分片上寫入,後續達到某個閥值可能會寫到别的分片。但是按照片鍵查詢會非常高效。随機片鍵對資料的均勻分布效果很好。注意盡量避免在多個分片上進行查詢。在所有分片上查詢,mongos會對結果進行歸并排序。

mongo分片實施 資源有限在一台機器上搞一下

1)配置伺服器。配置伺服器必須開啟1個或則3個,開啟2個則會報錯: (開啟3個,Port:20000、20001、20002    一個配置伺服器=一個副本集=三個節點) 

在其根目錄下建立檔案夾

[[email protected] mongodb-4.4.3]# mkdir configServer
[[email protected] mongodb-4.4.3]# cd ./configServer
[[email protected] configServer]# mkdir configserver20000
[[email protected] configServer]# mkdir configserver20001
[[email protected] configServer]# mkdir configserver20002

[[email protected] configServer]# cd configServer20000
[[email protected] configServer20000]# mkdir data
[[email protected] configServer20000]# mkdir log
[[email protected] configServer20000]# cp /app/mongodb-4.4.3/conf/mongo.conf ./mongo.conf
[[email protected] configServer20000]#  其他節點做一樣的操作
           

配置節點的配置檔案 其他節點修改端口 和檔案路徑

logpath=/app/mongodb-4.4.3/configServer/configServer20000/log/mongo.log  # 日志檔案

dbpath =/app/mongodb-4.4.3/configServer/configServer20000/data # 資料檔案

#錯誤日志采用追加模式
logappend=true
#啟用日志檔案,預設啟用
journal=true
#這個選項可以過濾掉一些無用的日志資訊,若需要調試使用請設定為false
quiet=true
#端口号 預設為27017
port=20000
#允許遠端通路
bind_ip=0.0.0.0
#開啟子程序
fork=true
#開啟認證,必選先添加使用者,先不開啟(不用驗證賬号密碼)
auth=false
#最大連接配接數
maxConns=20000      
#複制集名稱  
replSet=myShardConfigs   
configsvr=true                                                                                                                                                                                                                                  
           

啟動配置伺服器

./mongod -f ../configServer/configServer20000/mongo.conf
 ./mongod -f ../configServer/configServer20001/mongo.conf
 ./mongod -f ../configServer/configServer20002/mongo.conf
           

 連接配接到某個節點 配置副本集(連接配接三個節點任意一個)

mongo --port 20000                    //任意選擇一台進入
config={_id:"myShardConfigs",configsvr:true,members:[{_id:0,host:"127.0.0.1:20000"},{_id:1,host:"127.0.0.1:20001"},{_id:2,host:"127.0.0.1:20002"}]}  //建立複制集
rs.initiate(config)                //初始化複制集
           
mongodb搭建以及分片下載下傳至此 mongo安裝完成 下面搞mongo分片

配置伺服器 操作完畢

2)分片伺服器  兩個分片伺服器(兩個副本集) 每個分片3個節點 

本文沒有使用仲裁節點 為什麼請看https://www.zhihu.com/question/27648448/answer/99091787

[[email protected] shareServer]# mkdir shareServer1-21000
[[email protected] shareServer]# mkdir shareServer1-21001-replSet1
[[email protected] shareServer]# mkdir shareServer1-21002-replSet2
[[email protected]1cf6pm8o3dv75jmev9Z shareServer]# mkdir shareServer2-21005
[[email protected] shareServer]# mkdir shareServer2-21006-replSet1
[[email protected] shareServer]# mkdir shareServer2-21007-replSet2
[[email protected] shareServer]# 
           

分片節點的配置  其他節點修改路徑和端口和叢集名稱

logpath=/app/mongodb-4.4.3/shareServer/shareServer1-21000/log/mongo.log  # 日志檔案

dbpath =/app/mongodb-4.4.3/shareServer/shareServer1-21000/data # 資料檔案

#錯誤日志采用追加模式
logappend=true
#啟用日志檔案,預設啟用
journal=true
#這個選項可以過濾掉一些無用的日志資訊,若需要調試使用請設定為false
quiet=true
#端口号 預設為27017
port=21000
#允許遠端通路
bind_ip=0.0.0.0
#開啟子程序
fork=true
#開啟認證,必選先添加使用者,先不開啟(不用驗證賬号密碼)
auth=false
#最大連接配接數
maxConns=20000      
#複制集名稱  
replSet=share1
 #  聲明這是一個叢集的分片      
shardsvr=true                                                                                                                                              
           

啟動 六個節點

./mongod -f ../shareServer/shareServer1-21000/mongo.conf
./mongod -f ../shareServer/shareServer1-21001-replSet1/mongo.conf
./mongod -f ../shareServer/shareServer1-21002-replSet2/mongo.conf
./mongod -f ../shareServer/shareServer2-21005/mongo.conf
./mongod -f ../shareServer/shareServer2-21006-replSet1/mongo.conf
./mongod -f ../shareServer/shareServer2-21007-replSet2/mongo.conf
           

連接配接到某個節點  初始化複制集(21000、21001、21002為share1 ,21005、21006、21007為share2  配置的時候前三個連接配接任意一個配置  後三個任意一個配置 )

注意:如果沒有仲裁節點可以三個節點任意一台去初始化, 如果有仲裁節點隻能去不是仲裁節點的另外兩台去初始化。

share1

./mongo --port 21000
rsconf={ _id:"share1",members:[ {_id:0,host:"127.0.0.1:21000"}, {_id:1,host:"127.0.0.1:21001"}, {_id:2,host:"127.0.0.1:21002"}]}
rs.initiate(rsconf);
           

share2

./mongo --port 21005
rsconf={ _id:"share2",members:[ {_id:0,host:"127.0.0.1:21005"}, {_id:1,host:"127.0.0.1:21006"}, {_id:2,host:"127.0.0.1:21007"}]}
rs.initiate(rsconf);
           

3)路由伺服器 (這裡搞兩個路由伺服器 27017、27018)

[[email protected] mongodb-4.4.3]# cd routerServer/
[[email protected] routerServer]# mkdir router-27017
[[email protected] routerServer]# mkdir router-27018
           

config

logpath=/app/mongodb-4.4.3/routerServer/router-27017/log/mongo.log  # 日志檔案

pidfilepath =/app/mongodb-4.4.3/routerServer/router-27017/log/mongos.pid

#錯誤日志采用追加模式
logappend=true
#這個選項可以過濾掉一些無用的日志資訊,若需要調試使用請設定為false
quiet=true
#端口号 預設為27017
port=27017
#允許遠端通路
bind_ip=0.0.0.0
#開啟子程序
fork=true
#最大連接配接數
maxConns=20000
#配置伺服器
configdb =myShardConfigs/127.0.0.1:20000,127.0.0.1:20001,127.0.0.1:20002
           

啟動路由(這裡啟動27017  沒有啟動27018 如果使用兩個路由代碼中要配置兩個路由的路徑)

./mongos -f ../routerServer/router-27017/mongo.conf 



[[email protected] bin]# ps -ef |grep mong
root      4697     1  0 11:28 ?        00:03:16 ./mongod -f ../shareServer/shareServer1-21000/mongo.conf
root      4740     1  0 11:28 ?        00:02:46 ./mongod -f ../shareServer/shareServer1-21001-replSet1/mongo.conf
root      4783     1  0 11:28 ?        00:02:47 ./mongod -f ../shareServer/shareServer1-21002-replSet2/mongo.conf
root      4831     1  0 11:29 ?        00:03:16 ./mongod -f ../shareServer/shareServer2-21005/mongo.conf
root      4874     1  0 11:29 ?        00:02:49 ./mongod -f ../shareServer/shareServer2-21006-replSet1/mongo.conf
root      6136     1  0 14:07 ?        00:01:23 ./mongod -f ../shareServer/shareServer2-21007-replSet2/mongo.conf
root     11428     1  1 17:47 ?        00:00:03 ./mongod -f ../configServer/configServer20000/mongo.conf
root     11480     1  1 17:47 ?        00:00:02 ./mongod -f ../configServer/configServer20001/mongo.conf
root     11531     1  1 17:47 ?        00:00:02 ./mongod -f ../configServer/configServer20002/mongo.conf
root     11740     1  0 17:50 ?        00:00:00 ./mongos -f ../routerServer/router-27017/mongo.conf
root     11779  7334  0 17:51 pts/2    00:00:00 grep --color=auto mong
[[email protected] bin]# 
           

4)此時登入路由伺服器檢視狀态 這是還沒有添加分片伺服器的狀态

mongo --port 27017

mongos> sh.status();
--- Sharding Status --- 
  sharding version: {
        "_id" : 1,
        "minCompatibleVersion" : 5,
        "currentVersion" : 6,
        "clusterId" : ObjectId("600559990c4072b92c72da2f")
  }
  shards:
  active mongoses:
  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" : "config",  "primary" : "config",  "partitioned" : true }
mongos> 
           

手動加入分片1和分片2

admin
mongos> sh.addShard("share1/127.0.0.1:21000,127.0.0.1:21001,127.0.0.1:21002");
{
        "shardAdded" : "share1",
        "ok" : 1,
        "operationTime" : Timestamp(1610964029, 4),
        "$clusterTime" : {
                "clusterTime" : Timestamp(1610964029, 4),
                "signature" : {
                        "hash" : BinData(0,"AAAAAAAAAAAAAAAAAAAAAAAAAAA="),
                        "keyId" : NumberLong(0)
                }
        }
}
mongos> sh.addShard("share2/127.0.0.1:21005,127.0.0.1:21006,127.0.0.1:21007");
{
        "shardAdded" : "share2",
        "ok" : 1,
        "operationTime" : Timestamp(1610964053, 2),
        "$clusterTime" : {
                "clusterTime" : Timestamp(1610964054, 1),
                "signature" : {
                        "hash" : BinData(0,"AAAAAAAAAAAAAAAAAAAAAAAAAAA="),
                        "keyId" : NumberLong(0)
                }
        }
}
mongos>  sh.status();
--- Sharding Status --- 
  sharding version: {
        "_id" : 1,
        "minCompatibleVersion" : 5,
        "currentVersion" : 6,
        "clusterId" : ObjectId("600559990c4072b92c72da2f")
  }
  shards:
        {  "_id" : "share1",  "host" : "share1/127.0.0.1:21000,127.0.0.1:21001,127.0.0.1:21002",  "state" : 1 }
        {  "_id" : "share2",  "host" : "share2/127.0.0.1:21005,127.0.0.1:21006,127.0.0.1:21007",  "state" : 1 }
  active mongoses:
        "4.4.3" : 1
  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" : "config",  "primary" : "config",  "partitioned" : true }
mongos> 
           
rs.isMaster();   #  檢視目前是否是主節點      

5)實驗

修改塊的大小友善測試     預設是64MB,取值範圍是1 MB 到 1024 MB.

mongos> use config
switched to db config
mongos> db.settings.save({"_id":"chunksize","value":1})   //設定塊大小為1M是友善實驗,不然就需要插入海量資料
WriteResult({ "nMatched" : 0, "nUpserted" : 1, "nModified" : 0, "_id" : "chunksize" })
           

建立一個mydb資料庫  并建立一個集合為user 并插入資料啟用分片

use mydb;
mongos> for(i=1;i<=50000;i++){db.user.insert({"id":i,"name":"jack"+i})} //插入資料
mongos> sh.enableSharding("mydb");//給mydb資料庫開啟分片
{
        "ok" : 1,
        "operationTime" : Timestamp(1610966409, 3),
        "$clusterTime" : {
                "clusterTime" : Timestamp(1610966409, 4),
                "signature" : {
                        "hash" : BinData(0,"AAAAAAAAAAAAAAAAAAAAAAAAAAA="),
                        "keyId" : NumberLong(0)
                }
        }
}

mongos>db.user.createIndex({"id":1})   //給id添加索引

mongos>  sh.shardCollection("mydb.user",{"id":1})

mongos> sh.shardCollection("mydb.user",{"id":1});//以id為片鍵将user集合分片
{
        "collectionsharded" : "mydb.user",
        "collectionUUID" : UUID("66006f80-67a4-4dc4-8913-38d5d2274256"),
        "ok" : 1,
        "operationTime" : Timestamp(1610967475, 5),
        "$clusterTime" : {
                "clusterTime" : Timestamp(1610967475, 5),
                "signature" : {
                        "hash" : BinData(0,"AAAAAAAAAAAAAAAAAAAAAAAAAAA="),
                        "keyId" : NumberLong(0)
                }
        }
}
mongos> 
           

檢視分片狀态

mongos> sh.status();
--- Sharding Status --- 
  sharding version: {
        "_id" : 1,
        "minCompatibleVersion" : 5,
        "currentVersion" : 6,
        "clusterId" : ObjectId("600559990c4072b92c72da2f")
  }
  shards:
        {  "_id" : "share1",  "host" : "share1/127.0.0.1:21000,127.0.0.1:21001,127.0.0.1:21002",  "state" : 1 }
        {  "_id" : "share2",  "host" : "share2/127.0.0.1:21005,127.0.0.1:21006,127.0.0.1:21007",  "state" : 1 }
  active mongoses:
        "4.4.3" : 1
  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: 
                514 : Success
  databases:
        {  "_id" : "config",  "primary" : "config",  "partitioned" : true }
                config.system.sessions
                        shard key: { "_id" : 1 }
                        unique: false
                        balancing: true
                        chunks:
                                share1  512
                                share2  512
                        too many chunks to print, use verbose if you want to force print
        {  "_id" : "mydb",  "primary" : "share2",  "partitioned" : true,  "version" : {  "uuid" : UUID("99f1c4c0-5440-4971-9767-12df46b379bc"),  "lastMod" : 1 } }
                mydb.user
                        shard key: { "id" : 1 }
                        unique: false
                        balancing: true
                        chunks:
                                share1  2
                                share2  2
                        { "id" : { "$minKey" : 1 } } -->> { "id" : 2 } on : share1 Timestamp(2, 0) 
                        { "id" : 2 } -->> { "id" : 20604 } on : share2 Timestamp(3, 1) 
                        { "id" : 20604 } -->> { "id" : 31010 } on : share2 Timestamp(2, 2) 
                        { "id" : 31010 } -->> { "id" : { "$maxKey" : 1 } } on : share1 Timestamp(3, 0) 
mongos> 
           

此時如果你有share3 并将其sh.shard(xxx)伺服器又對資料進行重新分片,當你再次移除一個分片伺服器,此時又會對資料再次進行分片處理,MongoDB對資料的處理非常靈活

最終驗證:

結果 确實資料分片了 而且每個分片的副本集資料一緻

即 21000、21002、21003 資料量一緻

21005、21006、21007資料量一緻

share1+share2=總數

參考:https://www.imooc.com/article/277085?block_id=tuijian_wz

https://blog.51cto.com/13643643/2148825#h10

https://www.jianshu.com/p/918afbb6a8c5

https://www.jianshu.com/p/b5a7d13e1391

https://blog.51cto.com/13728740/2175905    //mongo的一些複制集實操