没有合适的资源?快使用搜索试试~ 我知道了~
MongoDB架构及基本操作说明.docx
1.该资源内容由用户上传,如若侵权请联系客服进行举报
2.虚拟产品一经售出概不退款(资源遇到问题,请及时私信上传者)
2.虚拟产品一经售出概不退款(资源遇到问题,请及时私信上传者)
版权申诉
0 下载量 166 浏览量
2023-09-05
17:04:51
上传
评论
收藏 26KB DOCX 举报
温馨提示
试读
11页
MongoDB架构及基本操作说明
资源推荐
资源详情
资源评论
MongoDB 架构及基本操作说明
当前架构 双服务器架构
当前架构为单 shard+replica Set 模式,双服务器为双 Shard+Replica Set 模
式。同一个 Shard 中的 primary 和 Secondary 存储内容一致。而双 Shard 则是两
个 Shard 分布式存储不同数据,备份由 shard 内部进行。
双服务器中的两个 Shard 各含一个 primary ,一个 secondary,和一个 arbiter
(arbiter 的唯一作用是在 primary 宕机后选举新的 primary 时拥有投票权,用
以使存活节点数大于 50%,不包括 50%,否则系统将整个 down 掉,以及在票
数相同的情况下用以打破选举的平衡,并不存储和读取数据)。
因为同一个 shard 中,只有 primary 可以用以写,secondary 只是用于对
primary 节点的备份并用于读操作,然后再 primary 宕机的情况下接管它的工作。
所以,双 shard 模式下,两个服务器分别包含一个 primary,而且同一个 shard
的 arbiter 必须和 secondary 在一个服务器上。这样子既保证了两个服务器都可
以进行读、写操作,而且在 primary down 的时候也能够继续使得选取成功
secondary。
后续扩展时,可以再在集群中添加新的 shard,然后与老的 shard 进行
balance 均衡操作。
当前架构启动顺序代码:
1、 先启动 primary,secondary,arbiter 这三个节点,linux 中命令分别为:
./mongod --replSet SetName --dbpath DbDir --logpath LogDir/mongod.log
--port PortNum
这里的 SetName 是你为建立的 Replica Set 所取的名字,因为三个节点处于同
一个 set,所以 SetName 是一致的。dbpath 是该节点上用于存储 mongoDB
数据的目录。Logpath 为存储日志的地址,此处需要是一个.log 的文档文件,
而不是一个文件夹目录。Port 是为这个 mongod 连接打开的端口号。
2、 启动 mongo 连接其中一个节点,进行 Set 的初始化操作
Primary
Secondary
Arbiter
ConfigSvr
Mongos
Primary1
Secondary2
Arbiter2
ConfigSvr
Mongos
Secondary1
Arbiter1
Primary2
ConfigSvr
Mongos
./mongo localhost:PortNum/admin
db.runCommand({“replSetInitiate”:{“_id”:”SetName”,”members”:[{“_id”:1,”ho
st”:”localhost:PortNum1”},{“_id”:2,”host”:”localhost:PortNum2”},{“_id”:3,”host”
:”localhost:PortNum3”,”arbiterOnly”:true}]}})
3、 启动 ConfigSvr
./mongod --dbpath DbDir --logpath LogDir --port PortNum
4、 启动 mongos
./mongos --port PortNum --configdb localhost:ConfigSvrPort
5、 启动客户端进行整个架构的初始化操作
./mongo SvrIP:mongosPort/admin
db.runCommand({addshard:”SetName/localhost:PortNum1,localhost:PortNu
m2”,name:”ShardName”})
(ShardName 是此时才定义的,此处 addshard 操作后面的节点只需要 Set 中
的 Standard 节点就行,不需要写入 arbiter)
6、 开始存储操作,在新加入一个数据库时,需要在 admin 库下进行操作,才能
使得它为分布式存储
use admin
db.runCommand({enablesharding:”newDB”})
db.runCOmmand({shardcollection:’DB.Collection’,key:{_id:1}})
第一个指令为将 newDB 进行分布式,第二个指令为分别指定 DB 中的各个
Collection 的分布式存储的依据,默认为根据_id 来进行
当前的所有节点都位于服务器 192.168.1.113 上,其中 mongos 端口为
27050,primary 为 27051,Secondary 为 27052,Arbiter 为 27053,ConfigSvr
为 27054。目前只开放了 27050 端口,其他端口都只能从服务器上 localhost 访
问。
因为目前的 1.18.1 的 MongoDB 并不支持 Shard+Replica Set 模式的用户安全
设置功能,所以此处并无设置。预计于下个月发布的 1.19.1 版本可能会加入这
一功能,但要具体完善,初步估计需要到 1.20 版。
MongoDB 操作
1、 自增长 ID:
在原有 Collection 之外,新建一个 Collection,用以存储自增长的 ID,只需要
一条 Document 就行。每次在 lky_form 插入新的 Document 时,从这个 Collection
中 FindAndModify 一下他原有的数据,这是一个原子操作,便避免了并发性问
题的可能。
具体代码如下:
命令行版:
userId =
db.counter.findAndModify({update:{$inc:{‘count’:1},query:{name:”counter”},
new:true}})
a={“_id”:userId.count,…}
db.CollectionName.insert(a)
java 版:
DBObject modifier =new BasicDBObject("counter",1);
DBObject incQuery = new BasicDBObject("$inc",modifier);
DBObject user=number.findAndModify(num0, incQuery);
//此处的 num0 为我设置的存入新的表单的那个 Document 的名字
DBObject newuser = new BasicDBObject();
newuser.put("_id", user.get("counter"));
2、 模糊查询
使用正则表达式进行模糊查询
命令行版:
db.CollectionName.find({“tag”:/good/})
//此命令行表示查询 tag 中包含了 good 字符的 Document
或者也可以写为:
db.CollectionName.find({“tag”:{$regex:”good”}})
Java 版:
import java.util.regex.Pattern;
DBCursor cur ;
cur = coll.find(new
BasicDBObject().append("tag",Pattern.compile("good",Pattern.CASE_INSENSITIV
E)));
附录:
MongoDB Java Driver 简单操作
一、Java 驱动一致性
MongoDB 的 Java 驱动是线程安全的,对于一般的应用,只要一个 Mongo 实例
即可,Mongo 有个内置的连接池(池大小默认为 10 个)。
对于有大量写和读的环境中,为了确保在一个 Session 中使用同一个 DB 时,我
们可以用以下方式保证一致性:
DB mdb = mongo.getDB('dbname');
mdb.requestStart();
//
// 业务代码
剩余10页未读,继续阅读
资源评论
小小哭包
- 粉丝: 1899
- 资源: 3854
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功