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: 27018bindIp: 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: 27019bindIp: 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: 27020bindIp: 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: 27021bindIp: 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: 27017bindIp: 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.fileauthorization: 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集群都创建,才能正常看到数据。

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

如若内容造成侵权/违法违规/事实不符,请联系瞎胡闹网进行投诉反馈,一经查实,立即删除!

相关文章

opencv计算机视觉

树莓派主机的无键盘解决 进入控制面板&#xff0c;更改适配器设置&#xff0c;WIFI属性&#xff0c;勾选 1.将网线两头分别接入树莓派和笔记本的网线接口 2.在无线连接属性那里勾选允许其他用户连接 3.运行cmd使用arp -a查看树莓派ip地址&#xff0c;或者使用ipscanner查看 cmd…

JavaIO读取C101.txt文件

一、split分割带空格的字符串&#xff08;四种方法及其区别&#xff09; 参考&#xff1a;https://blog.csdn.net/yezonghui/article/details/106455940 String str "a b c d";String[] arr1 str.split(" "); //仅分割一个空格 String[] arr2 str…

c++之说_11|自定义类型 enum(枚举)与enumclass (c11新枚举)

至于枚举 会用就行 至少目前我感觉没什么太多问题 enum 被称为无作用域枚举 &#xff0c; enumclass / enumstruct 被称为有作用域枚举 看到了吧 语法规则 和 struct 差不多 只不过枚举成员 只是一个标志 它本质是数值 从上到下 下面的数根据上面的数 加 1 也可以直接…

前端JavaScript篇之对闭包的理解

目录 对闭包的理解用途循环中使用闭包解决 var 定义函数的问题 对闭包的理解 闭包是指一个函数能够访问并操作其词法作用域&#xff08;定义时所在的作用域&#xff09;之外的变量的能力。它可以通过在一个函数内部创建另一个函数来实现。内部函数可以访问外部函数的局部变量、…

【维生素C语言】附录:strlen 函数详解

写在前面&#xff1a;本篇将专门为 strlen 函数进行讲解&#xff0c;总结了模拟实现 strlen 函数的三种方法&#xff0c;并对其进行详细的解析。手写库函数是较为常见的面试题&#xff0c;希望通过本篇博客能够加深大家对 strlen 的理解。 0x00 strlen函数介绍 【百度百科】str…

Cobalt Strike 的使用及拓展

Cobalt Strike是一款以Metasploit为基础的GUI框架式渗透测试工具&#xff0c;集成了端 口转发、服务扫描、 自动化溢出、多模式端口监听、exe 、PowerShell木马生成 等&#xff0c;主要用于团队作战&#xff0c;能让多个渗透者同时连接到团体服务器上&#xff0c;共享渗透资 源…

Leetcode2560. 打家劫舍 IV

Every day a Leetcode 题目来源&#xff1a;2560. 打家劫舍 IV 解法1&#xff1a;二分答案 动态规划 给定数组 nums&#xff0c;从中选择一个长度至少为 k 的子序列 A&#xff0c;要求 A 中没有任何元素在 nums 中是相邻的。 最小化 max⁡(A)。 看到「最大化最小值」或者…

基于vue+node.js的校园跳蚤市场系统多商家

校园跳蚤市场系统可以在短时间内完成大量的数据处理、帮助用户快速的查找校园跳蚤市场相关信息&#xff0c;实现的效益更加直观。校园跳蚤市场系统中采用nodejs技术和mysql数据库。主要包括管理员、发布者和用户三大部分&#xff0c;主要功能是实现对个人中心、用户管理、发布者…

数据分析基础之《pandas(7)—高级处理2》

四、合并 如果数据由多张表组成&#xff0c;那么有时候需要将不同的内容合并在一起分析 1、先回忆下numpy中如何合并 水平拼接 np.hstack() 竖直拼接 np.vstack() 两个都能实现 np.concatenate((a, b), axis) 2、pd.concat([data1, data2], axis1) 按照行或者列…

【Opencv学习】04-图像加法

