mongodb对事务的支持,存在版本问题;复制集群和分片集群搭建
@Test
public void testTransaction() {
// begin
// update users set money= money-1 where username = ‘a’
// update users set money= money+1 where username = ‘b’
// commit
ClientSession clientSession = client.startSession();
clientSession.startTransaction();
Bson eq = eq("username", "a");
Bson inc = inc("money", -1);
doc.updateOne(clientSession,eq,inc);
Bson eq2 = eq("username", "b");
Bson inc2 = inc("money", 1);
doc.updateOne(clientSession,eq2,inc2);
clientSession.commitTransaction();
//clientSession.abortTransaction();
}
问题描述:在单机mongodb环境下,不支持事务;
报错信息:

版本问题:在4.0的版本只支持replica (可复制级)的集群
在4.2的版本支持replica和分片集群(clusters)
参考官方文档:https://docs.mongodb.com/manual/core/transactions/

复制集群的搭建
参考:https://docs.mongodb.com/manual/replication/
主节点

主节点

从节点不能执行语句,可以用rs.slaveOk();
在主节点的运行命令
rs.initiate({
_id: "configRS",
version: 1,
members: [{ _id: 0, host : "192.168.8.211:27017" }]});
//添加复制从节点
rs.add("192.168.8.212:27017");
//添加复制从节点
rs.add("192.168.8.213:27017");
配置文件
storage:
journal:
enabled: true
dbPath: "/usr/local/mongodb/data/db"
##是否一个库一个文件夹
directoryPerDB: true
engine: wiredTiger
##WT 引擎配置
wiredTiger:
engineConfig:
##WT 最大使用 cache(根据服务器实际情况调节)
cacheSizeGB: 1
##是否将索引也按数据库名单独存储
directoryForIndexes: true
#默认 snappy)
journalCompressor: none
##表压缩配置
collectionConfig:
##(默认 snappy,还可选 none、 zlib)
blockCompressor: zlib
##索引配置
indexConfig:
prefixCompression: true
systemLog:
destination: file
path: "/usr/local/mongodb/log/mongodb.log"
net:
bindIp: 0.0.0.0
port: 27017
processManagement:
fork: true
setParameter:
enableLocalhostAuthBypass: false
replication:
replSetName: configRS
oplogSizeMB: 50
分片集群搭建
参考:https://docs.mongodb.com/manual/sharding/
官网架构图

这里只说下关键配置
- config servers:存储集群的元数据,元数据包括:数据库、 集合、 分片的范围位置以及跨片数据分割和迁移的日志信息; mongos 启动时会从配置服务器读取元数据信息在内存中; 配置服务器最低 3台
- shard:分片。每个分区上存储部分数据
- router :路由。由于分片之存储部分数据,需要 mongos 路由将读写操作路由到对应的分区上
分片的配置文件参考replica配置文件
config的配置文件:
##省略部分配置
replication:
replSetName: editRS
oplogSizeMB: 50
sharding:
clusterRole: configsvr
路由的配置
systemLog: destination: file path: "/var/log/node27031/logs/mongodb.log"
#路由不用配置storage dbpath ; net: port: 27031 bindIp: 127.0.0.1,192.168.8.211 processManagement: fork: true setParameter: enableLocalhostAuthBypass: false
#配置配置中心的地址 sharding: configDB: editRS/192.168.8.211:27028,192.168.8.211:27029,192.168.8.211:27030
重要说明:路由的启动时通过mongos
/usr/local/mongodb/bin/mongos --config /usr/local/mongodb/mongosplit/node27031/mgdb.conf &
路由添加节点信息
use admin;
sh.addShard("configRS2/192.168.8.212:27023,192.168.8.212:27032,192.168.8.212:27033
");
sh.addShard("configRS3/192.168.8.212:27027,192.168.8.212:27034,192.168.8.212:27035
");
//configRS 这个是复制集的名称
sh.addShard("configRS/192.168.8.212:27024,192.168.8.212:27025,192.168.8.212:27026")
;

浙公网安备 33010602011771号