mongodb集群化部署(sharding + replication)

说明

Mongodb是一个非关系型的分布式数据库,它可以通过自身的群集技术组成mongodb群集,进而实现数据库的横向扩展和数据库的高可用功能。Mongodb数据库群集分为Replica Sets(复制集)和Sharding(分片)两个部分。其中Replica Sets实现了mongodb数据库的高可用功能,Sharding分片实现了数据库的横向分布式扩展。在生产环境中搭建mongodb群集时一般都采取了Replica Sets+Sharding的解决方案。

Replica Sets+Sharding数据库群集包含三种角色,分别如下所示:

  • Shard:使用Replica Sets确保每个数据节点都有备份、自动容错转移、自动恢复能力
  • Config:存储元数据,确定元数据的完整性
  • Router:实现访问的负载均衡,提高客户端访问性能

mongodb集群化部署(sharding + replication)

集群节点配置

节点ip 内存 cpu 硬盘 OS
192.168.100.50 1 GB 1核 100GB centos 7.0
192.168.100.100 1 GB 1核 100GB centos 7.0
192.168.100.101 1 GB 1核 100GB centos 7.0

服务部署规划

节点ip 服务 端口 数据目录 日志目录
192.168.100.50 Mongod s1-1 27020 /home/vagrant/mongodb/s1_1/db /home/vagrant/mongodb/s1_1/log
192.168.100.50 Mongod s2-1 27021 /home/vagrant/mongodb/s2_1/db /home/vagrant/mongodb/s2_1/log
192.168.100.50 Mongod c1 27018 /home/vagrant/mongodb/config/db /home/vagrant/mongodb/config/log
192.168.100.50 Mongod s 27017 /home/vagrant/mongodb/route/log
192.168.100.100 Mongod s1-2 27020 /home/vagrant/mongodb/s1_2/db /home/vagrant/mongodb/s1_2/log
192.168.100.100 Mongod s2-2 27021 /home/vagrant/mongodb/s2_2/db /home/vagrant/mongodb/s2_2/log
192.168.100.100 Mongod c2 27018 /home/vagrant/mongodb/config/db /home/vagrant/mongodb/config/log
192.168.100.100 Mongod s 27017 /home/vagrant/mongodb/route/log
192.168.100.101 Mongod s1-3 27020 /home/vagrant/mongodb/s1_3/db /home/vagrant/mongodb/s1_3/log
192.168.100.101 Mongod s2-3 27021 /home/vagrant/mongodb/s2_3/db /home/vagrant/mongodb/s2_3/log
192.168.100.101 Mongod c3 27018 /home/vagrant/mongodb/config/db /home/vagrant/mongodb/config/log
192.168.100.101 Mongod s 27017 /home/vagrant/mongodb/route/log

mongodb采用最新稳定版3.2。

部署

部署准备

  1. 将mongodb-linux-x86_64-2.4.5.tar分别拷贝到192.168.100.50、192.168.100.100、192.168.100.101的/usr/local目录下
  2. 分别切换到三台服务器的/usr/local目录下,使用tar xvzf mongodb-linux-x86_64-2.4.5.tar将软件包解压缩到/usr/local目录下
  3. 分别在三台服务器的/usr/local目录下使用mv mongodb-linux-x86_64-2.4.5mongodb命令将文件夹重命名为mongodb
  4. 在50服务器上分别创建如下目录
mkdir -p /home/vagrant/mongodb/s1_1/db
mkdir -p /home/vagrant/mongodb/s1_1/log
mkdir -p /home/vagrant/mongodb/s2_1/db
mkdir -p /home/vagrant/mongodb/s2_1/log
mkdir -p /home/vagrant/mongodb/config/db
mkdir -p /home/vagrant/mongodb/config/log
mkdir -p /home/vagrant/mongodb/route/log
  1. 在100服务器上分别创建如下目录
mkdir -p /home/vagrant/mongodb/s1_2/db
mkdir -p /home/vagrant/mongodb/s1_2/log
mkdir -p /home/vagrant/mongodb/s2_2/db
mkdir -p /home/vagrant/mongodb/s2_2/log
mkdir -p /home/vagrant/mongodb/config/db
mkdir -p /home/vagrant/mongodb/config/log
mkdir -p /home/vagrant/mongodb/route/log
  1. 在101服务器上分别创建如下目录
mkdir -p /home/vagrant/mongodb/s1_3/db
mkdir -p /home/vagrant/mongodb/s1_3/log
mkdir -p /home/vagrant/mongodb/s2_3/db
mkdir -p /home/vagrant/mongodb/s2_3/log
mkdir -p /home/vagrant/mongodb/config/db
mkdir -p /home/vagrant/mongodb/config/log
mkdir -p /home/vagrant/mongodb/route/log

