搭建mongo集群,以及分片和副本

本文详细介绍了如何在三个节点(node1, node2, node3)上搭建MongoDB集群,包括配置config server、创建分片和副本集,以及安装mongos进程和启用分片功能。通过步骤式的指导,读者可以了解到MongoDB集群的完整搭建过程和管理方法。" 112176212,10552260,CSS盒子模型深入解析:margin与padding实战,"['CSS', '前端开发', '布局', 'CSS盒模型']

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

(我这里是安装在3个节点上,分别为:node1,node2,node3)
1. 安装 mongodb到node1,2,3节点
https://blog.youkuaiyun.com/ZZPJackie/article/details/107141382
2. 在node1,node2,node3创建一个mongo目录

mkdir /opt/mongo

mongos, config, shard1,shard2,shard3分别对应三个子目录用来存 data,log, run (后面会创建)
3. 在node1,node2,node3先创建config server
1.分别在多台机器上创建mongo config server对应的目录

mkdir -p /opt/mongo/config/{log,data,run}
  1. 分别在多台机器上修改config server的配置文件
cat >> /opt/mongo/config/mongod.conf << EOF
systemLog:
  destination: file
  logAppend: true
  path: /opt/mongo/config/log/mongod.log
storage:
  dbPath: /opt/mongo/config/data
  journal:
    enabled: true
processManagement:
  fork: true
  pidFilePath: /opt/mongo/config/run/mongod.pid
net:
  port: 24000
replication:
  replSetName: config
sharding:
  clusterRole: configsvr
EOF

在这里插入图片描述
3. 启动所有的mongo config server服务

mongod --config /opt/mongo/config/mongod.conf

在这里插入图片描述
若出现如下错误:
Failed global initialization: BadValue: Invalid or no user locale set. Please ensure LANG and/or LC_* environment variables are set correctly. locale::facet::_S_create_c_locale name not valid
解决办法:
手动设置变量,在命令行里敲只是临时的重启后没有用了,这需要在环境变量配置文件里添加一行。

vi /etc/profile
export LC_ALL=C
source /etc/profile

再执行 : mongod --config /opt/mongo/config/mongod.conf
运行结果如上图

4, 测试登录node1,2,3中一台的config server, 以创建配置并激活:
(以登录node1中的mongo config server为例) : mongo --port 24000
5. 运行配置:
#创建配置

config = {
   _id : "config",
    members : [
        {_id : 0, host : "192.168.121.200:24000" },
        {_id : 1, host : "192.168.121.201:24000" },
        {_id : 2, host : "192.168.121.202:24000" }
    ]
}

注意: _id: config 必须与前面的 config server配置文件中的 replSetName: config 一致. host分别为node1,2,3的地址
6. 初始化副本集配置:

rs.initiate(config)
  1. 查看分区状态:
rs.status()

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
4. 给node1,2,3 各创建第一个分片和副本集

  1. 修改mongo shard1 server的配置文件:
mkdir -p /opt/mongo/shard1/{log,data,run}
  1. 分别在多台机器上修改shard1 server的配置文件:
 cat >> /opt/mongo/shard1/mongod.conf << EOF
systemLog:
  destination: file
  logAppend: true
  path: /opt/mongo/shard1/log/mongod.log
storage:
  dbPath: /opt/mongo/shard1/data
  journal:
    enabled: true
processManagement:
  fork: true
  pidFilePath: /opt/mongo/shard1/run/mongod.pid
net:
  port: 25001
replication:
  replSetName: shard1
sharding:
  clusterRole: shardsvr
EOF

注意: clusterRole: shardsvr && replSetName: shard1
3. 启动所有的shard1 server:

mongod --config /opt/mongo/shard1/mongod.conf
  1. 登陆任意一台shard1服务器(希望哪一台机器是主,就登录到那一台机器上,这里是准备将node1设为shard1的主节点),初始化副本集
mongo --port 25001
  1. 使用admin数据库
use admin
  1. 定义副本集配置
config = {
   _id : "shard1",
    members : [
        {_id : 0, host : "192.168.121.200:25001" },
        {_id : 1, host : "192.168.121.201:25001" },
        {_id : 2, host : "192.168.121.202:25001" }
    ]
}

注意:shard1 名字与上面的要一样
副本集中各节点的顺序, 第一个节点是主节点
7. 初始化副本集配置

rs.initiate(config);
  1. 查看分区状态
rs.status()

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

5. 给node1,2,3 各创建第二个分片和副本集

  1. 修改mongo shard2 server的配置文件
mkdir -p /opt/mongo/shard2/{log,data,run}
  1. 分别在多台机器上修改shard2 server的配置文件
cat >> /opt/mongo/shard2/mongod.conf << EOF
systemLog:
  destination: file
  logAppend: true
  path: /opt/mongo/shard2/log/mongod.log
storage:
  dbPath: /opt/mongo/shard2/data
  journal:
    enabled: true
processManagement:
  fork: true
  pidFilePath: /opt/mongo/shard2/run/mongod.pid
net:
  port: 25002
replication:
  replSetName: shard2
sharding:
  clusterRole: shardsvr
EOF
  1. 启动所有的shard2 server
mongod --config /opt/mongo/shard2/mongod.conf
  1. 登陆任意一台shard2服务器(希望哪一台机器是主,就登录到那一台机器上,这里是准备将node2设为shard2的主节点),初始化副本集
mongo --port 25002
  1. 使用admin数据库:use admin
  2. 定义副本集配置:
