您的位置:首页 > 数据库 > Mongodb

mongodb集群(Replica Sets+Sharding)

2014-11-07 10:55 363 查看
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