在文章《使用 acl 服务器框架编写负载均衡的应用服务》中介绍了 acl TCP 连接分配器的作用及原理,本节主要介绍 TCP 连接分配器的配置方法,及使用 acl 的服务器模板创建的应用服务子进程的配置方法(目前支持该功能的服务器模板有:线程池服务模板、协程服务模板以及非阻塞服务模板)。
一、TCP连接分配器的配置要点
TCP 连接分配器即 master_dispatch 程序,该程序也是一个服务进程,负责接收外部客户端的TCP连接,同时将该连接通过 UNIX 域套接口传递给后面的应用服务进程,该程序在 acl 库的 acl/app/master_dispatch/server 目录下。
master_dispatch 程序本身是基于非阻塞服务器模板编写,其中的配置项 aio_xxx 属于非阻塞服务器模板配置项,master_xxx 属于通用服务配置项,其中 master_service 配置项指明了 master_dispatch 监听的服务地址,如:master_service = 80, dispatch.sock, 1080,该配置指明 master_dispatch 同时监听 80 TCP 端口、dispatch.sock UNIX 域套接口及 1080 TCP 端口。外部客户端连接 80 端口,后端服务应用子进程连接 dispatch.sock 与 master_dispatch 进行通信。
关于 master_dispatch 应用本身的配置项说明如下:
1.1、backend_service = dispatch.sock
该配置项指明了后端应用服务子进程将会连接该 UNIX 域套接口,一方面应用服务进程向 master_dispatch 汇报自己的 TCP 连接数、总线程数、繁忙线程数等信息,该配置项的值必须与 master_service 中监听的 UNIX 域套接口保持一致;
1.2、manager_timer = 1
该配置项指明 master_dispatch 每隔 1 秒检测接收到的且未被传递给后端应用服务进程的 TCP 连接,尝试将这些连接再次传递给后端应用服务进程,同时将超时未传递的连接关闭,这样做的好处是当后端应用服务进程重启时依然可以接收外部客户端的连接,因为这些 TCP 连接暂时由 master_dispatch 保持着;
1.3、conn_expired = 10
该配置项指明当一个 TCP 连接由 master_dispatch ”保持“的超时时间为 10 秒,即超过 10 秒依然未被传递给后端应用服务进程的 TCP 连接将被 master_dispatch 强行关闭,而 TCP 连接一旦传递给后端应用服务进程则 master_dispatch 则将其从本身的缓存队列中删除;
1.4、status_servers = 127.0.0.1:10081
该配置项指定了 dispatch_mananger(用来收集缓存所有 master_dispatch 节点信息的服务进程)监听的服务地址,该配置项可以同时配置多个 dispatch_manager 的监听地址,格式为:ip1:port, ip2:port ...;
1.5、status_timer = 2
该配置项指定 master_dispatch 定期向 dispatch_manager 汇报状态的时间间隔为 2 秒;
1.6、status_service = 1080
该配置项指定 master_dispatch 可以在 1080 端口接收其它应用的状态查询请求,即 master_dispatch 不仅可以向 dispatch_manager 发送状态数据,同时也可以接收其它模块的状态请求;
1.7、server_timer = 1
该配置项指定 master_dispatch 每隔 1 秒汇总一下后端应用服务子进程的状态(总 TCP 连接数,总线程数,总繁忙线程数等);
1.8、service_name = app_service_name
该配置项指定 master_dispatch 所代表的服务节点的应用名称。
1.9、aio_access_allow = all
除了以上配置项外,还需检查 aio_access_allow 配置项是否为 all,该配置项指定允许连接 master_service 配置的 80 端口的客户端 IP 地址。
二、线程池服务器配置要点
2.1、ioctl_dispatch_addr = /opt/acl/var/private/dispatch.sock
该配置项指定 master_dispatch 进程监听的 UNIX 域套接口地址的全路径,线程池服务进程连接该地址与 master_dispatch 进行通信,汇报自己的状态(TCP连接数,线程数及繁忙线程数等),同时通过此 UNIX 域套接口从 master_dispatch 接收外部客户端连接;
2.2、ioctl_dispatch_type = app_service_name
该配置项指定本线程池服务的应用名称,一般与所属的 master_dispatch 中的 service_name 配置项相同即可;
2.3、master_maxproc = 1
该配置项指定进程池最大进程数;
2.4、master_prefork = 1
该配置项指定预启动的进程数,一般与 master_maxproc 相同即可,因为需要应用服务进程连接 master_dispatch 以便建立 UNIX 域套接口,所以要求此配置必须打开。
三、非阻塞服务器配置要点
3.1、aio_dispatch_addr = /opt/acl/var/private/dispatch.sock
该配置项指定 master_dispatch 进程监听的 UNIX 域套接口地址的全路径,非阻塞服务进程连接该地址与 master_dispatch 进行通信,汇报自己的状态(TCP连接数等),同时通过此 UNIX 域套接口从 master_dispatch 接收外部客户端连接;
3.2、aio_dispatch_type = app_service_name
该配置项指定本非阻塞服务的应用名称,一般与所属的 master_dispatch 中的 service_name 配置项相同即可。
3.3、master_maxproc = 1
该配置项指定进程池最大进程数;
3.4、master_prefork = 1
该配置项指定预启动的进程数,一般与 master_maxproc 相同即可,因为需要应用服务进程连接 master_dispatch 以便建立 UNIX 域套接口,所以要求此配置必须打开。