MongoDB的分片集群(二) :mongodb4.x分片集群离线搭建开启安全认证

转载说明:如果您喜欢这篇文章并打算转载它,请私信作者取得授权。感谢您喜爱本文,请文明转载,谢谢。


相关文章:

MongoDB的分片集群(一) : 基础知识

在《MongoDB的分片集群(一) : 基础知识》中梳理了分片集群的基础知识,本文则记录分片集群的离线搭建,并开启集群的安全认证的过程。

这是一篇结合自己踩过的坑,总结的笔记教程。

环境规划及准备

测试服务器数量:3台

测试服务器系统:centos7

mongodb版本:4.4.7(官网下载)

IP hostname部署内容
10.0.0.1mongodb01mongos,config,shard1,shard2,shard3
10.0.0.2mongodb02mongos,config,shard1,shard2,shard3
10.0.0.3mongodb03mongos,config,shard1,shard2,shard3

将离线安装包mongodb-linux-x86_64-rhel70-4.4.7.tgz上传到服务器mongodb01,并在三台主机均添加hosts解析

10.0.0.1 mongodb01
10.0.0.2 mongodb02
10.0.0.3 mongodb03

集群部署

1. 集群节点配置

包含mongos、config、shard1、shard2、shard3五个集群部署步骤。

1.1 在mongodb01准备集群环境

1.1.1 创建相关目录,安装mongodb集群
# mkdir -p /home/mongodb/cluster/{config,mongos,shard1,shard2,shard3}/{data,logs}
# tar xf mongodb-linux-x86_64-rhel70-4.4.7.tgz
# mv mongodb-linux-x86_64-rhel70-4.4.7 /home/mongodb/mongodb-4.4.7
1.1.2 创建配置文件

1)创建config集群配置文件:

[root@mongodb01 config]# cat /home/mongodb/cluster/config/mongod.conf
# where to write logging data.
systemLog:
destination: file
logAppend: true
path: /home/mongodb/cluster/config/logs/mongod.log
# Where and how to store data.
storage:
dbPath: /home/mongodb/cluster/config/data
journal:
enabled: true
# how the process runs
processManagement:
fork: true
timeZoneInfo: /usr/share/zoneinfo
pidFilePath: /home/mongodb/cluster/config/mongod.pid
# network interfaces
net:
port: 27018
  bindIp: mongodb01
replication:
replSetName: test
sharding:
clusterRole: configsvr

2)创建shard1配置文件:

[root@mongodb01 shard1]# cat /home/mongodb/cluster/shard1/mongod.conf
# where to write logging data.
systemLog:
destination: file
logAppend: true
path: /home/mongodb/cluster/shard1/logs/mongod.log

# Where and how to store data.
storage:
dbPath: /home/mongodb/cluster/shard1/data
journal:
enabled: true
# how the process runs
processManagement:
fork: true
timeZoneInfo: /usr/share/zoneinfo
pidFilePath: /home/mongodb/cluster/shard1/mongod.pid
# network interfaces
net:
port: 27019
  bindIp: mongodb01
replication:
  replSetName: shard1
sharding:
clusterRole: shardsvr

3)创建shard2配置文件:

[root@mongodb01 shard2]# cat /home/mongodb/cluster/shard2/mongod.conf
# where to write logging data.
systemLog:
destination: file
logAppend: true
path: /home/mongodb/cluster/shard2/logs/mongod.log

# Where and how to store data.
storage:
dbPath: /home/mongodb/cluster/shard2/data
journal:
enabled: true
# how the process runs
processManagement:
fork: true
timeZoneInfo: /usr/share/zoneinfo
pidFilePath: /home/mongodb/cluster/shard2/mongod.pid
# network interfaces
net:
port: 27020
  bindIp: mongodb01
replication:
  replSetName: shard2 
sharding:
clusterRole: shardsvr

4)创建shard2配置文件:

[root@mongodb01 shard3]# cat /home/mongodb/cluster/shard3/mongod.conf
# where to write logging data.
systemLog:
destination: file
logAppend: true
path: /home/mongodb/cluster/shard3/logs/mongod.log

