多DB承载 - noradle/noradle-dispatcher GitHub Wiki
-
单 dispatcher 接收多个 db instance 的通道池支持
- 这个对现有设计改动较大,主要是原先的数据接口都要类化
- 设计数据库的唯一命名规范
- client 请求 dispatcher 要增加连接哪个目标库Instance的参数
- dispatcher 要根据client 要求的目标db绑定具体的 dbpool 实例
- 设计要考虑同一个 db 采用 RAC, data-guard 时的情况
- 设计要考虑使用 oracle 12c 多租户 db 的的情况
-
考虑子进程或者 web worker
- 为每一个 db 或者 db instance 运行一个单独的进程,分担负载
dispatcher hold 多个 db instances(RAC/DG/DIST)
结构如下: pools[db_name.db_domain][unique_name][instance] = onePool pools[db_name.db_domain].primary = unique_name 用于知晓DG中那个库是 primary 库
dispatcher 配置
增加 oracle[db_name.db_domain][unique_name][instance][cfg_id] = true or false or oracle_ip 当一个 oracle 连接过来时,必须存在相关配置,而且值为 true。 这样可以确保不会有 oracle 错误的连接到 dispatcher 上来。 如果没有 .oracle 配置,那么就不检查 oracle 连接来源
server_control_t / p_mon
增加 db_unique_name, instance 字段,标明该配置是针对哪个 DG/RAC node 的
client_control_t /
增加 unique, instance 字段,标明该配置是针对连接哪个 DG/RAC node 的客户端配置
目标:
- 支持相同 db_name.db_domain 在 RAC/DG 上的负载平衡,分担只读请求到 standby db
- 分离不同的应用到 RAC/DG 上的不同节点,每个节点的活动和数据使用范围单一,提升内存等资源效率
- 做 distributed db 的 sharding 切片,或者是对分区表中不同的分区路由到各自的处理db节点上
url route to http
最好不同的 url prefix 路由到不同的 noradle.HTTP 处理器中
noradle.HTTP 不仅仅可以 hold 一个 dbPool, 还可以 hold 。
dispatcher listener check
check.oracle[db_name.db_domain/db_unique_name/instance] = { passwd, oip, cfg_id} 一个 db 只有一个 cfg 能连接特定的 dispatcher,如果设定了 check.client[client_id] = { passwd, cip }
确保只有合法的 oracle/client 可以连接到 dispatcher 上来,否则拒绝
client/oracle 都连接到 dispatcher 后,dispatcher 只做连接接续,通道和并发资源的管理。 客户端并发控制和服务端并发控制一样,都在 oracle 内配置,因为只要是占用oracle处理资源。
如何标识一个 oracle ?
- oracle12c 下 pdb 如何标识, sys_context('userenv','con_name')
- 其实不必标识,因为只有 passwd,oip 不能伪造,标识都是随意的,直接用 cfg_id 标识好了
通过 http/https 接入 dispatcher 然后 upgrade。
- 请求中添加连接dispatcher的认证信息,
- 客户端连接请求中要添加连接哪个 oracle 的信息,db_unique_name/instance 默认为 db_name/1。
key tech
- http.on.connect 来将 http connect 请求转变为纯 socket 通信
- proxy 能支持 connect 请求的代理
- proxy 能 handoff socket handle to other processes
- https 能支持 https.on.connect,并且 proxy 能代理
- 考虑 client - dispatcher 采用 web socket 协议,这样,browser side js 可以直接和 dispatcher 通信
todo
- 验证合法的 oracle instance 接入从命令行改为通过权限配置函数
- authAttr.role=oracle, authAttr.header 包含所有连入的 oracle 信息
- 通过这个来允许或者拒绝
参考:
- socket.io
- http-proxy