前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Mongodb 分片集群搭建

Mongodb 分片集群搭建

作者头像
老七Linux
发布2018-05-09 17:11:43
1.8K0
发布2018-05-09 17:11:43
举报
文章被收录于专栏:Laoqi's Linux运维专列
一、MongoDB分片介绍

一般的像小型企业和业务量不是太大的集群架构,我们使用MongoDB分片就可以足够满足业务需求,或者随着业务的不断增长我们多做些副本集也是可以解决问题,多搞几个主从就可以了。还有一种情况是,类似于腾讯或者阿里有着庞大的集群以及业务量和数据量,不可能一个库分成多个库,其实MongoDB也有这种功能叫做分片,也就是今天所用到的!如下:

  • 分片就是将数据库进行拆分,将大型集合分隔到不同服务器上。比如,本来100G的数据,可以分割成10份存储到10台服务器上,这样每台机器只有10G的数据。
  • 通过一个mongos的进程(路由分发)实现分片后的数据存储与访问,也就是说mongos是整个分片架构的核心,对客户端而言是不知道是否有分片的,客户端只需要把读写操作转达给mongos即可。
  • 虽然分片会把数据分隔到很多台服务器上,但是每一个节点都是需要有一个备用角色的,这样能保证数据的高可用。
  • 当系统需要更多空间或者资源的时候,分片可以让我们按需方便扩展,只需要把mongodb服务的机器加入到分片集群中即可。
MongoDB分片架构图

如上架构中可以这么理解,分片的下一个级别是副本集,其实每个Shard就是一个副本集,所以有必要先副本再分片,也就是说分片是由副本集组成的!Config Server(配置服务器)其实是需要保护起来的,所有的配置数据都在其内,而且配合高可用我们必须要配置多台,我们可以把如上架构中每台机器都看作为分片。

MongoDB分片相关概念
  • mongos: 数据库集群请求的入口,所有的请求都通过mongos进行协调,不需要在应用程序添加一个路由选择器,mongos自己就是一个请求分发中心,它负责把对应的数据请求请求转发到对应的shard服务器上。在生产环境通常有多mongos作为请求的入口,防止其中一个挂掉所有的mongodb请求都没有办法操作。
  • config server: 配置服务器,存储所有数据库元信息(路由、分片)的配置。mongos本身没有物理存储分片服务器和数据路由信息,只是缓存在内存里,配置服务器则实际存储这些数据。mongos第一次启动或者关掉重启就会从 config server 加载配置信息,以后如果配置服务器信息变化会通知到所有的 mongos 更新自己的状态,这样 mongos 就能继续准确路由。在生产环境通常有多个 config server 配置服务器,因为它存储了分片路由的元数据,防止数据丢失!
  • shard: 存储了一个集合部分数据的MongoDB实例,每个分片是单独的mongodb服务或者副本集,在生产环境中,所有的分片都应该是副本集。
二、mongodb分片搭建
2.1 服务器规划

服务器名称(IP)

作用1

作用2

作用3

作用4

作用5

zhdy01(192.168.96.129)

mongos

config server

副本集1主节点

副本集2仲裁

副本集3从节点

zhdy02(192.168.96.135)

mongos

config server

副本集1从节点

副本集2主节点

副本集3仲裁

zhdy03(192.168.96.136)

mongos

config server

副本集1仲裁

副本集2从节点

副本集3主节点

对应端口为

20000

21000

27001

27002

27003

三台机器全部关闭firewalld服务和selinux,或者增加对应端口的规则

2.2 创建目录

分别在三台机器上创建各个角色所需要的目录

代码语言:javascript
复制
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}
2.3 config server配置

mongodb3.4版本以后需要对config server创建副本集

添加配置文件(三台机器都操作):

代码语言:javascript
复制
mkdir /etc/mongod/

vim /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 = 192.168.96.XXX
port = 21000
fork = true
configsvr = true #declare this is a config db of a cluster;
replSet=configs #副本集名称
maxConns=20000 #设置最大连接数

bind_ip = 0.0.0.0 默认是这个,监听全网,但是不安全,因为咱们的MongoDB没有设置密码很容易被黑客入侵!所以还是改成本机IP。

三台机器均需要设置bindIp 以及replSetName

2.4 启动并测试

启动三台机器的config server

代码语言:javascript
复制
mongod -f /etc/mongod/config.conf  //三台机器都要操作

netstat -lntp

登录任意一台机器(我们这边使用192.168.96.129)的21000端口,初始化副本集