# Where and how to store data.
storage:
dbPath: /home/mongodb/cluster/shard3/data
journal:
enabled: true
# how the process runs
processManagement:
fork: true
timeZoneInfo: /usr/share/zoneinfo
pidFilePath: /home/mongodb/cluster/shard3/mongod.pid
# network interfaces
net:
port: 27021
  bindIp: mongodb01
replication:
  replSetName: shard3
sharding:
clusterRole: shardsvr

5)创建mongos配置文件:

[root@mongodb01 mongos]# cat /home/mongodb/cluster/mongos/mongod.conf
  # where to write logging data.
systemLog:
destination: file
logAppend: true
path: /home/mongodb/cluster/mongos/logs/mongod.log

# how the process runs
processManagement:
fork: true
timeZoneInfo: /usr/share/zoneinfo
pidFilePath: /home/mongodb/cluster/mongos/mongod.pid

# network interfaces
net:
port: 27017
  bindIp: mongodb01
sharding:
configDB: test/mongodb01:27018,mongodb02:27018,mongodb03:27018   #test是指在config配置文件中的replSetName: test
1.1.3 分发配置文件到mongodb02和mongodb03
# scp -r /home/mongodb/ root@mongodb02:/home/
# scp -r /home/mongodb/ root@mongodb03:/home/

1.2 另外两台主机配置

1.2.1 修改配置文件

在mongodb02执行修改:

# find /home/mongodb/cluster/ -type f -name "*.conf" -exec sed -i 's#bindIp: mongodb01#bindIp: mongodb02#g' {} +
# grep -nr "bindIp: mongodb02" /home/mongodb/cluster/

在mongodb03执行修改:

# find /home/mongodb/cluster/ -type f -name "*.conf" -exec sed -i 's#bindIp: mongodb01#bindIp: mongodb03#g' {} +
# grep -nr "bindIp: mongodb03" /home/mongodb/cluster/
1.2.2 三台主机配置环境变量
# echo "export PATH=/home/mongodb/mongodb-4.4.7/bin:\$PATH" >>/etc/profile
# source /etc/profile

2. 依次启动集群并初始化

顺序为先启动并初始化config,其次是分片集群,最后是mongos

2.1 启动并初始化config集群

2.1.1 启动config

在三台主机均运行命令:

# mongod -f /home/mongodb/cluster/config/mongod.conf
2.1.2 初始化config集群

在mongodb01服务器登录到config,进行初始化:

[root@mongodb01 ~]# mongo --host mongodb01 --port 27018 #登录到config后,执行后面2条命令
#初始化集群
rs.initiate(
  {
    _id: "test",
    configsvr: true,
    members: [
      { _id : 0, host : "mongodb01:27018" },
      { _id : 1, host : "mongodb02:27018" },
      { _id : 2, host : "mongodb03:27018" }
    ]
  }
)

rs.status()  #查看集群状态

2.2 启动并初始化3个shard分片集群

2.2.1 启动shard集群节点

三个节点每个节点执行以下命令启动3个shard分片副本集节点

# mongod -f /home/mongodb/cluster/shard1/mongod.conf
# mongod -f /home/mongodb/cluster/shard2/mongod.conf
# mongod -f /home/mongodb/cluster/shard3/mongod.conf
2.2.2 初始化shard集群

1)连接到第一个分片shard1初始化:

[root@mongodb01 ~]# mongo --host mongodb01 --port 27019 #登录到shard1,执行后面的命令
rs.initiate(
  {
    _id: "shard1",
    members: [
      { _id : 0, host : "mongodb01:27019" },
      { _id : 1, host : "mongodb02:27019" },
      { _id : 2, host : "mongodb03:27019" }
    ]
  }
)
> rs.status()  #查看集群状态

##在PRIMARY节点创建管理员账号:
> use admin
> db.createRole({role:'sysadmin',roles:[],privileges:[{resource:{anyResource:true},actions:['anyAction']}]});
> db.createUser({user:'root',pwd:'root@Sre2023',roles:[{role:'sysadmin',db:'admin'}]});

