mongodb分片

mongodb分片介绍

  • 在Mongodb里面存在另一种集群,就是分片技术,可以满足MongoDB数据量大量增长的需求。当MongoDB存储海量的数据时,一台机器可能不足以存储数据,也可能不足以提供可接受的读写吞吐量。这时,我们就可以通过在多台机器上分割数据,使得数据库系统能存储和处理更多的数据。
  • 分片就是将数据库进行拆分,将大型集合分隔到不同服务器上,比如本来100G的数据,可以分割成10分存储到10台服务器上,这样每台机器只有10G的数据。
  • 通过一个mongos的进程(路由)实现分片后的数据存储与访问,也就是说mongos是整个分片架构的核心,对客户端而言是不知道是否有分片的,客户端只需要把读写操作转达给mongos即可。
  • 虽然分片会把数据分隔到很多台服务器上,但是每一个节点都是需要有一个备用角色的,这样能保证数据的高可用。 当系统需要更多空间或者资源的时候,分片可以让我们按需方便扩展,只需要把mongodb服务的机器加入到分片集群中即可
  • 为什么使用分片
    (1)复制所有的写入操作到主节点
    (2)延迟的敏感数据会在主节点查询
    (3)单个副本集限制在12个节点
    (4)当请求量巨大时会出现内存不足
    (5)本地磁盘不足
    (6)垂直扩展价格昂贵
  • mongodb分片架构图
    在这里插入图片描述
    上图中主要有如下三个主要组件:
    (1)shard:用于存储实际的数据块,实际生产环境中一个shard server角色可由几台机器组个一个replica set承担,防止主机单点故障。存储了一个集合部分数据的mongodb实例,每个分片是单独的mongodb服务或者副本集,在生产环境中,所有的分片都应该是副本集(安全性)。
    (2)Config Server:mongod实例,存储了整个 ClusterMetadata,其中包chunk信息。配置服务器,存储所有数据库元信息(路由、分片)的配置。mongos本身没有物理存储分片服务器和数据路由信息,只是缓存在内存里,配置服务器则实际存储这些数据。mongos第一次启动或者关掉重启就会从 config server 加载配置信息,以后如果配置服务器信息变化会通知到所有的 mongos 更新自己的状态,这样 mongos 就能继续准确路由。在生产环境通常有多个 config server 配置服务器,因为它存储了分片路由的元数据,防止数据丢失!
    (3)Query Routers(mongos):前端路由,客户端由此接入,且让整个集群看上去像单一数据库,前端应用可以透明使用。数据库集群请求的入口,所有的请求都通过mongos进行协调,不需要在应用程序添加一个路由选择器,mongos自己就是一个请求分发中心,它负责把对应的数据请求转发到对应的shard服务器上,在生产环境通常有多mongos作为请求的入口,防止其中一个挂掉所有的mongodb请求都没有办法操作
    (4)3个组件都可以理解为都是由一个一个副本集组成,多个副本集构成分片。

mongodb分片搭建

  • 服务器规划(A-148,B-143,C-142)
    (1)A节点搭建:mongos、config server、副本集1主节点、副本集2仲裁、副本集3从节点
    (2)B节点搭建:mongos、config server、副本集1从节点、副本集2主节点、副本集3仲裁
    (3)C节点搭建:mongos、config server、副本集1仲裁、副本集2从节点、副本集3主节点
    (4)端口分配:mongos(20000)、config(21000)、副本集1(27001)、副本集2(27002)、副本集3(27003)
    (5)三台机器全部关闭firewalld和selinux服务。
  • 创建各个角色所需要的目录(三台机器都要执行)
    mkdir -p /data/mongodb/mongos/log
    mkdir -p /data/mongodb/config/{data,log}
    mkdir -p /data/mongodb/shard1/{data,log}
    mkdir -p /data/mongodb/shard2/{data,log}
    mkdir -p /data/mongodb/shard3/{data,log}

config server 配置

(1)mongodb3.4版本以后需要对config server创建副本集
(2)添加配置文件(三台机器都要操作)
mkdir /etc/mongod/
创建/etc/mongod/config.conf文件添加如下内容:
pidfilepath = /var/run/mongodb/configsrv.pid dbpath = /data/mongodb/config/data logpath = /data/mongodb/config/log/congigsrv.log logappend = true bind_ip = 0.0.0.0 /本机IP地址 port = 21000 fork = true configsvr = true #declare this is a config db of a cluster; replSet=configs #副本集名称 maxConns=20000 #设置最大连接数

  • 启动3台机器的config server并查看是否成功启动
    mongod -f /etc/mongod/config.conf
    在这里插入图片描述
  • 登录任意一台机器的21000端口,初始化副本集
    命令(1)mongo --host 192.168.142.148 --port 21000

命令(2)config = { _id: "configs", members: [ {_id : 0, host : "192.168.142.148:21000"},{_id : 1, host : "192.168.142.143:21000"},{_id : 2, host : "192.168.142.142:21000"}] }
命令(3)查看状态
在这里插入图片描述


