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")
;

  



 

posted @ 2021-12-07 21:27  cqzaier  阅读(250)  评论(0)    收藏  举报