代码语言:javascript
复制
mongo --host 192.168.96.129 --port 21000

use admin

config = { _id: "configs", members: [ {_id : 0, host : "192.168.96.129:21000"},{_id : 1, host : "192.168.96.135:21000"},{_id : 2, host : "192.168.96.136:21000"}] }

rs.initiate(config)

结果我就不贴图了,和昨天配置的主从是一样的!

2.5 分片配置

添加配置文件(三台机器都操作)

代码语言:javascript
复制
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 = 192.168.96.XXX
port = 27001
fork = true
httpinterface=true #打开web监控
rest=true
replSet=shard1 #副本集名称
shardsvr = true #declare this is a shard db of a cluster;
maxConns=20000 #设置最大连接数

添加配置文件(三台机器都操作)

代码语言:javascript
复制
vim /etc/mongod/shard2.conf 
//加入如下内容

pidfilepath = /var/run/mongodb/shard2.pid
dbpath = /data/mongodb/shard2/data
logpath = /data/mongodb/shard2/log/shard2.log
logappend = true
bind_ip = 192.168.96.129
port = 27002
fork = true
httpinterface=true #打开web监控
rest=true
replSet=shard2 #副本集名称
shardsvr = true #declare this is a shard db of a cluster;
maxConns=20000 #设置最大连接数

添加配置文件(三台机器都操作)

代码语言:javascript
复制
vim /etc/mongod/shard3.conf 
//加入如下内容

pidfilepath = /var/run/mongodb/shard3.pid
dbpath = /data/mongodb/shard3/data
logpath = /data/mongodb/shard3/log/shard3.log
logappend = true
bind_ip = 192.168.96.XXX
port = 27003
fork = true
httpinterface=true #打开web监控
rest=true
replSet=shard3 #副本集名称
shardsvr = true #declare this is a shard db of a cluster;
maxConns=20000 #设置最大连接数
2.6 启动并测试
2.6.1 启动shard1
代码语言:javascript
复制
mongod -f /etc/mongod/shard1.conf   //三台机器都要操作

登录129或者135任何一台机器的27001端口初始化副本集,136之所以不行,是因为shard1我们把136这台机器的27001端口作为了仲裁节点

代码语言:javascript
复制
mongo --host 192.168.96.XXX --port 27001

use admin

config = { _id: "shard1", members: [ {_id : 0, host : "192.168.96.129:27001"}, {_id: 1,host : "192.168.96.135:27001"},{_id : 2, host : "192.168.96.136:27001",arbiterOnly:true}] }

rs.initiate(config)
2.6.2 启动shard2
代码语言:javascript
复制
mongod -f /etc/mongod/shard2.conf  //三台机器都要操作

登录135或者136任何一台机器的27002端口初始化副本集,129之所以不行,是因为shard2我们把129这台机器的27002端口作为了仲裁节点

代码语言:javascript
复制
mongo --host 192.168.96.XXX --port 27002

use admin

config = { _id: "shard2", members: [ {_id : 0, host : "192.168.96.129:27002" ,arbiterOnly:true},{_id : 1, host : "192.168.96.135:27002"},{_id : 2, host : "192.168.96.136:27002"}] }

rs.initiate(config)
2.6.3 启动shard3
代码语言:javascript
复制
mongod -f /etc/mongod/shard3.conf  //三台机器都要操作

登录129或者136任何一台机器的27003端口初始化副本集,135之所以不行,是因为shard3我们把135这台机器的27003端口作为了仲裁节点

代码语言:javascript
复制
mongo --host 192.168.96.XXX --port 27003

use admin

config = { _id: "shard3", members: [ {_id : 0, host : "192.168.96.129:27003"},  {_id : 1, host : "192.168.96.135:27003", arbiterOnly:true}, {_id : 2, host : "192.168.96.136:27003"}] }

rs.initiate(config)
三、配置路由服务器

为什么在最后配置路由服务器呢?是因为mongos需要知道你的config server以及shard副本集都是那些。

3.1 添加配置文件(三台机器都操作)
代码语言:javascript
复制
vim /etc/mongod/mongos.conf 
//加入如下内容

pidfilepath = /var/run/mongodb/mongos.pid
logpath = /data/mongodb/mongos/log/mongos.log
logappend = true
bind_ip = 192.168.96.XXX
port = 20000
fork = true
configdb = configs/192.168.96.129:21000,192.168.96.135:21000,192.168.96.136:21000 #监听的配置服务器,只能有1个或者3个,configs为配置服务器的副本集名字
maxConns=20000 #设置最大连接数

