純潔的微笑 2017-09-21 原文html
最新版mongodb推薦使用yaml語法來作配置,另一些舊的配置在最新版本中已經不在生效,因此咱們在生產實際搭建mongodb集羣的時候作了一些改進。若是你們不熟悉什麼是分片、副本集、仲裁者的話請先移步查看上一篇文章:mongodb 3.4 集羣搭建:分片+副本集node
和前一個版本相比,改動點有:linux
系統系統 centos6.9
五臺服務器:192.168.0.31/32/33/34/35
安裝包: mongodb-linux-x86_64-3.4.6.tgzgit
服務器規劃github
服務器31 | 服務器32 | 服務器33 | 服務器34 | 服務器35 |
---|---|---|---|---|
mongos server | mongos server | config server | config server | config server |
shard1 server | shard2 server | shard3 server | shard4 server | shard5 server |
shard5 server | shard1 server | shard2 server | shard3 server | shard4 server |
shard4 server | shard5 server | shard1 server | shard2 server | shard3 server |
端口分配:mongodb
mongos:20000
config:21000
shard1:27001
shard2:27002
shard3:27003
shard4:27004
shard5:27005
權限分配:數據庫
登陸root帳戶,將安裝目錄和數據目錄權限分配給平常操做(youknow)帳戶vim
chown -R youknow:youknow /usr/local/
chown -R youknow:youknow /data
下載 mongodb 3.4.6 安裝包centos
curl -O https://fastdl.mongodb.org/linux/mongodb-linux-x86_64-3.4.6.tgz
#解壓
tar -xzvf mongodb-linux-x86_64-3.4.6.tgz -C /usr/local/
#更名
mv mongodb-linux-x86_64-3.4.6 mongodb
根據服務器的規範,分別在對應的服務器上創建conf、mongos、config、shard一、shard二、shard三、shard四、shard5等目錄,由於mongos不存儲數據,只須要創建日誌文件目錄便可。安全
mkdir -p /usr/local/mongodb/conf
mkdir -p /data/mongos/log
mkdir -p /data/config/data
mkdir -p /data/config/log
mkdir -p /data/shard1/data
mkdir -p /data/shard1/log
mkdir -p /data/shard2/data
mkdir -p /data/shard2/log
mkdir -p /data/shard3/data
mkdir -p /data/shard3/log
mkdir -p /data/shard4/data
mkdir -p /data/shard4/log
mkdir -p /data/shard5/data
mkdir -p /data/shard5/log
爲了後續方便操做,配置mongodb的環境變量,須要切到root用戶下面
vim /etc/profile
# 內容
export MONGODB_HOME=/usr/local/mongodb
export PATH=$MONGODB_HOME/bin:$PATH
# 使當即生效,在安裝用戶下(youknow)執行
source /etc/profile
查看mongodb版本信息mongod -v
輸出版本信息代表配置環境變量成功
在服務器3三、3四、35上配置如下內容:
添加配置文件:
添加配置文件
vi /usr/local/mongodb/conf/config.conf
## content
systemLog:
destination: file
logAppend: true
path: /data/config/log/config.log
# Where and how to store data.
storage:
dbPath: /data/config/data
journal:
enabled: true
# how the process runs
processManagement:
fork: true
pidFilePath: /data/config/log/configsrv.pid
# network interfaces
net:
port: 21000
bindIp: 192.168.0.33
#operationProfiling:
replication:
replSetName: config
sharding:
clusterRole: configsvr
啓動三臺服務器的config server
numactl --interleave=all mongod --config /usr/local/mongodb/conf/config.conf
登陸任意一臺配置服務器,初始化配置副本集
#鏈接
mongo 192.168.0.33:21000
#config變量
config = {
... _id : "config",
... members : [
... {_id : 0, host : "192.168.0.33:21000" },
... {_id : 1, host : "192.168.0.34:21000" },
... {_id : 2, host : "192.168.0.35:21000" }
... ]
... }
#初始化副本集
rs.initiate(config)
#查看分區狀態
rs.status();
其中,"_id" : "configs"應與配置文件中配置的 replicaction.replSetName 一致,"members" 中的 "host" 爲三個節點的ip和port
這樣配置服務器就配置好了
在服務器 3一、3二、33上面作如下配置
配置文件
vi /usr/local/mongodb/conf/shard1.conf
#配置文件內容
# where to write logging data.
systemLog:
destination: file
logAppend: true
path: /data/shard1/log/shard1.log
# Where and how to store data.
storage:
dbPath: /data/shard1/data
journal:
enabled: true
wiredTiger:
engineConfig:
cacheSizeGB: 20
# how the process runs
processManagement:
fork: true
pidFilePath: /data/shard1/log/shard1.pid
# network interfaces
net:
port: 27001
bindIp: 192.168.0.33
#operationProfiling:
replication:
replSetName: shard1
sharding:
clusterRole: shardsvr
啓動三臺服務器的shard1 server
numactl --interleave=all mongod --config /usr/local/mongodb/conf/shard1.conf
登錄任意一臺服務器,初始化副本集
mongo 192.168.0.31:27001
#使用admin數據庫
use admin
#定義副本集配置
config = {
... _id : "shard1",
... members : [
... {_id : 0, host : "192.168.0.31:27001" },
... {_id : 1, host : "192.168.0.32:27001" },
... {_id : 2, host : "192.168.0.33:27001" }
... ]
... }
#初始化副本集配置
rs.initiate(config);
#查看分區狀態
rs.status();
在服務器3二、3三、34上面作如下配置
配置文件
vi /usr/local/mongodb/conf/shard2.conf
#配置文件內容
# where to write logging data.
systemLog:
destination: file
logAppend: true
path: /data/shard2/log/shard2.log
# Where and how to store data.
storage:
dbPath: /data/shard2/data
journal:
enabled: true
wiredTiger:
engineConfig:
cacheSizeGB: 20
# how the process runs
processManagement:
fork: true
pidFilePath: /data/shard2/log/shard2.pid
# network interfaces
net:
port: 27002
bindIp: 192.168.0.33
#operationProfiling:
replication:
replSetName: shard2
sharding:
clusterRole: shardsvr
啓動三臺服務器的shard2 server
numactl --interleave=all mongod --config /usr/local/mongodb/conf/shard2.conf
登錄任意一臺服務器,初始化副本集
mongo 192.168.0.32:27002
#使用admin數據庫
use admin
#定義副本集配置
config = {
... _id : "shard2",
... members : [
... {_id : 0, host : "192.168.0.32:27002" },
... {_id : 1, host : "192.168.0.33:27002" },
... {_id : 2, host : "192.168.0.34:27002" }
... ]
... }
#初始化副本集配置
rs.initiate(config);
#查看分區狀態
rs.status();
在服務器3三、3四、35上面作如下配置
配置文件
vi /usr/local/mongodb/conf/shard3.conf
#配置文件內容
# where to write logging data.
systemLog:
destination: file
logAppend: true
path: /data/shard3/log/shard3.log
# Where and how to store data.
storage:
dbPath: /data/shard3/data
journal:
enabled: true
wiredTiger:
engineConfig:
cacheSizeGB: 20
# how the process runs
processManagement:
fork: true
pidFilePath: /data/shard3/log/shard3.pid
# network interfaces
net:
port: 27003
bindIp: 192.168.0.33
#operationProfiling:
replication:
replSetName: shard3
sharding:
clusterRole: shardsvr
啓動三臺服務器的shard3 server
numactl --interleave=all mongod --config /usr/local/mongodb/conf/shard3.conf
登錄任意一臺服務器,初始化副本集
mongo 192.168.0.33:27003
#使用admin數據庫
use admin
#定義副本集配置
config = {
... _id : "shard3",
... members : [
... {_id : 0, host : "192.168.0.33:27003" },
... {_id : 1, host : "192.168.0.34:27003" },
... {_id : 2, host : "192.168.0.35:27003" }
... ]
... }
#初始化副本集配置
rs.initiate(config);
#查看分區狀態
rs.status();
在服務器3四、3五、31上面作如下配置
配置文件
vi /usr/local/mongodb/conf/shard4.conf
#配置文件內容
# where to write logging data.
systemLog:
destination: file
logAppend: true
path: /data/shard4/log/shard4.log
# Where and how to store data.
storage:
dbPath: /data/shard4/data
journal:
enabled: true
wiredTiger:
engineConfig:
cacheSizeGB: 20
# how the process runs
processManagement:
fork: true
pidFilePath: /data/shard4/log/shard4.pid
# network interfaces
net:
port: 27004
bindIp: 192.168.0.35
#operationProfiling:
replication:
replSetName: shard4
sharding:
clusterRole: shardsvr
啓動三臺服務器的shard4 server
numactl --interleave=all mongod --config /usr/local/mongodb/conf/shard4.conf
登錄任意一臺服務器,初始化副本集
mongo 192.168.0.34:27004
#使用admin數據庫
use admin
#定義副本集配置
config = {
... _id : "shard4",
... members : [
... {_id : 0, host : "192.168.0.34:27004" },
... {_id : 1, host : "192.168.0.35:27004" },
... {_id : 2, host : "192.168.0.31:27004" }
... ]
... }
#初始化副本集配置
rs.initiate(config);
#查看分區狀態
rs.status();
在服務器3五、3一、32上面作如下配置
配置文件
vi /usr/local/mongodb/conf/shard5.conf
#配置文件內容
# where to write logging data.
systemLog:
destination: file
logAppend: true
path: /data/shard5/log/shard5.log
# Where and how to store data.
storage:
dbPath: /data/shard5/data
journal:
enabled: true
wiredTiger:
engineConfig:
cacheSizeGB: 20
# how the process runs
processManagement:
fork: true
pidFilePath: /data/shard5/log/shard5.pid
# network interfaces
net:
port: 27005
bindIp: 192.168.0.35
#operationProfiling:
replication:
replSetName: shard5
sharding:
clusterRole: shardsvr
啓動三臺服務器的shard5 server
numactl --interleave=all mongod --config /usr/local/mongodb/conf/shard5.conf
登錄任意一臺服務器,初始化副本集
mongo 192.168.0.35:27005
#使用admin數據庫
use admin
#定義副本集配置
config = {
... _id : "shard5",
... members : [
... {_id : 0, host : "192.168.0.35:27005" },
... {_id : 1, host : "192.168.0.31:27005" },
... {_id : 2, host : "192.168.0.32:27005" }
... ]
... }
#初始化副本集配置
rs.initiate(config);
#查看分區狀態
rs.status();
至此,五個分片和副本集搭建完畢
如下配置在服務器3一、32上執行
注意:先啓動配置服務器和分片服務器,後啓動路由實例
vi /usr/local/mongodb/conf/mongos.conf
systemLog:
destination: file
logAppend: true
path: /data/mongos/log/mongos.log
processManagement:
fork: true
# pidFilePath: /usr/local/mongodb/mongos.pid
# network interfaces
net:
port: 20000
bindIp: 192.168.0.31
#監聽的配置服務器,只能有1個或者3個 configs爲配置服務器的副本集名字
sharding:
configDB: configs/192.168.0.33:21000,192.168.0.34:21000,192.168.0.35:21000
啓動二臺服務器的mongos server
mongos --config /usr/local/mongodb/conf/mongos.conf
目前搭建了mongodb配置服務器、路由服務器,各個分片服務器,不過應用程序鏈接到mongos路由服務器並不能使用分片機制,還須要在程序裏設置分片配置,讓分片生效。
登錄任意一臺mongos
mongo 192.168.0.31:20000
#使用admin數據庫
use admin
#串聯路由服務器與分配副本集
sh.addShard("shard1/192.168.0.31:27001,192.168.0.32:27001,192.168.0.33:27001")
sh.addShard("shard2/192.168.0.32:27002,192.168.0.33:27002,192.168.0.34:27002")
sh.addShard("shard3/192.168.0.33:27003,192.168.0.34:27003,192.168.0.35:27003")
sh.addShard("shard4/192.168.0.34:27004,192.168.0.35:27004,192.168.0.31:27004")
sh.addShard("shard5/192.168.0.35:27005,192.168.0.31:27005,192.168.0.32:27005")
#查看集羣狀態
sh.status()
這樣mongodb的五臺集羣搭建就已經完成了,後期如何優化和運營請查看下一篇文章。
執行 rs.initiate(config); 報錯:
rs.initiate(config);
{
"ok" : 0,
"errmsg" : "No host described in new configuration 1 for replica set shard1 maps to this node",
"code" : 93,
"codeName" : "InvalidReplicaSetConfig"
}
最後發現是本身的一個端口號寫錯了。
啓動mongos的時候報錯:
about to fork child process, waiting until server is ready for connections.
forked process: 1436
ERROR: child process failed, exited with error number 1
這個問題卡了咱們半天,找了不少的資料,不是說清理lock文件,就是說清理log文件總無解,最後看到這個網站的提示
ERROR: child process failed, exited with error number 1
去掉了配置文件中 --fork,纔將真正的錯誤日誌打印了出來,是咱們的配置文件中的路徑寫錯了,原本是log寫成了logs
原來:path: /data/logs/mongos.log
改成:path: /data/log/mongos.log
成功
爲了方便你們拿取配置文件,我在github上面放置了一份:mongodb-five-cluster-conf