環境準備
系統系統 centos 7.4
三臺服務器:
node1(192.168.80.100)
node2(192.168.80.101)
node3(192.168.80.102)
安裝包:yum安裝
服務器規劃
服務器node1(192.168.80.100) | 服務器node2(192.168.80.101) | 服務器node3(192.168.80.102) |
---|---|---|
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 主節點 |
每一臺mongodb服務器端口分配:
mongos:20000
config:21000
shard1:27001
shard2:27002
shard3:27003
1、關閉防火牆和SElinux
systemctl stop firewalld
setenforce 0
2、配置MongoDB的yum源:
[mongodb-org-4.0]
name=MongoDB Repository
baseurl=https://repo.mongodb.org/yum/redhat/$releasever/mongodb-org/4.0/x86_64/
gpgcheck=1
enabled=1
gpgkey=https://www.mongodb.org/static/pgp/server-4.0.asc
3、安裝MongoDB:
yum install -y mongodb-org
4、路徑規劃並創建(三臺服務器都要操作)
分別在每臺機器建立conf、mongos、config、shard1、shard2、shard3目錄,因爲mongos不存儲數據,只需要建立日誌文件目錄即可,日誌文件創建完成之後還需要給予權限。
mkdir -p /data/mongodb/logs/ #日誌文件路徑
mkdir /etc/mongodb/ #配置文件路徑
mkdir /data/mongodb/config/ #config server數據存儲路徑
mkdir /data/mongodb/shard{1,2,3} #shard server數據存儲路徑
touch /data/mongodb/logs/shard{1,2,3}.log #shard server日誌文件
touch /data/mongodb/logs/mongos.log #mongos日誌文件
touch /data/mongodb/logs/config.log #config server日誌文件
chmod 777 /data/mongodb/logs/*.log #授權所有日誌文件都可以寫入
ll /data/mongodb/logs/
5、config server配置服務器
mongodb3.4以後要求配置服務器也創建副本集,不然集羣搭建不成功。
(1)、添加配置文件
cp -p /etc/mongod.conf /etc/mongodb/config.conf
vi /etc/mongodb/config.conf
修改後內容如下:
systemLog:
destination: file
logAppend: true
path: /data/mongodb/logs/config.log
storage:
dbPath: /data/mongodb/config/
journal:
enabled: true
processManagement:
fork: true
pidFilePath: /data/mongodb/logs/config.pid
timeZoneInfo: /usr/share/zoneinfo
net:
port: 21000
bindIp: 0.0.0.0
maxIncomingConnections: 20000
replication:
replSetName: configs
sharding:
clusterRole: configsvr
(2)將配置完的配置文件發送到其它服務器上
scp /etc/mongodb/config.conf [email protected]:/etc/mongodb/
scp /etc/mongodb/config.conf [email protected]:/etc/mongodb/
(3)三臺服務器啓動config實例:
mongod -f /etc/mongodb/config.conf
(4)、配置複製集(任意一臺操作即可,建議三臺服務器都進入數據庫,方便查看角色變更)
mongo 127.0.0.1:21000
config={_id:"configs",members:[
{_id:0,host:"192.168.80.100:21000"},
{_id:1,host:"192.168.80.101:21000"},
{_id:2,host:"192.168.80.102:21000"}]} #創建複製集
rs.initiate(config) #初始化複製集
config server服務到此完成。
7、部署shard1分片服務器
(1)、創建配置文件
cp -p /etc/mongod.conf /etc/mongodb/shard1.conf
vi /etc/mongodb/shard1.conf
修改後的內容如下:
systemLog:
destination: file
logAppend: true
path: /data/mongodb/logs/shard1.log
storage:
dbPath: /data/mongodb/shard1/
journal:
enabled: true
processManagement:
fork: true
pidFilePath: /data/mongodb/logs/shard1.pid
timeZoneInfo: /usr/share/zoneinfo
net:
port: 27001
bindIp: 0.0.0.0
maxIncomingConnections: 20000
replication:
replSetName: shard1
sharding:
clusterRole: shardsvr
(2)將配置完的配置文件發送到其它服務器上
scp /etc/mongodb/shard1.conf [email protected]:/etc/mongodb/
scp /etc/mongodb/shard1.conf [email protected]:/etc/mongodb/
(3)啓動實例shard1(三臺都操作)
mongod -f /etc/mongodb/shard1.conf
(4)登陸任意一臺非仲裁節點服務器,初始化副本集
mongo 127.0.0.1:27001
#使用admin數據庫
use admin
#定義副本集配置,第三個節點的 "arbiterOnly":true 代表其爲仲裁節點。
config = {
_id : "shard1",
members : [
{_id : 1, host : "192.168.80.100:27001" , priority:100},
{_id : 2, host : "192.168.80.101:27001" , priority:90},
{_id : 3, host : "192.168.80.102:27001" , arbiterOnly: true }
]
}
注:不是在任一臺服務器上創建都能成功的,如果選擇在預先設置爲仲裁節點的服務器上創建複製集會報錯
#初始化副本集配置
rs.initiate(config)
8、設置第二個分片副本集
添加配置文件
cp -p /etc/mongod.conf /etc/mongodb/shard2.conf
vi /etc/mongodb/shard2.conf
# 配置文件內容
systemLog:
destination: file
logAppend: true
path: /data/mongodb/logs/shard2.log
storage:
dbPath: /data/mongodb/shard2/
journal:
enabled: true
processManagement:
fork: true
pidFilePath: /data/mongodb/logs/shard2.pid
timeZoneInfo: /usr/share/zoneinfo
net:
port: 27002
bindIp: 0.0.0.0
maxIncomingConnections: 20000
replication:
replSetName: shard2
sharding:
clusterRole: shardsvr
(2)將配置完的配置文件發送到其它服務器上
scp /etc/mongodb/shard2.conf [email protected]:/etc/mongodb/
scp /etc/mongodb/shard2.conf [email protected]:/etc/mongodb/
(3)啓動實例shard2(三臺都操作)
mongod -f /etc/mongodb/shard2.conf
(4)
登陸任意一臺非仲裁節點服務器,初始化副本集在80.102上作這條命令不然不會成功的
mongo 127.0.0.1:27002
#使用admin數據庫
use admin
#定義副本集配置,第一個節點的 "arbiterOnly":true 代表其爲仲裁節點。
config = {
_id : "shard2",
members : [
{_id : 1, host : "192.168.80.100:27002" , arbiterOnly: true },
{_id : 2, host : "192.168.80.101:27002" , priority:2},
{_id : 3, host : "192.168.80.102:27002" , priority:1}
]
}
#初始化副本集配置
rs.initiate(config)
9、設置第三個分片副本集
添加配置文件
cp -p /etc/mongodb/shard2.conf /etc/mongodb/shard3.conf
vi /etc/mongodb/shard3.conf
:% s/2/3/g //把當前文件下的2換成3
記得把端口上的2改回來
## 配置文件內容
systemLog:
destination: file
logAppend: true
path: /data/mongodb/logs/shard3.log
storage:
dbPath: /data/mongodb/shard3/
journal:
enabled: true
processManagement:
fork: true
pidFilePath: /data/monodb/logs/shard3.pid
timeZoneInfo: /usr/share/zoneinfo
net:
port: 27003
bindIp: 0.0.0.0
maxIncomingConnections: 20000
replication:
replSetName: shard3
sharding:
clusterRole: shardsvr
將配置完的配置文件發送到其它服務器上
scp /etc/mongodb/shard3.conf [email protected]:/etc/mongodb/
scp /etc/mongodb/shard3.conf [email protected]:/etc/mongodb/
(3)啓動實例shard3(三臺都操作)
mongod -f /etc/mongodb/shard3.conf
(4)
登陸任意一臺非仲裁節點服務器,初始化副本集
mongo 127.0.0.1:27003
#使用admin數據庫
use admin
#定義副本集配置,第二個節點的 "arbiterOnly":true 代表其爲仲裁節點。
config = {
_id : "shard3",
members : [
{_id : 1, host : "192.168.80.100:27003" , priority:1},
{_id : 2, host : "192.168.80.101:27003" , arbiterOnly: true},
{_id : 3, host : "192.168.80.102:27003" , priority:2}
]
}
#初始化副本集配置
rs.initiate(config)
10、配置路由服務器 mongos
先啓動配置服務器和分片服務器,後啓動路由實例啓動路由實例:(三臺機器)
(1)創建配置文件
cp -p /etc/mongodb/shard2.conf /etc/mongodb/mongos.conf
vi /etc/mongodb/mongos.conf
## 配置文件內容
systemLog:
destination: file
logAppend: true
path: /data/mongodb/logs/mongos.log
processManagement:
fork: true
pidFilePath: /data/mongodb/logs/mongos.pid
timeZoneInfo: /usr/share/zoneinfo
net:
port: 20000
bindIp: 0.0.0.0
maxIncomingConnections=20000
sharding:
configDB: configs/192.168.80.100:21000, 192.168.80.101:21000, 192.168.80.102:21000
#注意監聽的配置服務器,只能有1個或者3個 csReplSet爲配置服務器的副本集名字
(2)將配置文件發送到其他服務器
scp /etc/mongodb/mongos.conf [email protected]:/etc/mongodb/
scp /etc/mongodb/mongos.conf [email protected]:/etc/mongodb/
(3)啓動mongos實例
mongos -f /etc/mongodb/mongos.conf
(4)啓用分片
目前搭建了mongodb配置服務器、路由服務器,各個分片服務器,不過應用程序連接到mongos路由服務器並不能使用分片機制,還需要在程序裏設置分片配置,讓分片生效。
登陸任意一臺mongos
mongo 127.0.0.1:20000
#使用admin數據庫
use admin
#串聯路由服務器與分配副本集
sh.addShard("shard1/192.168.80.100:27001,192.168.80.101:27001,192.168.80.102:27001")
sh.addShard("shard2/192.168.80.100:27002,192.168.80.101:27002,192.168.80.102:27002")
#查看集羣狀態
mongos> sh.status()
11、測試服務器分片功能
目前配置服務、路由服務、分片服務、副本集服務都已經串聯起來了,但我們的目的是希望插入數據,數據能夠自動分片。連接在mongos上,準備讓指定的數據庫、指定的集合分片生效。
mongo 127.0.0.1:20000
(1)設置分片chunk大小
mongos> use config
mongos> db.settings.save({"_id":"chunksize","value":1})
//設置塊大小爲1M是方便實驗,不然就需要插入海量數據才能分片
(2)模擬寫入數據
use python
show collections
for(i=1;i<=50000;i++){db.user.insert({"id":i,"name":"jack"+i})}
//在python庫的user表中循環寫入五萬條數據
db.user.find() //查看內容
(3)啓用數據分片
sh.enableSharding("python")
//數據庫分片就有針對性,可以自定義需要分片的庫或者表,畢竟也不是所有數據都是需要分片操作的
(4)爲表創建的索引
創建索引的規則是不能一致性太高,要具有唯一性,例如序號,比如性別這一類重複性太高的就不適合做索引
mongos> db.user.createIndex({"id":1}) //以”id“爲索引
(5)啓用表分片
mongos> sh.shardCollection("python.user",{"id":1})
(6)查看分片情況
mongos> sh.status()
(7)手動添加分片服務器,查看分片情況是否發生變化
use admin
sh.addShard("shard3/192.168.80.100:27003,192.168.80.101:27003,192.168.80.102:27003")
sh.status()
服務器又對數據進行重新分片,當你再次移除一個分片服務器,此時又會對數據再次進行分片處理,MongoDB對數據的處理非常靈活
小結:
config server 複製集configs 分片:configsvr
存儲節點:
shard1 複製集:shard1 ,分片:shardsvr
shard2 複製集:shard2 ,分片:shardsvr
shard3 複製集:shard3,分片:shardsvr
mongos,路由選擇功能
不可以存放數據,只能去連接各種節點