www.91084.com

GVKun编程网logo

Web 架构之路:MongoDB 集群及高可用实践(mongodb集群搭建原理)

1

此处将为大家介绍关于Web架构之路:MongoDB集群及高可用实践的详细内容,并且为您解答有关mongodb集群搭建原理的相关问题,此外,我们还将为您介绍关于ArgumentException:Mon

此处将为大家介绍关于Web 架构之路:MongoDB 集群及高可用实践的详细内容,并且为您解答有关mongodb集群搭建原理的相关问题,此外,我们还将为您介绍关于ArgumentException:MongoDB + Unity2D 中的无效关键字 'mongodb+srv://test:test@HOST' - Live MongoDB 未连接、asp.net-web-api – System.Web.Routing.RouteCollection不包含“MapHttpRoute”的定义 – VS 2012,Web API、asp.net-web-api – 在ASP.NET Web API控制器的nunit测试中实例化新的System.Web.Http.OData.Query.ODataQueryOptions、Docker 容器PHP + MongoDB 扩展 + `phpdotenv` mongodb/mongodb 1.9.0-alpha1 需要 ext-mongodb ^1.10.0 -> 它从您的系统中丢失的有用信息。

本文目录一览:

Web 架构之路:MongoDB 集群及高可用实践(mongodb集群搭建原理)

Web 架构之路:MongoDB 集群及高可用实践(mongodb集群搭建原理)

MongoDB 集群有副本集及主从复制两种模式,不过主从模式在 MongoDB 3.6 已经彻底废弃,今天主要探讨副本集的搭建和使用,以及分片。

副本集介绍

副本集 (Replica Set) 即副本的集合,在 MongoDB 中通过先定义一个副本集合,然后将多个节点 (副本) 加入到这个集合中。简单来说就是集群中包含了多份数据,保证主节点挂掉,备节点能够继续提供数据服务,实现 MongoDB 的数据备份及高可用。

副本集具有以下特征:

  • N 个节点的集群
  • 任何节点可作为主节点
  • 所有写入操作都在主节点上
  • 自动故障转移
  • 自动恢复

副本集搭建

条件有限,我们在单机上,通过三个不同的 MongoD 线程来搭副本集。

 

Web架构之路:MongoDB集群及高可用实践

主节点配置如下:

 

  1. # 指定数据库路径
  2. dbpath=/usr/local/mongochina/data/db
  3. # 使用追加的方式写日志
  4. logpath=/usr/local/mongochina/log/mongodb.log
  5. # 使用追加的方式写日志
  6. logappend = true
  7. # 绑定服务 IP
  8. bind_ip=127.0.0.1
  9. # 服务器端口
  10. port = 27017
  11. # 以守护进程的方式运行 MongoDB,创建服务器进程
  12. fork = true
  13. # PID File 的完整路径
  14. pidfilepath=/usr/local/mongochina/var/mongod.pid
  15. # 不启用验证
  16. noauth=true
  17. # 最大同时连接数,默认 2000
  18. maxConns=2000
  19. # 同步复制的日志大小设置,单位 MB
  20. oplogSize=10
  21. # 副本集名称
  22. replSet=rs0

副本节点的配置和主节点的基本一致,需要修改一下数据库 / 日志 / PID 路径和端口号,副本集名称需一致:

  1. # 指定数据库路径
  2. dbpath=/usr/local/mongochina/node/2/data/db
  3. # 使用追加的方式写日志
  4. logpath=/usr/local/mongochina/node/2/log/mongodb.log
  5. # 使用追加的方式写日志
  6. logappend = true
  7. # 绑定服务 IP
  8. bind_ip=127.0.0.1
  9. # 服务器端口
  10. port = 27018
  11. # 以守护进程的方式运行 MongoDB,创建服务器进程
  12. fork = true
  13. # PID File 的完整路径
  14. pidfilepath=/usr/local/mongochina/var/mongod2.pid
  15. # 不启用验证
  16. noauth=true
  17. # 最大同时连接数,默认 2000
  18. maxConns=2000
  19. # 副本集
  20. replSet=rs0

依次启动三个 mongod 进程:

  1. gitlib@devops:/usr/local/mongodb$ ps -aux | grep mongod
  2. root 14293 0.8 2.3 1588812 92700 ? Sl 08:06 0:01 bin/mongod -f mongod.conf
  3. root 14652 3.5 2.2 1583180 89364 ? Sl 08:08 0:00 bin/mongod -f mongod2.conf
  4. root 14723 6.4 2.2 1583180 89172 ? Sl 08:08 0:00 bin/mongod -f mongod3.conf

