搭建 MongoDB分片(sharding) / 分區 / 集羣環境

1. 安裝 MongoDB

三臺機器html

關閉防火牆node

systemctl stop firewalld.service 
複製代碼
192.168.252.121 192.168.252.122 192.168.252.123
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 主節點

端口分配:linux

mongos:20000
config:21000
shard1:27001
shard2:27002
shard3:27003
複製代碼

下載而且安裝mongodb

wget https://fastdl.mongodb.org/linux/mongodb-linux-x86_64-amazon-3.6.2.tgz
tar -xzvf mongodb-linux-x86_64-amazon-3.6.2.tgz  -C /usr/local/
複製代碼

全部版本二進制文件,自行下載數據庫

https://www.mongodb.org/dl/win32/x86_64-2008plus-ssl?_ga=2.87139544.1567998244.1517190032-1153843332.1517190032&_gac=1.204211492.1517212002.EAIaIQobChMI44v9_9b82AIV1AcqCh0lcABIEAAYASAAEgKI1_D_BwE
複製代碼

更名ubuntu

cd /usr/local/
mv  mongodb-linux-x86_64-amazon-3.6.2 mongodb
複製代碼

分別在每臺機器創建conf、mongos、config、shard一、shard二、shard3六個目錄,由於mongos不存儲數據,只須要創建日誌文件目錄便可。centos

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
複製代碼

配置環境變量bash

vi /etc/profile
# MongoDB 環境變量內容
export MONGODB_HOME=/usr/local/mongodb
export PATH=$MONGODB_HOME/bin:$PATH
複製代碼

使當即生效服務器

source /etc/profile
複製代碼

2. config server配置服務器

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

(三臺機器)添加配置文件

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
複製代碼

登陸任意一臺配置服務器,初始化配置副本集

鏈接 MongoDB

mongo --port 21000
複製代碼

config 變量

config = {
	_id : "configs",
	members : [
	{_id : 0, host : "192.168.252.121:21000" },
	{_id : 1, host : "192.168.252.122:21000" },
	{_id : 2, host : "192.168.252.123:21000" }
	]
}
複製代碼

初始化副本集

rs.initiate(config)
複製代碼

其中,"_id" : "configs"應與配置文件中配置的 replicaction.replSetName 一致,"members" 中的 "host" 爲三個節點的 ip 和 port

響應內容以下

> config = {
... _id : "configs",
... members : [
... {_id : 0, host : "192.168.252.121:21000" },
... {_id : 1, host : "192.168.252.122:21000" },
... {_id : 2, host : "192.168.252.123:21000" }
... ]
... }
{
	"_id" : "configs",
	"members" : [
		{
			"_id" : 0,
			"host" : "192.168.252.121:21000"
		},
		{
			"_id" : 1,
			"host" : "192.168.252.122:21000"
		},
		{
			"_id" : 2,
			"host" : "192.168.252.123:21000"
		}
	]
}
> rs.initiate(config);
{
	"ok" : 1,
	"operationTime" : Timestamp(1517369899, 1),
	"$gleStats" : {
		"lastOpTime" : Timestamp(1517369899, 1),
		"electionId" : ObjectId("000000000000000000000000")
	},
	"$clusterTime" : {
		"clusterTime" : Timestamp(1517369899, 1),
		"signature" : {
			"hash" : BinData(0,"AAAAAAAAAAAAAAAAAAAAAAAAAAA="),
			"keyId" : NumberLong(0)
		}
	}
}
configs:SECONDARY>
複製代碼

此時會發現終端上的輸出已經有了變化。

//從單個一個
>
//變成了
configs:SECONDARY>
複製代碼

查詢狀態

configs:SECONDARY> rs.status()
複製代碼

3. 配置分片副本集

3.1 設置第一個分片副本集

(三臺機器)設置第一個分片副本集

配置文件

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
 
#副本集名稱
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
複製代碼

登錄任意一臺服務器,初始化副本集(除了192.168.252.123)

鏈接 MongoDB

mongo --port 27001
複製代碼

使用admin數據庫

use admin
複製代碼

定義副本集配置

config = {
    _id : "shard1",
     members : [
         {_id : 0, host : "192.168.252.121:27001" },
         {_id : 1, host : "192.168.252.122:27001" },
         {_id : 2, host : "192.168.252.123:27001" , arbiterOnly: true }
     ]
 }
複製代碼

初始化副本集配置

rs.initiate(config)
複製代碼

響應內容以下

> use admin
switched to db admin
> config = {
...     _id : "shard1",
...      members : [
...          {_id : 0, host : "192.168.252.121:27001" },
...          {_id : 1, host : "192.168.252.122:27001" },
...          {_id : 2, host : "192.168.252.123:27001" , arbiterOnly: true }
...      ]
...  }
{
	"_id" : "shard1",
	"members" : [
		{
			"_id" : 0,
			"host" : "192.168.252.121:27001"
		},
		{
			"_id" : 1,
			"host" : "192.168.252.122:27001"
		},
		{
			"_id" : 2,
			"host" : "192.168.252.123:27001",
			"arbiterOnly" : true
		}
	]
}
> rs.initiate(config)
{ "ok" : 1 }
複製代碼

