环境
[root@centos181001 ~]# cat /etc/centos-release
CentOS Linux release 7.6.1810 (Core)
[root@mongodb-hotel-test ~]# mongo --version
MongoDB shell version v4.0.9
git version: fc525e2d9b0e4bceff5c2201457e564362909765
OpenSSL version: OpenSSL 1.0.1e-fips 11 Feb 2013
allocator: tcmalloc
modules: none
build environment:
distmod: rhel70
distarch: x86_64
target_arch: x86_64
节点1:192.168.30.81
节点2:192.168.30.82
节点3:192.168.30.83
Config Server 服务端口:27100
第一个 Shard 服务端口:27001
第二个 Shard 服务端口:27002
第三个 Shard 服务端口:27003
关于 Config Server:从MongoDB 3.4开始,必须将配置服务器部署为副本集(CSRS)
所以在3台服务器都要安装设置 Config Server以达到高可用的目录
关于 Shard:Shard 分片是为了将数据平均分配到不通分片节点的分布式方式来实现高性能的横向扩展。
但是这样如果有其中一个节点挂掉的话,分布在这个节点上的数据将丢失
所以官方建议为每个 Sharding 配置3个副本集以实现 Sharding 的高可用。
MongoDB分片群集包含以下组件:
shard:每个分片包含分片数据的子集。从MongoDB 3.6开始,必须将分片部署为副本集。
mongos:mongos充当查询路由器,提供客户端应用程序和分片集群之间的接口,也是唯一接口。
config servers:配置服务器存储群集的元数据和配置设置。从MongoDB 3.4开始,必须将配置服务器部署为副本集(CSRS)。
生产环境配置
在生产群集中,确保数据冗余并确保系统具有高可用性。对于生产分片群集部署,请考虑以下事项:
将Config Server部署为3成员副本集
将每个Shard部署为3成员副本集
部署多个mongos路由器
mongos和分布
部署多个mongos路由器以支持高可用性和可伸缩性。常见的模式是 mongos 在每个应用程序服务器上防止一个,这样可以减少应用程序和路由器之间的网络延迟
或者您可以将 mongos 放在专用主机上。大型部署受益于此方法,因为它将客户端应用程序服务器的数量与 mongos 实例数量分离,这样可以更好的控制 mongod 实例所服务的连接数。
客户端永远不应连接到单个分片以执行读取或写入操作。
第一步:安装 MongoDB(By All)
1.设置官方YUM源
cat <<EOF >/etc/yum.repos.d/mongodb.repo
[mongodb-org-4.0]
name=MongoDB Repository
baseurl=https://repo.mongodb.org/yum/redhat/7Server/mongodb-org/4.0/x86_64/
gpgcheck=1
enabled=1
gpgkey=https://www.mongodb.org/static/pgp/server-4.0.asc
EOF
2.安装
yum install -y mongodb-org
mongodb-org 一metapackage,将自动安装以下四个组件包。
mongodb-org-server 包含mongod守护程序,关联的init脚本和配置文件(/etc/mongod.conf)。您可以使用初始化脚本从mongod 配置文件开始。有关详细信息,请参阅运行MongoDB Community Edition。
mongodb-org-mongos 包含mongos守护进程。
mongodb-org-shell 包含mongoshell。
mongodb-org-tools 包含以下的MongoDB工具:,,, , ,,和。mongoimport bsondumpmongodumpmongoexportmongofilesmongorestoremongostatm
第二步:部署 Config Server
1.创建 Config Server 工作目录并编辑配置文件(By All)
## 创建工作目录
mkdir -p /mongo/config/{log,data,run}
## 编辑配置文件
cat > /mongo/config/mongod.conf << EOF
systemLog:
destination: file
logAppend: true
path: /mongo/config/log/mongod.log
storage:
dbPath: /mongo/config/data
journal:
enabled: true
processManagement:
fork: true
pidFilePath: /mongo/config/run/mongod.pid
timeZoneInfo: /usr/share/zoneinfo
net:
port: 27100
bindIp: 0.0.0.0
replication:
replSetName: config
sharding:
clusterRole: configsvr
EOF
cat /mongo/config/mongod.conf
2.在所有服务器上启动 Config Server 服务(By All)
mongod --config /mongo/config/mongod.conf
3.登录任意一台初始化 Config Server 副本集
## 登录
mongo --port 27100
## 创建配置(_id : "config" 等于上边的 replSetName: config)
config = {
_id : "config",
members : [
{_id : 0, host : "192.168.30.81:27100" },
{_id : 1, host : "192.168.30.82:27100" },
{_id : 2, host : "192.168.30.83:27100" }
]
}
## 初始化副本集配置
rs.initiate(config)
## 查看状态
rs.status()
第三步:配置 Shard 和副本集
3个副本集除路径和端口外其他信息都一样
1.创建第一个 Shard
## 创建工作目录(By All)
mkdir -p /mongo/shard1/{log,data,run}
## 编辑配置文件(By All)
cat > /mongo/shard1/mongod.conf << EOF
systemLog:
destination: file
logAppend: true
path: /mongo/shard1/log/mongod.log
storage:
dbPath: /mongo/shard1/data
journal:
enabled: true
processManagement:
fork: true
pidFilePath: /mongo/shard1/run/mongod.pid
net:
port: 27001
bindIp: 0.0.0.0
replication:
replSetName: shard1
sharding:
clusterRole: shardsvr
EOF
## 在所有服务器上启动 Sharding 服务(By All)
mongod --config /mongo/shard1/mongod.conf
## 登录任意一台初始化 Sharding 副本集
mongo --port 27001
## 需要切换到 admin 数据库操作
use admin
## 定义副本集配置
config = {
_id : "shard1",
members : [
{_id : 0, host : "192.168.30.81:27001" },
{_id : 1, host : "192.168.30.82:27001" },
{_id : 2, host : "192.168.30.83:27001" }
]
}
## 初始化副本集配置
rs.initiate(config);
## 查看状态
rs.status()
2.创建第二个 Shard
## 创建工作目录(By All)
mkdir -p /mongo/shard2/{log,data,run}
## 编辑配置文件(By All)
cat > /mongo/shard2/mongod.conf << EOF
systemLog:
destination: file
logAppend: true
path: /mongo/shard2/log/mongod.log
storage:
dbPath: /mongo/shard2/data
journal:
enabled: true
processManagement:
fork: true
pidFilePath: /mongo/shard2/run/mongod.pid
net:
port: 27002
bindIp: 0.0.0.0
replication:
replSetName: shard2
sharding:
clusterRole: shardsvr
EOF
## 在所有服务器上启动 Sharding 服务(By All)
mongod --config /mongo/shard2/mongod.conf
## 登录任意一台初始化 Sharding 副本集
mongo --port 27002
## 需要切换到 admin 数据库操作
use admin
## 定义副本集配置
config = {
_id : "shard2",
members : [
{_id : 0, host : "192.168.30.81:27002" },
{_id : 1, host : "192.168.30.82:27002" },
{_id : 2, host : "192.168.30.83:27002" }
]
}
## 初始化副本集配置
rs.initiate(config);
## 查看状态
rs.status()
3.创建第三个 Shard
## 创建工作目录(By All)
mkdir -p /mongo/shard3/{log,data,run}
## 编辑配置文件(By All)
cat > /mongo/shard3/mongod.conf << EOF
systemLog:
destination: file
logAppend: true
path: /mongo/shard3/log/mongod.log
storage:
dbPath: /mongo/shard3/data
journal:
enabled: true
processManagement:
fork: true
pidFilePath: /mongo/shard3/run/mongod.pid
net:
port: 27003
bindIp: 0.0.0.0
replication:
replSetName: shard3
sharding:
clusterRole: shardsvr
EOF
## 在所有服务器上启动 Sharding 服务(By All)
mongod --config /mongo/shard3/mongod.conf
## 登录任意一台初始化 Sharding 副本集
mongo --port 27003
## 需要切换到 admin 数据库操作
use admin
## 定义副本集配置
config = {
_id : "shard3",
members : [
{_id : 0, host : "192.168.30.81:27003" },
{_id : 1, host : "192.168.30.82:27003" },
{_id : 2, host : "192.168.30.83:27003" }
]
}
## 初始化副本集配置
rs.initiate(config);
## 查看状态
rs.status()
第四步:配置 Router mongos
## 创建工作目录(By All)
mkdir -p /mongo/mongos/{log,data,run}
## 编辑配置文件(configDB要与配置服务器 ID 保持一致)(By All)
cat > /mongo/mongos/mongod.conf << EOF
systemLog:
destination: file
logAppend: true
path: /mongo/mongos/log/mongod.log
processManagement:
fork: true
pidFilePath: /mongo/mongos/run/mongod.pid
net:
port: 27200
bindIp: 0.0.0.0
sharding:
configDB: config/192.168.30.81:27100,192.168.30.82:27100,192.168.30.83:27100
EOF
## 启动(By All)
mongos --config /mongo/mongos/mongod.conf
## 登录任意一台
mongo --port 27200
## 将分片添加到 mongos
sh.addShard("shard1/192.168.30.81:27001,192.168.30.82:27001,192.168.30.83:27001")
sh.addShard("shard2/192.168.30.82:27002,192.168.30.83:27002,192.168.30.81:27002")
sh.addShard("shard3/192.168.30.83:27003,192.168.30.81:27003,192.168.30.82:27003")
## 设置slave可读
rs.slaveOk()
## 查看状态
rs.status()
附录:
https://docs.mongodb.com/manual/core/sharded-cluster-components/
网友评论