mongodb集群搭建

前言


阅读本文的同学们需要一定基础知识,对集群结构,主从结构(master-slave)需要有一定的了解,否则会晕

首先需要了解认识NoSql, 即为Not Only Sql, 不同于传统的关系型数据库的数据库管理系统的统称. MongoDB 是一个基于分布式文件存储的数据库, 是一个介于关系数据库和非关系数据库之间的产品,是非关系数据库当中功能最丰富,最像关系数据库的.


MongoDB的数据结构与关系型数据库数据结构对比


关系型数据库术语/  概念MongoDB  术语/ 概念解释/ 说明
Database Database 数据库
TableCollection数据库表/集合
RowDocument 数据记录行/文档
Column Field数据列/数据字段
IndexIndex索引
Table joins  表关联/MongoDB 不支持
Primary KeyObject ID主键/MongoDB 自动将_id 设置为主键








MongoDB  的应用场景和不适用场景

1、适用场景

  a.网站数据:mongo非常适合实时的插入,更新与查询,并具备网站实时数据存储所需的复制及高度伸缩性。

  b.缓存:由于性能很高,mongo也适合作为信息基础设施的缓存层。在系统重启之后,由mongo搭建的持久化缓存可以避免下层的数据源过载。

  c.大尺寸、低价值的数据:使用传统的关系数据库存储一些数据时可能会比较贵,在此之前,很多程序员往往会选择传统的文件进行存储。

  d.高伸缩性的场景:mongo非常适合由数十或者数百台服务器组成的数据库。

  e.用于对象及JSON数据的存储:mongo的BSON数据格式非常适合文档格式化的存储及查询。

2、不适用场景

  a.高度事物性的系统:例如银行或会计系统。传统的关系型数据库目前还是更适用于需要大量原子性复杂事务的应用程序。

  b.传统的商业智能应用:针对特定问题的BI数据库会对产生高度优化的查询方式。对于此类应用,数据仓库可能是更合适的选择。



接下来进行实战:mongodb集群搭建
搭建环境准备: vmware workstation + centos7.0, 还不会搭建环境的同学么需要努力,这些都是程序员必备的

知识准备:如下图所示
图中的机器名 端口号等等,也将是我们本文之后要达到的目的


说明:由于资源有限,三台机器IP:192.168.131.129,IP:192.168.131.130,IP:192.168.131.131,route:mongodb路由配置主要是起到负载均衡的作用, 也可以搭建集群,本文为了演示,
就不弄那么复杂,只部署129一台机器上

configsvr:为了将一个特定的collection存储在多个shard中,需要为该collection指定一个shard key,决定该条记录属于哪个 chunk,配置服务器可以存储以下信息,每个shard节点的配置信息,每个chunk的shard key范围,chunk在各shard 的分布情况,集群中所有 DB 和 collection 的 sharding 配置信息。

repl副本集:主从配置(master-slave),需要注意 mongodb中增删改操作都在master上,slave只作为备份,不做任何操作,当然也可以通过配置来修改

chunks:每个副本集下又分为多个chunks,在shard分片的时候,根据规则存储在不同的chunks,所有的chunks做并集就是全部数据,也就是说可以把chunks理解为负无穷大到正无穷大,然后中间有几个分割点而已.


开始搭建:

1. wget https://fastdl.mongodb.org/linux/mongodb-linux-x86_64-amazon-3.6.1.tgz 下载mongodb数据库

2. tar -xzvfmongodb-linux-x86_64-amazon-3.6.1.tgz 解压安装包

3. 博主是解压在了/opt/mongodb/目录下, 然后在三台机器上分别创建目录replica1(副本集配置信息),

replica2, configserver, route(路由配置信息),

如下图所示


4. 每台机器下的每个文件夹下需要创建目录data, logs以及文件mongodb.cfg(三台机器都需要创建以下目录)

说明:data目录存放数据库信息, logs目录存放日志信息, mongdb.cfg文件配置数据库启动相关参数, 详见后续说明

mkdir -p /opt/mongodb/replica1/data

mkdir -p /opt/mongodb/replica1/logs

mkdir -p /opt/mongodb/replica2/data

mkdir -p /opt/mongodb/replica2/logs

mkdir -p /opt/mongodb/configserver/data

mkdir -p /opt/mongodb/configserver/logs


由于本文只搭建一个路由服务,所以下面目录只需要在129上创建即可

mkdir -p /opt/mongodb/route/data

mkdir -p /opt/mongodb/route/logs


接下来,看看mongodb.cfg是如何配置的?


1) 首先 我们要知道 mongo, mongod, mongos 这三个命令分别代表什么?

a. mongo:是指客户端连接数据库的命令,比如 mongo 192.168.131.129:27017
b. mongod:是指启动数据库服务的命令,如何启动 下面的问题回答
c. mongos:这个命令是连接路由配置的,也就是说本文最终要在129机器上配置一台路由服务,端口号为30000
将来我们最终的增删改操作都是连接的路由服务,由路由服务根据配置规则去副本集中查询真正的数据
例如: mongos192.168.131.129:30000


2)启动mongodb数据库命令的操作和方式有什么?

a. 在后续过程中我们会一直使用mongodb中的命令, 所以需要配置环境变量,这个过程又有临时配置生效和

永久生效, 我们采用后一种,

vim /etc/profile

export MONGODB_HOME=/opt/mongodb
export PATH=$MONGODB_HOME/bin:$PATH