注意如上configdb后面的IP地址处不要有空格!

启动mongos服务,注意命令,前面都是mongod,这里是mongos

代码语言:javascript
复制
mongos -f /etc/mongod/mongos.conf
3.2 启用分片

登录任何一台20000端口(我们这边使用96.129,任意一台即可)

代码语言:javascript
复制
mongo --port 20000 --host 192.168.96.129

把所有分片和路由器串联:

代码语言:javascript
复制
sh.addShard("shard1/192.168.96.129:27001,192.168.96.135:27001,192.168.96.136:27001")

sh.addShard("shard2/192.168.96.129:27002,192.168.96.135:27002,192.168.96.136:27002")

sh.addShard("shard3/192.168.96.129:27003,192.168.96.135:27003,192.168.96.136:27003")

查看集群状态

代码语言:javascript
复制
sh.status()
mark
mark
3.3 测试

登录任何一台20000端口

代码语言:javascript
复制
mongo --port 20000  

use admin

db.runCommand({ enablesharding : "testdb"}) 或者
sh.enableSharding("testdb") //指定要分片的数据库
 
db.runCommand( { shardcollection : "testdb.table1",key : {id: 1} } ) 或者
sh.shardCollection("testdb.table1",{"id":1} ) //#指定数据库里需要分片的集合和片键

use  testdb

for (var i = 1; i <= 10000; i++) db.table1.save({id:i,"test1":"testval1"})   //插入10000条测试数据

mongos> show dbs
admin   0.000GB
config  0.001GB
testdb  0.000GB

db.table1.stats()  //查看table1状态
3.3.2 随便的创建几个新库:

查看库的状态:

看来刚刚创建的三个库确实是被均分到不同的分片中:

四、 mongodb备份

备份的命令和mysql差不多

4.1 备份指定库

它会在/tmp/目录下面生成一个mydb的目录:

代码语言:javascript
复制
mongodump --host 192.168.96.129 --port 20000  -d mydb -o /tmp/mongobak

备份所有库

代码语言:javascript
复制
mongodump --host 192.168.96.129 --port 20000 -o /tmp/mongobak/alldatabase

指定备份集合

它依然会生成mydb目录,再在这目录下面生成两个文件

代码语言:javascript
复制
mongodump --host 192.168.96.129 --port 20000 -d mydb -c c1 -o /tmp/mongobak/

导出集合为json文件

代码语言:javascript
复制
mongoexport --host 192.168.96.129 --port 20000 -d mydb -c c1 -o /tmp/mydb2/1.json
五、 mongodb恢复
5.1 恢复所有库

其中dir是备份所有库的目录名字,其中–drop可选,意思是当恢复之前先把之前的数据删除,不建议使用

代码语言:javascript
复制
mongorestore -h 192.168.96.129--port 20000 --drop dir/

-d 跟要恢复的库名字,dir就是该库备份时所在的目录

代码语言:javascript
复制
mongorestore -d mydb dir/

恢复集合

代码语言:javascript
复制
mongorestore -d mydb -c testc dir/mydb/testc.bson // -c后面跟要恢复的集合名字,dir是备份mydb库时生成文件所在路径,这里是一个bson文件的路径

导入集合

代码语言:javascript
复制
mongoimport -d mydb -c testc --file /tmp/testc.json
本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2016/10/21,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 一、MongoDB分片介绍
    • MongoDB分片架构图
      • MongoDB分片相关概念
      • 二、mongodb分片搭建
        • 2.1 服务器规划
          • 2.2 创建目录
            • 2.3 config server配置
              • 2.4 启动并测试
                • 2.5 分片配置
                  • 2.6 启动并测试
                    • 2.6.1 启动shard1
                    • 2.6.2 启动shard2
                    • 2.6.3 启动shard3
                    • 3.1 添加配置文件(三台机器都操作)
                    • 3.2 启用分片
                    • 3.3 测试
                    • 3.3.2 随便的创建几个新库:
                    • 4.1 备份指定库
                    • 5.1 恢复所有库
                • 三、配置路由服务器
                • 四、 mongodb备份
                • 五、 mongodb恢复
                相关产品与服务
                数据库
                云数据库为企业提供了完善的关系型数据库、非关系型数据库、分析型数据库和数据库生态工具。您可以通过产品选择和组合搭建,轻松实现高可靠、高可用性、高性能等数据库需求。云数据库服务也可大幅减少您的运维工作量,更专注于业务发展,让企业一站式享受数据上云及分布式架构的技术红利!
                领券
                问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档