在主节点中,先使用 rs.initiate () 方法进行副本集初始化操作,再使用 rs.add () 方法来添加副本集的成员:

  1. > rs.initiate()
  2. {
  3.     “info2” : “no configuration specified. Using a default configuration for the set”,
  4.     “me” : “127.0.0.1:27017”,
  5.     “ok” : 1,
  6.     “$clusterTime” : {
  7.         “clusterTime” : Timestamp(1569457173, 1),
  8.         “signature” : {
  9.             “hash” : BinData(0,“AAAAAAAAAAAAAAAAAAAAAAAAAAA=”),
  10.             “keyId” : NumberLong(0)
  11.         }
  12.     },
  13.     “operationTime” : Timestamp(1569457173, 1)
  14. }
  15. rs0:OTHER> rs.add(‘127.0.0.1:27018’);
  16. {
  17.     “ok” : 1,
  18.     “$clusterTime” : {
  19.         “clusterTime” : Timestamp(1569457214, 2),
  20.         “signature” : {
  21.             “hash” : BinData(0,“AAAAAAAAAAAAAAAAAAAAAAAAAAA=”),
  22.             “keyId” : NumberLong(0)
  23.         }
  24.     },
  25.     “operationTime” : Timestamp(1569457214, 2)
  26. }
  27. rs0:PRIMARY> rs.add(‘127.0.0.1:27019’);
  28. {
  29.     “ok” : 1,
  30.     “$clusterTime” : {
  31.         “clusterTime” : Timestamp(1569457219, 1),
  32.         “signature” : {
  33.             “hash” : BinData(0,“AAAAAAAAAAAAAAAAAAAAAAAAAAA=”),
  34.             “keyId” : NumberLong(0)
  35.         }
  36.     },
  37.     “operationTime” : Timestamp(1569457219, 1)
  38. }
  39. rs0:PRIMARY>

到此,MongoDB 副本集部署完成,我们可以通过 rs.status () 命令查看副本集状态。

  1. gitlib@devops:~$ mongo 127.0.0.1:27018
  2. rs0:SECONDARY> rs.status()
  3. {
  4.     “set” : “rs0”,
  5.     “date” : ISODate(“2019-09-26T12:09:48.818Z”),
  6.     “myState” : 2,
  7.     “term” : NumberLong(1),
  8.     “syncingTo” : “127.0.0.1:27017”,
  9.     “syncSourceHost” : “127.0.0.1:27017”,
  10.     “syncSourceId” : 0,
  11.     “heartbeatIntervalMillis” : NumberLong(2000),
  12.     “optimes” : {
  13.         “lastCommittedOpTime” : {
  14.             “ts” : Timestamp(1569499786, 1),
  15.             “t” : NumberLong(1)
  16.         },
  17.         “lastCommittedWallTime” : ISODate(“2019-09-26T12:09:46.038Z”),
  18.         “readConcernMajorityOpTime” : {
  19.             “ts” : Timestamp(1569499786, 1),
  20.             “t” : NumberLong(1)
  21.         },
  22.         “readConcernMajorityWallTime” : ISODate(“2019-09-26T12:09:46.038Z”),
  23.         “appliedOpTime” : {
  24.             “ts” : Timestamp(1569499786, 1),
  25.             “t” : NumberLong(1)
  26.         },
  27.         “durableOpTime” : {
  28.             “ts” : Timestamp(1569499786, 1),
  29.             “t” : NumberLong(1)
  30.         },
  31.         “lastAppliedWallTime” : ISODate(“2019-09-26T12:09:46.038Z”),
  32.         “lastDurableWallTime” : ISODate(“2019-09-26T12:09:46.038Z”)
  33.     },
  34.     “lastStableRecoveryTimestamp” : Timestamp(1569499726, 1),
  35.     “lastStableCheckpointTimestamp” : Timestamp(1569499726, 1),
  36.     “members” : [
  37.         {
  38.             “_id” : 0,
  39.             “name” : “127.0.0.1:27017”,
  40.             “ip” : “127.0.0.1”,
  41.             “health” : 1,
  42.             “state” : 1,
  43.             “stateStr” : “PRIMARY”,
  44.             “uptime” : 42574,
  45.             “optime” : {
  46.                 “ts” : Timestamp(1569499786, 1),
  47.                 “t” : NumberLong(1)
  48.             },
  49.             “optimeDurable” : {
  50.                 “ts” : Timestamp(1569499786, 1),
  51.                 “t” : NumberLong(1)
  52.             },
  53.             “optimeDate” : ISODate(“2019-09-26T12:09:46Z”),
  54.             “optimeDurableDate” : ISODate(“2019-09-26T12:09:46Z”),
  55.             “lastHeartbeat” : ISODate(“2019-09-26T12:09:47.119Z”),
  56.             “lastHeartbeatRecv” : ISODate(“2019-09-26T12:09:47.667Z”),
  57.             “pingMs” : NumberLong(0),
  58.             “lastHeartbeatMessage” : “”,
  59.             “syncingTo” : “”,
  60.             “syncSourceHost” : “”,
  61.             “syncSourceId” : -1,
  62.             “infoMessage” : “”,
  63.             “electionTime” : Timestamp(1569457173, 2),
  64.             “electionDate” : ISODate(“2019-09-26T00:19:33Z”),
  65.             “configVersion” : 3
  66.         },
  67.         {
  68.             “_id” : 1,
  69.             “name” : “127.0.0.1:27018”,
  70.             “ip” : “127.0.0.1”,
  71.             “health” : 1,
  72.             “state” : 2,
  73.             “stateStr” : “SECONDARY”,
  74.             “uptime” : 43284,
  75.             “optime” : {
  76.                 “ts” : Timestamp(1569499786, 1),
  77.                 “t” : NumberLong(1)
  78.             },
  79.             “optimeDate” : ISODate(“2019-09-26T12:09:46Z”),
  80.             “syncingTo” : “127.0.0.1:27017”,
  81.             “syncSourceHost” : “127.0.0.1:27017”,
  82.             “syncSourceId” : 0,
  83.             “infoMessage” : “”,
  84.             “configVersion” : 3,
  85.             “self” : true,
  86.             “lastHeartbeatMessage” : “”
  87.         },
  88.         {
  89.             “_id” : 2,
  90.             “name” : “127.0.0.1:27019”,
  91.             “ip” : “127.0.0.1”,
  92.             “health” : 1,
  93.             “state” : 2,
  94.             “stateStr” : “SECONDARY”,
  95.             “uptime” : 42569,
  96.             “optime” : {
  97.                 “ts” : Timestamp(1569499786, 1),
  98.                 “t” : NumberLong(1)
  99.             },
  100.             “optimeDurable” : {
  101.                 “ts” : Timestamp(1569499786, 1),
  102.                 “t” : NumberLong(1)
  103.             },
  104.             “optimeDate” : ISODate(“2019-09-26T12:09:46Z”),
  105.             “optimeDurableDate” : ISODate(“2019-09-26T12:09:46Z”),
  106.             “lastHeartbeat” : ISODate(“2019-09-26T12:09:47.646Z”),
  107.             “lastHeartbeatRecv” : ISODate(“2019-09-26T12:09:47.036Z”),
  108.             “pingMs” : NumberLong(0),
  109.             “lastHeartbeatMessage” : “”,
  110.             “syncingTo” : “127.0.0.1:27018”,
  111.             “syncSourceHost” : “127.0.0.1:27018”,
  112.             “syncSourceId” : 1,
  113.             “infoMessage” : “”,
  114.             “configVersion” : 3
  115.         }
  116.     ],
  117.     “ok” : 1,
  118.     “$clusterTime” : {
  119.         “clusterTime” : Timestamp(1569499786, 1),
  120.         “signature” : {
  121.             “hash” : BinData(0,“AAAAAAAAAAAAAAAAAAAAAAAAAAA=”),
  122.             “keyId” : NumberLong(0)
  123.         }
  124.     },
  125.     “operationTime” : Timestamp(1569499786, 1)
  126. }

