互联网项目之Mongodb集群搭建与业务场景讨论
MongoDB是一个基于分布式的文件存储数据库,非关系型,不支持SQL查询,由C++语言编写,旨在为应用提供可扩展的高性能数据存储解决方案。它是非关系数据库当中功能最丰富,最像关系数据库的。它支持的数据结构非常松散,是类似json的bson格式,因此可以存储比较复杂的数据类型。Mongo最大的特点是它支持的查询语言非常强大,其语法有点类似于面向对象的查询语言,几乎可以实现类似关系数据库单表查询的绝大部分功能,而且还支持对数据建立索引。
我们今天一起了解,如何搭建MongoDB的集群。
物料清单:
3台服务器,操作系统是Centos 7.x,IP分别是:
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/mongodb
cd /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.tgz
cd mongodb-linux-x86_64-rhel70-4.2.1
mkdir -p /usr/local/mongodb
mkdir -p /usr/local/mongodb/conf
mkdir -p /usr/local/mongodb/data
mkdir -p /usr/local/mongodb/logs
cp -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.log
keyFile=/usr/local/mongodb/conf/mongodb_keyfile
port=27001
logappend=true
fork=true
maxConns=10240
replSet=configs
configsvr=true
#允许任意IP连接
bind_ip=0.0.0.0
制作shard进程的启动文件:
文件名:shard1.conf
存放目录:/usr/local/mongodb/conf/
dbpath=/usr/local/mongodb/data/shard1
logpath=/usr/local/mongodb/logs/shard1.log
keyFile=/usr/local/mongodb/conf/mongodb_keyfile
port=27011
logappend=true
fork=true
maxConns=10240
shardsvr=true
replSet=shard1
bind_ip=0.0.0.0
文件名:shard2.conf
存放目录:/usr/local/mongodb/conf/
dbpath=/usr/local/mongodb/data/shard2
logpath=/usr/local/mongodb/logs/shard2.log
keyFile=/usr/local/mongodb/conf/mongodb_keyfile
port=27012
logappend=true
fork=true
maxConns=10240
shardsvr=true
replSet=shard2
bind_ip=0.0.0.0
文件名:shard3.conf
存放目录:/usr/local/mongodb/conf/
dbpath=/usr/local/mongodb/data/shard3
logpath=/usr/local/mongodb/logs/shard3.log
keyFile=/usr/local/mongodb/conf/mongodb_keyfile
port=27013
logappend=true
fork=true
maxConns=10240
shardsvr=true
replSet=shard3
bind_ip=0.0.0.0
文件名:mongos.conf
存放目录:/usr/local/mongodb/conf/
logpath=/usr/local/mongodb/logs/mongos.log
logappend = true
keyFile=/usr/local/mongodb/conf/mongodb_keyfile
port=27021
fork=true
maxConns=10240
bind_ip=0.0.0.0
configdb = 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 27001
use admin
db.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.conf
mongod -f /usr/local/mongodb/conf/shard2.conf
mongod -f /usr/local/mongodb/conf/shard3.conf
#在17上连接分片进程shard1
#只用在17这一台机器上连接即可
#如果提示需要验证,就使用root账户验证
mongo --host 127.0.0.1 --port 27011
use admin
#初始化shard1
rs.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"}]})
#查看状态是否为 OK
rs.status()
#在17上连接分片进程shard2
#只用在17这一台机器上连接即可
#如果提示需要验证,就使用root账户验证
mongo --host 127.0.0.1 --port 27012
use admin
#初始化shard2
rs.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"}]})
#查看状态是否为 OK
rs.status()
#在17上连接分片进程shard3
#只用在17这一台机器上连接即可
#如果提示需要验证,就使用root账户验证
mongo --host 127.0.0.1 --port 27013
use admin
#初始化shard3
rs.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"}]})
#查看状态是否为 OK
rs.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 27021
use admin
#为路由进程添加分片信息
#添加分片1
sh.addShard("shard1/192.168.92.17:27011,192.168.92.18:27011,192.168.92.19:27011")
#添加分片2
sh.addShard("shard2/192.168.92.17:27012,192.168.92.18:27012,192.168.92.19:27012")
#添加分片3
sh.addShard("shard3/192.168.92.17:27013,192.168.92.18:27013,192.168.92.19:27013")
#查看状态是否为 OK
rs.status()
四、功能性测试
#在17上连接路由进程mongos
#只用在17这一台机器上连接即可
#如果提示需要验证,就使用admin账户验证
mongo --host 127.0.0.1 --port 27021
use 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
谢谢您的支持!技术世界有您真好!
文章来源于网友投稿、网络转载、自写自撰等,
如果有争议请联系。