如何在 CentOS 7 上安装 MongoDB 分片集群
在此页
- 分片和复制
- 三个分片组件
- 第 1 步 - 禁用 SELinux 并配置主机
- 第 2 步 - 在所有实例上安装 MongoDB
- 第 3 步 - 创建配置服务器副本集
- 第 4 步 - 创建分片副本集
- 第 5 步 - 配置 mongos/查询路由器
- 第 6 步 - 将分片添加到 mongos/查询路由器
- 第 7 步 - 测试
- 参考资料
分片是一个 MongoDB 进程,用于跨不同机器存储数据集。它允许你做数据的水平扩展,跨独立实例分区数据,它可以是 Replica Sets。 Sharding 上的数据集分区使用分片键。分片允许您根据堆栈上的数据增长添加更多机器。
分片和复制
让我们简单点。当您有音乐收藏时,Sharding 会将您的音乐收藏保存并保存到不同的文件夹中。另一方面,复制只是将您的音乐收藏同步到其他实例。
三个分片组件
Shard - 用于存储所有数据,在生产环境中,每个分片都是副本集。提供高可用性和数据一致性。
Config Server - 用于存储集群元数据,包含集群数据集和分片的映射。 mongos/查询服务器使用此数据来交付操作。建议在生产中使用 3 个以上的实例。
Mongos/Query Router - 这只是作为应用程序接口运行的 mongo 实例。应用程序将向 mongos 实例发出请求,然后 mongos 将使用分片键将请求传递到分片副本集。
先决条件
- 2 台 centOS 7 服务器作为配置副本集
- 10.0.15.31 configsvr1
- 10.0.15.32 configsvr2
- 10.0.15.21 shardsvr1
- 10.0.15.22 shardsvr2
- 10.0.15.23 shardsvr3
- 10.0.15.24 shardsvr4
- 10.0.15.11 mongos
第 1 步 - 禁用 SELinux 并配置主机
对于本教程,我们将禁用 SELinux。将 SELinux 配置从强制更改为禁用。
通过 OpenSSH 连接到所有节点。
ssh
通过编辑配置文件禁用 SELinux。
vim /etc/sysconfig/selinux
将 SELinux 值更改为已禁用。
SELINUX=disabled
保存并退出。
接下来,编辑每台服务器上的主机文件。
vim /etc/hosts
粘贴以下主机配置:
10.0.15.31 configsvr1
10.0.15.32 configsvr2
10.0.15.11 mongos
10.0.15.21 shardsvr1
10.0.15.22 shardsvr2
10.0.15.23 shardsvr3
10.0.15.24 shardsvr4保存并退出。
现在重启所有服务器:
reboot
第 2 步 - 在所有实例上安装 MongoDB
我们将为所有实例使用最新的 MongoDB (MongoDB 3.4)。通过执行以下命令添加新的 MongoDB 存储库:
cat <<'EOF' >> /etc/yum.repos.d/mongodb.repo
[mongodb-org-3.4]
name=MongoDB Repository
baseurl=https://repo.mongodb.org/yum/redhat/$releasever/mongodb-org/3.4/x86_64/
gpgcheck=1
enabled=1
gpgkey=https://www.mongodb.org/static/pgp/server-3.4.asc
EOF现在使用下面的 yum 命令从 mongodb 存储库安装 mongodb 3.4。
sudo yum -y install mongodb-org
mongodb安装完成后,使用mongo或mongod命令如下方式查看版本详情。
mongod --version
第 3 步 - 创建配置服务器副本集
在先决条件部分,我们已经用 2 台机器 configsvr1 和 configsvr2 定义了配置服务器。在这一步中,我们将把它配置为一个副本集。
如果服务器上正在运行 mongod 服务,请使用以下 systemctl 命令将其停止。
systemctl stop mongod
编辑默认的 mongodb 配置 mongod.conf。
vim /etc/mongod.conf
将数据库存储路径更改为您自己的目录。我们将为第一台服务器使用 /data/db1,为第二台配置服务器使用 /data/db2 目录。
storage:
dbPath: /data/db1将行 bindIP 的值更改为您的内部网络地址。 configsvr1 的 IP 地址为 10.0.15.31,第二台服务器的 IP 地址为 10.0.15.32。
bindIP: 10.0.15.31
在复制部分中,设置复制名称。
replication:
replSetName: "replconfig01"在分片部分下,定义实例的角色。我们将使用这两个实例作为 configsvr。
sharding:
clusterRole: configsvr保存并退出。
接下来,我们必须为 MongoDB 数据创建一个新目录,然后将该目录的所有权权限更改为 mongod 用户。
mkdir -p /data/db1
chown -R mongod:mongod /data/db1接下来,使用以下命令启动 mongod 服务。
mongod --config /etc/mongod.conf
您可以使用 netstat 命令检查 mongod 服务是否在端口 27017 上运行。
netstat -plntu
Configsvr1 和 Configsvr2 已准备好复制集。连接到 configsvr1 服务器并访问 mongo shell。
ssh
mongo --host configsvr1 --port 27017使用下面的查询为所有 configsvr 成员启动副本集名称。
rs.initiate(
{
_id: "replconfig01",
configsvr: true,
members: [
{ _id : 0, host : "configsvr1:27017" },
{ _id : 1, host : "configsvr2:27017" }
]
}
)如果你得到一个结果 { \ok\ : 1 },这意味着 configsvr 已经配置了副本集。
您将能够看到哪个节点是主节点,哪个节点是辅助节点。
rs.isMaster()
rs.status()Config Server 副本集配置完成。
第 4 步 - 创建分片副本集
在这一步中,我们将配置 4 个 centos 7 服务器作为具有 2 个副本集的 Shard 服务器。
- 2 服务器 - shardsvr1 和 shardsvr2,副本集名称:shardreplica01
- 2 服务器 - shardsvr3 和 shardsvr4,副本集名称:shardreplica02
连接到每个服务器并停止 mongod 服务(如果该服务正在运行),并编辑 MongoDB 配置文件。
systemctl stop mongod
vim /etc/mongod.conf将默认存储更改为您的特定目录。
storage:
dbPath: /data/db1在 bindIP 行中,将值更改为您的内部网络地址。
bindIP: 10.0.15.21
在复制部分,您可以将 shardreplica01 用于第一个和第二个实例。第三个和第四个分片服务器使用 shardreplica02。
replication:
replSetName: "shardreplica01"接下来,定义服务器的角色。我们将使用所有这些作为 shardsvr 实例。
sharding:
clusterRole: shardsvr保存并退出。
现在为 MongoDB 数据创建一个新目录。
mkdir -p /data/db1
chown -R mongod:mongod /data/db1启动 mongod 服务。
mongod --config /etc/mongod.conf
使用以下命令检查 MongoDB 是否正在运行:
netstat -plntu
您将看到 MongoDB 正在本地网络地址上运行。
接下来,为这 2 个分片实例创建一个新的副本集。连接到 shardsvr1 并访问 mongo shell。
ssh
mongo --host shardsvr1 --port 27017初始化副本集,名称为shardreplica01,成员为shardsvr1和shardsvr2。
rs.initiate(
{
_id : "shardreplica01",
members: [
{ _id : 0, host : "shardsvr1:27017" },
{ _id : 1, host : "shardsvr2:27017" }
]
}
)如果没有错误,您将看到如下所示的结果。
来自 shardsvr3 和 shardsvr4 的结果,副本集名称为 shardreplica02。
在具有不同副本集名称 shardreplica02 的 shardsvr3 和 shardsvr4 服务器上重做此步骤。
现在我们已经创建了 2 个副本集作为分片 - shardreplica01 和 shardreplica02。
第 5 步 - 配置 mongos/查询路由器
查询路由器或 mongos 只是运行 mongos 的实例。您可以使用配置文件运行 mongos,或者仅使用命令行运行它。
登录mongos服务器,停止MongoDB服务。
ssh
systemctl stop mongod使用以下命令运行 mongos。
mongos --configdb "replconfig01/configsvr1:27017,configsvr2:27017"
使用 --configdb 选项定义配置服务器。如果您在生产环境中,请至少使用 3 个配置服务器。
您将在下面看到结果。
Successfully connected to configsvr1:27017
Successfully connected to configsvr2:27017mongos 实例正在运行。
第 6 步 - 将分片添加到 mongos/查询路由器
从步骤 5 打开另一个 shell,再次连接到 mongos 服务器并访问 mongo shell。
ssh
mongo --host mongos --port 27017使用 sh mongodb 查询添加分片服务器。
对于 shardreplica01 实例。
sh.addShard( "shardreplica01/shardsvr1:27017")
sh.addShard( "shardreplica01/shardsvr2:27017")对于 shardreplica02 实例。
sh.addShard( "shardreplica02/shardsvr3:27017")
sh.addShard( "shardreplica02/shardsvr4:27017")确保没有错误并检查分片状态。
sh.status()
您将分片状态如下面的屏幕截图所示。
我们有 2 个分片副本集和 1 个 mongos 实例在我们的堆栈上运行。
第 7 步 - 测试
现在通过启用分片来测试 MongoDB 服务器,然后添加文档。
访问 mongos 服务器 mongo shell。
ssh
mongo --host mongos --port 27017为数据库启用分片
创建一个新数据库并为新数据库启用分片。
use lemp
sh.enableSharding("lemp")
sh.status()现在查看数据库的状态 - 它已被分区到副本集 shardreplica01。
为集合启用分片
接下来,使用分片支持将新集合添加到数据库中。我们将使用分片集合名称添加名为 stack 的新集合,然后查看数据库和集合状态。
sh.shardCollection("lemp.stack", {"name":1})
sh.status()添加了具有分片集合名称的新集合堆栈。
将文档添加到集合堆栈。
现在将文档插入到集合中。当我们将文档添加到分片集群上的集合时,我们必须包括分片键。
您可以使用下面的示例。我们正在使用分片键名,正如我们在为集合启用分片时添加的那样。
db.stack.save({
"name": "LEMP Stack",
"apps": ["Linux", "Nginx", "MySQL", "PHP"],
})文档已成功添加到集合中,如以下屏幕截图所示。
如果要测试数据库,可以连接到副本集shardreplica01 PRIMARY服务器,打开mongo shell。我正在登录到 shardsvr2 主服务器。
ssh
mongo --host shardsvr2 --port 27017检查副本集上可用的数据库。
show dbs
use lemp
db.stack.find()您将看到数据库、集合和文档在副本集中可用。
CentOS 7 上的MongoDB 分片集群成功安装部署。
参考
- https://docs.mongodb.com/manual/tutorial/deploy-shard-cluster/