1 MongoDB简介
MongoDB 是一个文档数据库,旨在简化开发和扩展。 MongoDB 中的记录是一个文档,它是由字段和值对组成的数据结构。MongoDB 文档类似于 JSON 对象。字段的值可能包括其他文档、数组和文档数组。 使用文档的优点是: 文档(即对象)对应于许多编程语言中的本地数据类型。 嵌入式文档和数组减少了对昂贵连接的需求。 动态模式支持流畅的多态性。
2 环境准备
2.1 主机规划
hadoop101 | hadoop102 | hadoop103 | 说明 |
---|
mongos | mongos | mongos | 路由服务器,寻址 | config | config | config | 配置服务器,保存配置 | shard1(主) | shard2(主) | shard3(主) | 分片:保存数据,可扩展 | shard2 | shard3 | shard1 | 副本集:备份数据,可以配置读写分离(主负责写,从负责同步数据和读) | shard3 | shard1 | shard2 | 副本集:备份数据,可以配置读写分离(主负责写,从负责同步数据和读) |
2.2 下载MongoDB安装包
MongoDB 源码包下载地址:https://www.mongodb.com/download-center#community
2.3 MongoDB安装
以下操作在3台主机都需要操作!
安装方法1:(离线安装)
下载完安装包,并解压 tgz(以下演示的是 64 位 Linux上的安装)。
$ tar -xvf mongodb-linux-x86_64-rhel70-4.2.16.tgz -C /opt/modules/ # 解压
$ mv mongodb-linux-x86_64-rhel70-4.2.16/ mongodb-4.2 # 将解压包拷贝到指定目录
MongoDB 的可执行文件位于 bin 目录下,所以可以将其添加到 PATH 路径中:
sudo vim /etc/profile
...
# MONGO_DB
export MONGO_HOME=/opt/modules/mongodb-4.2
export PATH=$PATH:$MONGO_HOME/binsource
# 生效
$ source /etc/profile</pre>
安装方法2:(在线安装)
创建安装文件
sudo vim /etc/yum.repos.d/mongodb-org-4.2.repo
[mongodb-org-4.2]
name=MongoDB Repository
baseurl=https://repo.mongodb.org/yum/redhat/$releasever/mongodb-org/4.2/x86_64/
gpgcheck=1
enabled=1
gpgkey=https://www.mongodb.org/static/pgp/server-4.2.asc
安装指定版本的最新文档版
sudo yum install -y mongodb-org
安装指定版本
sudo yum install -y mongodb-org-4.2.16 mongodb-org-server-4.2.16 mongodb-org-shell-4.2.16 mongodb-org-mongos-4.2.16 mongodb-org-tools-4.2.16
2.4 创建相关目录
分别在各主机上创建mongo config server对应的目录,根据自己情况选择
# 配置文件服务器
mkdir -p /opt/modules/mongodb/cluster/config/{log,data,run}
# 第一分片和副本集
mkdir -p /opt/modules/mongodb/cluster/shard1/{log,data,run}
# 第二分片和副本集
mkdir -p /opt/modules/mongodb/cluster/shard2/{log,data,run}
# 第三分片和副本集
mkdir -p /opt/modules/mongodb/cluster/shard3/{log,data,run}
# mongos目录
mkdir -p /opt/modules/mongodb/cluster/mongos/{log,data,run}
3 创建集群
3.1 创建配置文件服务器
分别在多台机器上修改config server的配置文件
cat > /opt/modules/mongodb/cluster/config/mongod.conf << EOF
systemLog:
destination: file
logAppend: true
path: /opt/modules/mongodb/cluster/config/log/mongod.log
storage:
dbPath: /opt/modules/mongodb/cluster/config/data
journal:
enabled: true
processManagement:
fork: true
pidFilePath: /opt/modules/mongodb/cluster/config/run/mongod.pid
net:
port: 27100
bindIp: 192.168.56.101
replication:
replSetName: config
sharding:
clusterRole: configsvr
EOF
clusterRole: configsvr 这个配置是固定的,表示配置文件服务器
启动所有的mongo config server服务
mongod --config /opt/modules/mongodb/cluster/config/mongod.conf
登录任意一台配置服务器,初始化配置副本集
mongo --port 27100 --host 192.168.56.101
创建配置
config = {
_id : "config",
members : [
{_id : 0, host : "192.168.56.101:27100" },
{_id : 1, host : "192.168.56.102:27100" },
{_id : 2, host : "192.168.56.103:27100" }
]
}
初始化副本集配置
> rs.initiate(config)
{
"ok" : 1,
"$gleStats" : {
"lastOpTime" : Timestamp(1634369868, 1),
"electionId" : ObjectId("000000000000000000000000")
},
"lastCommittedOpTime" : Timestamp(0, 0)
}
查看分区状态
> rs.status()
config:PRIMARY> rs.status()
{
"set" : "config",
"date" : ISODate("2021-10-16T07:39:30.295Z"),
"myState" : 1,
"term" : NumberLong(1),
"syncingTo" : "",
"syncSourceHost" : "",
"syncSourceId" : -1,
"configsvr" : true,
"heartbeatIntervalMillis" : NumberLong(2000),
"majorityVoteCount" : 2,
"writeMajorityCount" : 2,
...
"members" : [
{
"_id" : 0,
"name" : "192.168.56.101:27100",
"health" : 1,
"state" : 1,
"stateStr" : "PRIMARY",
"uptime" : 493,
"optime" : {
"ts" : Timestamp(1634369969, 1),
"t" : NumberLong(1)
},
"optimeDate" : ISODate("2021-10-16T07:39:29Z"),
"syncingTo" : "",
"syncSourceHost" : "",
"syncSourceId" : -1,
"infoMessage" : "could not find member to sync from",
"electionTime" : Timestamp(1634369879, 1),
"electionDate" : ISODate("2021-10-16T07:37:59Z"),
"configVersion" : 1,
"self" : true,
"lastHeartbeatMessage" : ""
},
{
"_id" : 1,
"name" : "192.168.56.102:27100",
"health" : 1,
"state" : 2,
"stateStr" : "SECONDARY",
"uptime" : 102,
"optime" : {
...
注意:其中,"_id" : "config"对应配置文件中配置的 replicaction.replSetName 一致,"members" 中的 "host" 为三个节点的ip和port
3.2 配置第一个分片和副本集
创建配置文件,注意每个主机的bindIp不一样
cat > /opt/modules/mongodb/cluster/shard1/mongod.conf << EOF
systemLog:
destination: file
logAppend: true
path: /opt/modules/mongodb/cluster/shard1/log/mongod.log
storage:
dbPath: /opt/modules/mongodb/cluster/shard1/data
journal:
enabled: true
processManagement:
fork: true
pidFilePath: /opt/modules/mongodb/cluster/shard1/run/mongod.pid
net:
port: 27001
bindIp: 192.168.56.101
replication:
replSetName: shard1
sharding:
clusterRole: shardsvr
EOF
启动所有的shard1 server
mongod --config /opt/modules/mongodb/cluster/shard1/mongod.conf
登陆任意一台shard1服务器(希望哪一台机器是主,就登录到那一台机器上),初始化副本集
mongo --port 27001 --host 192.168.56.101
使用admin数据库
use admin
定义副本集配置
config = {
_id : "shard1",
members : [
{_id : 0, host : "192.168.56.101:27001" },
{_id : 1, host : "192.168.56.102:27001" },
{_id : 2, host : "192.168.56.103:27001" }
]
}
初始化副本集配置
rs.initiate(config)
查看分区状态
rs.status()
3.3 配置第二个分片和副本集
创建配置文件,注意每个主机的bindIp不一样
cat > /opt/modules/mongodb/cluster/shard2/mongod.conf << EOF
systemLog:
destination: file
logAppend: true
path: /opt/modules/mongodb/cluster/shard2/log/mongod.log
storage:
dbPath: /opt/modules/mongodb/cluster/shard2/data
journal:
enabled: true
processManagement:
fork: true
pidFilePath: /opt/modules/mongodb/cluster/shard2/run/mongod.pid
net:
port: 27002
bindIp: 192.168.56.101
replication:
replSetName: shard2
sharding:
clusterRole: shardsvr
EOF
启动所有的shard2 server
mongod --config /opt/modules/mongodb/cluster/shard2/mongod.conf
登陆任意一台shard2服务器(希望哪一台机器是主,就登录到那一台机器上),初始化副本集
mongo --port 27002 --host 192.168.56.101
使用admin数据库
use admin
定义副本集配置
config = {
_id : "shard2",
members : [
{_id : 0, host : "192.168.56.101:27002" },
{_id : 1, host : "192.168.56.102:27002" },
{_id : 2, host : "192.168.56.103:27002" }
]
}
初始化副本集配置
rs.initiate(config)
查看分区状态
rs.status()
3.4 配置第三个分片和副本集
创建配置文件,注意每个主机的bindIp不一样
cat > /opt/modules/mongodb/cluster/shard3/mongod.conf << EOF
systemLog:
destination: file
logAppend: true
path: /opt/modules/mongodb/cluster/shard3/log/mongod.log
storage:
dbPath: /opt/modules/mongodb/cluster/shard3/data
journal:
enabled: true
processManagement:
fork: true
pidFilePath: /opt/modules/mongodb/cluster/shard3/run/mongod.pid
net:
port: 27003
bindIp: 192.168.56.101
replication:
replSetName: shard3
sharding:
clusterRole: shardsvr
EOF
启动所有的shard3 server
mongod --config /opt/modules/mongodb/cluster/shard3/mongod.conf
登陆任意一台shard3服务器(希望哪一台机器是主,就登录到那一台机器上),初始化副本集
mongo --port 27003 --host 192.168.56.101
使用admin数据库
use admin
定义副本集配置
config = {
_id : "shard3",
members : [
{_id : 0, host : "192.168.56.101:27003" },
{_id : 1, host : "192.168.56.102:27003" },
{_id : 2, host : "192.168.56.103:27003" }
]
}
初始化副本集配置
rs.initiate(config)
查看分区状态
rs.status()
3.5 添加mongs的配置文件
cat > /opt/modules/mongodb/cluster/mongos/mongod.conf << EOF
systemLog:
destination: file
logAppend: true
path: /opt/modules/mongodb/cluster/mongos/log/mongod.log
processManagement:
fork: true
pidFilePath: /opt/modules/mongodb/cluster/mongos/run/mongod.pid
net:
port: 27200
bindIp: 192.168.56.101
sharding:
configDB: config/192.168.56.101:27100,192.168.56.102:27100,192.168.56.103:27100
EOF
注意,这里configDB后面的config要与配置服务器的保持一致
启动路由服务器
mongos --config /opt/modules/mongodb/cluster/mongos/mongod.conf
登录其中的一台路由节点,手动启用分片
mongo --port 27200 --host 192.168.56.101
添加分片到mongos
sh.addShard("shard1/192.168.56.101:27001,192.168.56.102:27001,192.168.56.103:27001")
sh.addShard("shard2/192.168.56.102:27002,192.168.56.103:27002,192.168.56.101:27002")
sh.addShard("shard3/192.168.56.103:27003,192.168.56.101:27003,192.168.56.102:27003")
设置slave可读(在命令行中生效一次),如果配置从接到可读,那么是连接客户端指定的
rs.slaveOk()
4 集群启停
4.1 启动集群
#启动所有的config server
mongod --config /opt/modules/mongodb/cluster/config/mongod.conf
#启动所有的shard1
mongod --config /opt/modules/mongodb/cluster/shard1/mongod.conf
#启动所有的shard2
mongod --config /opt/modules/mongodb/cluster/shard2/mongod.conf
#启动所有的shard3
mongod --config /opt/modules/mongodb/cluster/shard3/mongod.conf
#启动所有的mongos
mongos --config /opt/modules/mongodb/cluster/mongos/mongod.conf
4.2 集群停止
关闭服务
mongod --shutdown --dbpath /opt/modules/mongodb/cluster/shard3/data
mongod --shutdown --dbpath /opt/modules/mongodb/cluster/shard2/data
mongod --shutdown --dbpath /opt/modules/mongodb/cluster/shard1/data
mongod --shutdown --dbpath /opt/modules/mongodb/cluster/config/data
5 集群测试
[hadoop@hadoop101 ~]$ mongo --port 27200 --host hadoop101
MongoDB shell version v4.2.17
connecting to: mongodb://hadoop101:27200/?compressors=disabled&gssapiServiceName=mongodb
Implicit session: session { "id" : UUID("f95ab028-5395-4f7b-87cf-a8fdc97c2de2") }
MongoDB server version: 4.2.17
mongos> show dbs
admin 0.000GB
config 0.003GB
mongos> quit()
[hadoop@hadoop101 ~]$ mongo --port 27200 --host hadoop102
MongoDB shell version v4.2.17
connecting to: mongodb://hadoop102:27200/?compressors=disabled&gssapiServiceName=mongodb
Implicit session: session { "id" : UUID("ce375f9a-2fdd-4192-9845-2205a4848a85") }
MongoDB server version: 4.2.17
mongos> show dbs
admin 0.000GB
config 0.003GB
mongos> quit()
[hadoop@hadoop101 ~]$ mongo --port 27200 --host hadoop103
MongoDB shell version v4.2.17
connecting to: mongodb://hadoop103:27200/?compressors=disabled&gssapiServiceName=mongodb
Implicit session: session { "id" : UUID("8cca71f4-1c0b-4598-84ee-74c86674458b") }
MongoDB server version: 4.2.17
mongos> show dbs
admin 0.000GB
config 0.003GB
mongos> quit()
|