副本集高可用

集群中的各节点还会通过传递心跳信息来检测各自的健康状况。当主节点故障时,多个从节点会触发一次 新的选举操作,并选举其中的一个成为新的主节点 (通常谁的优先级更高,谁就是新的主节点),心跳信息默认每 2 秒传递一次。

 

Web架构之路:MongoDB集群及高可用实践

客户端连接到副本集后,不关心具体哪一台机器是否挂掉。主服务器负责整个副本集的读写,副本集定期同步数据备份。一旦主节点挂掉,副本节点就会选举一个新的主服务器。这一切对于应用服务器不需要关心。

 

 

Web架构之路:MongoDB集群及高可用实践

我们可以通过关闭主节点,测试是否会选举新的主节点:

 

  1. gitlib@devops:~$ ps -aux | grep mongod
  2. root 14293 0.6 2.5 1888584 99504 ? Sl 08:06 4:39 bin/mongod -f mongod.conf
  3. root 14652 0.6 2.6 1923896 102200 ? Sl 08:08 4:59 bin/mongod -f mongod2.conf
  4. root 14723 0.6 2.5 1886124 98984 ? Sl 08:08 4:47 bin/mongod -f mongod3.conf
  5. gitlib@devops:~$ sudo kill -9 14293
  6. [sudo] password for zhoufei:
  7. zhoufei@devops:~$ ps -aux | grep mongod
  8. root 14652 0.6 2.6 1932092 102200 ? Sl 08:08 4:59 bin/mongod -f mongod2.conf
  9. root 14723 0.6 2.5 1894320 99064 ? Sl 08:08 4:47 bin/mongod -f mongod3.conf

