mongodb-4.4.10版本集群搭建:可复制集、分片集群
mongo除了单机部署,那么集群搭建可分为:可复制集、分片集群。
可复制集:每个master主后面都有N个slave备用节点。(生产环境推荐的部署模式)
分片集群:同时拥有多个可复制集,每个可复制集有自己的master和slave节点。
【可复制集】
读写分离,负载均衡,避免数据丢失,保障数据安全,提高系统安全性。
最少3节点,最大50节点。
自动化灾备机制,主节点宕机后通过选举产生新主机;提高系统健壮性;7个选举节点上限
通过日志同步,保证master和slave的数据是统一的。
查询会优先从master读。
【可复制集搭建步骤】
第一步:配置mongodb.conf
storage:
#数据文件存放目录
dbPath: "/Users/xxx/soft/mongodb-macos-x86_64-4.4.10/data"
systemLog:
#日志文件存放目录
destination: file
path: "/Users/xxx/soft/mongodb-macos-x86_64-4.4.10/log"
net:
#本地监听 IP,0.0.0.0 表示本地所有 IP,多个IP用逗号分隔。 #记住此处禁用localhost
bindIp: 0.0.0.0,192.168.2.100,127.0.0.1
# 端口,默认 27017,可以自定义
port: 27017
processManagement:
#以守护程序的方式启用,即在后台运行
fork: true
setParameter:
#是否需要验证权限登录(用户名和密码)
enableLocalhostAuthBypass: false
replication:
#集群搭建的slave信息
relSetName: configRS #集群名称
oplogSizeMB: 50 #oplog盖子集合大小
记住这里的集群名称叫 configRS。盖子集合的概念请参考《mongodb-4.4.10版本SQL查询进阶,mongodb与mysql的select SQL大比拼》
node1的config文件参照上面配置,然后node2 node3的config文件也按照上面的配置复制,只需要更改端口号、log存放目录、dbpath目录就好了。
第二步:启动mongo
依次启动3个mongodb节点命令:
bin/mongod --config mongo_node1.conf
bin/mongod --config mongo_node2.conf
bin/mongod --config mongo_node3.conf
然后使用 ps -ef | grep mongo 命令查看是否成功启动了3个mongodb
第三步:决定哪个节点为master主节点
假设3个节点的端口号是:27017、27018、27019
mongo --port 27017 连接上你选中做为主节点的节点
use admin 回到管理目录
rs.initiate({ 创建集群命令,指定master节点到host参数
_id: "configRS", 这里的集合命名一定需与mongodb.conf的集群名字相同
version: 1,
members: [
{ _id: 0, host : "192.168.0.128:27017" }
]
});
rs.add("192.168.0.128:27018"); //第2个节点添加到集群
rs.add("192.168.0.128:27019"); //第3个节点添加到集群
rs.add... //第N个节点添加到集群
第一次rs.initiate命令如果成功了,会有结果反馈: { "ok":1 } 和其他一些cluster信息。然后你在命令行里的 “>” 会变成 "configRS:SECONDARY" 表示刚才那个命令开始了一个集群模式
第二次执行rs.add命令时,命令行里的 “>” 会变成 "configRS:PRIMARY" 表示你已经是一个集群模式里的master了
注意:在从节点里("configRS:SECONDARY")需要查看数据或集合时,需执行 rs.slaveOk()指令才可以,否则会报错:"not master and slaveOk=false",即使该slave节点因为master节点挂掉当前已经通过选举刚刚变成了master节点,也需要执行rs.slaveOk()指令才可以看见数据或者集合。
敲黑板:要保证大多数集群存活,才可以选举出master,如果只剩一个节点,那就没有master了,如果没有master,将不能insert数据,不能做事务操作,即使rs.slaveOk()也不能。
第四步:集群验证
ps -ef | grep mongo 列出所有mongodb节点
kill -9 xxx 干掉主节点
mongo --port 27018 连接到从节点上
configRS:PRIMARY> 此时从节点已经变成了主节点
第五步:springboot连接可复制集群demo
在springboot里注册一个mongoClient:
@Bean(name="mongo")
public MongoClient mongoClient() {
// MongoCredential createCredential =
// MongoCredential.createCredential("lison", "lison", "lison".toCharArray());
WriteConcern wc = WriteConcern.W1.withJournal(true); //制定写策略,就是在集群里怎么写才算完成事务,参考《mongodb-4.4.10版本的存储引擎与写策略》
MongoClientOptions mco = MongoClientOptions.builder()
.writeConcern(wc)
.readPreference(ReadPreference.secondary()) // 配置读策略:优先从slave读
.connectionsPerHost(100) // 每台主机连接数100,默认连接数10
.threadsAllowedToBlockForConnectionMultiplier(5) // 线程队列数,默认值5,与上面connectionsPerHost值相乘的结果就是线程队列最大值。如果连接线程排满了队列就会抛出“Out of semaphores to get db”错误。
.maxWaitTime(120000)
.connectTimeout(10000)
.build();
List<ServerAddress> asList = Arrays.asList(
new ServerAddress("192.168.2.100", 27017));
MongoClient client = new MongoClient(asList, mco);
return client;
}
【分片集群】
分片集群和可复制集的不同点是:
可复制集:每个slave数据都是全部拷贝自master节点,就是master里的user集合有多少数据,slave里的user集合就有多少数据。
分片集群:更像是mysql里的分库分表,一个user集合的数据通过hash算法分布式存储到不同的分片上,然后为了数据的高可用,你可以在每个分片上做一个可复制集。
分片集群有3大组件概念:
分片:在集群中唯一存储数据的位置,可以是单个mongo服务器,也可以是可复制集,每个分区上存储部分数据;生产环境推荐使用可复制集
mongos路由:由于分片之存储部分数据,需要mongos路由将读写操作路由到对应的分区上;mongos提供了单点连接集群的方式,轻量级、非持久化所以通常mongos和应用部署在同一台服务器上;
配置服务器:存储集群的元数据,元数据包括:数据库、集合、分片的范围位置以及跨片数据分割和迁移的日志信息;mongos启动时会从配置服务器读取元数据信息在内存中;配置服务器最低3台;
分片集群搭建步骤:
第一步:搭建3个分片,也就是3套可复制集
按照上面可复制集的搭建步骤搭建3套可复制集,注意,每个可复制集的集群名称必须不一样。注意 mongodb.conf 配置文件里要加上分片配置信息:
sharding:
clusterRole: shardsvr #配置这个信息就表示当前集群是分片集群。 #注意这个值的不同,可以区分当前mongo节点是分片节点,还是配置节点,还是路由节点
假设:
【第一套可复制集】端口:27024、27025、27026,集群名称:configRS
【第二套可复制集】端口:27027、27028、27029,集群名称:configRS2
【第三套可复制集】端口:27030、27031、27032,集群名称:configRS3
bin/mongod --config /soft/mongosplit/node27024/mongodb.conf
bin/mongod --config /soft/mongosplit/node27025/mongodb.conf
bin/mongod ... 以这种方式,分别启动以上9个节点
ps -ef | grep mongo 查看是否9个节点都启动成功
第二步:搭建3个配置服务器
在mongodb.conf 配置文件里要加上:
sharding:
clusterRole: configsvr #注意这个值的不同,可以区分当前mongo节点是分片节点,还是配置节点,还是路由节点
假设启动的3个配置服务器端口是:27040、27041、27042
bin/mongod --config /soft/mongosplit/node27040/mongodb.conf
bin/mongod --config /soft/mongosplit/node27041/mongodb.conf
bin/mongod ... 以这种方式,分别启动以上3个配置节点
ps -ef | grep mongo 查看是否12个节点都启动成功(9个分片节点 + 3个配置节点)
第三步:搭建分片集群的路由
在mongodb.conf配置文件里要加上:
sharding:
configDB: editRS/192.168.2.100:27024,192.168.2.100:27027,192.168.2.100:27030 #仅配置每个分片里的可复制集里的master节点,这里共3个分片也就是3套可复制集,也就是3个master节点
#注意路由节点的conf配置文件里是没有dbPath配置的,它的配置信息全都从配置服务器里取
bin/mongos --config /soft/mongosplit/node27050/mongodb.conf & 启动路由命令。注意这里的启动命令不是mongod了,而是mongos。此时用 ps -ef | grep mongo 命令就能查到13个节点了,其中一个是mongos节点
>mongo --port 27050 进入路由节点
mongos> 进入路由节点成功,因为在这里显示mongos了
use admin 进入管理目录
sh.addShard("configRS/192.168.2.100:27024,192.168.2.100:27025,192.168.2.100:27026"); 添加第1个分片
sh.addShard("configRS2/192.168.2.100:27027,192.168.2.100:27028,192.168.2.100:27029"); 添加第2个分片
sh.addShard("configRS3/192.168.2.100:27030,192.168.2.100:27031,192.168.2.100:27032"); 添加第3个分片
user lison 进入lison数据库
sh.enableSharding("lisonSharding") 启用一个名叫lisonSharding的分片
sh.shardCollection("lison.orders", {"useCode":"hashed"} ) 对lison数据库的orders集合启用分片,使用hash算法进行分片的分布式存储。命令成功的话会返回{"ok":1}等信息
第四步:springboot连接分片集群demo
在springboot里注册一个mongoClient:
@Bean(name="mongo")
public MongoClient mongoClient() {
WriteConcern wc = WriteConcern.W1.withJournal(true); //制定写策略,就是在集群里怎么写才算完成事务,参考《mongodb-4.4.10版本的存储引擎与写策略》
MongoClientOptions mco = MongoClientOptions.builder()
.writeConcern(wc)
.readPreference(ReadPreference.secondary()) // 配置读策略:优先从slave读
.connectionsPerHost(100) // 每台主机连接数100,默认连接数10
.threadsAllowedToBlockForConnectionMultiplier(5) // 线程队列数,默认值5,与上面connectionsPerHost值相乘的结果就是线程队列最大值。如果连接线程排满了队列就会抛出“Out of semaphores to get db”错误。
.maxWaitTime(120000)
.connectTimeout(10000)
.build();
List<ServerAddress> asList = Arrays.asList( new ServerAddress("192.168.2.100", 27050)); // 这里直接连接到路由节点即可
MongoClient client = new MongoClient(asList, mco);
return client;
}
事务支持版本
mongo4.0版本,只有可复制集是支持事务的,分片集群(replica sets)是不支持事务的。
而在最新的mongo4.2版本中,分片集群也可以支持事务了。
集群注意事项
生产环境中打开profile,便于优化系统性能
生产环境中打开auth模式,保障系统安全
end.