Mongodb集群部署ReplicaSet+Sharding -摘自网络

网上关于三种集群方式的搭建方式很多,都是分开来介绍的。Replica Set (复制集成)主要是做主从库的,但是没法实现负载均衡的效果,真正实现这个的,是Sharding(分片集群),通过数据分布在每个分片上而实现。所以,如果只用分片,如果一个只有一个主库,那么挂了就真的挂了。所以在我尝试的集群部署采用的Replica Set+Sharding的方式。OS是Redhat_x64系统,客户端用的是Java客户端。Mongodb版本是mongodb-linux-x86_64-2.4.9.tgz。

要构建一个 MongoDB Sharding Cluster,需要三种角色:

l Shard Server: mongod 实例,用于存储实际的数据块,实际生产环境中一个shard server角色可由几台机器组个一个relica set承担,防止主机单点故障

l Config Server: mongod 实例,存储了整个 Cluster Metadata,其中包括 chunk 信息。

l Route Server: mongos 实例,前端路由,客户端由此接入,且让整个集群看上去像单一数据库,前端应用可以透明使用。

1. 分别在3台机器运行一个mongod实例(称为mongod shard11,mongod shard12,mongod shard13)组织replica set1,作为cluster的shard1

2. 1台机器运行一个mongod实例(称为mongod shard22,单机作为cluster的shard2

3. 每台机器运行一个mongod实例,作为3个config server

4. 每台机器运行一个mongs进程,用于客户端连接


主机


IP


端口信息


Server1


172.17.253.216


mongod shard11:27017
mongod config1:20000
mongs1:30000


Server2


172.17.253.217


mongod shard12:27017
mongod shard22:27018
mongod config2:20000
mongs2:30000


Server3


172.17.253.67


mongod shard13:27017
mongod config3:20000
mongs3:30000

2.1软件准备

1. 安装monodb软件

su – mongodb
tar zxvf mongodb-linux-x86_64-2.4.9.tgz

创建数据目录
根据本例sharding架构图所示,在各台sever上创建shard数据文件目录
Server1:

cd /opt/mongodb
mkdir -p data/shard11

Server2:

cd /opt/mongodb
mkdir -p data/shard12
mkdir -p data/shard22

Server3:
cd /opt/mongodb
mkdir -p data/shard13

2.2配置relica sets(复制集)

1. 配置shard1所用到的replica sets:

方式一:

Server1:
cd /opt/mongodb/bin
./mongod –shardsvr –replSet shard1 –port 27017 –dbpath /mongodb/data/shard11 –oplogSize 100 –logpath /mongodb/data/shard11.log –logappend –fork

Server2:
cd /opt/mongodb/bin
./mongod –shardsvr –replSet shard1 –port 27017 –dbpath /mongodb/data/shard12 –oplogSize 100 –logpath /mongodb/data/shard12.log –logappend –fork

Server3:
cd /opt/mongodb/bin

./mongod –shardsvr –replSet shard1 –port 27017 –dbpath /mongodb/data/shard13 –oplogSize 100 –logpath /mongodb/data/shard13.log –logappend –fork

方式二:

由于配置文件比较多,建议写在文件中

Server1:

vim /opt/mongodb/bin/shard11.conf

view sourceprint?

01.#shard11.conf

02.dbpath=/opt/mongodb/data/shard11

03.logpath = /opt/mongodb/data/shard11.log

04.pidfilepath = /opt/mongdb/shard11.pid

05.directoryperdb = true

06.logappend = true

07.replSet = shard1

08.bind_ip=172.17.253.216

09.port = 27017

10.oplogSize = 100

11.fork = true

12.noprealloc=true

cd /opt/mongodb/bin

./mongod -shardsvr -f shard11.conf
当看到下面的内容表示启动成功:

view sourceprint?

1.about to fork child process, waiting until server is ready for connections.

2.all output going to: /opt/mongodb/data/shard11.log

3.forked process: 14867

4.child process started successfully, parent exiting

Server2:同理

vim /opt/mongodb/bin/shard12.conf

view sourceprint?

01.#shard12.conf

02.dbpath=/opt/mongodb/data/shard12

03.logpath = /opt/mongodb/data/shard12.log

04.pidfilepath = /opt/mongdb/shard12.pid

05.directoryperdb = true

06.logappend = true

07.replSet = shard1

08.bind_ip=172.17.253.217

09.port = 27017

10.oplogSize = 100

11.fork = true

12.noprealloc=true

cd /opt/mongodb/bin
./mongod -shardsvr -f shard12.conf

Server3:同理

vim /opt/mongodb/bin/shard12.conf

view sourceprint?

01.#shard13.conf

02.dbpath=/opt/mongodb/data/shard13

03.logpath = /opt/mongodb/data/shard13.log

04.pidfilepath = /opt/mongdb/shard13.pid

05.directoryperdb = true

06.logappend = true

07.replSet = shard1

08.bind_ip=172.17.253.67

09.port = 27017

10.oplogSize = 100

11.fork = true

12.noprealloc=true

cd /opt/mongodb/bin
./mongod -shardsvr -f shard12.conf

参数解释:

dbpath:数据存放目录

logpath:日志存放路径

pidfilepath:进程文件,方便停止mongodb

directoryperdb:为每一个数据库按照数据库名建立文件夹存放

logappend:以追加的方式记录日志

replSet:replica set的名字

bind_ip:mongodb所绑定的ip地址

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

oplogSize:mongodb操作日志文件的最大大小。单位为Mb,默认为硬盘剩余空间的5%

fork:以后台方式运行进程

noprealloc:不预先分配存储

初始化replica set

配置主,备,仲裁节点,可以通过客户端连接mongodb,也可以直接在三个节点中选择一个连接mongodb。
用mongo连接其中一个mongod,执行:

view sourceprint?

01.[root@localhost bin]# ./mongo 172.17.253.217:27017

02.MongoDB shell version: 2.4.9

03.connecting to: 172.17.253.217:27017/test

04.> use admin

05.switched to db admin

06.> config={_id:‘shard1‘,members:[{_id:0,host:‘172.17.253.216:27017‘,priority:2},{_id:1,host:‘172.17.253.217:27017‘,priority:1},{_id:2,host:‘172.17.253.67:27017‘,arbiterOnly:true}]}

07.{

08."_id" "shard1",

09."members" : [

10.{

11."_id" 0,

12."host" "172.17.253.216:27017",

13."priority" 2

14.},

15.{

16."_id" 1,

17."host" "172.17.253.217:27017",

18."priority" 1

19.},

20.{

21."_id" 2,

22."host" "172.17.253.67:27017",

23."arbiterOnly" true

24.}

25.]

26.}

27.> rs.initiate(config)#使配置生效 

28.

29.{

30."info" "Config now saved locally.  Should come online in about a minute.",

31."ok" 1

32.}

config是可以任意的名字,当然最好不要是mongodb的关键字,conf,config都可以。最外层的_id表示replica set的名字,members里包含的是所有节点的地址以及优先级。优先级最高的即成为主节点,即这里的172.17.253.216:27017。特别注意的是,对于仲裁节点,需要有个特别的配置——arbiterOnly:true。这个千万不能少了,不然主备模式就不能生效。

配置的生效时间根据不同的机器配置会有长有短,配置不错的话基本上十几秒内就能生效,有的配置需要一两分钟。如果生效了,执行rs.status()命令会看到如下信息:

view sourceprint?

01.> rs.status()

02.{

03."set" "shard1",

04."date" : ISODate("2014-02-13T17:39:46Z"),

05."myState" 2,

06."members" : [

07.{

08."_id" 0,

09."name" "172.17.253.216:27017",

10."health" 1,

11."state" 6,

12."stateStr" "UNKNOWN",

13."uptime" 42,

14."optime" : Timestamp(00),

15."optimeDate" : ISODate("1970-01-01T00:00:00Z"),

16."lastHeartbeat" : ISODate("2014-02-13T17:39:44Z"),

17."lastHeartbeatRecv" : ISODate("1970-01-01T00:00:00Z"),

18."pingMs" 1,

19."lastHeartbeatMessage" "still initializing"

20.},

21.{

22."_id" 1,

23."name" "172.17.253.217:27017",

24."health" 1,

25."state" 2,

26."stateStr" "SECONDARY",

27."uptime" 3342,

28."optime" : Timestamp(13923131371),

29."optimeDate" : ISODate("2014-02-13T17:38:57Z"),

30."self" true

31.},

32.{

33."_id" 2,

34."name" "172.17.253.67:27017",

35."health" 1,

36."state" 5,

37."stateStr" "STARTUP2",

38."uptime" 40,

39."lastHeartbeat" : ISODate("2014-02-13T17:39:44Z"),

40."lastHeartbeatRecv" : ISODate("2014-02-13T17:39:44Z"),

41."pingMs" 0

42.}

43.],

44."ok" 1

45.}

view sourceprint?

1.> rs.initiate()

2.{

3."errmsg" "exception: Can‘t take a write lock while out of disk space",

4."code" 14031,

5."ok" 0

6.}

我们会发现,本来应该是主库的显示unkown,仲裁库显示STARTUP2。报错:

view sourceprint?

1.Can‘t take a write lock while out of disk space

这个如何解决呢,经过百度一番之后,

将lock文件删除
rm /var/lib/mongodb/mongod.lock

最好也把journal日志删除,那玩意也很占硬盘,重启mongodb服务

在次尝试:

view sourceprint?

01.root@Labs06 bin]# ./mongo 172.17.253.216:27017

