mongodb集群(Replica Sets+Sharding)

原创 2014年11月07日 10:55:55
Shard:
   使用replica sets,确保每个数据结点都具有备份、自动容错转移、自动恢复能力。
Config:
   使用3个配置服务器,确保元数据完整性;
Route:

使用3个路由进程,实现负载均衡,提高客户端接入性能;


开放的端口如下:

主机

IP

服务及端口

Server A

10.200.3.116

mongod shard11:27017
mongod shard21:27018
mongod config1:20000
mongs1:30000

Server B

10.200.3.117

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

Server C

10.200.3.118

mongod shard13:27017
mongod shard23:27018
mongod config3:20000
mongs3:30000



首先将3台服务器时间保证一致性。


安装mongodb
先给serverA、serverB、serverC安装mongodb:
cd /usr/local/src
tar -zxvf mongodb-linux-x86_64-2.6.4.tgz
mv mongodb-linux-x86_64-2.6.4 /usr/local/mongodb264
ln -s  /usr/local/mongodb264/bin/* /usr/sbin



创建数据目录:
在serverA上:
mkdir -p /mongodb/db/shard11
mkdir -p /mongodb/db/shard21
mkdir -p /mongodb/config
mkdir -p /var/log/mongodb


在serverB上:
mkdir -p /mongodb/db/shard12
mkdir -p /mongodb/db/shard22
mkdir -p /mongodb/config
mkdir -p /var/log/mongodb


在serverC上:
mkdir -p /mongodb/db/shard13
mkdir -p /mongodb/db/shard23
mkdir -p /mongodb/config
mkdir -p /var/log/mongodb

配置复制集(replica sets):


配置shard1所用到的replica sets:
在serverA上:

#/usr/local/mongodb264/bin/mongod --shardsvr --replSet shard1 --port 27017 --maxConns 20000 --dbpath /mongodb/db/shard11  --oplogSize 4096 --logpath /var/log/mongodb/shard11.log --logappend --fork

在serverB上:

/usr/local/mongodb264/bin/mongod --shardsvr --replSet shard1 --port 27017 --maxConns 20000 --dbpath /mongodb/db/shard12 --oplogSize 4096 --logpath /var/log/mongodb/shard12.log --logappend   --fork

在serverC上:

/usr/local/mongodb264/bin/mongod --shardsvr --replSet shard1 --port 27017 --maxConns 20000 --dbpath /mongodb/db/shard13 --oplogSize 4096 --logpath /var/log/mongodb/shard13.log --logappend   --fork


用mongo连接其中一台机器的27017端口的mongod,初始化replica sets “shard1”:

#source  /etc/profile

# mongo --port 27017

config={_id:'shard1',members:[
... {_id:0,host:'10.200.3.116:27017',priority:3},
... {_id:1,host:'10.200.3.117:27017',priority:1},
... {_id:2,host:'10.200.3.118:27017',priority:2}]
... }
{
	"_id" : "shard1",
	"members" : [
		{
			"_id" : 0,
			"host" : "10.200.3.116:27017",
			"priority" : 3
		},
		{
			"_id" : 1,
			"host" : "10.200.3.117:27017",
			"priority" : 1
		},
		{
			"_id" : 2,
			"host" : "10.200.3.118:27017",
			"priority" : 2
		}
	]
}
> rs.initiate(config)
{
	"info" : "Config now saved locally.  Should come online in about a minute.",
	"ok" : 1
}
> exit



配置shard2所用到的replica sets:

在serverA上:
#/usr/local/mongodb264/bin/mongod --shardsvr --replSet shard2 --port 27018 --maxConns 20000 --dbpath /mongodb/db/shard21  --oplogSize 4096 --logpath /var/log/mongodb/shard21.log --logappend    --fork

在serverB上:

#/usr/local/mongodb264/bin/mongod --shardsvr --replSet shard2 --port 27018 --maxConns 20000 --dbpath /mongodb/db/shard22 --oplogSize 4096 --logpath /var/log/mongodb/shard22.log --logappend   --fork

在serverC上:

/usr/local/mongodb264/bin/mongod --shardsvr --replSet shard2 --port 27018 --maxConns 20000 --dbpath /mongodb/db/shard23/ --oplogSize 4096 --logpath /var/log/mongodb/shard23.log --logappend   --fork

用mongo连接其中一台机器的27018端口的mongod,初始化replica sets “shard2”:

#source  /etc/profile

#mongo --port  27018

> config={_id:'shard2',members:[
...  {_id:0,host:'10.200.3.116:27018',priority:1},
...  {_id:1,host:'10.200.3.117:27018',priority:3},
...  {_id:2,host:'10.200.3.118:27018',priority:2}]
... }
{
	"_id" : "shard2",
	"members" : [
		{
			"_id" : 0,
			"host" : "10.200.3.116:27018",
			"priority" : 1
		},
		{
			"_id" : 1,
			"host" : "10.200.3.117:27018",
			"priority" : 3
		},
		{
			"_id" : 2,
			"host" : "10.200.3.118:27018",
			"priority" : 2
		}
	]
}
> rs.initiate(config)
{
	"info" : "Config now saved locally.  Should come online in about a minute.",
	"ok" : 1
}
>exit


配置3台config server:
分别在serverA、serverB、serverC上执行:

#/usr/local/mongodb264/bin/mongod --configsvr --dbpath /mongodb/config --port 20000 --logpath /var/log/mongodb/config.log --logappend  --fork

配置3台route process:

分别在serverA、serverB、serverC上执行:

#/usr/local/mongodb264/bin/mongos --configdb 10.200.3.116:20000,10.200.3.117:20000,10.200.3.118:20000 --port 30000 --chunkSize 64 --logpath /var/log/mongodb/mongos.log --logappend  --fork



配置shard cluster(集群)

连接到其中一台服务器的30000的mongos进程,并切换到admin数据库做一下配置

#mongo --port 30000

mongos> use admin
switched to db admin
mongos> db.runCommand({addshard:"shard1/10.200.3.116:27017,10.200.3.117:27017,10.200.3.118:27017"});
{ "shardAdded" : "shard1", "ok" : 1 }
mongos>db.runCommand({addshard:"shard2/10.200.3.116:27018,10.200.3.117:27018,10.200.3.118:27018"});
{ "shardAdded" : "shard2", "ok" : 1 }
激活数据库及集合的分片:
mongos> db.runCommand({enablesharding:"mouyu"})    ####激活mouyu库的分片
{ "ok" : 1 }
mongos> db.runCommand({shardcollection:"mouyu.t1",key:{_id:1}})   ####给mouyu库的t1表分片
{ "collectionsharded" : "mouyu.t1", "ok" : 1 }


至此,mongod集群就部署完毕,接下来的是一些补充内容。



测试分片是否成功:
由于在启动mongos的时候-chunkSize值设置的是64M,所以要数据满64M的时候才会分片,为了直观的看到效果,实验的时候可以将这个值改为1M,然后往mouyu库的t1表插入数据,观看效果。
插入表方法:
mongos> use mouyu;
mongos> for(i=1;i<=100000;i++) db.t1.save({_id:i,name:"aaabbbcccdddeeeeffffff"+i})
mongos>sh.status();    ##查看chunks项是不是有两个shard,如果是就ok了



为了便于管理,在每台服务器上写好启动脚本:
在serverA上:

#cd /usr/local/mongodb264/

#vim shard11_start.sh

/usr/local/mongodb264/bin/mongod  --shardsvr --replSet shard1 --port 27017 --maxConns 20000 --dbpath /mongodb/db/shard11  --oplogSize 4096 --logpath /var/log/mongodb/shard11.log --logappend   --fork

#vim shard21_start.sh

/usr/local/mongodb264/bin/mongod --shardsvr --replSet shard2 --port 27018 --maxConns 20000 --dbpath /mongodb/db/shard21  --oplogSize 4096 --logpath /var/log/mongodb/shard21.log --logappend   --fork

#vim config_start.sh

/usr/local/mongodb264/bin/mongod --configsvr --dbpath /mongodb/config --port 20000 --logpath /var/log/mongodb/config.log --logappend   --fork

#vim mongos_start.sh

/usr/local/mongodb264/bin/mongos --configdb 10.200.3.116:20000,10.200.3.117:20000,10.200.3.118:20000 --port 30000 --chunkSize 64 --logpath /var/log/mongodb/mongos.log --logappend   --fork


给这几个脚本赋予可执行权限,注意启动顺序为: sh shard11_start.sh--- sh shard21_start.sh---sh config_start.sh----sh  mongos_start.sh


最后在serverB和serverC上执行类似的操作。


Mongodb优化:
1、Vim  /etc/profile
echo "0" > /proc/sys/vm/zone_reclaim_mode
/sbin/blockdev --setra  64 /dev/sdb (实际存放mongodb数据库的磁盘)
2、vim /etc/sysctl.conf
vm.swappiness = 0(将值改为0,不让使用交换分区)
3、连接池默认stack size为10240,意思就是每个连接需要使用10M,如果连接数多了,会相当的耗内存,所以调整为每个连接使用1M。
  Vim  /etc/profile.d/app.sh
  ulimit -SHs 1024
常用命令
       查看复制集信息
rs.status()  
   查看复制集优先级
rs.config()   
查看数据库
show dbs;
切换/创建数据库
use db1;
删除当前使用的数据库
db.dropDatabase();
查看集合
show collections;
看当前使用的数据库
db.getName();
db
显示当前db状态
db.stats();
当前db版本
db.version();
创建集合
db.createCollection("coll_1");
查看当前数据库的集合
show collections;
添加数据(若存在主键,insert()不做操作,而save()则更改原来的内容为新内容)
db.coll_1.insert({age:1, name:"aaa"});
db.coll_1.save({age:1, name:"aaa"});
删除数据
db.coll_1.remove({})
修改数据
db.coll_1.update({"id":"aaa"}, {"name","abcdefg"}, false,true)
查询集合中的数据
db.coll_1.find({"age":{"$gt":60}});
db.coll_1.count(); 














修改复制集优先级(在主库上操作)
conf=rs.conf()
conf.members[0].priority=3
conf.members[1].priority=2
conf.members[2].priority=1
conf.members[3].priority=0.5
rs.reconfig(conf)




管理维护sharding:
1.       列出所有的shard server
> db.runCommand({ listshards: 1 })
2.  查看sharding信息:
>printShardingStatus()
3.  判断是否sharding:
    >db.runCommand({ isdbgrid:1 })
4.查看分片信息
  >sh.status();





Mongodb高可用架构—Replica Set 集群实战

Replica Set使用的是n个mongod节点,构建具备自动的容错功能(auto-failover),自动恢复的(auto-recovery)的高可用方案。 使用Replica Set来实现...
  • huaishu
  • huaishu
  • 2013年07月05日 16:47
  • 13745

Mongodb设置Replica Set集群 并使用PHP来连接

Mongodb之前一直是做主从模式,后来官方推荐用Replica Set(简称RS)来代替主从,主要是当primary节点出现故障后,会自动连接secondary节点,并且选为新的primary节点,...
  • ddjohn
  • ddjohn
  • 2015年08月25日 11:22
  • 2753

mongodb 最新版本高可用解决方案-replica sets副本集部署详细过程

Mongodb副本集:NoSQL的产生就是为了解决大数据量、高扩展性、高性能、灵活数据模型、高可用性。但是光通过主从模式的架构远远达不到上面几点,由此MongoDB设计了副本集和分片的功能,先来用用副...
  • mchdba
  • mchdba
  • 2016年06月11日 21:17
  • 11966

采用Replica Sets + Sharding方式搭建MongoDB高可用集群

3.搭建 3.1环境准备   在 Mongo 的官网下载 Linux 版本安装包,然后解压到对应的目录下;由于资源有限,我们采用 Replica Sets + Sharding 方...
  • xincai
  • xincai
  • 2017年04月19日 13:55
  • 337

mongodb分片集群(sharding with replica set)配置

一共有4台机器,各自挂接一个存储,希望实现:尽量节约存储高可用性存储大量数据配置方案:每一台机器做一个分片的主数据库每一台机器做一个分片的后备数据库每一台机器做一个分片的仲裁服务两个两个一组交叉作对方...
  • kindy1022
  • kindy1022
  • 2011年06月15日 17:11
  • 585

Mongodb集群配置(sharding with replica set)

长期以来我就对分布式系统原理与实践非常感兴趣,对于Mongodb我一直很好奇,最近终于有时间能动手实验一把!我在一台Windows机器下搭建了一个 Replica Sets + Sharding 测试...
  • zhangzhaokun
  • zhangzhaokun
  • 2011年03月22日 23:19
  • 16179

转:mongodb分片集群(sharding with replica set)配置

一共有4台机器,各自挂接一个存储,希望实现:尽量节约存储高可用性存储大量数据配置方案:每一台机器做一个分片的主数据库每一台机器做一个分片的后备数据库每一台机器做一个分片的仲裁服务两个两个一组交叉作对方...
  • yuanxuran0101
  • yuanxuran0101
  • 2011年02月18日 20:52
  • 1210

MongoDB管理与开发精要《红丸出品》23 结合应用Replica Sets + Sharding

第二十三章 Replica Sets + Sharding MongoDB Auto-Sharding 解决了海量存储和动态扩容的问题,但离实际生产环境所需的高可靠、高可用还有些距离,所以有了” R...
  • cdhongwan
  • cdhongwan
  • 2012年06月23日 18:30
  • 1016

利用Mongodb的复制集搭建高可用分片,Replica Sets + Sharding的搭建过程

参考资料 reference:  http://mongodb.blog.51cto.com/1071559/740131  http://docs.mongodb.org/manual/tutori...
  • libing13810124573
  • libing13810124573
  • 2016年05月25日 15:36
  • 566

MongoDB学习之旅三十:Replica Sets + Sharding

MongoDB Auto-Sharding 解决了
  • u013339851
  • u013339851
  • 2014年04月21日 16:46
  • 919
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:mongodb集群(Replica Sets+Sharding)
举报原因:
原因补充:

(最多只允许输入30个字)