我们直接 kill 掉主节点,进入节点 1,看一下当前节点是否是主节点:

  1. gitlib@devops:~$ mongo 127.0.0.1:27018
  2. rs0:SECONDARY> rs.isMaster()
  3. {
  4.     “hosts” : [
  5.         “127.0.0.1:27017”,
  6.         “127.0.0.1:27018”,
  7.         “127.0.0.1:27019”
  8.     ],
  9.     “setName” : “rs0”,
  10.     “setVersion” : 3,
  11.     “ismaster” : false,
  12.     “secondary” : true,
  13.     “primary” : “127.0.0.1:27019”,
  14.     “me” : “127.0.0.1:27018”,
  15.     …

可以看到当主节点 (127.0.0.1:27017) 挂掉之后,主节点自动切换到从节点 2 (127.0.0.1:27019) 上。

副本集选举机制

副本集中的从节点在主节点挂掉后通过心跳机制检测到后,就会在集群内发起主节点的选举机制,自动选举出一位新的主服务器。

副本集包括三种节点:主节点、从节点、仲裁节点。

  • 主节点负责处理客户端请求,读、写数据,记录在其上所有操作的 oplog;
  • 从节点定期轮询主节点获取这些操作,然后对自己的数据副本执行这些操作,从而保证从节点的数据与主节点一致。默认情况下,从节点不支持外部读取,但可以设置,副本集的机制在于主节点出现故障的时候,余下的节点会选举出一个新的主节点,从而保证系统可以正常运行。
  • 仲裁节点不复制数据,仅参与投票。由于它没有访问的压力,比较空闲,因此不容易出故障。由于副本集出现故障的时候,存活的节点必须大于副本集节点总数的一半,否则无法选举主节点,或者主节点会自动降级为从节点,整个副本集变为只读。因此,增加一个不容易出故障的仲裁节点,可以增加有效选票,降低整个副本集不可用的风险。仲裁节点可多于一个。也就是说只参与投票,不接收复制的数据,也不能成为活跃节点。

官方推荐 MongoDB 副本节点最少为 3 台, 建议副本集成员为奇数,最多 12 个副本节点,最多 7 个节点参与选举。限制副本节点的数量,主要是因为一个集群中过多的副本节点,增加了复制的成本,反而拖累了集群的整体性能。 太多的副本节点参与选举,也会增加选举的时间。而官方建议奇数的节点,是为了避免脑裂 的发生。

选举过程

副本集的选举过程大致如下:

得到每个服务器节点的最后操作时间戳。每个 mongodb 都有 oplog 机制会记录本机的操作,方便和主服务器进行对比数据是否同步还可以用于错误恢复。

如果集群中大部分服务器 down 机了,保留活着的节点都为 secondary 状态并停止,不选举了。

如果集群中选举出来的主节点或者所有从节点最后一次同步时间看起来很旧了,停止选举等待人来操作。

如果上面都没有问题就选择最后操作时间戳最新 (保证数据是最新的) 的服务器节点作为主节点。

MongoDB 同步延迟问题

在 MongoDB 中,所有写操作都会产生 oplog,oplog 是每修改一条数据都会生成一条,如果你采用一个批量 update 命令更新了 N 多条数据,那么 oplog 会有很多条,而不是一条。所以同步延迟就是写操作在主节点上执行完后,从节点还没有把 oplog 拿过来再执行一次。而这个写操作的量越大,主节点与从节点的差别也就越大,同步延迟也就越大了。

分片

当 MongoDB 存储海量的数据时,一台机器可能不足以存储数据,也可能不足以提供可接受的读写吞吐量。这时我们就可以通过在多台机器上分割数据,使得数据库系统能存储和处理更多的数据。

分片集群结构分布:

 

Web架构之路:MongoDB集群及高可用实践

三个主要组件:

 

  • Shard:数据存储位置,以 chunk 为单位存数据,实际生产环境中一个 shard server 角色可由几台机器组个一个 replica set 承担,防止主机单点故障;
  • Config Server:mongod 实例,存储了整个 ClusterMetadata,其中包括 chunk 信息,默认需要配置 3 个 Config Server 节点;
  • Query Routers:(Mongos) 前端路由,客户端由此接入,且让整个集群看上去像单一数据库,前端应用可以透明使用。

Mongos 本身并不持久化数据,Sharded Cluster 所有的元数据都会存储到 Config Server,而用户的数据会议分散存储到各个 shard。Mongos 启动后,会从配置服务器加载元数据,开始提供服务,将用户的请求正确路由到对应的碎片。

Mongos 的路由功能:

  • 当数据写入时,MongoDB Cluster 根据分片键设计写入数据。
  • 当外部语句发起数据查询时,MongoDB 根据数据分布自动路由至指定节点返回数据。

分片部署

条件有限,我们还是在单机上,用不同 MongoDB 线程来部署分片。

 

Web架构之路:MongoDB集群及高可用实践

分片服务器

 

Shard Server 和普通 Mongod 程序一样,不同的是需要在配置文件中添加 shardsvr=true 标记为 Shard Server,配置参考如下:

  1. # 指定数据库路径
  2. dbpath=/usr/local/mongochina/share/1/data/db
  3. # 使用追加的方式写日志
  4. logpath=/usr/local/mongochina/share/1/log/mongodb.log
  5. # 使用追加的方式写日志
  6. logappend = true
  7. # 绑定服务 IP
  8. bind_ip=127.0.0.1
  9. # 服务器端口
  10. port = 27020
  11. # 以守护进程的方式运行 MongoDB,创建服务器进程
  12. fork = true
  13. # PID File 的完整路径
  14. pidfilepath=/usr/local/mongochina/var/mongod27020.pid
  15. # 不启用验证
  16. noauth=true
  17. # 最大同时连接数,默认 2000
  18. maxConns=2000
  19. # 同步复制的日志大小设置,单位 MB
  20. oplogSize=10
  21. # 设置为 shared server
  22. shardsvr=true

以上配置复制 4 份,修改一下数据库路径 / 日志路径 / 服务器 IP 和端口 / PID 路径,启动 4 个 Shard Server:

  1. sudo bin/mongod -f shard1.conf
  2. sudo bin/mongod -f shard2.conf
  3. sudo bin/mongod -f shard3.conf
  4. sudo bin/mongod -f shard4.conf

配置服务器

4.0 版本的 MongoDB 中配置服务器 (Config Server) 需要设置副本集,同时设置 configsvr=true,配置参考如下:

  1. # 指定数据库路径
  2. dbpath=/usr/local/mongochina/share/5/data/db
  3. # 使用追加的方式写日志
  4. logpath=/usr/local/mongochina/share/5/log/mongodb.log
  5. # 使用追加的方式写日志
  6. logappend = true
  7. # 绑定服务 IP
  8. bind_ip=127.0.0.1
  9. # 服务器端口
  10. port = 27100
  11. # 以守护进程的方式运行 MongoDB,创建服务器进程
  12. fork = true
  13. # PID File 的完整路径
  14. pidfilepath=/usr/local/mongochina/var/mongod27100.pid
  15. # 不启用验证
  16. noauth=true
  17. # 最大同时连接数,默认 2000
  18. maxConns=2000
  19. # 同步复制的日志大小设置,单位 MB
  20. oplogSize=10
  21. # 配置为 config server
  22. configsvr=true
  23. # 副本集名称
  24. replSet=rs0

启动 Config Server,并初始化副本集:

  1. sudo bin/mongod -f shard-config.conf
  2. mongo 127.0.0.1:27100
  3. > rs.initiaze()

新版本 MongoDB 建议设置多个 Config Server,采用副本集形式设置集群,为了搭建方便,这里我们只采用单个 Config Server。

路由服务器

Router Server 不存放数据,配置参考如下:

  1. # 使用追加的方式写日志
  2. logpath=/usr/local/mongochina/share/6/log/mongodb.log
  3. # 使用追加的方式写日志
  4. logappend = true
  5. # 绑定服务 IP
  6. bind_ip=127.0.0.1
  7. # 服务器端口
  8. port = 4000
  9. # 以守护进程的方式运行 MongoDB,创建服务器进程
  10. fork = true
  11. # PID File 的完整路径
  12. pidfilepath=/usr/local/mongochina/var/mongod4000.pid
  13. # 设置监听的 config 服务器
  14. configdb=rs0/127.0.0.1:27100

启动 Router Server,路由服务器是由 mongos 命令启动,与分片服务器及配置服务器不同。

  1. sudo bin/mongos -f shard-router.conf

启动后,需要通过 sh.addShard () 命令添加分片服务器:

  1. sh.addShard(‘127.0.0.1:27020’)
  2. sh.addShard(‘127.0.0.1:27021’)
  3. sh.addShard(‘127.0.0.1:27022’)
  4. sh.addShard(‘127.0.0.1:27023’)

配置完成后,可以通过 sh.status () 命令,查看分片情况:

  1. mongos> sh.status()
  2. — Sharding Status — 
  3.  sharding version: {
  4.     “_id” : 1,
  5.     “minCompatibleVersion” : 5,
  6.     “currentVersion” : 6,
  7.     “clusterId” : ObjectId(“5d8ddd1d94796dc650e29f67”)
  8.  }
  9.  shards:
  10.  { “_id” : “shard0000”, “host” : “127.0.0.1:27020”, “state” : 1 }
  11.  { “_id” : “shard0001”, “host” : “127.0.0.1:27021”, “state” : 1 }
  12.  { “_id” : “shard0002”, “host” : “127.0.0.1:27022”, “state” : 1 }
  13.  { “_id” : “shard0003”, “host” : “127.0.0.1:27023”, “state” : 1 }
  14.  active mongoses:
  15.  “4.2.0” : 1
  16.  autosplit:
  17.  Currently enabled: yes
  18.  balancer:
  19.  Currently enabled: yes
  20.  Currently running: no
  21.  Failed balancer rounds in last 5 attempts: 0
  22.  Migration Results for the last 24 hours:
  23.  No recent migrations
  24.  databases:
  25.  { “_id” : “config”, “primary” : “config”, “partitioned” : true }
  26.  config.system.sessions
  27.  shard key: { “_id” : 1 }
  28.  unique: false
  29.  balancing: true

 

ArgumentException:MongoDB + Unity2D 中的无效关键字 'mongodb+srv://test:test@HOST' - Live MongoDB 未连接

ArgumentException:MongoDB + Unity2D 中的无效关键字 'mongodb+srv://test:test@HOST' - Live MongoDB 未连接

如何解决ArgumentException:MongoDB + Unity2D 中的无效关键字 ''mongodb+srv://test:test@HOST'' - Live MongoDB 未连接?

我试图在本地连接我的 Live MongoDB 数据库,但在我使用外部字符串而不是 localhost 时出错

我使用:

  • MongoDB 数据库 v4.0.x(使用 mongoDB 的免费集群)
  • Unity 2020.3.13

如果我使用 localhost,即使所有的插入、更新、删除查询都能正常工作,这段代码也能正常工作

using UnityEngine;
using UnityEngine.UI;
using MongoDB.Bson;
using MongoDB.Driver;
using System.Collections;
using UnityEngine.Networking;
using MongoDB.Driver.Builders;
using UnityEngine.SceneManagement;
using System;
using Newtonsoft.Json ;

public class Login_Screen : MonoBehavIoUr {

public InputField usernameedit;
public InputField passwordone;
public Button loginButton;


  void start(){
    string connectionString = "mongodb://localhost:27017";
    var client = new MongoClient(connectionString);
    var server = client.GetServer();
    var database = server.GetDatabase("admin");
    var playercollection = database.GetCollection<BsonDocument>("users");
  }
}

但是我用于 LIVE 数据库调用的相同内容,然后导致以下错误。甚至连不上。

string connectionString = "mongodb+srv://testUsername:testPassword@testClustor.mongodb.net?retryWrites=true&w=majority";

错误信息如下:

ArgumentException: Invalid keyword ''mongodb+srv://testusername:testpassword@xyz.xxx.mongodb.net/admin1?w''. MongoDB.Driver.MongoConnectionStringBuilder.set_Item (System.String keyword,System.Object value) (at <6da29fc855c44d33ad78b3e27475ff27>:0) System.Data.Common.DbConnectionStringBuilder.set_ConnectionString (System.String value) (at <290425a50ff84a639f8c060e2d4530f6>:0) MongoDB.Driver.MongoConnectionStringBuilder..ctor (System.String connectionString) (at <6da29fc855c44d33ad78b3e27475ff27>:0) MongoDB.Driver.MongoClient.ParseConnectionString (System.String connectionString) (at <6da29fc855c44d33ad78b3e27475ff27>:0) MongoDB.Driver.MongoClient..ctor (System.String connectionString) (at <6da29fc855c44d33ad78b3e27475ff27>:0) Login_Screen.DoLogin () (at Assets/Script/Login_Screen.cs:61) UnityEngine.Events.InvokableCall.Invoke () (at <24599fe2776145d58ab771516c063d56>:0) UnityEngine.Events.UnityEvent.Invoke () (at <24599fe2776145d58ab771516c063d56>:0) UnityEngine.UI.Button.Press () (at Library/PackageCache/com.unity.ugui@1.0.0/Runtime/UI/Core/Button.cs:68) UnityEngine.UI.Button.OnPointerClick (UnityEngine.EventSystems.PointerEventData eventData) (at Library/PackageCache/com.unity.ugui@1.0.0/Runtime/UI/Core/Button.cs:110) UnityEngine.EventSystems.ExecuteEvents.Execute (UnityEngine.EventSystems.IPointerClickHandler handler,UnityEngine.EventSystems.BaseEventData eventData) (at Library/PackageCache/com.unity.ugui@1.0.0/Runtime/EventSystem/ExecuteEvents.cs:50) UnityEngine.EventSystems.ExecuteEvents.Execute[T] (UnityEngine.GameObject target,UnityEngine.EventSystems.BaseEventData eventData,UnityEngine.EventSystems.ExecuteEvents+EventFunction1[T1] functor) (at Library/PackageCache/com.unity.ugui@1.0.0/Runtime/EventSystem/ExecuteEvents.cs:262) UnityEngine.EventSystems.EventSystem:Update() (at Library/PackageCache/com.unity.ugui@1.0.0/Runtime/EventSystem/EventSystem.cs:385)

enter image description here

我真的浪费了 2 天的时间来寻找解决方案,请任何人帮助我。提前致谢

解决方法

我遇到了同样的问题。检查您的 db 和 db 用户的设置 - 确保它们可以从外部 IP 访问。

我像这样修改了我的连接字符串:

 private readonly Dictionary<string,string> _config = new Dictionary<string,string>()
        {
            {"dbUser","xxxxxx"},{"dbName","YourDbName"},{"password","xxxxxxxxxxxxx"}
        };

        public IMongoDatabase CreateInstance()
        {
            var client = new MongoClient($"mongodb+srv://{_config["dbUser"]}:{HttpUtility.UrlEncode(_config["password"])}@pocdata.0u29g.mongodb.net/{HttpUtility.UrlEncode(_config["dbName"])}?retryWrites=true&w=majority");
            return client.GetDatabase(_config["dbName"]);
        }

我只是使用公共方法连接到数据库,但这不是强制性的 - 您可以直接替换值 - 只需对密码和数据库名称进行 url 编码

asp.net-web-api – System.Web.Routing.RouteCollection不包含“MapHttpRoute”的定义 – VS 2012,Web API

asp.net-web-api – System.Web.Routing.RouteCollection不包含“MapHttpRoute”的定义 – VS 2012,Web API

我刚刚安装了Visual Studio 2012,并开始检查MVC 4和Web Api。
我已经用Web API创建了一个新的MVC 4应用程序。基于一些示例和教程,我开始配置我的路由:
routes.MapHttpRoute(
                name: "Controller only",routeTemplate: "api/{controller}"
            );

但是,这会导致RouteCollection不包含MapHttpRoute的定义的错误。我是否安装了一些DLL?
据我看到,我已经安装了所有正确的DLL和版本。

解决方法

我已经通过在RouteConfig.cs中添加对System.Web.Http的引用来解决它

asp.net-web-api – 在ASP.NET Web API控制器的nunit测试中实例化新的System.Web.Http.OData.Query.ODataQueryOptions

asp.net-web-api – 在ASP.NET Web API控制器的nunit测试中实例化新的System.Web.Http.OData.Query.ODataQueryOptions

我有一个ASP.NET MVC4 Web API项目与ApiController继承的控制器接受一个ODataQueryOptions参数作为其输入之一.

我正在使用NUnit和Moq来测试该项目,这使我能够从ApiController使用的相关的存储库方法中设置canned响应.这样做,如:

[TestFixture]
public class ProjectControllerTests
{
    [Test]
    public async Task GetById()
    {
        var repo = new Mock<IManagementQuery>();

        repo.Setup(a => a.GetProjectById(2)).Returns(Task.Fromresult<Project>(new Project()
        { 
              ProjectID = 2,ProjectName = "Test project",ProjectClient = 3
        }));

        var controller = new ProjectController(repo.Object);
        var response = await controller.Get(2);

        Assert.AreEqual(response.id,2);
        Assert.AreEqual(response.name,"Test project");
        Assert.AreEqual(response.clientId,3);
    }
}

我所面临的挑战是,要使用这种模式,我需要将相关的querystring参数传递给控制器​​以及存储库(这实际上是我的意图).然而,在使用ODataQueryOptions接受ApiController方法的情况下,即使在我想仅使用ODataQueryOptions的默认参数的情况下,我需要知道如何实例化一个.这变得棘手:

> ODataQueryOptions不实现接口,所以我不能直接模拟它.
>构造函数需要实现System.Web.Http.OData.ODataQueryContext,它需要实现一些实现Microsoft.Data.Edm.IEdmModel的文件,文档很少,Visual Studio 2012查找引用和查看调用层次不会提供洞察力(实现该接口?).

我需要做什么/有更好的方法吗?

谢谢.

解决方法

看来,其他人在 here的评论中已经回答了这个问题,但这不是我的用例的完整解决方案(见下面的评论):
ODataModelBuilder modelBuilder = new ODataConventionModelBuilder(); 
modelBuilder.EntitySet<Customer>("Customers"); 
var opts = new ODataQueryOptions<Customer>(new ODataQueryContext(modelBuilder.GetEdmModel(),typeof(Customer)),request);

Docker 容器PHP + MongoDB 扩展 + `phpdotenv` mongodb/mongodb 1.9.0-alpha1 需要 ext-mongodb ^1.10.0 -> 它从您的系统中丢失

Docker 容器PHP + MongoDB 扩展 + `phpdotenv` mongodb/mongodb 1.9.0-alpha1 需要 ext-mongodb ^1.10.0 -> 它从您的系统中丢失

如何解决Docker 容器PHP + MongoDB 扩展 + `phpdotenv` mongodb/mongodb 1.9.0-alpha1 需要 ext-mongodb ^1.10.0 -> 它从您的系统中丢失

我想要一个用于 PHP 的运行 Docker 容器,它可以与 MongoDB Atlas 数据库进行远程交互。

我已经硬编码并手动修复了自定义 Docker 映像以使 MongoDB 扩展正常工作。现在在扩展它以包含 vlucas/PHPdotenv composer 包时遇到问题。研究其他位置,似乎还有其他方法可以运行单独的 composer 容器并映射相关驱动器:

https://hackernoon.com/get-composer-to-run-on-docker-container-a-how-to-guide-y86g36z7

但是我无法使用 PHP:8.0-apache 图像或我自己的自定义图像来运行它。

自定义图像构建为:

  1. FROM PHP:8.0-apache
  2. RUN apt-get update -y && apt-get upgrade -y && apt-get install git libssl-dev -y
  3. RUN pecl install mongodb && docker-PHP-ext-enable mongodb
  4. RUN echo "extension=mongodb.so" >> /usr/local/etc/PHP/PHP.ini
  5. copY --from=composer /usr/bin/composer /usr/bin/composer
  6. EXPOSE 80 443

docker-compose.yml,使用我上面的自定义图片,是:

  1. version: ''2''
  2. services:
  3. PHP:
  4. image: redswitch/PHP-mongodb:8.0-1.9.0-3
  5. container_name: PHP
  6. volumes:
  7. - ./html:/var/www/html
  8. restart: always
  9. environment:
  10. - VIRTUAL_HOST=www.domain.com
  11. - LETSENCRYPT_HOST=www.domain.com
  12. - LETSENCRYPT_EMAIL=admin@domain.com
  13. - "TZ=Europe/London"
  14. ports:
  15. - 80
  16. expose:
  17. - 80
  18. restart: unless-stopped
  19. composer:
  20. image: composer:2.0
  21. command: ["composer","install"]
  22. volumes:
  23. - ./html:/app
  24. networks:
  25. default:
  26. external:
  27. name: Nginx-proxy-net

./html 的位置是 composer.json

  1. {
  2. "require": {
  3. "mongodb/mongodb": "^1.9.0-alpha1","vlucas/PHPdotenv": "^5.3.0"
  4. }
  5. }

我尝试了不同的最低版本,例如 ^1.8.0^1.9.0 和以上。这会根据 composer.json 文件中指定的版本提供相同错误消息的差异。

composer 容器按预期启动和停止。这是容器的日志:

  1. No composer.lock file present. Updating dependencies to latest instead of installing from lock file. See https://getcomposer.org/install for more information.,Loading composer repositories with package information,Updating dependencies,Your requirements Could not be resolved to an installable set of packages.,Problem 1,- Root composer.json requires mongodb/mongodb ^1.9.0-alpha1 -> satisfiable by mongodb/mongodb[1.9.0-alpha1].,- mongodb/mongodb 1.9.0-alpha1 requires ext-mongodb ^1.10.0 -> it is missing from your system. Install or enable PHP''s mongodb extension.,To enable extensions,verify that they are enabled in your .ini files:,- /usr/local/etc/PHP/PHP-cli.ini,- /usr/local/etc/PHP/conf.d/docker-PHP-ext-sodium.ini,- /usr/local/etc/PHP/conf.d/docker-PHP-ext-zip.ini,You can also run `PHP --ini` inside terminal to see which files are used by PHP in CLI mode.,

使用 PHP 调用检查 PHPinfo() 容器,我可以看到 MongoDB 扩展 v1.9.0 已启用,加载的配置文件和附加配置位于:

  • /usr/local/etc/PHP/PHP.ini
  • /usr/local/etc/PHP/conf.d/docker-PHP-ext-mongodb.ini,/usr/local/etc/PHP/conf.d/docker-PHP-ext-sodium.ini立>

我该如何解决这个问题?

这是部署 PHP+MongoDB+Composer+PHPDotEnv 的正确方式吗?

今天关于Web 架构之路:MongoDB 集群及高可用实践mongodb集群搭建原理的讲解已经结束,谢谢您的阅读,如果想了解更多关于ArgumentException:MongoDB + Unity2D 中的无效关键字 'mongodb+srv://test:test@HOST' - Live MongoDB 未连接、asp.net-web-api – System.Web.Routing.RouteCollection不包含“MapHttpRoute”的定义 – VS 2012,Web API、asp.net-web-api – 在ASP.NET Web API控制器的nunit测试中实例化新的System.Web.Http.OData.Query.ODataQueryOptions、Docker 容器PHP + MongoDB 扩展 + `phpdotenv` mongodb/mongodb 1.9.0-alpha1 需要 ext-mongodb ^1.10.0 -> 它从您的系统中丢失的相关知识,请在本站搜索。

本文标签: