MongoDB集群搭建[记录]

这段时间正好在做业务架构的调整,由于用户量持续的增长,原有的Mysql(AWS RDS)扩展也比较麻烦,对于分库分表需要业务代码的调整或者增加中间件(DBProxy),而且我们的业务也没有要求事务性,所以考虑采用Nosql数据库。其中有几点我们比较关注的:

1、Schema-free.大家用过Mysql或关系型数据的都知道,当数据量很大的时候对于表结构的修改会头疼的。

有相关的中间件在Mysql上层,可以做到Schema-free。

2、良好的横向扩展性。无需任何修改,添加机器自动可以扩容,分布式集群的特性。

也有相关的中间件在Mysql上层,或D-Mysql。

3、复杂的查询和统计相关的查询,能够更快的得到查询数据。

Mysql本身不支持,但可以通过其他服务实现,比如Solr ES等等。

当然,Mongodb是要烧内存的,Mysql将所有的数据缓存到内存查询性能也很强筋,换成SSD也会提高性能。

Mongodb也占用更多的磁盘空间,会有很多碎片存在。因为是Schema-free,所以数据保存的同时字段也需要保存,所以它是BSON格式存储。

下面记录一下整理的Mongodb分布式(shard)集群(Master-Slave)的搭建

Mongodb集群搭建

  1. 准备机器。
    1. 6台主节点的机器Master(master-server-1,master-server-2…)
    2. 3台配置服务器和路由的机器Config(config-server-1,config-server-2,config-server-3)
    3. 6台复制节点的机器Slave(slave-server-1,slave-server-2…)
    4. 其中Master机器和Slave机器统称为shard机器
  2. 在每台机器上安装mongodb-org(包含完整工具包)
  3. 在每台机器上建立mongodb对应的数据目录和配置目录(以下创建的目录所属用户都是mongod)
    1. mkdir -p /data/mongo
    2. mkdir -p /etc/mongo
    3. mkdir -p /var/run/mongo
  4. 在每台Master机器上建立对应的分片目录(这里我们在每台Master机器创建shard目录,按照序号创建。例如master-server-1 机器创建shard1目录,master-server-2机器创建shard2目录…)
    1. mkdir -p /data/mongo/shard1/data
    2. mkdir -p /data/mongo/shard1/log
  5. 在每台Slave机器上建立对应的分片目录(我们确定每个分片有两个复制,一个是数据备份,另外一个作为仲裁节点,分别部署在两台服务器上。例如slave-server-1启用两个实例,其中一个是shard1的数据复制,另一个是shard2的仲裁节点,其它分别设定…)
    1. mkdir -p /data/mongo/shard1/data
    2. mkdir -p /data/mongo/shard1/log
    3. mkdir -p /data/mongo/shard2/data
    4. mkdir -p /data/mongo/shard2/log
  6. 在每台Config机器上建立config目录和mongos目录。
    1. mkdir -p /data/mongo/config/data
    2. mkdir -p /data/mongo/config/log
    3. mkdir -p /data/mongo/mongos/log
  7. 规划各个组件的端口。
    1. mongos使用端口20000
    2. config server使用端口21000
    3. shard1使用端口22001、shard2使用端口22002、shard3使用端口22003。。。以此类推
  8. 在各个分片节点(包括master和slave)创建分片配置,下面举例shard1,其它shard类似。
    1. vim /etc/mongo/shard1.conf
    2. pidfilepath=/var/run/mongo/shard1.pid
    3. port=22001
    4. replSet=shard1
    5. dbpath=/data/mongo/shard1/data
    6. logpath=/data/mongo/shard1/log
    7. fork=true
    8. nojournal=true
    9. shardsvr=true
  9. 在每个Config机器上创建config配置文件和mongos配置文件。
    1. vim /etc/mongo/config.conf
    2. pidfilepath=/var/run/mongo/config.pid
    3. configsvr=true
    4. dbpath=/data/mongo/config/data
    5. port=21000
    6. logpath=/data/mongo/config/log
    7. fork=true
    8. vim /etc/mongo/mongos.conf
    9. pidfilepath=/var/run/mongo/mongos.pid
    10. port=20000
    11. logpath=/data/mongo/mongos/log
    12. fork=true
    13. configdb=config-server-1:21000,config-server-2:21000,config-server-3:21000
  10. 在config服务器上启动配置服务器和mongos服务器(注意以mongod用户运行)
    1. mongod -f /etc/mongo/config.conf
    2. mongos -f /etc/mongo/mongos.conf
  11. 分别在shard服务器上启动分片或复制集
    1. mongod -f /etc/mongo/shard1.conf
    2. mongod -f /etc/mongo/shard2.conf
    3. 分别启动shard1,shard2,shard3…
  12. 分别对每个分片配置复制集,例如对shard1配置复制集
    1. mongo —port 22001
    2. use admin
    3. config = { _id: “shard1″, members: [ {_id: 0, host: “master-server-1:22001”}, {_id: 1, host: “slave-server-1:22001”}, {_id: 2, host: “slave-server-2:22001”, arbiterOnly: true} ]   //arbiterOnly仲裁节点
    4. rs.initiate(config)
    5. 分别设置shard1,shard2,shard3…
  13. 配置分片,将六个分片分别添加到集群
    1. mongo —port 20000
    2. use admin
    3. db.runCommand( { addShard : “shard1/shard1-master, shard1-slave, shard1-arbiter” } )
    4. db.runCommand( { addShard : “shard2/shard2-master, shard2-slave, shard2-arbiter” } )
    5. 分别添加shard1,shard2,shard3…
    6. 可以查看分片服务器的配置信息
    7. db.runCommand( { listshards : 1 } )
  14. 指定数据库、指定集合分片生效(这里数据库为testdb,集合是table1)
    1. mongo —port 20000
    2. db.runCommand( { enablesharding : “testdb”} )
    3. db.runCommand( { shardcollection : “testdb.table1”,  key : { id : 1 } } ) //根据ID自动分片

发表评论

电子邮件地址不会被公开。 必填项已用*标注