vlambda博客
学习文章列表

互联网项目之Mongodb集群搭建与业务场景讨论

     MongoDB是一个基于分布式的文件存储数据库,非关系型,不支持SQL查询,由C++语言编写,旨在为应用提供可扩展的高性能数据存储解决方案。它是非关系数据库当中功能最丰富,最像关系数据库的。它支持的数据结构非常松散,是类似jsonbson格式,因此可以存储比较复杂的数据类型。Mongo最大的特点是它支持的查询语言非常强大,其语法有点类似于面向对象的查询语言,几乎可以实现类似关系数据库单表查询的绝大部分功能,而且还支持对数据建立索引。

 

       我们今天一起了解,如何搭建MongoDB的集群。

 

       物料清单:

       3台服务器,操作系统是Centos 7.xIP分别是:

       192.168.92.17

       192.168.92.18

       192.168.92.19

  MongoDB版本:mongodb-linux-x86_64-rhel70-4.2.1.tgz

 

下载地址https://fastdl.mongodb.org/linux/mongodb-linux-x86_64-rhel70-4.2.1.tgz



       下面我们开始部署Mongodb,如下表格中是部署规划:

 

服务器

复制集进程

mongodb

分片进程

shard1

分片进程

shard2

分片进程

shard3

路由进程

mongos

192.168.92.17

27001

27011

27012

27013

27021

192.168.92.18

27001

27011

27012

27013

27021

192.168.92.19

27001

27011

27012

27013

27021

 

 一、准备工作

      三台机器同时执行同样动作

     下载:

mkdir -p /software/mongodbcd /software/mongodb
wget https://fastdl.mongodb.org/linux/mongodb-linux-x86_64-rhel70-4.2.1.tgz


     解压与安装