02.MongoDB shell version: 2.4.9

03.connecting to: 172.17.253.216:27017/test

04.shard1:PRIMARY>

05.shard1:PRIMARY> rs.status()

06.{

07."set" "shard1",

08."date" : ISODate("2014-02-13T10:53:12Z"),

09."myState" 1,

10."members" : [

11.{

12."_id" 0,

13."name" "172.17.253.216:27017",

14."health" 1,

15."state" 1,

16."stateStr" "PRIMARY",

17."uptime" 921,

18."optime" : Timestamp(13923131371),

19."optimeDate" : ISODate("2014-02-13T17:38:57Z"),

20."self" true

21.},

22.{

23."_id" 1,

24."name" "172.17.253.217:27017",

25."health" 1,

26."state" 2,

27."stateStr" "SECONDARY",

28."uptime" 815,

29."optime" : Timestamp(13923131371),

30."optimeDate" : ISODate("2014-02-13T17:38:57Z"),

31."lastHeartbeat" : ISODate("2014-02-13T10:53:10Z"),

32."lastHeartbeatRecv" : ISODate("2014-02-13T10:53:11Z"),

33."pingMs" 1,

34."syncingTo" "172.17.253.216:27017"

35.},

36.{

37."_id" 2,

38."name" "172.17.253.67:27017",

39."health" 1,

40."state" 7,

41."stateStr" "ARBITER",

42."uptime" 776,

43."lastHeartbeat" : ISODate("2014-02-13T10:53:11Z"),

44."lastHeartbeatRecv" : ISODate("2014-02-13T10:53:10Z"),

45."pingMs" 0

46.}

47.],

48."ok" 1

49.}