2)连接到第二个分片shard2初始化:

[root@mongodb01 ~]# mongo --host mongodb01 --port 27020 #登录到shard2,执行后面的命令
rs.initiate(
  {
    _id: "shard2",
    members: [
      { _id : 0, host : "mongodb01:27020" },
      { _id : 1, host : "mongodb02:27020" },
      { _id : 2, host : "mongodb03:27020" }
    ]
  }
)
> rs.status()       #查看集群状态

##在PRIMARY节点创建管理员账号:
> use admin
> db.createRole({role:'sysadmin',roles:[],privileges:[{resource:{anyResource:true},actions:['anyAction']}]});
> db.createUser({user:'root',pwd:'root@Sre2023',roles:[{role:'sysadmin',db:'admin'}]});

3)连接到第一个分片shard3初始化:

[root@mongodb01 ~]# mongo --host mongodb01 --port 27021  #登录到shard3,执行后面的命令
rs.initiate(
  {
    _id: "shard3",
    members: [
      { _id : 0, host : "mongodb01:27021" },
      { _id : 1, host : "mongodb02:27021" },
      { _id : 2, host : "mongodb03:27021" }
    ]
  }
)
> rs.status()

#在PRIMARY节点创建管理员账号:
> use admin
> db.createRole({role:'sysadmin',roles:[],privileges:[{resource:{anyResource:true},actions:['anyAction']}]});
> db.createUser({user:'root',pwd:'root@Sre2023',roles:[{role:'sysadmin',db:'admin'}]});

2.3 启动并初始化mongos

2.3.1 在3个节点启动mongos-router
# mongos -f /home/mongodb/cluster/mongos/mongod.conf #注意是mongos不是mongod,否则会报错Unrecognized option: sharding.configDB
2.3.2 连接到第一个mongos节点初始化,将三个分片集群加入mongos
[root@mongodb01 ~]# mongo --host mongodb01 --port 27017
> sh.addShard( "shard1/mongodb01:27019,mongodb02:27019,mongodb03:27019");
> sh.addShard( "shard2/mongodb01:27020,mongodb02:27020,mongodb03:27020");
> sh.addShard( "shard3/mongodb01:27021,mongodb02:27021,mongodb03:27021");
> sh.status()

# 创建管理员账号:
> use admin
> db.createRole({role:'sysadmin',roles:[],privileges:[{resource:{anyResource:true},actions:['anyAction']}]});
> db.createUser({user:'root',pwd:'root@Sre2023',roles:[{role:'sysadmin',db:'admin'}]});

3. 测试分片集群

3.1 创建测试数据

[root@mongodb01 ~]# mongo --host mongodb01 --port 27017  #登录mongos进行后面的操作
> use sre  #创建一个新的db
> sh.enableSharding("sre")  #为sre数据库启用分片
> sh.shardCollection("sre.table1", {"_id": "hashed" }) #为table1集合设置分片规则

##插入1000条数据验证
> for (i = 1; i <= 1000; i=i+1){db.table1.insert({'book': 1})}

#查看插入的数据量
> db.table1.find().count()

#查看table1在3个分片集群的分片情况,包括data、docs、chunk数据:
> db.table1.getShardDistribution()

3.2 验证数据

访问3个分片集群,查看各自存储的数据量是否与上一步看到的一致(现在还没有开启安全认证,无论是否使用管理员账号密码登录,都能正常看到数据)。

查看shard1:

[root@mongodb01 ~]# mongo --host mongodb01 --port 27019
shard1:PRIMARY> show dbs;
admin 0.000GB
config 0.001GB
local 0.001GB
sre 0.000GB
shard1:PRIMARY> use sre
switched to db sre
shard1:PRIMARY> show collections;
table1
shard1:PRIMARY> db.table1.find().count()
336   #核对此数据
shard1:PRIMARY>

查看shard2:

[root@mongodb01 ~]# mongo --host mongodb01 --port 27020
shard2:PRIMARY> show dbs
admin 0.000GB
config 0.001GB
local 0.001GB
sre 0.000GB
shard2:PRIMARY> use sre
switched to db sre
shard2:PRIMARY> show collections;
table1
shard2:PRIMARY> db.table1.find().count()
318 #核对此数据
shard2:PRIMARY>

