MongoDB 搭建高可用集群(分片副本集)
发布日期:2021-11-15 14:57:42 浏览次数:32 分类:技术文章

本文共 4907 字,大约阅读时间需要 16 分钟。

一、 架构图如下

分片副本集架构图
分片副本集部署规划:

  1. 2个mongos实例分别在192.168.1.1、192.168.1.2上,端口为27019
  2. 3个config实例分别在192.168.2.1、192.168.2.2、192.168.2.3上,端口为27018,副本集名为configs
  3. shard1分片的副本集配置的三个实例分别在192.168.3.1、192.168.3.2、192.168.3.3上,端口为27017
  4. shard2分片的副本集配置的三个实例分别在192.168.4.1、192.168.4.2、192.168.4.3上,端口为27017

二、 创建/home/mongodb/{log,data,key}路径目录,用于存放mongodb的日志、数据和访问key。

三、mongos实例的config.conf配置文件如下:

systemLog:    destination: file		# mongos服务器日志的存储路径    path: "/home/mongodb/log/mongos.log"    logAppend: truesharding:		# 添加config副本集配置		# 例如config副本集配置的三个实例分别在192.168.2.1、192.168.2.2、192.168.2.3上,端口为27018,副本集名为configs。者该配置如下所写    configDB: configs/192.168.2.1:27018,192.168.2.2:27018,192.168.2.3:27018security:		# 访问key的路径    keyFile: "/home/mongodb/key/mongodb_keyfile"    clusterAuthMode: "keyFile"processManagement:    fork: truenet:    bindIp: 0.0.0.0    # 配置mongos的端口号为27019    port: 27019

四、config实例的config.conf配置文件如下:

systemLog:    destination: file		# config服务器日志的存储路径    path: "/home/mongodb/log/mongos.log"    logAppend: truestorage:		# config服务器数据的存储路径    dbPath: "/home/mongodb/data"    journal:        enabled: truesecurity:		# 启用身份认证    authorization: "enabled" 		# 访问key的路径    keyFile: "/home/mongodb/key/mongodb_keyfile"    clusterAuthMode: "keyFile"sharding:		# 标识该实例用于config服务器    clusterRole: "configsvr"replication:    oplogSizeMB: 1024    # config副本集的名字    replSetName: "configs"processManagement:    fork: truenet:    bindIp: 0.0.0.0    # 配置config的端口号为27018    port: 27018

四、分片下每一个mongod实例的config.conf配置文件如下:

systemLog:    destination: file		# shard服务器日志的存储路径    path: "/home/mongodb/log/shard.log"    logAppend: truestorage:		# shard服务器数据的存储路径    dbPath: "/home/mongodb/data"    journal:        enabled: truesecurity:		# 启用身份认证    authorization: "enabled" 		# 访问key的路径    keyFile: "/home/mongodb/key/mongodb_keyfile"    clusterAuthMode: "keyFile"sharding:		# 标识该实例用于shard分片    clusterRole: "shardsvr"replication:    oplogSizeMB: 1024    # shard副本集的名字    replSetName: "shard1"processManagement:    fork: truenet:    bindIp: 0.0.0.0    # 配置shard的端口号为27017    port: 27017

五、key的生成

mongodb_key_address=/home/mongodb/key/mongodb_keyfileopenssl rand -base64 756 > $mongodb_key_addresschmod 400 $mongodb_key_address

所有实例中都使用同一个key,复制key后还得要修改400权限后mongodb才可以正常运行。

六、 准备好所有的conf配置文件和key后,第一步首先启动负责shard的六个mongod实例。

# shard1分片# 在192.168.3.1主机中运行mongod -f /home/mongodb/config.conf# 在192.168.3.2主机中运行mongod -f /home/mongodb/config.conf# 在192.168.3.3主机中运行mongod -f /home/mongodb/config.conf# shard2分片# 在192.168.4.1主机中运行mongod -f /home/mongodb/config.conf# 在192.168.4.2主机中运行mongod -f /home/mongodb/config.conf# 在192.168.4.3主机中运行mongod -f /home/mongodb/config.conf