文章目录 前言一、图像加法混合1.1 代码1.2 运行结果 二、图像的按位运算-组合相加2.1 代码2.2 运行结果示例&#xff1a;PPT平滑切换运行结果 总结 前言 简单说就是介绍了两张图如何组合在一起。 1、混合&#xff0c;透明度和颜色会发生改变 2、组合&#xff0c;叠加起来。可…

大厂的供应链域数据中台设计

关注我&#xff0c;紧跟本系列专栏文章&#xff0c;咱们下篇再续&#xff01; 作者简介&#xff1a;魔都技术专家兼架构&#xff0c;多家大厂后端一线研发经验&#xff0c;各大技术社区头部专家博主&#xff0c;编程严选网创始人。具有丰富的引领团队经验&#xff0c;深厚业务架…

2/10 BFS初探

其实在我看来解决全排列问题&#xff0c;核心还是顺序&#xff0c;想清楚结束条件&#xff0c;然后输出&#xff0c;以n3为例 #include<iostream> using namespace std; const int N 10; int path[N];//保存序列 int state[N];//数字是否被用过 int n; void dfs(int u) …

FPGA_工程_基于rom的vga显示

一 框图 二 代码修改 module Display #(parameter H_DISP 1280,parameter V_DISP 1024,parameter H_lcd 12d150,parameter V_lcd 12d150,parameter LCD_SIZE 15d10_000 ) ( input wire clk, input wire rst_n, input wire [11:0] lcd_xpos, //lcd horizontal coo…

C++面向对象 Part 2

文章目录 类六个默认存在的成员函数构造函数&#xff1a;析构函数&#xff1a;拷贝构造函数:拷贝构造详解及细节&#xff1a; 赋值运算符重载;取地址及const取地址操作符重载const修饰的含义&#xff1a; 类六个默认存在的成员函数 构造函数 析构函数 拷贝构造函数 赋值运算…

【从Python基础到深度学习】3. Winscp与Ubuntu使用及配置

一、Ubuntu的使用 1.1 开启与关闭 1.2 修改Ubuntu分辨率 选择适合自己电脑大小的分辨率 1.3 Ubuntu终端 1.4 网络测试 终端中输入&#xff1a; ping www.baidu.com ctr C 退出ping命令 1.5 下载软件 连通安装源 sudo apt update 安装 ssh vim sudo apt install ss…

Verilog刷题笔记22

题目&#xff1a; Build a priority encoder for 8-bit inputs. Given an 8-bit vector, the output should report the first (least significant) bit in the vector that is 1. Report zero if the input vector has no bits that are high. For example, the input 8’b100…

使用耳机壳UV树脂制作一个耳机壳需要多长时间?

使用耳机壳UV树脂制作一个耳机壳所需的时间取决于多个因素&#xff0c;包括工艺流程、加工方式、设备和技术水平等。一般来说&#xff0c;制作一个耳机壳需要数小时到数天不等。 以下是影响制作时间的几个主要因素&#xff1a; 获取耳模时间&#xff1a;获取耳模的时间取决于…

爬虫2—用爬虫爬取壁纸(想爬多少张爬多少张)

先看效果图&#xff1a; 我这个是爬了三页的壁纸60张。 上代码了。 import requests import re import os from bs4 import BeautifulSoupcount0 img_path "./壁纸图片/"#指定保存地址 if not os.path.exists(img_path):os.mkdir(img_path) headers{ "User-Ag…

第66讲管理员登录功能实现

项目样式初始化 放assets目录下&#xff1b; border.css charset "utf-8"; .border, .border-top, .border-right, .border-bottom, .border-left, .border-topbottom, .border-rightleft, .border-topleft, .border-rightbottom, .border-topright, .border-botto…

【Dubbo源码二:Dubbo服务导出】

入口 Dubbo服务导出的入口&#xff1a;服务导出是在DubboBootstrapApplicationListener在监听到ApplicationContextEvent的ContextRefreshedEvent事件后&#xff0c;会触发dubboBootstrap.start(), 在这个方法中最后会导出Dubbo服务 DubboBootstrapApplicationListener Dub…