查看shard3:

[root@mongodb01 ~]# mongo --host mongodb01 --port 27021
shard3:PRIMARY> show dbs;
admin 0.000GB
config 0.001GB
local 0.001GB
sre 0.000GB
shard3:PRIMARY> use sre
switched to db sre
shard3:PRIMARY> show collections;
table1
shard3:PRIMARY> db.table1.find().count()
346  #核对此数据
shard3:PRIMARY>

4. 开启安全认证

4.1 创建keyfile

在mongodb01服务器创建keyfile

# openssl rand -base64 756 > /home/mongodb/cluster/test_keyfile.file
# chmod 400 /home/mongodb/cluster/test_keyfile.file

4.2 分发keyfile

分发到mongodb02和mongodb03,并检查确保文件权限为400:

# scp /home/mongodb/cluster/test_keyfile.file root@mongodb02:/home/mongodb/cluster/
# scp /home/mongodb/cluster/test_keyfile.file root@mongodb03:/home/mongodb/cluster/

4.3 停止所有集群节点

每个节点依次关闭mongod和mongos

# killall mongod
# killall mongos

4.4 修改配置文件

每一个config节点和shard节点配置文件mongod.conf添加以下内容:

security:
 keyFile: /home/mongodb/cluster/test_keyfile.file
 authorization: enabled

在每个mongos节点添加以下内容:

security:
 keyFile: /home/mongodb/cluster/test_keyfile.file

mongos比mongod少了authorization:enabled的配置,原因是:

副本集加分片的安全认证需要配置两方面的,副本集各个节点之间使用内部身份验证,用于内部各个mongo实例的通信,只有相同keyfile才能相互访问。所以都要开启keyFile: /home/mongodb/cluster/test_keyfile.file

然而mongod保存数据的分片。mongos只做路由,不保存数据。所以所有的mongod开启访问数据的授权authorization:enabled。这样用户只有账号密码正确才能访问到数据。

4.5 服务启动

三台服务器依次启动config、shard分片集群和mongos:

# mongod -f /home/mongodb/cluster/config/mongod.conf
# mongod -f /home/mongodb/cluster/shard1/mongod.conf
# mongod -f /home/mongodb/cluster/shard2/mongod.conf
# mongod -f /home/mongodb/cluster/shard3/mongod.conf
# mongos -f /home/mongodb/cluster/mongos/mongod.conf

此时必须使用账号密码登录,才能看到数据了:

###登录mongos
mongo --host mongodb01 --port 27017 -u "root" -p"root@Sre2023" --authenticationDatabase "admin"

###登录shard分片集群
mongo --host mongodb01 --port 27019 -u "root" -p"root@Sre2023" --authenticationDatabase "admin"
mongo --host mongodb01 --port 27020 -u "root" -p"root@Sre2023" --authenticationDatabase "admin"
mongo --host mongodb01 --port 27021 -u "root" -p"root@Sre2023" --authenticationDatabase "admin"

再次按照3. 测试分片集群中测试数据分片,成功。

5. 几个命令

mongos> use sre
mongos> db.table1.stats().sharded  #查看table1是否分片
true  #true表示已经开启分片,如果集合没有开启分片,会返回:Collection sre.sre.table4 is not sharded.
mongos> 
mongos> db.table1.stats().shards   #查询分片的详细状态数据,db.table1.stats()返回的数据更多
##返回非常详细的数据
mongos> db.table1.getShardDistribution()  #在mongo上查看数据分布

踩过的坑:

之前在网上看过很多文章,大都是没有做安全认证;有部分文章做了安全认证,但是只在mongos上创建了管理员账号,shard集群没有创建。

这样的集群等创建好之后,无账号登录shard分片集群会发现看不到db了;用mongos创建的账号又无法登录shard集群。所以创建管理员账号,需要mongos和shard集群都创建,才能正常看到数据。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/374685.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

知名开发工具RubyMine全新发布v2023.3——支持AI Assistant