同样方法,配置shard2用到的replica sets:

这里我们之添加172.17.253.217:27018单机

2.3配置三台config server,启动配置节点

Server1:
mkdir -p /mongodb/data/config
./mongod –configsvr –dbpath /mongodb/data/config –port 20000 –logpath /mongodb/data/config.log –logappend –fork #config server也需要dbpath

Server2:
mkdir -p /mongodb/data/config
./mongod –configsvr –dbpath /mongodb/data/config –port 20000 –logpath /mongodb/data/config.log –logappend –fork

Server3:
mkdir -p /mongodb/data/config
./mongod –configsvr –dbpath /mongodb/data/config –port 20000 –logpath /mongodb/data/config.log –logappend –fork

方式二:

由于配置文件比较多,建议写在文件中

Server1:

#config.conf

view sourceprint?

1.dbpath=/opt/mongodb/data/config

2.logpath = /opt/mongodb/data/config.log

3.logappend = true

4.bind_ip=172.17.253.216

5.port = 20000

6.fork = true

view sourceprint?

1.[root@localhost bin]# ./mongod -configsvr -f config.conf

2.about to fork child process, waiting until server is ready for connections.

3.forked process: 24132

4.all output going to: /opt/mongodb/data/config.log

5.child process started successfully, parent exiting

Server2:

view sourceprint?

1.dbpath=/opt/mongodb/data/config

2.logpath = /opt/mongodb/data/config.log

3.logappend = true

4.bind_ip=172.17.253.217

5.port = 20000

6.fork = true

Server3:

view sourceprint?

1.dbpath=/opt/mongodb/data/config

2.logpath = /opt/mongodb/data/config.log

