多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