RubyMine 是一个为Ruby 和 Rails开发者准备的 IDE&#xff0c;其带有所有开发者必须的功能&#xff0c;并将之紧密集成于便捷的开发环境中。 RubyMine v2023.3正式版下载 新版本改进AI Assistant支持、Rails应用程序和引擎的自定义路径、对Rails 7.1严格locals的代码洞察、RB…

页面模块向上渐变显示效果实现

ps: 先祝各位朋友新春快乐 ^o^/ 想要首页不那么枯燥无味吗&#xff1f;还在未首页过于单调而苦恼吧&#xff0c;来试试这个吧&#xff08;大佬请忽略上述语句o&#xff09; 今天要实现一个页面线上渐变显示的效果&#xff0c;用来丰富首页等页面&#xff1a; 这里先随机建立几…

jsp商场会员卡管理系统Myeclipse开发mysql数据库web结构java编程计算机网页项目

一、源码特点 JSP 商场会员卡管理系统是一套完善的java web信息管理系统&#xff0c;对理解JSP java编程开发语言有帮助&#xff0c;系统具有完整的源代码和数据库&#xff0c;系统主要采用B/S模式开发。开发环境为TOMCAT7.0,Myeclipse8.5开发&#xff0c;数据库为Mysql5.…

C遗漏知识(个人向)

之前C语言遗漏的一些。 数据在内存中的存储 原码、反码、补码 整数的2进制表⽰⽅法有三种&#xff0c;即 原码、反码和补码 正整数的原、反、补码都相同。 负整数的三种表⽰⽅法各不相同。 原码&#xff1a;直接将数值按照正负数的形式翻译成⼆进制得到的就是原码。 反码&…

【芯片设计- RTL 数字逻辑设计入门 6 -- 带同步复位的D触发器 RTL实现及testbench 验证】

文章目录 带同步复位的D触发器Verilog 代码testbench 代码编译及仿真问题小结 带同步复位的D触发器 同步复位 &#xff1a;复位只能发生在在clk信号的上升沿&#xff0c;若clk信号出现问题&#xff0c;则无法进行复位。 Verilog 代码 // timescale ins/1nsmodule flopr (inpu…

45 漏洞发现-API接口服务之漏洞探针类型利用修复

目录 端口服务类安全测试API接口-webservice RESTful APT 演示案例:端口服务类-Tomcat弱口令安全问题端口服务类-Glassfish任意文件读取其他补充类-基于端口WEB站点又测试其他补充类-基于域名WEB站点又测试其他补充类-基于IP配合端口信息再收集口令安全脚本工具简要使用-Snetcr…

sql求解连续两个以上的空座位

Q&#xff1a;查找电影院所有连续可用的座位。 返回按 seat_id 升序排序 的结果表。 测试用例的生成使得两个以上的座位连续可用。 结果表格式如下所示。 A:我们首先找出所有的空座位&#xff1a;1&#xff0c;3&#xff0c;4&#xff0c;5 按照seat_id排序&#xff08;上面已…

vue3 elementplus DateTimePicker 日期时间设置默认时间为当天

DateTimePicker里面有个自带属性 可以实现这个需求&#xff0c;如图&#xff1a; // 设置当前当天时间范围 00: 00: 00 - 23:59:59 const currentDate [setDefaultDate(0), setDefaultDate(1)]const setDefaultDate (type:number ): string > {let t ;let date new Da…

代码随想录算法训练营第25天 | 216.组合总和III ,17.电话号码的字母组合

回溯章节理论基础&#xff1a; https://programmercarl.com/%E5%9B%9E%E6%BA%AF%E7%AE%97%E6%B3%95%E7%90%86%E8%AE%BA%E5%9F%BA%E7%A1%80.html 216.组合总和III 题目链接&#xff1a;https://leetcode.cn/problems/combination-sum-iii/ 思路: 本题就是在[1,2,3,4,5,6,7,…

【宝藏系列】嵌入式入门概念大全

