MongoDB分片笔记

本文详细介绍了MongoDB集群的搭建过程,包括mongos、configserver和shard的配置与启动,以及如何通过mongos进行数据库分片管理和均衡器的启用。

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

mongos,数据库集群请求的入口,所有的请求都通过mongos进行协调,不需要在应用程序添加一个路由选择器,mongos自己就是一个请求分发中心,它负责把对应的数据请求请求转发到对应的shard服务器上。在生产环境通常有多mongos作为请求的入口,防止其中一个挂掉所有的mongodb请求都没有办法操作。

config server,顾名思义为配置服务器,存储所有数据库元信息(路由、分片)的配置。mongos本身没有物理存储分片服务器和数据路由信息,只是缓存在内存里,配置服务器则实际存储这些数据。mongos第一次启动或者关掉重启就会从 config server 加载配置信息,以后如果配置服务器信息变化会通知到所有的 mongos 更新自己的状态,这样 mongos 就能继续准确路由。在生产环境通常有多个 config server 配置服务器,因为它存储了分片路由的元数据,这个可不能丢失!就算挂掉其中一台,只要还有存货, mongodb集群就不会挂掉。

shard,这就是传说中的分片了。上面提到一个机器就算能力再大也有天花板,就像军队打仗一样,一个人再厉害喝血瓶也拼不过对方的一个师。俗话说三个臭皮匠顶个诸葛亮,这个时候团队的力量就凸显出来了。在互联网也是这样,一台普通的机器做不了的多台机器来做

 

server1server2server3
mongosmongosmongos
config serverconfig serverconfig server
shard1(主节点)shard1(从节点)shard1(仲裁节点)
shard2(仲裁节点)shard2(主节点)shard2(从节点)
shard3(从节点)shard3(仲裁节点)shard3(主节点)

 

应用相关端口,一定要记得在防火墙中开放对应端口:

mongos:27200
config server:27100
shard1:27001
shard2:27002
shard3:27003

在搭建集群环境之前,先创建对应目录应用于存放数据和日志,conf文件夹用于存相关配置文件,由于mongos没有数据,所以只创建日志目录

sudo mkdir -p /usr/local/mongodb/conf  
sudo mkdir -p /usr/local/mongodb/mongos/log  
sudo mkdir -p /usr/local/mongodb/config/data
sudo mkdir -p /usr/local/mongodb/config/log
sudo mkdir -p /usr/local/mongodb/shard1/data
sudo mkdir -p /usr/local/mongodb/shard1/log
sudo mkdir -p /usr/local/mongodb/shard2/data
sudo mkdir -p /usr/local/mongodb/shard2/log
sudo mkdir -p /usr/local/mongodb/shard3/data
sudo mkdir -p /usr/local/mongodb/shard3/log

首先添加配置文件config.conf

sudo vim /usr/local/mongodb/conf/config.conf

systemLog:
  destination: file
  #日志存储位置
  path: "/mongodb/csvr.log"
  logAppend: true
storage:
  journal:
    enabled: true
  #数据文件存储位置
  dbPath: "/mongodb/data/csvr"
  #是否一个库一个文件夹
  directoryPerDB: true
  #WT引擎配置
  wiredTiger:
    engineConfig:
      #WT最大使用cache(根据服务器实际情况调节)
      cacheSizeGB: 1
      #是否将索引也按数据库名单独存储
      directoryForIndexes: true
    #表压缩配置
    collectionConfig:
      blockCompressor: zlib
    #索引配置
    indexConfig:
      prefixCompression: true
#端口配置
net:
  bindIp: 192.168.1.14
  port: 27100
replication:
  oplogSizeMB: 2048
  replSetName: csvr
sharding:
  clusterRole: configsvr
processManagement:
  fork: true

配置shard1,2,3

首先创建配置文件shard1.conf(shard2,shard3相同):

sudo vim /usr/local/mongodb/conf/shard1.conf

systemLog:
   destination: file
   path: "/mongodb/mongod1.log"
   logAppend: true
storage:
   journal:
      enabled: true
   dbPath: "/mongodb/data/1"
processManagement:
   fork: true
net:
   bindIp: 0.0.0.0
   port: 27001
setParameter:
   enableLocalhostAuthBypass: false
replication:
   replSetName: "rs1"
sharding:
   clusterRole: shardsvr

配置mongos

首先创建配置文件mongos.conf

sudo vim /usr/local/mongodb/conf/mongos.conf

#日志路径配置以及是否叠加
systemLog:
  destination: file
  path: "/mongodb/mongos.log"
  logAppend: true
processManagement:
  fork: true
#配置ip,port以及最大连接数
net:
    bindIp: 192.168.1.13
    port: 27200
    #    maxIncomingConnections:200
#监听的配置服务器,只能有1个或者3个 config为配置服务器的副本集名字
sharding:
        configDB:config/server1:27100,server2:27100,server3:27100

分别启动三台服务器的config server

sudo mongod --config /usr/local/mongodb/conf/config.conf

都启动之后,任意选择一台服务器,进行以下操作:

mongo 10.202.80.149:27100

config={
    _id:"config",
    members:[
        {_id:0,host:"server1:27100"},
        {_id:1,host:"server2:27100"},
        {_id:2,host:"server3:27100"}
    ]
}

#初始化副本集
rs.initiate(config)

其中,_id要与之前配置文件中的replSet保持一致

启动三台服务器的shard1,2,3服务,任意选一台服务器(注意:不要选择即将要设置为仲裁节点的服务器)

sudo mongod --config /usr/local/mongodb/conf/shard3.conf
mongo server1(2,3):27001(2,3)

config = {
    _id : "shard1(2,3)",
     members : [
         {_id : 0, host : "server1:27001(2,3)" },
         {_id : 1, host : "server2:27001(2,3)" , arbiterOnly: true},
         {_id : 2, host : "server3:27001(2,3)" }
     ]
 }


rs.initiate(config)

启动三台服务器mongos:

sudo mongos --config /usr/local/mongodb/conf/mongos.conf

连接mongo server1(2,3):27200

开始命令行操作:

#只有admin才有操作权限
> use admin
#增加分片命令
> db.runCommand({ addshard: 'shard1/server1:27001,server2:27001,server3:27001'})
> db.runCommand({ addshard: 'shard2/server1:27002,server2:27002,server3:27002'})
> db.runCommand({ addshard: 'shard3/server1:27003,server2:27003,server3:27003'})
#指定testdb分片生效
> db.runCommand( { enablesharding :"test"});
#重要,开启均衡器
> sh.startBalancer()
> 
> use test
> db.testtable.createIndex({id:"hashed"})
> use admin
#指定数据库里需要分片的集合和片键,1表示自增长
> db.runCommand( { shardcollection : "test.testtable",key : {id: "hashed"} } )
#观看全局sharding状态
> db.printShardingStatus()
#观看单表sharding状态
> db.testtable.stats().shards
> db.testtable.getShardDistribution()

#分片集操作,操作之前先连接shard1(2,3)的主节点,查看状态:
> rs.status()
> rs.conf()
#可以通过连接primary rs节点来删从节点,改增Arb节点
> rs.remove("server3:27004")
# remove有可能导致节点shutdown,需要去服务器端检测下进程
> rs.addArb("server3:27004")

> db.adminCommand({shutdown : 1, force : true})

 

 

 

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值