此時會發現終端上的輸出已經有了變化。

//從單個一個
>
//變成了
shard1:SECONDARY>
複製代碼

查詢狀態

shard1:SECONDARY> rs.status()
複製代碼

3.2 設置第二個分片副本集

設置第二個分片副本集

配置文件

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
 
#副本集名稱
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
複製代碼

鏈接 MongoDB

mongo --port 27002
複製代碼

使用admin數據庫

use admin
複製代碼

定義副本集配置

config = {
    _id : "shard2",
     members : [
         {_id : 0, host : "192.168.252.121:27002"  , arbiterOnly: true },
         {_id : 1, host : "192.168.252.122:27002" },
         {_id : 2, host : "192.168.252.123:27002" }
     ]
 }
複製代碼

初始化副本集配置

rs.initiate(config)
複製代碼

響應內容以下

> use admin
switched to db admin
> config = {
...     _id : "shard2",
...      members : [
...          {_id : 0, host : "192.168.252.121:27002"  , arbiterOnly: true },
...          {_id : 1, host : "192.168.252.122:27002" },
...          {_id : 2, host : "192.168.252.123:27002" }
...      ]
...  }
{
	"_id" : "shard2",
	"members" : [
		{
			"_id" : 0,
			"host" : "192.168.252.121:27002",
			"arbiterOnly" : true
		},
		{
			"_id" : 1,
			"host" : "192.168.252.122:27002"
		},
		{
			"_id" : 2,
			"host" : "192.168.252.123:27002"
		}
	]
}
> rs.initiate(config)
{ "ok" : 1 }
shard2:SECONDARY> rs.status()
複製代碼

3.3 設置第三個分片副本集

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

#副本集名稱
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
複製代碼

登錄任意一臺服務器,初始化副本集(除了192.168.252.121)

mongo --port 27003
複製代碼

使用admin數據庫

use admin
複製代碼

定義副本集配置

config = {
    _id : "shard3",
     members : [
         {_id : 0, host : "192.168.252.121:27003" },
         {_id : 1, host : "192.168.252.122:27003" , arbiterOnly: true},
         {_id : 2, host : "192.168.252.123:27003" }
     ]
 }
複製代碼

初始化副本集配置

rs.initiate(config)
複製代碼

響應內容以下

> use admin
switched to db admin
> config = {
...     _id : "shard3",
...      members : [
...          {_id : 0, host : "192.168.252.121:27003" },
...          {_id : 1, host : "192.168.252.122:27003" , arbiterOnly: true},
...          {_id : 2, host : "192.168.252.123:27003" }
...      ]
...  }
{
	"_id" : "shard3",
	"members" : [
		{
			"_id" : 0,
			"host" : "192.168.252.121:27003"
		},
		{
			"_id" : 1,
			"host" : "192.168.252.122:27003",
			"arbiterOnly" : true
		},
		{
			"_id" : 2,
			"host" : "192.168.252.123:27003"
		}
	]
}
> rs.initiate(config)
{ "ok" : 1 }
shard3:SECONDARY> rs.status()
複製代碼

3.4 配置路由服務器 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.252.121:21000,192.168.252.122:21000,192.168.252.123:21000
 
#設置最大鏈接數
maxConns = 20000
複製代碼

啓動三臺服務器的mongos server

mongos -f /usr/local/mongodb/conf/mongos.conf
複製代碼

4. 串聯路由服務器

目前搭建了mongodb配置服務器、路由服務器,各個分片服務器,不過應用程序鏈接到mongos路由服務器並不能使用分片機制,還須要在程序裏設置分片配置,讓分片生效。

登錄任意一臺mongos

mongo --port 20000
複製代碼

使用admin數據庫

use  admin
複製代碼

串聯路由服務器與分配副本集

sh.addShard("shard1/192.168.252.121:27001,192.168.252.122:27001,192.168.252.123:27001");
sh.addShard("shard2/192.168.252.121:27002,192.168.252.122:27002,192.168.252.123:27002");
sh.addShard("shard3/192.168.252.121:27003,192.168.252.122:27003,192.168.252.123:27003");
複製代碼

查看集羣狀態

sh.status()
複製代碼

響應內容以下

mongos> sh.status()
--- Sharding Status --- 
  sharding version: {
  	"_id" : 1,
  	"minCompatibleVersion" : 5,
  	"currentVersion" : 6,
  	"clusterId" : ObjectId("5a713a37d56e076f3eb47acf")
  }
  shards:
        {  "_id" : "shard1",  "host" : "shard1/192.168.252.121:27001,192.168.252.122:27001",  "state" : 1 }
        {  "_id" : "shard2",  "host" : "shard2/192.168.252.122:27002,192.168.252.123:27002",  "state" : 1 }
        {  "_id" : "shard3",  "host" : "shard3/192.168.252.121:27003,192.168.252.123:27003",  "state" : 1 }
  active mongoses:
        "3.6.2" : 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" : "config",  "primary" : "config",  "partitioned" : true }