tar -xzvf mongodb-linux-x86_64-rhel70-4.2.1.tgzcd mongodb-linux-x86_64-rhel70-4.2.1
mkdir -p /usr/local/mongodbmkdir -p /usr/local/mongodb/confmkdir -p /usr/local/mongodb/datamkdir -p /usr/local/mongodb/logscp -rf ./* /usr/local/mongodb/


    设置系统环境


#将如下行加入到/etc/profile的最后一行export PATH=$PATH:/usr/local/mongodb/bin


    刷新系统环境


source /etc/profile


二、制作MongoDB安全认证文件和启动配置文件


  3台服务器,都放一份一样的配置文件,都是一样的文件路径。


    我们一次性的把MongoDB的安全认证文件和配置文件制作到位:


    制作安全认证文件:

    在17这台机器上操作,你也可以用其他机器制作。

cd /usr/local/mongodb/conf
openssl rand -base64 175 > ./mongodb_keyfile#注意,上面的加盐随机数有限制。


    把这个mongodb_keyfile复制到其他两台机器的conf目录

    具体是:/usr/local/mongodb/conf


    制作Mongodb复制进程的启动文件:

文件名:config.conf

存放目录:/usr/local/mongodb/conf/

dbpath=/usr/local/mongodb/data/
logpath=/usr/local/mongodb/logs/config.logkeyFile=/usr/local/mongodb/conf/mongodb_keyfileport=27001logappend=truefork=truemaxConns=10240replSet=configsconfigsvr=true#允许任意IP连接bind_ip=0.0.0.0


   制作shard进程的启动文件:

文件名:shard1.conf

存放目录:/usr/local/mongodb/conf/

dbpath=/usr/local/mongodb/data/shard1logpath=/usr/local/mongodb/logs/shard1.logkeyFile=/usr/local/mongodb/conf/mongodb_keyfileport=27011logappend=truefork=truemaxConns=10240shardsvr=truereplSet=shard1bind_ip=0.0.0.0


文件名:shard2.conf

存放目录:/usr/local/mongodb/conf/

dbpath=/usr/local/mongodb/data/shard2logpath=/usr/local/mongodb/logs/shard2.logkeyFile=/usr/local/mongodb/conf/mongodb_keyfileport=27012logappend=truefork=truemaxConns=10240shardsvr=truereplSet=shard2bind_ip=0.0.0.0



文件名:shard3.conf

存放目录:/usr/local/mongodb/conf/

dbpath=/usr/local/mongodb/data/shard3logpath=/usr/local/mongodb/logs/shard3.logkeyFile=/usr/local/mongodb/conf/mongodb_keyfileport=27013logappend=truefork=truemaxConns=10240shardsvr=truereplSet=shard3bind_ip=0.0.0.0


文件名:mongos.conf

存放目录:/usr/local/mongodb/conf/

logpath=/usr/local/mongodb/logs/mongos.loglogappend = truekeyFile=/usr/local/mongodb/conf/mongodb_keyfileport=27021fork=truemaxConns=10240bind_ip=0.0.0.0configdb = configs/192.168.92.17:27001,192.168.92.18:27001,192.168.92.19:27001


上述中配置文件为如以下列表:

config.conf

mongodb_keyfile

mongos.conf

shard1.conf

shard2.conf

shard3.conf


3台服务器,都放一份一模一样的配置文件。


三、配置MongoDB集群:


1、启动并配置数据复制集进程


#三台都启动mongod -f /usr/local/mongodb/conf/config.conf


#在17上以客户端连接mongodb数据复制集进程mongo --host 127.0.0.1 --port 27001


#连接后,执行以下命令,初始化复制集use admin
rs.initiate({_id:"configs",members:[{_id:0,host:"192.168.92.17:27001"},{_id:1,host:"192.168.92.18:27001"}, {_id:2,host:"192.168.92.19:27001"}]})


#查看状态#重点,要看到有 "ok" : 1, 字样,你得确认你的操作是有效的。
rs.status()


2、添加两个账户,后面用得着。

#在17上以客户端连接mongodb数据复制集进程mongo --host 127.0.0.1 --port 27001use admindb.createUser(     user:"admin",     pwd:"xxxxxx",     roles:[{role:"userAdminAnyDatabase",db:"admin"}] ); db.createUser( { user: "root", pwd: "xxxxxx", roles: [ { role: "root", db: "admin" } ] });



3、启动并配置数据分片进程shard


#启动三台服务器上的分片进程shard,每台服务器有3个mongod -f /usr/local/mongodb/conf/shard1.confmongod -f /usr/local/mongodb/conf/shard2.confmongod -f /usr/local/mongodb/conf/shard3.conf


#在17上连接分片进程shard1#只用在17这一台机器上连接即可#如果提示需要验证,就使用root账户验证
mongo --host 127.0.0.1 --port 27011use admin
#初始化shard1rs.initiate({_id:"shard1",members:[{_id:0,host:"192.168.92.17:27011"},{_id:1,host:"192.168.92.18:27011"},{_id:2,host:"192.168.92.19:27011"}]})


#查看状态是否为 OKrs.status()


#在17上连接分片进程shard2

#只用在17这一台机器上连接即可#如果提示需要验证,就使用root账户验证

mongo --host 127.0.0.1 --port 27012use admin

#初始化shard2rs.initiate({_id:"shard2",members:[{_id:0,host:"192.168.92.17:27012"},{_id:1,host:"192.168.92.18:27012"},{_id:2,host:"192.168.92.19:27012"}]})


#查看状态是否为 OKrs.status()


#在17上连接分片进程shard3

#只用在17这一台机器上连接即可#如果提示需要验证,就使用root账户验证

mongo --host 127.0.0.1 --port 27013use admin

#初始化shard3rs.initiate({_id:"shard3",members:[{_id:0,host:"192.168.92.17:27013"},{_id:1,host:"192.168.92.18:27013"},{_id:2,host:"192.168.92.19:27013"}]})


#查看状态是否为 OKrs.status()


4、启动并配置MongoDB数据路由进程mongos


#启动三台服务器上的数据路由进程mongos,每台服务器有1个mongos -f /usr/local/mongodb/conf/mongos.conf


#在17上连接路由进程mongos

#只用在17这一台机器上连接即可#如果提示需要验证,就使用root账户验证

mongo --host 127.0.0.1 --port 27021use admin

#为路由进程添加分片信息


#添加分片1sh.addShard("shard1/192.168.92.17:27011,192.168.92.18:27011,192.168.92.19:27011")


#添加分片2sh.addShard("shard2/192.168.92.17:27012,192.168.92.18:27012,192.168.92.19:27012")


#添加分片3sh.addShard("shard3/192.168.92.17:27013,192.168.92.18:27013,192.168.92.19:27013")


#查看状态是否为 OKrs.status()


四、功能性测试


#在17上连接路由进程mongos

#只用在17这一台机器上连接即可#如果提示需要验证,就使用admin账户验证

mongo --host 127.0.0.1 --port 27021use admin

#为路由进程添加分片信息show dbs#为测试修改块大小,后续可以改为128、256、512、1024等
use config
db.setting.save({"_id":"chunksize","value":1})#使用数据集test1,并写入大量数据use test1
for(i=1;i<=100000;i++){db.user.insert({"id":i,"portuser":"Andy"+i})}#为数据集test1分片
sh.enableSharding("test1")#为数据集test1以id建立索引db.user.createIndex({"id":1})#根据索引,为数据分片sh.shardCollection(test1.user",{"id":1})#查看数据分片的情况
sh.status()

#注意:查看状态这个命令要勤使用,对于输出的信息一定要仔细看。


五、破坏性测试


1、重启一台服务器操作系统。

2、重启两台服务器操作系统。


分别查看集群的可用性情况。


六、硬件建议

  MongoDB作为一个对内存需求很大的非关系型数据库,生产环境建议内存约为数据集大小的两倍,假设容量设计数据集为300G,建议物理机内存为512G以配合业务增长,内存频率越高越好,方便数据全内存运行以获得高速写读IO,操作系统选择linux的精简版,并进行优化以提高性能,硬盘选SSD-RAID10或者SAS-15K-RAID10都可以,CPU以多核心高主频为好。


七、业务场景

  用MongoDB存对象的很多,譬如新闻类、论坛类的项目用来存文章标题、内容、图片等等,再用Cache做缓存,也有用来存结构灵活的日志数据、跟踪数据等,也有一些项目用来存类型单一的数据配合Mysql做业务。


八、其他

  个人认为MongoDB的集群搭建过程步骤稍多,比较容易的方法自己是写个工具实现自动化部署,另外,在易用性方面有些欠缺。

   如果您在搭建MongoDB集群的过程中有任何困难,欢迎联系。

   如果上述行文过程中观点有误,欢迎您联系指正,提前致谢!



 

欢迎大家参与技术讨论。

“运维沙龙”现征集技术文章,

因为会以您的名义发布,所以请您署上您的名字。

(当然您也可以选择匿名)。

也可以带上您的照片和简历,只为更方便分享技术经验。

来稿请邮件发送到:[email protected]

或者加QQ好友:77810419

谢谢您的支持!技术世界有您真好!





文章来源于网友投稿、网络转载、自写自撰等,

如果有争议请联系。