source /etc/profile 是配置生效

b. 继续说启动操作(拿副本集replica1举例)

第一种 mongod --dbpath=/opt/mongodb/replica1/data --logpath=/opt/mongodb/replica1/logs --logappend --port=27017 --fork

第二种 采用配置文件的方式启动, 就是把上面红色标注的命令放入文件中 例如mongodb.cfg

mongod -f /opt/mongodb/replica1/mongodb.cfg 来启动数据库

相信对linux操作熟悉的人都知道 以上第二种启动方式在很多地方都雷同 比如redis中也可以这样指定

上面有哪些基本参数以及代表什么含义,详见下面的问题


3) mongodb.cfg的基本配置参数有哪些, 有代表什么含义?

基本参数及解释

dbpath:数据存放目录(也就是上文中创建的data目录)

logpath:日志存放路径(也就是上文中创建的logs目录)
logappend:以追加的方式记录日志
replSet:replica set 的名字
bind_ip:mongodb 所绑定的 ip 地址

port:mongodb 进程所使用的端口号,默认为 27017

fork:以后台方式运行进程

shardsvr: 表示以sharding(分片)模式启动服务


以上问题,看了之后希望能够理解,接下来就是傻瓜式的操作,

不断的配置mongodb.cfg, 然后指定所在目录,不断的以

mongod -f /opt/mongodb/***/mongodb.cfg 启动

最后 在启动路由服务时 mongos -f /opt/mongodb/route/mongodb.cfg


好啦 不在废话 直接操作

1.先搭建第一个副本集replica1

分别修改三台机器的以下文件

vim /opt/mongodb/replica1/mongodb.cfg




上图部分指定一个副本集shard1 和分别绑定对应的IP地址, 以及端口号都设置为27017

细心的同学发现了最后一个图并没有指定shardsvr=true

这是为什么呢?

因为我们要把最后一台机器设置为arbiter仲裁节点,这个节点可以不用设置分片


2.设置完成后,开始分别启动数据库

mongod -f /opt/mongodb/replica1/mongodb.cfg


3. 使副本集的数据节点生效

mongo 192.168.131.129:27017 (ip: 129 或 130 都可以, port为上文配置中写的端口)

use admin

cfg={_id:"shard1",members:[{_id:0,host:'192.168.131.129:27017',priority:9},

{_id:1,host:'192.168.131.130:27017',priority:1},{_id:2,host:'192.168.131.131:27017',arbiterOnly:true}]};

priority:9 //代表权重值 值越大越可能成为master

arbiterOnly:true //就是指定为仲裁节点

rs.initiate(cfg) //使配置生效

rs.status() //可以查看节点状态


可以看到 master(129) slave(130) arbiter(131)


4. 搭建第二个副本集replica2, 过程操作步骤和上述一摸一样,只不过为了区分,

只需要修改mongodb.cfg中的 replSet=shard2, port=27018, dbpath, logpath修改为对应目录

只上一张图看看, 其它的重复上面步骤即可


mongo 192.168.131.129:27018

use admin

cfg={_id:"shard2",members:[{_id:0,host:'192.168.131.129:27018'},

{_id:1,host:'192.168.131.130:27018'},{_id:2,host:'192.168.131.131:27018'}]};

rs.initiate(cfg)

这个副本集中没有配置仲裁节点,当然也可以配置


5. 搭建configserver

同样修改mongodb.cfg文件

port=27019 //统一指定端口为27019

configsvr=true// 指定为configsvr


分别启动各台机器的服务

mongod -f /opt/mongodb/configserver/mongodb.cfg

使configsvr节点集群生效

mongo 192.168.131.129:27019 (ip: 129 或 130 都可以, port为上文配置中写的端口)

use admin

cfg={_id:"configrs",members:[{_id:0,host:'192.168.131.129:27019'},{_id:1,host:'192.168.131.130:27019'},

{_id:2,host:'192.168.131.131:27019'}]};

rs.initiate(cfg) //使配置生效


6. 配置路由节点

由于只在129上配置 直接上图说话

7. 启动路由节点

mongos -f /opt/mongodb/route/mongodb.cf //注意 这里是mongos 不是mongod

8. 连接路由节点, 开始配置sharding

mongo 192.168.131.129:30000 //这里必须连接路由节点

sh.addShard("shard1/192.168.131.129:27017");
sh.addShard("shard2/192.168.131.130:27018");

shard1、shard2 表示 replica set 的名字 当把主节点添加到 shard 以后,会自动找到 set里的主,备,决策节点

use testdb //数据库名为testdb

sh.enableSharding("testdb") //开启数据库分片

sh.shardCollection("testdb.testcon",{"name":"hashed"}) //根据表testcon中的字段name值进行hash分配

for (var i = 1; i <= 30; i++) db.testcon.save({"name":"tom"+i,"age":i}) 在路由节点中插入30条数据

然后我们查看 不同的副本集中存了数据是否一致



可以看出结果 30条记录根据name的hash值, 存放入不同的分片中,

也就是上文中说的他们的并集就是30条记录


问题:

1. 有的人可能在连接上某一台机器执行 show dbs, show collections等命令时报错

这是因为 mongdb中默认不会让我们在slave上面操作,增删改查只能在master上,如果非要在slave上操作也是可以的,

需要到admin用户下 use admin 执行一个方法 rs.slaveOk()即可












  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值