MongoDB 搭建高可用集群(分片副本集)

一、 架构图如下
分片副本集架构图
分片副本集部署规划:

  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: true
sharding:
		# 添加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:27018
security:
		# 访问key的路径
    keyFile: "/home/mongodb/key/mongodb_keyfile"
    clusterAuthMode: "keyFile"
processManagement:
    fork: true
net:
    bindIp: 0.0.0.0
    # 配置mongos的端口号为27019
    port: 27019

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

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

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

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

五、key的生成

mongodb_key_address=/home/mongodb/key/mongodb_keyfile
openssl rand -base64 756 > $mongodb_key_address
chmod 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 << mongo
use 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 << mongo
use 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 << config
use 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 << mongos
use admin;
# 创建root权限的账户,密码建议更改较为复杂的密码
db.createUser({user:"root",pwd:"root",roles:[{role:"root",db:"admin"}]});
# 用root账户登陆MongoDB
db.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;
# 创建集合col
db.createCollection(col);
# 为集合col添加{"id":1}索引
db.col.createIndex({"id":1})
# 指定test_db分片生效:
db.runCommand({enablesharding:"testDB"});
# 指定数据库里需要分片的集合和片键:
db.runCommand({shardcollection:"testDB.col",key:{id:"hashed"}})

exit
mongos

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

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

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

use testDB
for(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()

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

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值