冰禹的博客

技术源于实践,记录学习的轨迹

mongodb集群(Replica Sets+Sharding)
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
个人分类: DEBIAN-nosql
想对作者说点什么? 我来说一句

没有更多推荐了,返回首页

不良信息举报

mongodb集群(Replica Sets+Sharding)

最多只允许输入30个字

加入CSDN,享受更精准的内容推荐,与500万程序员共同成长!
关闭
关闭