mongos> 
複製代碼

5. 啓用集合分片生效

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

登錄任意一臺mongos

mongo --port 20000
複製代碼

使用admin數據庫

use  admin
複製代碼

指定testdb分片生效

db.runCommand( { enablesharding :"testdb"});
複製代碼

指定數據庫裏須要分片的集合和片鍵,哈希id 分片

db.runCommand( { shardcollection : "testdb.table1",key : {"id": "hashed"} } );
複製代碼

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

測試分片配置結果

鏈接 MongoDB 路由服務

mongo  127.0.0.1:20000
複製代碼

切換到 testdb 數據庫

use  testdb;
複製代碼

插入測試數據

for(i=1;i<=100000;i++){db.table1.insert({"id":i,"name":"penglei"})};
複製代碼

總條數

db.table1.aggregate([{$group : {_id : "$name", totle : {$sum : 1}}}])
複製代碼

查看分片狀況以下

  • shard1: "count": 33755
  • shard2: "count": 33143,
  • shard3: "count": 33102

結論數據基本均勻

db.table1.stats();
複製代碼
mongos> db.table1.stats();
{
    "sharded": true,
    "capped": false,
    "ns": "testdb.table1",
    "count": 100000,
    "size": 5200000,
    "storageSize": 1519616,
    "totalIndexSize": 3530752,
    "indexSizes": {
        "_id_": 892928,
        "id_hashed": 2637824
    },
    "avgObjSize": 52,
    "nindexes": 2,
    "nchunks": 6,
    "shards": {
        "shard1": {
            "ns": "testdb.table1",
            "size": 1755260,
            "count": 33755,
            "avgObjSize": 52,
            "storageSize": 532480,
            "capped": false,
            "wiredTiger": {
			...省略不少
            }
        },
        "shard2": {
            "ns": "testdb.table1",
            "size": 1723436,
            "count": 33143,
            "avgObjSize": 52,
            "storageSize": 479232,
            "capped": false,
            "wiredTiger": {
			...省略不少
            }
        },
        "shard3": {
            "ns": "testdb.table1",
            "size": 1721304,
            "count": 33102,
            "avgObjSize": 52,
            "storageSize": 507904,
            "capped": false,
            "wiredTiger": {
			...省略不少
            }
        }
    },
    "ok": 1,
    "$clusterTime": {
        "clusterTime": Timestamp(1517488062, 350),
        "signature": {
            "hash": BinData(0, "AAAAAAAAAAAAAAAAAAAAAAAAAAA="),
            "keyId": NumberLong(0)
        }
    },
    "operationTime": Timestamp(1517488062, 350)
}
mongos> 
複製代碼

分組查看總數量是:100000

mongos> db.table1.aggregate([{$group : {_id : "$name", totle : {$sum : 1}}}])
{ "_id" : "penglei", "totle" : 100000 }
mongos>
複製代碼

後期運維

參考

手把手教你 MongoDB 的安裝與詳細使用(一)

www.ymq.io/2018/01/26/…

手把手教你 MongoDB 的安裝與詳細使用(二)

www.ymq.io/2018/01/29/…

建立索引

db.table1.createIndex({"name":1})
db.table1.getIndexes()
複製代碼

啓動

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
mongos -f /usr/local/mongodb/conf/mongos.conf
複製代碼

啓動報錯

about to fork child process, waiting until server is ready for connections.
forked process: 1303
child process started successfully, parent exiting
[root@node1 ~]# mongod -f /usr/local/mongodb/conf/shard1.conf
about to fork child process, waiting until server is ready for connections.
forked process: 1384
複製代碼

刪除 mongod.lock

cd /usr/local/mongodb/shard1/data
rm -rf mongod.lock
複製代碼

關閉防火牆(不關防火牆也會遇到這樣的問題)

systemctl stop firewalld.service 
複製代碼

關閉

#debian、ubuntu系統下:

apt-get install psmisc

#centos或、rhel系統下:

yum install psmisc
複製代碼

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

killall mongod
killall mongos
複製代碼

參考:

mongodb 3.4 集羣搭建:分片+副本集 www.ityouknow.com/mongodb/201…

Runoob 教程:http://www.runoob.com/mongodb/mongodb-tutorial.html
Tutorials 教程:Pointhttps://www.tutorialspoint.com/mongodb/mongodb_advantages.htm
MongoDB 官網地址:https://www.mongodb.com
MongoDB 官方英文文檔:https://docs.mongodb.com/manual
MongoDB 各平臺下載地址:https://www.mongodb.com/download-center#community
MongoDB 安裝 https://docs.mongodb.com/manual/tutorial/install-mongodb-enterprise-on-ubuntu

Contact

關注公衆號-搜雲庫
搜雲庫
相關文章
相關標籤/搜索