如何在CentOS 7上安装MongoDB Sharded Cluster
Sharding是一个在不同机器上存储数据集的MongoDB过程。 它允许您执行横向数据分区,跨独立实例分区数据,并且可以是“副本集”。 'Sharding'上的数据集分区使用分片键。 Sharding允许您根据上的数据增长添加更多计算机。
分片和复制
让我们简单一点。 当您收藏音乐时,“分片”将保存并将您的音乐收藏保存到不同的文件夹中。 另一方面,“复制”只是将音乐收藏同步到其他实例。
三个分片组件
碎片 - 用于存储所有数据,并且在生产环境中,每个碎片都是副本集。 提供高可用性和数据一致性。
配置服务器 - 用于存储群集元数据,包含群集数据集和分片的映射。 mongos / query服务器使用此数据来执行操作。 建议在生产中使用3个以上的实例。
Mongos / Query Router - 这只是作为应用程序接口运行的mongo实例。 应用程序将向mongos实例发出请求,然后mongos将使用分片密钥将请求发送到分片副本集。
先决条件
- 2 centOS 7服务器作为配置副本集
- 10.0.15.31 configsvr1
- 10.0.15.32 configsvr2
- 4个CentOS 7服务器作为碎片副本集
- 10.0.15.21 shardsvr1
- 10.0.15.22 shardsvr2
- 10.0.15.23 shardsvr3
- 10.0.15.24 shardsvr4
- 1个CentOS 7服务器作为mongos /查询路由器
- 10.0.15.11 mongos
- 根特权
- 每台服务器连接到另一台服务器
第1步 - 禁用SELinux和配置主机
对于本教程,我们将禁用SELinux。 将SELinux配置从“执行”更改为“禁用”。
通过OpenSSH连接到所有节点。
ssh root@SERVERIP
通过编辑配置文件来禁用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
将DB存储路径更改为您自己的目录。 我们将为第一个服务器使用'/ 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 root@configsvr1
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服务器副本集的配置已完成。
第4步 - 创建碎片副本集
在这一步中,我们将配置4个centos 7服务器作为'Shard'服务器和2个'Replica Set'。
- 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正在本地网络地址上运行。
接下来,为这两个分片实例创建一个新的副本集。 连接到'shardsvr1'并访问mongo shell。
ssh root@shardsvr1
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 root@mongos
systemctl stop mongod
用下面的命令运行mongos。
mongos --configdb "replconfig01/configsvr1:27017,configsvr2:27017"
使用'--configdb'选项来定义配置服务器。 如果您正在生产,请至少使用3个配置服务器。
你会在下面看到结果。
Successfully connected to configsvr1:27017
Successfully connected to configsvr2:27017
mongos实例正在运行。
第6步 - 添加分片到mongos /查询路由器
从第5步打开另一个shell,再次连接到mongos服务器并访问mongo shell。
ssh root@mongos
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 root@mongos
mongo --host mongos --port 27017
为数据库启用分片
创建一个新数据库并为新数据库启用分片。
use lemp
sh.enableSharding("lemp")
sh.status()
现在查看数据库的状态 - 它已被分区到副本集“shardreplica01”。
为集合启用分片
接下来,使用分片支持将新集合添加到数据库。 我们将添加名为'stack'的新集合和分片集合'name',然后查看数据库和集合的状态。
sh.shardCollection("lemp.stack", {"name":1})
sh.status()
已添加具有分片集合“名称”的新集合“”。
将文档添加到集合''。
现在将文档插入到集合中。 当我们将文档添加到分片群集的集合中时,我们必须包含'分片键'。
你可以使用下面的例子。 正如我们在为集合启用分片时添加的那样,我们正在使用分片键“ 名称 ”。
db.stack.save({
"name": "LEMP Stack",
"apps": ["Linux", "Nginx", "MySQL", "PHP"],
})
文档已成功添加到集合中,如以下屏幕截图所示。
如果要测试数据库,可以连接到副本集“ shardreplica01 ”PRIMARY服务器并打开mongo shell。 我正在登录到'shardsvr2'PRIMARY服务器。
ssh root@shardsvr2
mongo --host shardsvr2 --port 27017
检查副本集上可用的数据库。
show dbs
use lemp
db.stack.find()
您会看到数据库,集合和文档在副本集中可用。
CentOS 7上的MongoDB分片群集成功安装和部署。