分片配置

  • 三台机器添加配置文件shard1.conf、shard2.conf、shard3.conf(内容一样,CP后只需要修改数字即可)
    vim /etc/mongod/shard1.conf
    pidfilepath = /var/run/mongodb/shard1.pid dbpath = /data/mongodb/shard1/data logpath = /data/mongodb/shard1/log/shard1.log logappend = true bind_ip = 0.0.0.0 /本机IP port = 27001 fork = true #httpinterface=true #打开web监控 #rest=true replSet=shard1 #副本集名称 shardsvr = true #declare this is a shard db of a cluster; maxConns=20000 #设置最大连接数
    如果mongodb版本为4以上,就需要去掉2行 ,不然不能启动
  • 启动shard1
    (1)在三台机器上执行命令mongod -f /etc/mongod/shard1.conf 启动服务
    (2)登录148(shard1主节点)中任何一台机器的27001端口初始化副本集,142之所以不能登录,是因为shard1我们把142这台机器的27001端口作为了仲裁节点
    (3)登录148机器
    mongo --host 192.168.142.148 --port 27001
    (4)进去admin库
    use admin
    (5)初始化副本集
    config = { _id: "shard1", members: [ {_id : 0, host : "192.168.142.148:27001"}, {_id: 1,host : "192.168.142.143:27001"},{_id : 2, host : "192.168.142.142:27001",arbiterOnly:true}] } 148为副本集1主节点,143为从节点,142为仲裁节点
    (6)查看信息rs.initiate(config)在这里插入图片描述
    在这里插入图片描述
  • 启动shard2
    (1)三台机器执行mongod -f /etc/mongod/shard2.conf
    (2)登录143(shard2主节点)中一台机器的27002端口初始化副本集,148这台机器是作为shard2的仲裁节点
    (3)登录143机器的27002
    mongo --host 192.168.142.143 --port 27002
    (4)进入admin库初始化副本集
    config = { _id: "shard2", members: [ {_id : 0, host : "192.168.142.148:27002" ,arbiterOnly:true},{_id : 1, host : "192.168.142.143:27002"},{_id : 2, host : "192.168.142.142:27002"}] }
    143为副本集2主节点,142为从节点,148为仲裁
    在这里插入图片描述
  • 启动shard3
    (1)mongod -f /etc/mongod/shard3.conf
    (2)登录142机器的27003端口进行初始化副本集
    (3)use admin
    (4)config = { _id: "shard3", members: [ {_id : 0, host : "192.168.142.142:27003"}, {_id : 1, host : "192.168.142.143:27003", arbiterOnly:true}, {_id : 2, host : "192.168.142.148:27003"}] }
    在这里插入图片描述
  • 配置路由服务器
    (1)编辑配置文件/etc/mongod/mongos.conf加入以下内容(3台机器)
    pidfilepath = /var/run/mongodb/mongos.pid logpath = /data/mongodb/mongos/log/mongos.log logappend = true bind_ip = 0.0.0.0 /本机IP port = 20000 fork = true configdb = configs/192.168.142.148:21000, 192.168.142.143:21000, 192.168.142.142:21000 #监听的配置服务器,只能有1个或者3个,configs为配置服务器的副本集名字 maxConns=20000 #设置最大连接数
    (2)启动mongos服务
    mongos -f /etc/mongod/mongos.conf
  • 启用分片
    (1)登录任何一台机器的20000端口
    mongo --host 192.168.142.148 --port 20000
    (2)把所有分片和路由器串联,依次执行以下命令
sh.addShard("shard1/192.168.142.148:27001,192.168.142.143:27001,192.168.142.142:27001")
sh.addShard("shard2/192.168.142.148:27002,192.168.142.143:27002,192.168.142.142:27002")
sh.addShard("shard3/192.168.142.148:27003,192.168.142.143:27003,192.168.142.142:27003")

在这里插入图片描述

(3)查看集群状态

sh.status()

在这里插入图片描述


分片测试

(1)登录任何一台机器的20000端口
mongo --host 192.168.142.148 --port 20000
(2)use admin
(3)指定要分片的数据库(2种方法),如果数据库不存在,则会创建
db.runCommand({ enablesharding : "testdb"})或者sh.enableSharding("testdb")
在这里插入图片描述
(4)指定数据库里要分片的集合和片键
db.runCommand( { shardcollection : "testdb.table1",key : {id: 1} } ) 或者sh.shardCollection("testdb.table1",{"id":1} )
在这里插入图片描述
(5)插入测试数据
use testdb
for (var i = 1; i <= 10000; i++) db.table1.save({id:i,"test1":"testval1"})
(6)查看table1状态
db.table1.stats()
在这里插入图片描述


mongodb备份恢复

(1)备份指定库
mongodump --host 192.168.142.148 --port 20000 -d testdb -o /tmp/mongobak 它会在/tmp/mongobak目录下生成一个testdb目录,目录中会针对每个集合生成2个文件,前提是/tmp/mongobak目录是存在的
在这里插入图片描述
bson存储的真正的数据
json会记录库的相关信息
(2)备份所有库
mongodump --host 192.168.142.148 --port 20000 -o /tmp/mongobak/alldatebase
(3)备份指定集合
mongodump --host 192.168.142.148 --port 20000 -d testdb -c table1 -o /tmp/mongoback
在这里插入图片描述
-d 指定库 -c 指定表
(4)导出集合为JSON文件
mongoexport --host 192.168.142.148 --port 20000 -d testdb -c table1 -o /tmp/table1.json
在这里插入图片描述
(5)恢复所有库
mongorestore --host 192.168.142.148 --port 20000 --drop dir/其中dir是备份所有库的目录名称,其中–drop可选,意思是当恢复之前先把之前的数据删除,不建议使用
(6)恢复指定库
mongorestore -d testdb dir /-d跟要恢复的库名字,dir就是该库备份的所在目录
(7)恢复集合
mongorestore -d testdb -c table1 dir /tmp/table1.bson /-c 后面跟要恢复的集合名字,dir是备份testdb库时生成文件所在路径,这里是一个bosn文件的路径
(8)导入集合
mongonimport -d testdb -c table1 --file /tmp/table1.json

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值