创建ReplicaSet 1

  1. 在50服务器上执行命令:
./mongod --shardsvr --replSet s1 --port 27020 --dbpath=/home/vagrant/mongodb/s1_1/db --logpath=/home/vagrant/mongodb/s1_1/log/mongo.log --logappend --fork
  1. 在100服务器上执行命令:
./mongod --shardsvr --replSet s1 --port 27020 --dbpath=/home/vagrant/mongodb/s1_2/db --logpath=/home/vagrant/mongodb/s1_2/log/mongo.log --logappend --fork
  1. 在101服务器上执行命令:
./mongod --shardsvr --replSet s1 --port 27020 --dbpath=/home/vagrant/mongodb/s1_3/db --logpath=/home/vagrant/mongodb/s1_3/log/mongo.log --logappend --fork
  1. 连接三个节点的任一个初始化复制集s1,这里以连接到50服务器的27020为例,执行下述命令:
./mongo -port 27020
use admin
config={_id:'s1',members:[{_id:0,host:'192.168.100.50:27020'},{_id:1,host:'192.168.100.100:27020'},{_id:2,host:'192.168.100.101:27020'}]}
rs.initiate(config)
// 查看s1状态
rs.status()

创建ReplicaSet 2

  1. 在50服务器上执行命令:
./mongod --shardsvr --replSet s2 --port 27021 --dbpath=/home/vagrant/mongodb/s2_1/db --logpath=/home/vagrant/mongodb/s2_1/log/mongo.log --logappend --fork
  1. 在100服务器上执行命令:
./mongod --shardsvr --replSet s2 --port 27021 --dbpath=/home/vagrant/mongodb/s2_2/db --logpath=/home/vagrant/mongodb/s2_2/log/mongo.log --logappend --fork
  1. 在101服务器上执行命令:
./mongod --shardsvr --replSet s2 --port 27021 --dbpath=/home/vagrant/mongodb/s2_3/db --logpath=/home/vagrant/mongodb/s2_3/log/mongo.log --logappend --fork
  1. 连接三个节点的任一个初始化复制集s2,这里以连接到50服务器的27021为例,执行下述命令:
./mongo -port 27021
use admin
config={_id:'s2',members:[{_id:0,host:'192.168.100.50:27021'},{_id:1,host:'192.168.100.100:27021'},{_id:2,host:'192.168.100.101:27021'}]}
rs.initiate(config)
// 查看s2状态
rs.status()

启动configserver

依次在50、100、101三台机器上执行如下命令:

./mongod --configsvr --dbpath=/home/vagrant/mongodb/config/db --port 27018 --logpath=/home/vagrant/mongodb/config/mongo.log --fork

启动routerserver

依次在50、100、101三台机器上执行如下命令:

./mongos --fork --configdb "192.168.100.50:27018,192.168.100.100:27018,192.168.100.101:27018" --logpath=/home/vagrant/mongodb/route/log/mongo.log --port 27017

创建sharding

连接任一mongos进程执行以下命令,这里以50服务器的27017为例

./mongo 192.168.100.50:27017
use admin
db.runCommand({addshard:"s1/192.168.100.50:27020,192.168.100.100:27020,192.168.100.101:27020"})
db.runCommand({addshard:"s2/192.168.100.50:27021,192.168.100.100:27021,192.168.100.101:27021"})
// 查看分片状态
db.printShardingStatus()

读写测试

连接任一mongos进程执行以下命令,这里以50服务器的27017为例

./mongo 192.168.100.50:27017
use test
for(var i=1;i<=1;i++) db.c1.save({_id:i,age:i,name:"zhangsan",addr:"beijing",host:"1234567890"});

// 对db开启sharding功能
sh.enableSharding("test")

// 对Collection建立索引
// 1表示对记录按照字典序递增排列
// -1表示对记录按照字典序递减排列
db.c1.createIndex({name: 1})

// 对Collection开启sharding功能
// 这个 name:1表示按照name字段字典序递增的顺序进行shard,同样 -1表示递减
sh.shardCollection("test.c1", {name: 1})

常见问题

please create an index that starts with the shard key before sharding

在对Collection开启sharding功能时如果没有对Collection建立索引就会报出该错误。因此正切的姿势是先创建索引,请参考上面的步骤。

为什么不能对Collection以hash方式进行sharding?

以下命令会报错:

sh.shardCollection("test.c1", {name: "hashed"})

如果要使用hash的方式来进行sharding的话,那么在创建索引的时候就要指定同样的策略,如下:

db.c2.createIndex( { name: "hashed" } )
sh.shardCollection("test.c2", {name: "hashed"})

参考

Leave a Reply

Your email address will not be published. Required fields are marked *

You may use these HTML tags and attributes: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <s> <strike> <strong>