【宝藏系列】嵌入式入门概念大全 0️⃣1️⃣操作系统&#xff08;Operating System&#xff0c;OS&#xff09; 是管理计算机硬件与软件资源的系统软件&#xff0c;同时也是计算机系统的内核与基石。操作系统需要处理管理与配置内存、决定系统资源供需的优先次序、控制输入与输…

leetcode9. 回文数|详细深入讲解算法

前往题目有 反转一半数字 思路 映入脑海的第一个想法是将数字转换为字符串&#xff0c;并检查字符串是否为回文。但是&#xff0c;这需要额外的非常量空间来创建问题描述中所不允许的字符串。 第二个想法是将数字本身反转&#xff0c;然后将反转后的数字与原始数字进行比较&…

ERR_SSL_VERSION_OR_CIPHER_MISMATCH

我在namesilo买的域名&#xff0c;coludflare做的解析&#xff0c;华为云的SSL&#xff0c;用宝塔部署的SSL&#xff0c;访问https报错&#xff0c;http却正常&#xff1a; 报错&#xff1a;此网站无法提供安全连接www.hongkong.ioyunxin.top 使用了不受支持的协议。 ERR_SSL_…

法国跨境电商平台 Cdiscount 注册指南,保姆级详细教程

随着跨境电商的兴起&#xff0c;越来越多的企业开始寻求在国际市场上拓展业务。Cdiscount 作为法国最大的在线零售平台之一&#xff0c;是很多跨境卖家进入欧洲市场的首选跨境电商平台之一&#xff0c;要在Cdiscount上成功运营&#xff0c;首要任务是注册店铺。在本文中&#x…

寒武纪显卡实现高维向量的softmax并行优化

关于寒武纪编程可以参考本人之前的文章添加链接描述&#xff0c;添加链接描述&#xff0c;添加链接描述 高维向量softmax的基础编程 高维向量的softmax实现更加复杂&#xff0c;回忆之前在英伟达平台上实现高维向量的softmax函数&#xff0c;比如说我们以形状为[1,2,3,4,5,6]…

Linux自有服务—防火墙和计划任务

Linux常用自有服务有NTP时间同步服务、firewalld防火墙服务和crond计划任务服务&#xff0c;NTP在上一篇中讲过&#xff0c;这次主要来说一下防火墙firewalld与计划任务的相关内容。如下。 一、Linux中防火墙firewalld 1、什么是防火墙 防火墙&#xff1a;防范一些网络攻击…

thinkphp获取用户最新的阅读记录,按书籍id去重,返回最新的阅读记录

通过uid查询data_user_zhangjie的记录 去重shuji_id 获取createtime最新的一条数据 //获取用户章节记录public function getUserZhangjieList(){$uid = input(uid);if(empty

基于SpringBoot+Vue的外卖点餐管理系统

末尾获取源码作者介绍&#xff1a;大家好&#xff0c;我是墨韵&#xff0c;本人4年开发经验&#xff0c;专注定制项目开发 更多项目&#xff1a;CSDN主页YAML墨韵 学如逆水行舟&#xff0c;不进则退。学习如赶路&#xff0c;不能慢一步。 目录 一、项目简介 二、开发技术与环…

vue3项目中使用mapv

vue3项目中使用mapv mapv是百度地图官方提供的地图数据可视化开源项目&#xff0c;提供了很多效果酷炫的绘图api mapv地址在这里&#xff0c;示例图在这里 先解释为什么要用mapv echarts画的地图&#xff0c;都是行政区划&#xff0c;就算是geo地图&#xff0c;也只能在行政…

c++父类转换为子类,子类转换为父类,子类父类指针相互强制转换

1.子类转换为父类 子类转换为父类之后&#xff0c;不能调用子类独有的函数和成员变量&#xff0c;只能调用子类继承的虚函数&#xff0c;利用 多态的特性。 #include <iostream>class base { public:virtual void Show(){std::cout << "base class" &…

HDL Designer 2021.1 如何将默认编辑器修改为VsCode

第1步 安装Vscode 第2步 添加Vscode至HDL Designer 第3步 更改HDL Designer编译器 第4步 修改结束&#xff0c;在HDL Designer中双击block可使用Vscode编辑verilog