3.logappend = true

4.bind_ip=172.17.253.67

5.port = 20000

6.fork = true

2.4启动路由节点

在每一台server上都执行

view sourceprint?

1.[root@localhost bin]# ./mongos --configdb172.17.253.217:20000,172.17.253.67:20000,172.17.253.216:20000 -port 30000 -chunkSize 5 -logpath /opt/mongodb/data/mongos.log -logappend -fork

2.about to fork child process, waiting until server is ready for connections.

3.forked process: 26210

4.all output going to: /opt/mongodb/data/mongos.log

5.child process started successfully, parent exiting

2.5配置Sharding

连接到其中一个mongos进程,并切换到admin数据库做以下配置
1. 连接到mongs,并切换到admin
./mongo 172.17.253.217:30000/admin这里必须连接路由节点

>db
Admin
2. 加入shards
如里shard是单台服务器,用>db.runCommand( { addshard : “[:]” } )这样的命令加入,如果shard是replica sets,用replicaSetName/[:port][,serverhostname2[:port],…]这样的格式表示,例如本例执行:

view sourceprint?

1.mongos> db.runCommand( { addshard :"shard1/172.17.253.216:27017,172.17.253.67:27017,172.17.253.217:27017",name:"shard1",maxsize:20480});

2."shardAdded" "shard1""ok" 1 }

view sourceprint?

1.mongos> db.runCommand( { addshard :"shard2/172.17.253.217:27018",name:"shard2",maxsize:20480});

2."shardAdded" "shard2""ok" 1 }

view sourceprint?

01.mongos> db.runCommand({listshards:1})

02.{

03."shards" : [

04.{

05."_id" "shard1",

06."host" "shard1/172.17.253.216:27017,172.17.253.217:27017"

07.},

08.{

09."_id" "shard2",

10."host" "shard2/172.17.253.217:27018"

11.}

12.],

13."ok" 1

14.}

注意:在添加第二个shard时,出现error:test database 已经存在的错误,这里用mongo命令连接到第二个replica set,用db.dropDatabase()命令把test数据库给删除然后就可加入

3. 可选参数
Name:用于指定每个shard的名字,不指定的话系统将自动分配
maxSize:指定各个shard可使用的最大磁盘空间,单位megabytes

4. Listing shards
>db.runCommand( { listshards : 1 } )
如果列出了以上二个你加的shards,表示shards已经配置成功

2.6数据库分片以及Collecton分片

1、激活数据库分片

命令:
> db.runCommand( { enablesharding : “” } );
通过执行以上命令,可以让数据库跨shard,如果不执行这步,数据库只会存放在一个shard,一旦激活数据库分片,数据库中不同的collection将被存放在不同的shard上,但一个collection仍旧存放在同一个shard上,要使单个collection也分片,还需单独对collection作些操作

2、Collection分片

要使单个collection也分片存储,需要给collection指定一个分片key,通过以下命令操作:
> db.runCommand( { shardcollection : “”,key : });
注:
a. 分片的collection系统会自动创建一个索引(也可用户提前创建好)
b. 分片的collection只能有一个在分片key上的唯一索引,其它唯一索引不被允许
One note: a sharded collection can have only one unique index, which must exist on the shard key. No other unique indexes can exist on the collection.

2.7分片collection例子

>db.runCommand( { shardcollection : “test.c1″,key : {id: 1} } )
>for (var i = 1; i <= 200003; i++) db.c1.save({id:i,value1:”1234567890″,value2:”1234567890″,value3:”1234567890″,value4:”1234567890″});
> db.c1.stats()(该命令可以查看表的存储状态)

时间: 2024-11-03 22:36:20

Mongodb集群部署ReplicaSet+Sharding -摘自网络的相关文章

MongoDB集群部署(副本集模式)

一.需求背景1.现状描述(1).针对近期出现的mongodb未授权的安全问题,导致mongodb数据会被非法访问.应安全平台部的要求,需要对所有mongodb进行鉴权设置,目前活动侧总共有4台,用于某XX产品: (2).某XX产品用到4台mongodb,属于2015年机房裁撤的范围: (3).早期的4台mongodb采用是的M1机型,同时在架构上采取了路由分片的模式.从目前来看,无论是数据量上,还是访问量上,都比较小,在资源上有点浪费,在架构上属于过早设计. 而本次新建的mongodb集群,采用

