通讯协议
-
组成
- head: 消息头
- payload length(int32): 消息长度
- request_id(int32): 请求ID
- response_to(int32): 服务端响应对应请求的reques_id(请求类型为OP_QUERY、OP_GET_MORE)
- operation_code(int32): 消息类型
- payload: 消息体
- head: 消息头
-
类型
名称 | 代码 | 作用 |
---|---|---|
OP_REPLY | 1 | 回复客户端请求 |
OP_UPDATE | 2001 | 更新数据 |
OP_INSERT | 2002 | 插入数据 |
OP_QRERY | 2004 | 请求 |
OP_GET_MORE | 2005 | 获取更多的数据 |
OP_DELETE | 2006 | 删除数据 |
OP_KILL_CURSORS | 2007 | 游标已使用完 |
OP_MSG | 2013 | 扩展消息 |
客户端消息
- 可以发送除OP_REPLY之外的类型
- 只有OP_QUERY和OP_GET_MORE会有响应
- OP_UPDATE消息体
- ZRRO(int32): 保留字
- fullCollectionName(string): 表全称,如db1.collection1
- flags(int32): 标志,第一位代表是否upsert, 第二位代表是否更新多个,其他位为保留位
- selector(bson): 更新条件
- update(bson): 更新操作
pymongo
客户端选项:
- retryWrites/retryWrites: operations will be retried once after a network error on MongoDB 3.6+. Defaults to True
- write concern选项
- w: int/string 写入确认 0:无需任何确认 1(默认值):数据写入到Primary就向客户端发送确认 n: n个节点都写入了才确认 majority: 大多数节点写入之后才确认
- journal:写入持久化到journal才确认
- read preference
- primary(默认): 只从primary读数据
- primaryPreferred: 优先读primary
- secondary:只从secondary节点读数据
- secondaryPreferred: 优先读secondary
- nearest: 按网络距离就近读取
- readConcernLevel
- local: 能读取任意数据
- majority: 能读取到写入大多数节点的数据
获取对应数据库
|
|
TCP连接建立(NODELAY, KEEPALIVE)
|
|
新建sock
|
|
放入pool
|
|
更新过期的sock
|
|
检测sock是否可读:
|
|
打包
|
|