然后登入shard1分片中任意一台主机中运行以下代码

# 向端口号为27017的mongodb服务器输入指令mongo -port 27017 << mongouse admin;config={_id:'shard1',members:[{_id: 0 ,host: '192.168.3.1:27017'},{_id: 1 ,host: '192.168.3.2:27017'},{_id: 2 ,host: '192.168.3.3:27017'}]};rs.initiate(config);exit;mongo

然后再登入shard2分片中任意一台主机中运行以下代码

# 向端口号为27017的mongodb服务器输入指令mongo -port 27017 << mongouse admin;config={_id:'shard2',members:[{_id: 0 ,host: '192.168.4.1:27017'},{_id: 1 ,host: '192.168.4.2:27017'},{_id: 2 ,host: '192.168.4.3:27017'}]};rs.initiate(config);exit;mongo

此时,shard1、shard2分片的副本集已经正式启动了。

七、 然后再启动config的三个mongod实例。

# 在192.168.2.1主机中运行mongod -f /home/mongodb/config.conf# 在192.168.2.2主机中运行mongod -f /home/mongodb/config.conf# 在192.168.2.3主机中运行mongod -f /home/mongodb/config.conf

然后登入其中任意一台主机中运行以下代码

# 向端口号为27018的mongodb服务器输入指令mongo -port 27018 << configuse admin;config={
_id:'configs',members:[{
_id: 0 ,host: '192.168.2.1:27018'},{
_id: 1 ,host: '192.168.2.2:27018'},{
_id: 2 ,host: '192.168.2.3:27018'}]};rs.initiate(config);exit;config

那么config服务器的副本集也已经正式启动了。

八、 启动mongos的服务。

# 在192.168.1.1主机中运行mongos -f /home/mongodb/config.conf# 在192.168.1.2主机中运行mongos -f /home/mongodb/config.conf

任选一台mongos主机,运行以下代码

# 向端口号为27019的mongodb服务器输入指令mongo -port 27019 << mongosuse admin;# 创建root权限的账户,密码建议更改较为复杂的密码db.createUser({user:"root",pwd:"root",roles:[{role:"root",db:"admin"}]});# 用root账户登陆MongoDBdb.auth("root","root");# 添加分片集群信息sh.addShard("shard1/192.168.3.1:27017,192.168.3.2:27017,192.168.3.3:27017");sh.addShard("shard2/192.168.4.1:27017,192.168.4.2:27017,192.168.4.3:27017");# 自此分片添加已经完成,下面为对具体某集合执行分片指令# 设置分片规则(此处对testDB.col进行哈希分片):# 进入testDB库use testDB;# 创建集合coldb.createCollection(col);# 为集合col添加{"id":1}索引db.col.createIndex({"id":1})# 指定test_db分片生效:db.runCommand({enablesharding:"testDB"});# 指定数据库里需要分片的集合和片键:db.runCommand({shardcollection:"testDB.col",key:{id:"hashed"}})exitmongos

MongoDB分片副本集已经正式启动,并以完成对testDB.col集合进行分片并以文档中的id作为片键,执行哈希分片。

九、 分片副本集的测试用例如下:

首先登陆一台mongos服务器的主机,并用root权限账户实行登陆,在mongos服务器中运行以下代码

use testDBfor(var i = 0;i<5000;i++){
var arr = [{
id:0}]; for(var j = 0;j<1000;j++){
arr.push({
id:i,value_j:j}); } db.testDB.insertMany(arr);}

执行以上代码后,相当于向testDB.col集合插入5005000条数据。然后在执行以下代码,观察testDB.col集合的分块情况。

sh.status()

执行后可以观察到该集合在分片中的数据分布情况。

转载地址:https://blog.csdn.net/qq_39741836/article/details/105995105 如侵犯您的版权,请留言回复原文章的地址,我们会给您删除此文章,给您带来不便请您谅解!

上一篇:更新Nodejs和Npm版本
下一篇:MongoDB的触发器-Change Stream

发表评论

最新留言

做的很好,不错不错
[***.243.131.199]2024年03月27日 15时10分12秒