Mongodb集群部署以及集群维护命令

Mongodb集群部署以及集群维护命令 http://lipeng200819861126-126-com.iteye.com/blog/1919271 mongodb分布式集群架构及监控配置 http://freeze.blog.51cto.com/1846439/884925/ 见文中: 七.监控配置:      早在去年已经出现MongoDB和Redis的Cacti模板,使用它,你可以对你的MongoDB和Redis服务进行流量监控.cacti的模板一直在更新,若企业已经用到nosql这种

阿里项目的高可用Mongodb集群部署

数据副本 MongoDB中的一组副本是一群mongod进程,这些进程维护同样的数据集.副本集提供了冗余和高可用性,是生产环境部署的基础. 数据冗余和可用性 通过在不同的服务器上存储相同的数据,副本机制保证了一定程度的容错,即在一个数据库挂掉后,数据服务仍然可用. 在某些情况下,副本可以提升数据的读性能,因为用户可以从不同的数据库读取数据.在不同的数据中心维护数据的拷贝,能够提高分布式应用程序的可用性.也可以维护额外的副本用于其他的目的,比如灾难恢复,告警或者是备份. Mongo中的副本 一个Mo

MongoDB集群复制部署

简介: 本文总结了MongoDB 3.2版本的集群复制集部署步骤. 要求: •该集群中包含2个分片(shard) •每个分片都是1个副本集 •分片副本集.配置服务器都需要考虑到单机故障的情况,保证可用性 •为了减小实验数据占据磁盘空间.加快实验速度,将每个分片的mongodb服务oplogSize设置在100以下 •部署前,做好部署准备工作,记录部署架构 部署前准备工作: 根据要求,绘制出集群部署架构图,如下图所示: 两台Linux服务器,服务器版本为CentOS-6.6,为实现高可用配置两个复

手把手教你用Docker部署一个MongoDB集群

MongoDB是一个介于关系数据库和非关系数据库之间的产品,是非关系数据库当中最像关系数据库的.支持类似于面向对象的查询语言,几乎可以实现类似关系数据库单表查询的绝大部分功能,而且还支持对数据建立索引.本文介绍了如何使用Docker搭建MongoDB集群. 本文我会向大家介绍如何使用Docker部署一个MongoDB集群,具体如下: 2.6.5版本的MongoDB 有3个节点的副本集(Replica set) 身份验证 持久化数据到本地文件系统 首先要准备三个运行的Docker服务器,这意味着你

在CentOS6.6上以replSet方式部署MongoDB集群

部署方式在3台centos6.6系统上以Replica Set方式部署mongodb3.0.2集群. 官方参考资料: http://docs.mongodb.org/manual/tutorial/deploy-replica-set/ http://docs.mongodb.org/manual/tutorial/install-mongodb-on-red-hat/ 集群的IP地址分配# node01: 192.168.35.173(PRIMARY node)# node02: 192.16

在Docker中安装和部署MongoDB集群

在Docker中安装mongodb 采用的mongodb镜像:https://registry.hub.docker.com/u/tutum/mongodb/ 以该镜像启动一个容器(注意此时mongodb是standalone模式): docker run -d --name=mongodb -p 27017:27017 -p 28017:28017 tutum/mongodb:3.0 docker logs mongodb 输出信息: =============================

利用Docker部署mongodb集群--分片与副本集

环境 Docker version 1.6.2  mongodb 3.0.4 第一步  编写Dockerfile并生成镜像 主意包含两个Dockerfile镜像,一个mongod的,一个mongos(在集群中负责路由) 编写Mongod的Dockerfile: FROM ubuntu:14.04 RUN apt-key adv --keyserver hkp://keyserver.ubuntu.com:80 --recv 7F0CEB10 ENV MONGO_MAJOR 3.0 RUN ech

mongodb集群搭建

mongodb集群有三种方式 1,主从模式,类似mysql master slave方式. 2,副本集模式,其实是一主多从,如果主节点挂掉,会重新在从节点选取一台为主节点. 3,分片模式,针对大数据量,高负载情况. 从图中可以看到有四个组件:mongos.config server.shard.replica set. mongos,数据库集群请求的入口,所有的请求都通过mongos进行协调,不需要在应用程序添加一个路由选择器,mongos自己就是一个请求分发中心,它负责把对应的数据请求请求转发