mongodb集群(一)——搭建

1.前言

之前有一篇博客是介绍了搭建mongodb的replica set集群的。
这次系列将会对mongodb做一个更为详细的介绍,这篇主要讲的是mongodb数据分片集群的搭建。

分片(sharding)、副本集(replication)与分布式文件系统(比如 hbase)的区别

  • 副本集集群中的每一个节点的数据都是相同的,有一个primary,1~7个secondary,数据写入primary节点后会同步给所有的备份节点,可以很方便地作读写分离。还有一个可选的arbitary节点,当primary节点宕机后,由arbitary节点从secondary中选出新的primary节点。如果没有arbitary,则由所有secondary节点共同决定下一个primary节点。
  • 数据分片集群中,每一个数据节点存的数据都是不同的,互作补充。由预先定义的字段或者组合字段作为分片的依据。往集群中新增分片节点,数据库会自动作数据迁移,使得存储负载尽可能平均。(某个节点挂了,部分数据访问不了怎么办,如何作数据的高可用?)
  • 分布式文件系统是文件系统,数据库是一种定义的数据存储格式。数据库的数据在文件系统中也是以多个文件的形式存储的,而文件就是存储在文件系统中的。

mongodb支持数据的分布式存储,将collection作数据分片,减少每个节点的数据负载。
每个节点可以位于不同的物理机器上,一个简单的sharding集群如下图所示(引用自mongodb官网):

三部分

  • 多个mongos节点,用作路由
  • 3个config server,记录了所有数据分片存储位置
  • n个sharding server,数据真正落地的地方

2.创建configServer

创建数据库目录

1
2
3
mkdir ~/Desktop/configdb_1
mkdir ~/Desktop/configdb_2
mkdir ~/Desktop/configdb_3

启动config server 进程

1
2
3
mongod --configsvr --dbpath  /Users/wangyue/Desktop/configdb_1 --port 9801 --fork --logpath /Users/wangyue/Desktop/configdb_1/mongod.log
mongod --configsvr --dbpath /Users/wangyue/Desktop/configdb_2 --port 9802 --fork --logpath /Users/wangyue/Desktop/configdb_2/mongod.log
mongod --configsvr --dbpath /Users/wangyue/Desktop/configdb_3 --port 9803 --fork --logpath /Users/wangyue/Desktop/configdb_3/mongod.log

3.创建mongos进程

1
mongos --configdb 127.0.0.1:9801,127.0.0.1:9802,127.0.0.1:9803 --port 9800 --fork --logpath /Users/wangyue/Desktop/mongos.log

4.添加数据分片服务器

一个数据分片可以是一个单独的mongod进程,也可以是一个副本集集群。
把数据分片节点配置成副本集在生产环境中是最常用的做法,可以保证数据分片节点一定程度的高可用。

4.1.启动3个数据分片服务器

创建数据库目录

1
2
3
mkdir mongodb_1
mkdir mongodb_2
mkdir mongodb_3

启动数据分片

1
2
3
mongod --dbpath /Users/wangyue/Desktop/mongodb_1 --port 9804 --fork --logpath /Users/wangyue/Desktop/mongodb_1/mongod.log
mongod --dbpath /Users/wangyue/Desktop/mongodb_2 --port 9805 --fork --logpath /Users/wangyue/Desktop/mongodb_2/mongod.log
mongod --dbpath /Users/wangyue/Desktop/mongodb_3 --port 9806 --fork --logpath /Users/wangyue/Desktop/mongodb_3/mongod.log

4.2.连接mongs服务器

1
2
3
4
5
mongo --host 127.0.0.1 --port 9800
# 在mongos命令行中执行:
sh.addShard("127.0.0.1:9804")
sh.addShard("127.0.0.1:9805")
sh.addShard("127.0.0.1:9806")

执行 db.stats() 可以看到详细信息:

5.启动数据分片

1
2
3
4
5
# 连接mongos
mongo --host 127.0.0.1 --port 9800
# 在mongos命令行中执行:
sh.enableSharding("test_shard")
sh.shardCollection("test_shard.collection", {"_id": "hashed"})
  • 如果不用hash分片的话填入 1, 也可以支持多个index联合作为分片的字段

6.数据插入测试

  • 插入10000个数据
1
2
3
4
5
6
7
8
9
10
11
import pymongo

client = pymongo.MongoClient('localhost', 9800)
db = client.test_shard
collection = db['collection']
# collection.drop()

for i in range(10000):
collection.insert({'value': i})

client.close()
  • 数据在节点中的分布

  • mongo客户端可以单独连接每个数据分片,作一些增删改查
    (虽然不推荐这么做,但这个特性提供了很大的可能性去做别的事情)

7.参考文献