1 简介
1.1 简介
MongoDB 是由 C ++ 语言编写的,是一个基于分布式文件存储的开源数据库系统。在高负载的情况下,添加更多的节点,可以保证服务器性能。
MongoDB 旨在为 WEB 应用提供可扩展的高性能数据存储解决方案。
MongoDB 将数据存储为一个文档,数据结构由键值 (key=>value) 对组成。MongoDB 文档类似于 JSON 对象。字段值可以包含其他文档,数组及文档数组。
官网:https://www.mongodb.com
1.2 参考资料
https://www.jianshu.com/p/e18…
https://www.cnblogs.com/tians…
https://blog.csdn.net/weixin_…
https://blog.csdn.net/eagle89…
2 单机部署
2.1 单机部署环境
操作系统:CentOS7 +
三台服务器:192.168.90.225
安装包:mongodb-linux-x86_64-4.0.10.tgz
2.2 安装 MongoDB 单机测试
2.2.1 目录规划
mkdir /usr/local/tmp #临时目录,用于上传压缩包
mkdir /topinfo #mongodb 的安装目录
2.2.2 上传 MongoDB 安装包
上传安装包:
cd /usr/local/tmp/ # 跳转到临时目录
rz #通过 rz 上传 mongodb-linux-x86_64-4.0.10.tgz
2.2.3 安装
1、解压
tar -zxvf mongodb-linux-x86_64-4.0.10.tgz # 解压
mv mongodb-linux-x86_64-4.0.10 mongodb #重命名
mv /usr/local/tmp/mongodb /topinfo # 将解压包拷贝到指定目录
2、MongoDB 的可执行文件位于 bin 目录下,所以可以将其添加到 PATH 路径中:
vim /etc/profile
#加入以下内容
export MONGODB_HOME=/topinfo/mongodb
export PATH=$MONGODB_HOME/bin:$PATH
#保持退出后,执行以下命令,立即生效
source /etc/profile
3、环境变量验证
使用命令 mongod - v 输出信息版本信息验证环境变量是否配置成功
mongod -v
2.2.4 创建数据库目录
1、创建数据库的目录
MongoDB 的默认数据存储在跟目录 data/db 目录下,但是这个目录在安装过程不会自动创建,所以你需要手动创建 data 目录,并在 data 目录。
注意:data/db 是 MongoDB 默认的启动的数据库路径。如果你的数据库目录不是 /data/db,可以通过 –dbpath 来指定。(mongod –dbpath /usr/local/mongo/data)
如果是不是分片,则可以暂时不需要创建数据库的目录。后续在分配中创建。
mkdir -p /topinfo/mongodb/data # 创建数据库数据目录
mkdir -p /topinfo/mongodb/logs # 创建数据库日志目录
2.2.5 启动
先测试一下 MongoDB 是否安装成功:
which mongod
显示 MongoDB 的 bin/mongod 路径则表示安装成功。
启动 mongodb:
你可以再命令行中执行 mongo 安装目录中的 bin 目录执行 mongod 命令来启动 mongdb 服务。
MongoDB 后台运行,启动时只需添加 –fork 函数即可。可以在日志路径后面添加 –logappend,防止日志被删除。
mongod --fork --dbpath= /topinfo/mongodb/data --logpath= /topinfo/mongodb/logs/mongodb2.log --logappend
查看进程:
ps -ef | grep mongo
停止 MongoDB
mongod -shutdown --dbpath= /topinfo/mongodb /data --logpath= /topinfo/mongodb /logs/mongodb2.log --logappend
2.2.6 远程连接
MongoDB 数据库启动后,默认只能在本地使用,如果远程访问,需要进行一下设置。
1、关闭防火墙,或开放对应的端口
systemctl stop firewalld
2、启动命令中添加。–bind_ip=0.0.0.0
mongod --fork --dbpath= /topinfo/mongodb /data --logpath= /topinfo/mongodb /logs/mongodb2.log --logappend --bind_ip=0.0.0.0
在用客户端连接如图:
3 分片部署
3.1 分片部署环境
操作系统:CentOS7 +
三台服务器:192.168.90.225/226/227
安装包:mongodb-linux-x86_64-4.0.10.tgz
3.2 部署设计
3.2.1 机器规划
为了更好的均衡机器的压力,把每个机器既可以作为主节点、副本节点、仲裁节点,这样压力就会均衡很多了。
3.2.2 端口规划
由于一个机器需要同时部署 mongos、config server、shard1、shard2、shard3,所以需要用端口进行区分。
端口分配:
config:21000
shard1:27001
shard2:27002
shard3:27003
mongos:20000
3.2.3 目录规划
1、创建安装和临时目标
mkdir /usr/local/tmp #临时目录,用于上传压缩包
mkdir /topinfo #mongodb 的安装目录
2、目录规划
mkdir -p /topinfo/mongodb/conf # 存放所有服务器的配置文件
mkdir -p /topinfo/mongodb/mongos/logs # 存放路由服务器的日志信息
mkdir -p /topinfo/mongodb/config/data # 存放配置服务器的数据
mkdir -p /topinfo/mongodb/config/logs # 存放配置服务器的日志
mkdir -p /topinfo/mongodb/shard1/data # 存放分片服务器上的数据
mkdir -p /topinfo/mongodb/shard1/logs # 存放分片服务器上的日志
mkdir -p /topinfo/mongodb/shard2/data # 存放分片服务器上的数据
mkdir -p /topinfo/mongodb/shard2/logs # 存放分片服务器上的日志
mkdir -p /topinfo/mongodb/shard3/data # 存放分片服务器上的数据
mkdir -p /topinfo/mongodb/shard3/logs # 存放分片服务器上的日志
根据服务器规划:
1、mongo 服务通过配置文件启动, 存放配置文件目录 /topinfo/mongodb/conf
2、在每台服务器创建该节点所含 shard 的数据存放目录 /topinfo/mongodb/shard1-3
3、在每台服务器(也可以在其中两台)创建存放 config server 数据的数据目录 /topinfo/mongodb/config,本次配置是在三台机器上都配置。
故:分别在每台机器建立 conf、mongos、config、shard1、shard2、shard3 六个目录,因为 mongos 不存储数据,只需要建立日志文件目录即可。
如图:
3.3 安装
3.3.1 上传 MongoDB 安装包
上传安装包:
cd /usr/local/tmp/ # 跳转到临时目录
rz #通过 rz 上传 mongodb-linux-x86_64-4.0.10.tgz
3.3.2 安装
1、解压
tar -zxvf mongodb-linux-x86_64-4.0.10.tgz # 解压
mv mongodb-linux-x86_64-4.0.10 mongodb #重命名
mv /usr/local/tmp/mongodb /topinfo # 将解压包拷贝到指定目录
2、MongoDB 的可执行文件位于 bin 目录下,所以可以将其添加到 PATH 路径中:
vim /etc/profile
#加入以下内容
export MONGODB_HOME=/topinfo/mongodb
export PATH=$MONGODB_HOME/bin:$PATH
#保持退出后,执行以下命令,立即生效
source /etc/profile
如图:
3、环境变量验证
使用命令 mongod - v 输出信息版本信息验证环境变量是否配置成功
mongod -v
如图:
3.4 config server 集群配置
3.4.1 config server 服务器(副本集)
根据服务器规划,我们在三台机器上部署 config server 副本集,在该三台服务器上分别添加以下配置文件:
进入配置文件目录 /topinfo/mongodb/conf/config.conf
vi /topinfo/mongodb/conf/config.conf
添加配置文件信息:
# where to write logging data.
systemLog:
destination: file
logAppend: true
path: /topinfo/mongodb/config/logs/config.log
# Where and how to store data.
storage:
dbPath: /topinfo/mongodb/config/data/
journal:
enabled: true
# how the process runs
processManagement:
fork: true
pidFilePath: /topinfo/mongodb/config/logs/configsrv.pid
# network interfaces
net:
port: 21000
bindIp: 0.0.0.0
# 集群名称
replication:
replSetName: configs
# 声明这是一个集群的配置数据服务
sharding:
clusterRole: configsvr
退出保存:
wq!
启动三台服务器的 config server
mongod -f /topinfo/mongodb/conf/config.conf
登录任意一台配置服务器(注意是配置端口),初始化配置副本集(执行命令的时候,不要复制注释,只复制命令去一步步执行)。
mongo --port 21000
定义副本集配置(键“_id”对应的值必须与配置文件中的 replicaction.replSetName 一致)
config = {
_id : "configs",
members : [{_id : 0, host : "192.168.90.225:21000"},
{_id : 1, host : "192.168.90.226:21000"},
{_id : 2, host : "192.168.90.227:21000"}
]
}
初始化副本集
rs.initiate(config)
查看分区状态
rs.status();
此时会发现终端上的输出已经有了变化。
rs.initiate(config) 初始化。不成功的话,路由服务器与配置服务器连接不上。
其中,”_id”:“configs”应与配置文件中配置的 replicaction.replSetName 一致,”members”中的“host”为三个节点的 ip 和 配置 port。
3.5 shard server 分片服务器集群配置
3.5.1 配置第一个分片副本集
根据服务器规划:
192.168.90.225: 27001 – 主节点
192.168.90.226: 27001 – 副节点
192.168.90.227: 27001 – 仲裁节点
三台服务器上分别添加以下配置文件:
进入配置文件:
vi /topinfo/mongodb/conf/shard1.conf #分片配置文件
配置文件内容:
# where to write logging data.
systemLog:
destination: file
logAppend: true
path: /topinfo/mongodb/shard1/logs/shard1.log
# Where and how to store data.
storage:
dbPath: /topinfo/mongodb/shard1/data
journal:
enabled: true
# how the process runs
processManagement:
fork: true
pidFilePath: /topinfo/mongodb/shard1/logs/shard1.pid
# network interfaces
net:
port: 27001
bindIp: 0.0.0.0
# 副本集名称
replication:
replSetName: shard1
# 声明这是一个集群的分片服务;
sharding:
clusterRole: shardsvr
启动三台服务器的 shard1 server
mongod -f /topinfo/mongodb/conf/shard1.conf
登陆任意一台服务器(注意是分片端口),初始化副本集(执行命令的时候,不要复制注释,只复制命令去一步步执行)
mongo --port 27001
# 定义副本集配置(键“_id”对应的值必须与配置文件中的 replicaction.replSetName 一致,priority 代表权重[1,100],大的被分配为主服务器,0 永久不会变为主服务器)config = {
_id : "shard1",
members : [{_id : 0, host : "192.168.90.225:27001", priority : 2},
{_id : 1, host : "192.168.90.226:27001", arbiterOnly :true},
{_id : 2, host : "192.168.90.227:27001", priority : 1}
]
}
#初始化副本集
rs.initiate(config)
#查看分区状态
rs.status();
3.5.2 设置第二个分片副本集
其他副本集都按照以上方式进行配置:
注意事项:
1、复制集的名称不要重复
2、ip 和端口根据分配进行配置
3、合理分配仲裁服务器的位置(因为仲裁不存放数据,很轻,合理的分配,可以分担其他服务器的压力)
3.6 mongos server 路由服务器集群配置
3.6.1 配置 mongos
注意:启动 mongodb 时,先启动配置服务器,再启动分片服务器,最后启动路由服务器。
根据服务器规划,我们在每台服务器都配置了 mongos:
192.168.90.225: 20000 – mongos
192.168.90.226: 20000 – mongos
192.168.90.227: 20000 – mongos
三台服务器上分别添加以下配置文件:
进入配置文件:
vi /topinfo/mongodb/conf/mongos.conf
配置文件内容
# where to write logging data.
systemLog:
destination: file
logAppend: true
path: /topinfo/mongodb/mongos/logs/mongos.log
# how the process runs
processManagement:
fork: true
# pidFilePath: /var/log/nginx/mongos.pid
# network interfaces
net:
port: 20000
bindIp: 0.0.0.0
#监听的配置服务器, 只能有 1 个或者 3 个,configs 为配置服务器的副本集名字,ip:configs 配置服务器的端口
sharding:
configDB: configs/192.168.90.225:21000,192.168.90.226:21000,192.168.90.227:21000
启动三台服务器的 mongos server
mongos -f /topinfo/mongodb/conf/mongos.conf
目前已经搭建好配置服务器、数据分片服务器、路由服务器,下面进行分片启用,使得 app 连接到路由服务器时可以使用分片机制
3.6.2 串联路由服务器与分配副本集
登录任意一台 mongos:
mongo --port 20000
使用 admin 数据库
use admin
串联路由服务器与分片副本集:
#串联路由服务器与分片副本集
sh.addShard("shard1/192.168.90.225:27001,192.168.90.226:27001,192.168.90.227:27001")
#sh.addShard("shard2/192.168.90.225:27001,192.168.90.226:27001,192.168.90.227:27001")
查看集群状态:
sh.status()
如图:
3.6.3 启动分片
目前配置服务、路由服务、分片服务、副本集服务都已经串联起来了,但我们的目的是希望插入数据,数据能够自动分片。连接在 mongos 上,准备让指定的数据库、指定的集合分片生效。
指定 testdb 分片生效
use admin # enableSharding 只能针对 admin 数据库运行,适宜选用 admin
db.runCommand({ enablesharding :"testdb"});
指定数据库里需要分片的集合和片键:
我们设置 testdb 的 testcoll 表需要分片,根据 id 自动分片到 shard1,shard2,.. 上面去。
db.runCommand({ shardcollection : "testdb.testcoll",key : {id: "hashed"} } )
要这样设置是因为不是所有 mongodb 的数据库和表 都需要分片!!
查看分片状态
db.testcoll.stats()
3.7 分片测试
3.7.1 测试
连接 MongoDB 路由服务:
执行测试语句:
for(i=1;i<=10000;i++){db.testcoll.insert({"id":i,"name":"yangp"})};
查看分片结果:
db.testcoll.stats();
如图:
说明分片成功!
4 注意事项
4.1 分片配置异常
4.1.1 执行命令
分片配置副本集的执行以下:
#定义副本集配置(键“_id”对应的值必须与配置文件中的 replicaction.replSetName 一致,priority 代表权重[1,100],大的被分配为主服务器,0 永久不会变为主服务器)config = {
_id : "shard1",
members : [{_id : 0, host : "192.168.90.225:27001", priority : 2},
{_id : 1, host : "192.168.90.226:27001", priority : 1},
{_id : 2, host : "192.168.90.227:27001", arbiterOnly :true}
]
}
#初始化副本集
rs.initiate(config)
4.1.2 异常日志
This node, 192.168.90.227:27001, with _id 2 is not electable under the new configuration version 1 for replica set shard1",
4.1.3 异常处理
192.168.90.227 这台服务器不能初始化,换一台机器做仲裁,顺利通过。
# 定义副本集配置(键“_id”对应的值必须与配置文件中的 replicaction.replSetName 一致,priority 代表权重[1,100],大的被分配为主服务器,0 永久不会变为主服务器)config = {
_id : "shard1",
members : [{_id : 0, host : "192.168.90.225:27001", priority : 2},
{_id : 1, host : "192.168.90.226:27001", arbiterOnly :true},
{_id : 2, host : "192.168.90.227:27001", priority : 1}
]
}
#初始化副本集
rs.initiate(config)
#查看分区状态
rs.status();
4.2 MongoDB 常用命令
4.2.1 启动命令
4.2.2 停止命令
mongod -shutdown -dbpath=/usr/local/mongodb/data
或
use admin
db.shutdownServer()