Centos7 搭建Mongodb 分片集群
安装启动顺序:config–>shard–>mongos
服务器最终配置:
执行完第【一】步——>执行完第【五(2)】步后会达到此效果。
下面最终完成为两分片,每个分片三副本(主+slaver+arbiter)的配置
ip | 组件 |
---|---|
leojiang123 | arbiter(shard1)、arbiter(shard2) |
leojiang124 | mongos、config、shard1(副) |
leojiang125 | mongos、config、shard2(副) |
leojiang126 | mongos、config、shard1(主) |
leojiang127 | mongos、shard2(主) |
端口号的选择
组件 | 端口选择 |
---|---|
mongos | 20000 |
config | 27000 |
shard | 27001 |
arbiter | 27026、27027 |
一、安装MongoDB社区版
第一步将会完成部署一个新的分片集群,该集群由mongos、配置服务器config和两个分片副本集组成
将会完成的结构如下:
1、配置程序包管理系统(yum
)
创建一个/etc/yum.repos.d/mongodb-org-4.0.repo
文件,以便您可以使用yum
以下命令直接安装MongoDB :
- 注:分别在
leojiang123
~leojiang127
服务器上执行 - 如需安装不同的版本换成不同的版本源即可。
cat > /etc/yum.repos.d/mongodb-org-4.0.repo << EOF
[mongodb-org-4.0]
name=MongoDB Repository
baseurl=https://repo.mongodb.org/yum/redhat/7/mongodb-org/4.0/x86_64/
gpgcheck=1
enabled=1
gpgkey=https://www.mongodb.org/static/pgp/server-4.0.asc
EOF
2、安装对应版本的MongoDB软件包。
- 注:分别在
leojiang123
~leojiang127
服务器上执行
要安装最新的稳定版MongoDB,请发出以下命令:(暂不推荐)
sudo yum install -y mongodb-org
2.1、另外,要安装特定版本的MongoDB,请分别指定每个组件包,然后将版本号附加到包名中,如以下示例所示:(本文推荐指定版本号安装)
sudo yum install -y mongodb-org-4.0.9 mongodb-org-server-4.0.9 mongodb-org-shell-4.0.9 mongodb-org-mongos-4.0.9 mongodb-org-tools-4.0.9
2.2、您可以指定任何可用的MongoDB版本。但是yum ,当有新版本可用时,将升级软件包。为防止意外升级,请固定包装。要固定包,exclude请在/etc/yum.conf文件中添加以下指令:(建议执行以防自动升级版本导致程序无法使用,或是修改.repo包enabled=0)
echo 'exclude=mongodb-org,mongodb-org-server,mongodb-org-shell,mongodb-org-mongos,mongodb-org-tools'>>/etc/yum.conf
记住如果卸载或是升级需要删除此限制,要不无法安装
3、创建运行mongodb的目录并禁用SELinux
- 注:根据自身情况分别在
leojiang123
~leojiang127
服务器上执行
3.1、创建需要的文件夹
mkdir -p /var/opt/mongodb/config
mkdir -p /var/opt/mongodb/mongos
mkdir -p /var/opt/mongodb/shard
mkdir -p /var/opt/mongodb/arbiter
确保运行MongoDB的用户有权访问一个或多个目录:
chown -R mongod:mongod /var/opt/mongodb
3.2、查看当前的 SELinux 状态,并禁用
# 查看状态
getenforce
禁用SELinux
vim /etc/sysconfig/selinux
SELINUX=disabled
setenforce 0
4、修改文件打开数
- 注:分别在
leojiang123
~leojiang127
服务器上执行
4.1、修改系统文件打开数
# 直接生效
ulimit -n 1000000
vim /etc/security/limits.conf
* soft nofile 1000000
* hard nofile 1000000
* soft nproc 1000000
* hard nproc 1000000
4.2、修改mongo最大文件打开数
修改mongo最大open files(mongod -f 启动)
cat > /etc/security/limits.d/99-mongodb.conf << LEO
#Default limit for number of user’s processes to prevent
# accidental fork bombs.
# # See rhbz #432903 for reasoning.
# #
# # * soft nproc 4096
# # root soft nproc unlimited
* soft nofile 1000000
* hard nofile 1000000
* soft fsize unlimited
* hard fsize unlimited
* soft cpu unlimited
* hard cpu unlimited
* soft nproc 500000
* hard nproc 500000
LEO
注:修改mongo最大open files(systemctr 启动)(暂不推荐-跳过)
vim /usr/lib/systemd/system/mongod.service
5、初始化系统
- 注:根据自身情况分别在
leojiang123
~leojiang127
服务器上执行
安装numactl
yum install numactl
5.1、创建config配置服务器,配置文件mongoconfig.conf,并启动
- 注:根据我们采用配置分别在
leojiang124
~leojiang126
服务器上执行
1、创建config配置/var/opt/mongodb/config/mongo.conf
1、sharding.clusterRole到configsvr,
2、replication.replSetName配置服务器副本集的所需名称,
3、net.bindIp远程客户端(包括配置服务器副本集的其他成员以及分片集群的其他成员)可以用来连接到实例的主机名/IP 地址或以逗号分隔的主机名或 IP 地址列表的选项。【本文配置0.0.0.0允许所有ip访问】
processManagement:
# 作为守护进程运行
fork: true
net:
bindIp: 0.0.0.0
##should be changed after clusters stable
port: 27000
storage:
dbPath: /var/opt/mongodb/config/metadata/
replication:
replSetName: cfgReplSet
sharding:
clusterRole: configsvr
systemLog:
# 日志级别 debug<info<warn<Error<Fatal;(默认是0 info级别,1~5是dug级别,级别越高打印越细。)
verbosity: 0
# 打印详细信息进行调试。
#traceAllExceptions: true
destination: file
path: "/var/opt/mongodb/config/log/config.log"
logAppend: true
logRotate: reopen
timeStampFormat: ctime
#security:
# authorization: enabled
#transitionToAuth: enabled
#clusterAuthMode: keyFile
# keyFile: /var/opt/mongodb/mongodb-keyfile
2、创建需要的文件夹
mkdir -p /var/opt/mongodb/config/metadata/
mkdir -p /var/opt/mongodb/config/log/
3、启动
mongod -f /var/opt/mongodb/config/mongo.conf
初始化配置config集群,找一台config配置即可
mongo --port 27000
use admin
rs.initiate(
{
_id: "cfgReplSet",
configsvr: true,
members: [
{ _id : 0, host : "leojiang124:27000" },
{ _id : 1, host : "leojiang125:27000" },
{ _id : 2, host : "leojiang126:27000" }
]
}
)
5.2、创建shard服务器,shard 配置 mongd.conf
- 注:根据我们采用配置分别在
leojiang126
~leojiang127
服务器上执行
- leojiang126 配置
/var/opt/mongodb/shard/shard.conf
1、replication.replSetName复制到所需的副本集名称,
2、sharding.clusterRole选项shardsvr,
3、net.bindIp远程客户端(包括配置服务器副本集的其他成员以及分片集群的其他成员)可以用来连接到实例的 ip 或逗号分隔的 ip 列表的选项。
processManagement:
fork: true
pidFilePath: /var/opt/mongodb/shard/log/shard1.pid
net:
bindIp: 0.0.0.0
##should be changed after clusters stable
port: 27001
#maxIncomingConnections
#默认synchronous && adaptive 启用网络i/o减轻disk i/o
serviceExecutor: adaptive
##split net io and disk io, reuse network io and connection to reduce locks
storage:
#indexBuildRetry set to false if mongod restart fail when there is rebuild index error
dbPath: /var/opt/mongodb/shard/data
# directoryPerDB想要生效必须初始化系统是打开,还有wiredTiger下的配置联合使用
#directoryPerDB: true
#directoryPerDB should be set when initial mongodb, can't use on existing db
journal:
enabled: true
commitIntervalMs: 200
#wiredTiger:
#collectionConfig:
# blockCompressor: zlib
#indexConfig:
# prefixCompression: true
#none with highest query speed but snappy and zlib with lower IO, zlib will take more cpu and less IO than snappy 压缩存储blockCompressor数据,压缩存储prefixCompression索引
#engineConfig:
#directoryForIndexes: true
#directoryForIndexes should be set when initial mongodb, can't use on existing db
replication:
replSetName: shard1
sharding:
clusterRole: shardsvr
systemLog:
verbosity: 0
#traceAllExceptions: true
destination: file
path: "/var/opt/mongodb/shard/log/shard1.log"
logAppend: true
logRotate: reopen
timeStampFormat: ctime
# component:
# sharding:
# verbosity: 0
# write:
# verbosity: 0
#security:
# authorization: enabled
#transitionToAuth: enabled
#clusterAuthMode: keyFile
# keyFile: /var/opt/mongodb/mongodb-keyfile
#clusterIpSourceWhitelist: for whitelist of clients
#ldap configuration might be used when ITSAC and mongodb should be enterprise version
- leojiang127 配置第二个shard副本集config配置文件修改<replication.replSetName>;如果配置多台只修改replSetName为不同的name即可)
replication:
replSetName: shard2
- 创建所需的文件夹
mkdir -p /var/opt/mongodb/shard/data
mkdir -p /var/opt/mongodb/shard/log
- 启动
mongod -f /var/opt/mongodb/shard/shard.conf
5.2.1启动副本集。
-
在mongoshell 中,运行该rs.initiate()方法。
-
rs.initiate()触发选举并选举其中一个成员作为主要成员。
1、单成员副本集(由于经济原因本文只使用一个单成员副本集,没有添加副本)
- leojiang126上执行
mongo --port 27001
use admin
rs.initiate(
{
_id: "shard1",
members: [
{ _id : 0, host : "leojiang126:27001" }
]
}
)
- leojiang127上重复执行:
mongo --port 27001
use admin
rs.initiate(
{
_id: "shard2",
members: [
{ _id : 0, host : "leojiang127:27001" }
]
}
)
三成员副本添加如下所示(根据公司情况选择——单成员或是三成员)(本章节跳过,后续会提及如何部署)
mongo --port 27001
use admin
rs.initiate(
{
_id: "shard1",
members: [
{ _id : 0, host : "leojiang126:27001" },
{ _id : 1, host : "leojiang1266:27001" },
{ _id : 2, host : "leojiang12666:27001" }
]
}
)
5.3、创建mongos客户端指定配置服务器,配置mongos.conf
- 注:分别在
leojiang124
~leojiang127
服务器上执行
/var/opt/mongodb/mongos/mongos.conf
processManagement:
fork: true
pidFilePath: /var/opt/mongodb/mongos/log/mongos.pid
net:
# 远程客户端(包括配置服务器副本集的其他成员以及分片集群的其他成员)可以用来连接到实例的 ip 选项或以逗号分隔的 ip 列表。
bindIp: 0.0.0.0
##should be changed after clusters stable
port: 20000
# 默认synchronous && adaptive 启用网络i/o减轻disk i/o
serviceExecutor: adaptive
sharding:
configDB: cfgReplSet/leojiang124:27000,leojiang125:27000,leojiang126:27000
systemLog:
# 日志级别 debug<info<warn<Error<Fatal;0是infor级别(也是默认级别)1~5是debug级别越大显示粒度越细
verbosity: 0
# 打印详细信息进行调试。
#traceAllExceptions: true
destination: file
path: "/var/opt/mongodb/mongos/log/mongos.log"
logAppend: true
logRotate: reopen
timeStampFormat: ctime
#security:
#authorization: enabled
#transitionToAuth: enabled
#clusterAuthMode: keyFile
# keyFile: /var/opt/mongodb/mongodb-keyfile
- 创建所需的文件夹
mkdir -p /var/opt/mongodb/mongos/log
- 启动,使用mongos为sharded 启动cluster
mongos -f /var/opt/mongodb/mongos/mongos.conf
- 配置mongos集群,随机找一个mongos连接配置连接到分片集群:
mongo --port 20000
use admin
①向集群添加分片,以下操作将两个分片副本集添加到集群:
将分片副本集添加到分片集群。此方法必须在mongos实例上运行。
# 一个一个加
sh.addShard("shard1/leojiang126:27001");
sh.addShard("shard2/leojiang127:27001");
# eg:或一起添加都可以(跳过)
sh.addShard( "shard1/leojiang126:27001,leojiang124:27001")
②开启Balancer
sh.getBalancerState() # 查看状态
sh.startBalancer() # 关开启balancer
sh.stopBalancer() # 关闭balancer
- 处理waring
echo "never" > /sys/kernel/mm/transparent_hugepage/enabled
echo "never" > /sys/kernel/mm/transparent_hugepage/defrag
6、数据库添加内部安全认证
1、使用密钥文件身份验证,分片集群中的每个 mongod或实例使用密钥文件的内容作为共享密码来验证部署中的其他成员。mongos只有 具有正确密钥文件mongod的mongos实例才能加入分片集群。
2、客户端只能使用配置的客户端认证机制连接到分片集群。
注:加安全认证后使用用户登录才有增删改权限,否则只有查询权限
1、连接mongodb
mongo
2、设置管理员admin用户,选择一台mongos和主shard分别添加root用户
use admin
db.createUser(
{
user: "root",
pwd: "root123",
roles: [ { role: "root", db: "admin" } ]
}
)
注:分别在leojiang123
~leojiang127
服务器上执行
6.1、创建密钥文件
openssl
生成复杂的伪随机 1024 字符串以用于密钥文件。然后它chmod
用于更改文件权限以仅为文件所有者提供读取权限:
openssl rand -base64 756 > /var/opt/mongodb/mongodb-keyfile
chmod 600 /var/opt/mongodb/mongodb-keyfile
6.2、把生成的mongodb-keyfile文件拷贝到每个需要keyfile的服务器上,开启配置文件的注释
1. config、shard配置文件修改,开启keyfile认证
1、将每个分片副本集成员转换为强制身份验证
2、转换配置服务器副本集成员以强制身份验证
security:
authorization: enabled
# 用于转换现有分片集群以强制身份验证而不会导致停机的过程。
#transitionToAuth: true
keyFile: /var/opt/mongodb/mongodb-keyfile
2. mongos配置文件修改,开启keyfile认证
security:
#transitionToAuth: true
keyFile: /var/opt/mongodb/mongodb-keyfile
6.3、重启集群并生效:
1. 关闭mongo集群
1、只需要选择一台mongos执行sh.stopBalancer()即可
mongo --port 20000 --authenticationDatabase "admin" -u "root" -p "root123"
sh.stopBalancer()
2、停止mongos路由器
mongo --port 20000 --authenticationDatabase "admin" -u "root" -p "root123"
use admin
db.shutdownServer()
exit
# or use
db.getSiblingDB("admin").shutdownServer()
3. stop shard(stop secondary first then primary)
mongo --port 27001
db.getSiblingDB("admin").shutdownServer()
4. stop config(stop secondary first then primary)
mongo --port 27000
db.getSiblingDB("admin").shutdownServer()
2. 启动mongo集群
在 Linux 上,您必须禁用区域回收并确保您的 mongod实例mongos由 启动 numactl,这通常通过您平台的 init 系统进行配置。您必须执行这两个操作才能正确禁用 NUMA 以与 MongoDB 一起使用。
使用以下命令之一禁用区域回收:
echo 0 | sudo tee /proc/sys/vm/zone_reclaim_mode
sudo sysctl -w vm.zone_reclaim_mode=0
启动:
1. 启动配置服务器
numactl --interleave=all /usr/bin/mongod -f /var/opt/mongodb/config/mongo.conf
2. 启动每个分片副本集。
numactl --interleave=all /usr/bin/mongod -f /var/opt/mongodb/shard/shard.conf
# numactl --interleave=all /usr/bin/mongod -f /var/opt/mongodb/arbiter/arbiter26/arbiter26.conf
# numactl --interleave=all /usr/bin/mongod -f /var/opt/mongodb/arbiter/arbiter27/arbiter27.conf
3. 启动mongos路由器。
numactl --interleave=all /usr/bin/mongos -f /var/opt/mongodb/mongos/mongos.conf
4. 重新启用平衡器,连接到集群的mongos实例之一并运行sh.startBalancer()命令
sh.startBalancer()
要检查平衡器状态,请发出sh.getBalancerState() 命令。
3. 连接测试
mongo --port 20000 --authenticationDatabase "admin" -u "root" -p "root123"
mongo --port 27000 --authenticationDatabase "admin" -u "root" -p "root123"
mongo --port 27001 --authenticationDatabase "admin" -u "root" -p "root123"
二、清理日志(参考)
1、查看设置日志等级
MongoDB将日志详细等级划分为0~5
1. 0 是MongoDB日志的的默认级别,会包含 Informational 类信息。
2. 1~5 是调试级别,会记录客户端所有的完整请求
# 查看日志级别
db.getLogComponents()
# 设置日志等级为默认INFO等级
db.adminCommand( {
setParameter:0,
logComponentVerbosity: {
verbosity: 0,
query: {
verbosity: -1
}
}
} )
2、手动清理
#登录上mongos, shard和config,然后执行
use admin;db.runCommand({logRotate:1});
#或
mongo localhost:20000/admin --eval "db.auth('root','root123');db.runCommand({logRotate:1});"
mongo localhost:27000/admin --eval "db.auth('root','root123');db.runCommand({logRotate:1});"
mongo localhost:27001/admin --eval "db.auth('root','root123');db.runCommand({logRotate:1});"
3、定时清理脚本mongolog.sh
3.1、创建/var/opt/mongodb-script/mongolog.sh
#!/bin/sh
mongo localhost:20000/admin --eval "db.auth('root','root123');db.runCommand({logRotate:1});"
sleep 5s
mongo localhost:27000/admin --eval "db.auth('root','root123');db.runCommand({logRotate:1});"
sleep 5s
mongo localhost:27001/admin --eval "db.auth('root','root123');db.runCommand({logRotate:1});"
sleep 5s
#find /var/opt/mongodb/mongos/log/mongos.log.* -type f -mtime +1 -delete
find /var/opt/mongodb/mongos/log/mongos.log.* -delete
sleep 1s
find /var/opt/mongodb/config/log/config.log.* -delete
sleep 1s
find /var/opt/mongodb/shard/log/shard1.log.* -delete
3.2、chmod +x mongolog.sh
crontab -e
0 1,13 * * * /var/opt/mongodb-script/mongolog.sh >> /var/opt/mongodb-script/log/success.log 2>&1
三、缩容shard
1、查看shard name,执行RemoveShard命令
1.1、查看shard name
mongo --port 20000 -u "root" -p "root123" --authenticationDatabase "admin"
db.adminCommand( { listShards: 1 } )
1.2、执行RemoveShard命令
db.runCommand( { removeshard: "bristol01" } )
{# 完成后会显示successfully, 如果没显示可以查看迁移状态。
"msg" : "draining started successfully",
"state" : "started",
"shard" : "bristol01",
"note" : "you need to drop or movePrimary these databases",
"dbsToMove" : [
"fizz",
"buzz"
],
"ok" : 1,
……
上面这句会立即返回,实际在后台执行。
平衡器开始将块从命名的分片迁移(“排出”) bristol01到集群中的其他分片。这些迁移发生得很慢,以避免给集群带来过多的负载。
2、查看迁移状态
我们可以反复执行上面语句,查看执行结果。
db.runCommand( { removeshard: "bristol01" } )
{ msg: "draining ongoing" , state: "ongoing" , remaining: { chunks: 442, dbs : 1 }, ok: 1 }
当chunks的值等于0时代表数据迁移完成。
3、movePrimary移出非Shard数据(如果存在dbsToMove的库)
3.1、在从分片中清除所有块之后,如果您有dbsToMove,代表还剩多少个库需要设置新的大本营,您可以movePrimary针对这些数据库,或者删除这些数据库(这会删除关联的数据文件)。movePrimary操作要等到数据迁移完成之后再进行。也就是当chunks的值等于0后才可以执行movePrimary操作。
db.adminCommand( { movePrimary: <databaseName>, to: <newPrimaryShard> } )
#例如,以下命令将主分片从 移动test到 shard0001:
db.adminCommand( { movePrimary: "testreduce", to: "shard2" } )
这次就不是立即返回了,需要很久,然后会返回如下:
{ "primary" : "mongodb1", "ok" : 1 }
3.2、参考:(可跳过)
在分片集群中,movePrimary重新分配 包含数据库中所有未分片集合的 主分片。movePrimary首先更改集群元数据中的主分片,然后将所有未分片的集合迁移到指定的分片
从 MongoDB 4.2 开始:
如果您使用该movePrimary命令移动 未分片的集合,您必须:
1、在已移动的未分片集合
后的任何数据读或写,需要在所有mongos实例和所有mongod分片成员(包括辅助成员)上使用该flushRouterConfig命令 ,因为在使用movePrimary命令变更数据库的主分片之后,config server中的配置信息是最新的,mongos缓存的配置信息变得过时了。
2、重启所有mongos实例和所有 mongod分片成员(包括次要成员)
否则,您可能会错过读取数据,并且可能无法将数据写入正确的分片。要恢复,您必须手动干预。
flushRouterConfig 强制mongos从config server获取最新的配置信息,刷新mongos mongod的缓存。
1、当传入集合命名空间参数时,刷新指定集合的缓存:
db.adminCommand({ flushRouterConfig: "<db.collection>" } )
2、当传入数据库命名空间参数时,刷新指定数据库及其集合的缓存:
db.adminCommand({ flushRouterConfig: "<db>" } )
3、在不带参数运行或传入非字符串标量值(例如)时刷新所有数据库及其集合的缓存:
db.adminCommand("flushRouterConfig")
db.adminCommand( { flushRouterConfig: 1 } )
4、清理残余数据。
上面步骤都完成后,还需要再执行一次RemoveShard
在平衡器完成将所有块从分片中移出并且您已经处理完dbsToMove之后,removeShard可以完成。再次运行removeShard会返回类似于以下内容的输出:
db.runCommand( { removeshard: "bristol01" } )
执行成功后,会如下结果:
{
"msg" : "removeshard completed successfully",
"state" : "completed",
"shard" : "bristol01",
"ok" : 1,
"operationTime" : Timestamp(1575400370, 2),
"$clusterTime" : {
"clusterTime" : Timestamp(1575400370, 2),
"signature" : {
"hash" : BinData(0,"JjSRciHECXDBXo0e5nJv9mdRG8M="),
"keyId" : NumberLong("6766255701040824328")
}
}
}
显示completed后,就可以安心的关闭mongod的进程了。
四、扩容、缩容configsvr
缩容:
1、修改mongos启动配置文件,把不需要的config去掉即可
只能是基数否则无法选举leader
# 例如我配置三个config,去除其中两个直接修改即可
configdb = cfgReplSet/leojiang124:27000,leojiang125:27000,leojiang126:27000
# 修改后
configdb = cfgReplSet/leojiang126:27000
2、先登录master config修改master config(如果缩容的是master执行,否则跳过)
-
需要注意的是,修改节点优先级需要登录Master节点运行。
-
rs.reconfig()shell方法会导致选举,可以强制当前主节点降级。否则报错。当主要降级时,mongod将关闭所有客户端连接。 虽然这通常需要10-20秒,但请尝试在计划的维护期间进行这些更改。
# 可以使用rs.status()查看集群状态,或者rs.isMaster()
# 修改节点的优先级可以触发重新选举,这样可以人工指定主节点。
# 使用如下命令,在主节点leojiang124登录,将leojiang126提升为Master。
cfgReplSet:PRIMARY> rs.conf();
cfgReplSet:PRIMARY> cfg=rs.conf(); //查看当前配置,存入config变量中
cfgReplSet:PRIMARY> cfg.members[0].priority=1
cfgReplSet:PRIMARY> cfg.members[1].priority=1
cfgReplSet:PRIMARY> cfg.members[2].priority=10 //修改config变量,第三组成员的优先级为10.
cfgReplSet:PRIMARY> rs.reconfig(cfg); //配置生效
3、删除旧的configsvr
rs.remove("<hostnameOld>:<portOld>")
# eg:
rs.remove("leojiang125:27000")
# 查看删除的情况
rs.status()
4、重启再次生效(也可不重启,但是记住第1步一定要修改防止下次重启发生错误)
扩容:
增加config。或是参考五(2)来添加副本集
从原配置服务(21000)导出config库并导入新的配置服务(21001,21002):
# mongodump --port 27000 -u "root" -p "root123" --authenticationDatabase "admin" -d config #导出
# mongorestore --port 27000 -u "root" -p "root123" --authenticationDatabase "admin" -d configdump/config #导入
# mongorestore --port 27000 -u "root" -p "root123" --authenticationDatabase "admin" -d configdump/config #导入
续:下一章 Centos7 搭建Mongodb 分片集群4.0——三成员副本集(二)
MongoDB是一个非关系型数据库管理系统,具有一些优点和缺点:
优点:
1. 灵活的数据模型:MongoDB是面向文档的数据库,使用JSON格式存储数据,因此可以轻松地存储各种类型的数据,而不需要遵循严格的模式。
2. 可扩展性:MongoDB支持水平扩展,可以通过添加更多的服务器来处理大量的数据和流量,从而实现高可扩展性。
3. 高性能:MongoDB具有快速的读写速度,特别是在大型数据库和高并发访问的情况下。
强大的查询功能:MongoDB支持丰富的查询功能,包括复杂的聚合查询、全文搜索等。
4. 自动故障转移:MongoDB具有自动故障转移功能,可以在主服务器故障时自动切换到备用服务器,提高了系统的可用性。
缺点:
1. 不支持事务:MongoDB在某些情况下不支持原子性事务,这意味着在一些复杂的操作中可能会存在数据一致性的问题。(MongoDB 4.0及以上版本开始提供对多文档事务的支持,但仅限于在复制集的主节点上或者分片集群的集群写入节点上使用。)
2. 内存消耗较大:MongoDB在处理大规模数据时需要大量的内存来维护索引和缓存,这可能导致服务器成本较高。
3. 数据一致性问题:由于MongoDB的分布式特性,可能会存在数据一致性的问题,特别是在网络分区或节点故障时。
4. 相对较新:相对于传统的关系型数据库,MongoDB是一个相对较新的技术,因此在某些方面可能缺乏成熟度和广泛的支持。
5. 不支持复杂的查询:虽然MongoDB支持丰富的查询功能,但在某些情况下,特别是涉及多表关联的复杂查询时,性能可能不如传统的关系型数据库。
经验
1.在MongoDB的分片架构中,存储压力和内存消耗主要集中在shard服务器上,而不是mongos路由服务器上。
2.总的来说,在MongoDB的分片架构中,针对大查询过程中消耗内存较多的情况,主要应该关注和优化shard服务器的性能和配置。
MongoDB在以下情况下表现优异:
1. 灵活的数据模型:如果你的应用程序需要存储不同类型的数据,而这些数据结构可能经常变化,MongoDB的面向文档的数据模型会更适合,因为它不需要严格的模式定义,可以轻松地适应数据结构的变化。
2. 大规模数据的写入:MongoDB具有良好的水平扩展性,可以处理大量的写入操作。这使得它非常适合需要高吞吐量写入的应用程序,如日志记录、传感器数据收集等。
3. 高性能读取:在适当的配置下,MongoDB能够提供出色的读取性能,特别是在具有合适的索引和复制机制的情况下。这使得它适用于需要快速读取响应的应用程序,如内容管理系统、实时分析等。
4. 无需复杂的事务:如果你的应用程序对事务的一致性要求不是特别高,或者可以通过应用程序逻辑来保证数据的一致性,MongoDB可以作为一个高效的替代方案。例如,某些应用程序可以通过使用单文档事务或乐观并发控制来维护数据的一致性。
5. 全文搜索:MongoDB提供了全文搜索功能,可以用于需要在大量文本数据中进行搜索的应用程序,如博客、新闻网站等。
总的来说,MongoDB特别适合需要处理灵活数据模型、大规模写入、高性能读取和无需复杂事务支持的应用程序。
以下是一些MongoDB适用的业务场景:
MongoDB适合许多不同类型的业务,特别是那些需要处理灵活数据模型、大规模写入、高性能读取和无需复杂事务支持的应用。
1. 内容管理系统(CMS):CMS通常需要处理多种类型的内容,如文章、图片、视频等,而这些内容的结构可能会经常变化。MongoDB的灵活的文档数据模型使其成为存储和管理此类内容的理想选择。
2. 实时分析和日志处理:MongoDB可以处理大规模的写入操作,因此非常适合存储实时生成的日志数据或其他实时事件数据。它还具有良好的读取性能,可以支持实时分析和查询。
3. 物联网(IoT)应用:物联网应用通常需要处理大量的传感器数据和设备数据,并且这些数据的结构可能是不确定的。MongoDB的灵活性和水平扩展性使其成为存储和处理物联网数据的良好选择。
4. 用户分析和个性化推荐:对于需要存储和分析大量用户数据,并基于这些数据进行个性化推荐或用户行为分析的应用程序,MongoDB是一个强大的工具。它可以轻松存储用户配置文件、行为数据等,并支持复杂的查询和分析。
5. 实时数据集成和消息队列:MongoDB可以作为消息队列或实时数据集成系统的存储后端。它可以存储实时生成的数据,并且具有足够的读取性能来支持实时数据消费者。
Data Flow