config = {
   _id : "shard2",
    members : [
        {_id : 0, host : "192.168.121.201:25002" },
        {_id : 1, host : "192.168.121.200:25002" },
        {_id : 2, host : "192.168.121.202:25002" }
    ]
}
  1. 初始化副本集配置:rs.initiate(config);
  2. 查看分区状态:rs.status()

6. 给node1,2,3 各创建第三个分片和副本集:
方法同上
7. 安装配置 mongos 进程, 给node1, 2,3各创建目录

  1. 创建 mongos 进程所在的目录
mkdir -p /opt/mongo/mongos/{log,data,run}
  1. 添加mongs的配置文件
 cat >> /opt/mongo/mongos/mongod.conf << EOF
systemLog:
  destination: file
  logAppend: true
  path: /opt/mongo/mongos/log/mongod.log
processManagement:
  fork: true
  pidFilePath: /opt/mongo/mongos/run/mongod.pid
net:
  port: 23000
sharding:
  configDB: config/192.168.121.200:24000,192.168.121.201:24000,192.168.121.202:24000
EOF
  1. 启动所有的路由服务器
mongos --config /opt/mongo/mongos/mongod.conf
  1. 登录其中的一台路由节点,手动启用分片
mongo --port 23000
  1. 添加分片到mongos
sh.addShard("shard1/192.168.121.200:25001,192.168.121.201:25001,192.168.121.202:25001")
sh.addShard("shard2/192.168.121.201:25002,192.168.121.200:25002,192.168.121.202:25002")
sh.addShard("shard3/192.168.121.202:25003,192.168.121.200:25003,192.168.121.201:25003")
  1. 设置slave可读(在命令行中生效一次),如果配置从接到可读,那么是连接客户端指定的
rs.slaveOk()

8. node1,node2,node3 联接 mongos 客户端, 来操作mongo集群,并在其中创建库并开启分片功能
1.创建库:use mybike
2 创建 bike集合:db.createCollection("bike")
给bike集合创建索引: db.bike.ensureIndex({loc:"2d",status:1})
3 对mybike这个数据库开启分片功能:

 use admin

4 对mybike这个数据库开启分片功能

db.runCommand({"enablesharding":"mybike"}) 

5 对mybike数据库下的bikes集合按id的hash进行分片

db.runCommand({"shardcollection":"mybike.bike","key":{_id:'hashed'}})

6 又切换回 mybike库:use mybike
7 切换到 mybike库,向bike集合中插入数据

db.bike.insert(   {"status": 1, "loc": [28.189153,112.960318],"qrcode":""}   )
db.bike.insert(   { "status": 1, "loc": [28.189155,112.960318],"qrcode":""}   )
db.bike.insert(   {"status": 1, "loc": [28.189159,112.960318],"qrcode":""}   )
db.bike.insert(   {"status": 1, "loc": [28.189163,112.960318],"qrcode":""}   )
db.bike.insert(   { "status": 1, "loc": [28.189170,112.960318],"qrcode":""}   )
db.bike.insert(   {"status": 1, "loc": [28.189393,112.943868],"qrcode":""}   )
db.bike.insert(   { "status": 1, "loc": [28.197871,112.957641],"qrcode":""}   )
db.bike.insert(   {"status": 1, "loc": [28.201437,112.960336],"qrcode":""}   )
db.bike.insert(   {"status": 1, "loc": [28.201487,112.960336],"qrcode":""}   )
db.bike.insert(   {"status": 1, "loc": [28.20392,112.958953],"qrcode":""}   )
db.bike.insert(  {"status" : 1, "loc" : [ 28.204381, 112.959887 ], "qrcode" : ""} )
db.bike.insert(  {  "status" : 1, "loc" : [ 28.204391, 112.959885 ], "qrcode" : ""   } )
db.bike.insert(  {  "status" : 1, "loc" : [ 28.204481, 112.959789 ], "qrcode" : ""   } )
db.bike.insert(  {   "status" : 1, "loc" : [ 28.204181, 112.959671 ], "qrcode" : ""  } )
db.bike.insert(  {  "status" : 1, "loc" : [ 28.204881, 112.959556 ], "qrcode" : ""   } )
db.bike.insert(  { "status" : 1, "loc" : [ 28.204681, 112.959874 ], "qrcode" : ""    } )
db.bike.insert(  { "status" : 1, "loc" : [ 28.204201, 112.959867 ], "qrcode" : ""    } )
db.bike.insert(  {   "status" : 1, "loc" : [ 28.2043941, 112.959854 ], "qrcode" : ""  } )

9. 测试查询的各种情况

  1. 在mongos 进程中查询得到的结果是所有分片要满足条件的结果
    先在 node1 上,以 mongo --port 23000 登录.
show dbs
use mybike
show collections
db.bike.find()

可以查到所有数据
2. 如果指定以某个 shard登录,则只能查到这个 分片上的数据
在node2上,以它上面的主节点 shard2: 25002 登录

mongo --port 25002

shard2:PRIMARY> 这个提示符表明当前是 shard2分片,并且是主节点
(如果登录的是从节点的话,默认是没有访问权限,要执行shard2:SECONDARY> rs.slaveOk() )
输入以下命令:

use mybike
db.bike.find()

只能看到在这个分区上的数据,这就说明 以后利用客户端应该联接 mongos 进程,而不能直联 shard

  1. 对某个备份节点 slave进行操作:
    比如 node2上的 shard3: 25003 :mongo --port 25003
    shard3:SECONDARY> 表明这是一个备份节点
    rs.slaveOk()启用 备份节点可读
    就可以查到备份节点上的数据

说明集群及分片、副本安装成功!!!!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值