6. 运行管理

Limax框架,既是一套服务器/客户端开发环境,又是一个运行环境。提供了Switcher,GlobalId,Auany这些服务器组件,这些服务器组件与用户提供的Provider进行交互,最终达成完整的系统功能。正确配置,调优服务器运行参数;规划服务器互联关系;监视服务器运行状况;以及版本升级,数据迁移,故障恢复,是运行管理阶段必须完成的工作。


6.1 配置

Limax框架下各种服务器配置大多数通过xml描述实现。源码中基本服务器组件的配置可以作为参照进行修改,应用服务器生成的时候也生成了相应配置根据具体运行环境进行调整。部分不常用配置表现为java虚拟机参数形式,可以在启动时调整参数。

  • xml基本参数

    • Properties

      只有一个属性:file,可以指定一个符合java Properties规范的文件,提供给后续解析使用,影响后续部分属性字符串的解析。具体工作方式如下:

      如果属性字符串为$key:value$格式,例如serveri-switcher.xml中解析remoteIp属性"$auany.ipaddr:127.0.0.1$"时,按如下步骤进行:

      1. 分离出key=auany.ipaddr,用于查找

      2. 查找系统Property,如果存在则使用找到的值作为remoteIp,否则

      3. 在Properties中提供的属性文件中查找,如果存在则使用找到的值作为remoteIp,否则

      4. 设置remoteIp为127.0.0.1


    • Trace

      系统日志配置,包含如下属性:

      outDir: 日志输出目录,默认为"./trace"

      console: 是否允许输出到控制台,默认为true

      rotateHourOfDay,rotateMinute: rotate日志的时间,默认为每天早上6点,这里要注意,系统必须在运行中跨越这一时间点才会执行rotate

      rotatePeriod: rotate日志的周期,单位毫秒,默认86400000,即1天。

      level: 日志级别,有5种,DEBUG, INFO, WARN, ERROR, FATAL,默认为warn,这个属性字符串大小写不敏感。


    • Limit

      数量限制配置,当前用于控制ServerManager的接入数量,允许多个ServerManager引用同一限制。

      name: Limit的命名

      maxSize: 最大数量


    • JmxServer

      必选三个属性 host, serverPortrmiPort,提供给JMX管理应用使用。启动url为"service:jmx:rmi://<host>:<serverPort>/jndi/rmi://<host>:<rmiPort>/jmxrmi"。通常情况下配置不常用的端口,只要管理应用能够访问即可。

      属性usernamepassword可选。

      通常情况下,如果启动JmxServer,应该设置防火墙阻止来自Internet的访问。


    • ThreadPoolSize

      网络服务器线程池参数,包含如下属性。

      nioCpus: 执行网络Poll的cpu数量,超过系统cpu数量没有意义,默认1。

      netProcessors: 网络数据收发线程数量,默认4。

      protocolSchedulers: 协议处理线程数量,默认4。

      applicationExecutors: 应用线程数量,默认16。


    • Manager

      与应用xml描述中的type="server",type="client"两种Manager对应,描述了一个网络端点。包含以下属性。

      type: "client"或者"server"


      客户端,服务器共有属性

      parserCreatorClass: 将属性的解析工作转交给该属性指定的类的对象。

      className: 服务器或者客户端Listener类,用以处理网络消息,不存在则使用默认Listener。

      classSingleton: 存在className属性的情况下, 如果设置了这参数, 这个参数必须为类定义中一个静态方法名, 获取对象单件;如果没有这个参数, 则直接创建类的对象。

      defaultStateClass: 如果存在, 则启动时调用该类的getDefaultState静态方法获取Manager初始状态;如果不存在则以Listener对象为参数, 向className定义的对象查询Manager的初始状态。

      以上4个属性,与开发过程生成代码相关,一般情况下运营维护过程不用关心。


      enable: 允许启动该manager,默认为true;某些运营场景下可以设置为disable,暂时禁止启动manager。

      name: 端点名称,字符串。

      inputBufferSize: 输入缓冲区大小,默认16384,除非网络吞吐量很大否则无需修改。

      outputBufferSize: 输出缓冲区大小,默认16384,除非网络吞吐量很大否则无需修改。

      checkOutputBuffer: 是否检查输出缓冲区大小,如果允许检查,当网络拥塞时堆积数据超出outputBufferSize,记录警告,关闭连接。默认为false

      inputSecurity: 初始的网络输入流密钥,需要16字节串表示十六进制数,默认没有。

      outputSecurity: 初始的网络输出流密钥,需要16字节串表示十六进制数,默认没有。

      inputCompress: 初始状态下是否允许输入流压缩,默认false

      outputCompress: 初始状态下是否允许输出流压缩,默认false

      asynchronous: 该Manager工作模式为异步模式或者poll模式,默认false,使用poll模式


      客户端独有属性:

      remoteIp: 服务器ip地址

      remotePort: 服务器端口号

      connectTimeout: 连接超时时间,默认5秒

      autoReconnect: 是否允许连接失败后自动重连,允许的情况下,第一次延迟1秒后重连,以后逐次加倍退避,直到3分钟,3分钟为最长退避时间。默认false


      服务器独有属性:

      localIp: 服务器Ip地址,默认0.0.0.0

      localPoft: 服务器端口号

      backlog: 服务器Listen参数

      limit: 引用Limit配置名,控制服务器最大承载连接数量,超出数量后,记录日志,关闭后续接入用户连接,拒绝后续用户接入。缺省情况下,配置名解释为空串,共同引用一个maxSize=Long.MAX_VALUE的Limit。

      autoStartListen: 启动后是否允许服务器自动开始监听端口,默认为true

      webSocketEnabled: 是否启动为WebSocket服务器,支持HTML5兼容客户端,默认为false。


      如果启动为WebSocket服务器,则可以通过如下属性支持https:

      keyStore: pkcs12格式包装的服务器证书包路径

      password: keyStore密码


    • NodeService

      node.js服务组件配置,一个属性:

      module: node模块路径

      一系列有序子xml节点集,对应模块需要的参数。


      <parameter value="p0"/>
      <parameter value="p1"/>
      

    • Switcher

      switcher服务器组件专用,提供与Endpoint之间的连接配置参数。

      五个属性:

      cacheGroup:成功登录的情况下,switcher通过该组播地址在服务器间同步登录响应,switcher与auany断开连接的情况下,试图使用该cache信息进行认证。默认为空串,禁止该cache

      cacheCapacity:成功登录的login信息cache容量,默认10000

      needcompress.s2c: 是否压缩Switcher到Endpoint数据流,默认为true

      needcompress.c2s: 是否压缩Endpoint到Switcher数据流,默认为true

      key: swicher向auany发起验证使用的key,具体描述参见附录3(应用配置)。

      一系列子xml节点集:


      <dh group="1"/>	
      

      配置服务器允许的Diffie-Hellman组。RFC2049,RFC3526

      隐含支持 dhgroup = 1

      配置支持 dhgroup = 2,5,14,15,16,17,18


      <native id=”1”/>
      <ws id="2"/>
      <wss id="3">
      

      配置该服务器支持的switcher id,具体描述参见附录3(应用配置)。


    • Auany

      Auany服务器组件专用,包括三种类型子节点,plat,pay,appstore:

      plat节点:plat节点具有2个主要属性name与className。name大小写不敏感,为认证平台名,与Endpoint登录配置中的platflag相对应,相应的认证请求交由className指定的平台支持类进行处理。

      平台支持类需要实现limax.auany.PlatProcess接口,提供两个方法:

      init: 参数为对应plat节点,可以在plat节点内扩充平台需要的其它配置,在这里解析

      check: 具体处理方法可以参考,limax.auany.plats.Test的实现, 其中Test模块允许任何用户名, 但是密码必须为123456。limax.aunay.local.Authenticator为本地认证方式,比较复杂,支持3种常见的认证系统,radius,ldap,sql数据库,实际使用按照例子修改配置,选择某一种即可。定义在该plat节点下的认证系统通过RR方式支持负载均衡及容错,这种情况下请放置多个不同条目,条目越多,timeout配置应该越小,因为实现上,如果某一认证系统的查询不能正确返回结果——包括超时与失败——这种情况下,轮换使用下一认证系统。

      pay节点:pay节点具有2个主要属性gateway与className。gateway是系统为第三方支付网关分配的数字id, 与Endpoint.AuanyService.Pay中的gateway相对应. className指明了第三方支付网关消息处理类, 该类必须实现limax.auany.PayGateway接口。

      appstore节点:appstore发票处理的基础配置。

      此外,Auany 节点内 <xi:include href="appconfig.xml"/> 通过include方式引用了appconfig.xml配置文件,提供应用配置,具体描述在附录(应用配置)中详细介绍。


    • GlobalId

      Provider服务专用,配置类似于type="client"的Manager。一般来说应该配置autoReconnect=”true”,以及正确的GlobalId服务器ip地址,端口号。另外,可以配置属性timeout,指定GlobalId请求超时,效果等同于执行方法limax.provider.GlobalId.setTimeout(long timeout),默认为2000ms。


    • Provider

      与应用xml描述中的type="provider"类型Manager对应,提供了Provider的网络端点配置。

      Provider内置至少一个客户端类型Manager节点,描述了Provider连接Switcher服务器组件的配置,这些Manager节点除了parserCreatorClass,className,classSingleton,defaultStateClass属性无意义外,其它与客户端Manager节点相同。一个Provider内置Manager节点允许有多个,连接多个Switcher服务器组件,需要调整接入规模的时候,这是最常用的。

      Provider节点有如下属性:

      className:ProviderListener类,用以处理Provider消息,不存在则使用默认ProviderListener

      classSingleton: 存在className属性的情况下, 如果设置了这参数, 这个参数必须为类定义中一个静态方法名, 获取对象单件;如果没有这个参数, 则直接创建类的对象。

      viewManagerClass: View的管理类。

      setAsOnlines: 决定是否Provider启动时立刻打开数据服务,默认true

      以上4个属性,与开发过程生成代码相关,一般情况下运营维护过程不用关心。


      name: Provider名称,字符串

      pvid: Provider的PVID参数,决定了系统内服务号

      key: Provider密钥串,用于Auany服务器验证Provider合法性。默认为空串。Auany有验证需求时,应同步修改该串。

      useVariant: Provider是否支持Variant模式View,这与生成代码相关,但是必要的情况下可以通过设置该配置为false关闭这一特性。

      userScript: Provider是否支持脚本模式View,这与生成代码相关,但是必要的情况下可以通过设置该配置为false关闭这一特性。

      paySupportClass:如果Provider需要支持支付,则应该提供该支付处理类,支付处理类必须实现limax.provider.PaySupport接口。


    • Zdb

      Zdb配置支持大量属性:

      dbhome: 数据库home, 如果前缀为jdbc:mysql, 表示使用MYSQL数据库, 解释为jdbcUrl, 否则解释为EDB数据库的文件系统路径。

      preload: 表cache预装载路径。zdb正常停止,最后一次checkpoint之后,所有表的cache都是干净的。此时,将表cache内容保存到本地磁盘,下次启动,通过保存的内容初始化cache,后端为mysql的情况下,可以有效减轻启动负荷。装载过程中出现任何异常,立刻停止装载,所以表结构的变动不会造成任何影响。装载完成,清空整个目录。该属性默认不配置。

      edbCacheSize: 使用EDB数据库的情况下,该参数指定了EDB的cache页面最大数量。EDB数据页尺寸为8K。数据吞吐量过大的情况下,可能出现内存使用过载,一旦超出这个数量EDB将自动checkpoint,释放干净页面。

      edbLoggerPages: 使用EDB数据库的情况下,该参数指定了EDB的日志文件能够存储的页面的最大数量,checkpoint之前检查当前日志文件的页面数量是否超出这一限制,如果超出,则创建新的日志文件,如果启用了增量备份,前一个日志文件被复制到备份目录里,如果没有,前一个日志文件被简单删除。

      jdbcPoolSize: 使用MYSQL数据库的情况下,jdbcPoolSize决定了连接池大小,否则无意义。

      defaultTableCache: 选择表cache类,当前支持limax.zdb.TTableCacheConcurrentMap, limax.zdb.TTableCacheNull, limax.zdb.TTableCacheLRU,默认为limax.zdb.TTableCacheLRU。

      zdbVerify: 运行中检查程序锁的使用是否合规,测试运行阶段可以设置为true,正式运行设置为false,提高性能。

      autoKeyInitValue, autoKeyStep: 自增量key初始值和自增量key增长步长,如果预期到以后有合并数据库的需求,那么多个服务器可以考虑使用同样步长,不同初始值。这样使用自增量key的表就可以在维护时直接合并,不需要考虑重设id。

      corePoolSize, procPoolSize, schedPoolSize: 分别配置了zdb核心线程池大小;存储过程线程池大小;调度线程池大小。

      checkpointPeriod, marshalPeriod, marshalN, snapshotFatalTime: checkpointPeriod决定了将被改变的数据存储到底层数据库的频率,marshalPeriod决定了存储到底层数据库之前预打包未加锁的被改变数据的频率,预打包未加锁的被改变数据可以显著调高zdb吞吐量。可以几次预打包存储一次,marshalN决定了在最终存储之前预打包未加锁的被改变数据次数。两个频率的最小值由虚拟机参数limax.zdb.Checkpoint.SCHED_PERIOD控制,默认100ms。如果在最终存储之前,预打包与完全打包消耗的总时间大于snapshotFatalTime,则记录一条故障日志,多数情况表明系统负荷过重。

      deadlockDetectPeriod: 数据库死锁检测周期。


      Zdb节点下可以有一个Procedure节点,配置存储过程相关参数,Procedure节点有4个属性:

      maxExecutionTime: 存储过程执行的最大时间,执行超出该时间将报告过程执行超时,常见的OLTP应用,存储过程执行时间过长往往不合理。

      retryTimes, retryDelay: 这两个参数决定了死锁之后过程重试次数,以及退避时间。

      trace: 设定了存储过程相关日志记录级别。

      需要注意,所有Zdb配置的属性都没有提及默认值,因为这些默认值,全部来源于应用描述xml,存储在生成的程序文件中。应用启动时,这里的配置可以覆盖程序文件中的相应配置,一把来说只需要根据运营需求作少许修改。


  • Switcher

    Switcher配置可由上述Properties,Trace,JmxServer,ThreadPoolSize,Manager,Switcher节点进行组合,可参考Limax源码提供的service-switcher.xml进行调整,其中:

    Switcher节点必选

    Manager节点中

    name="ProviderServer" 节点定义了该Switcher作为Provider服务器的网络特性

    name="AuanyClient" 定义了该Switcher作为Auany客户端的网络特性

    name="SwitcherServer" 定义了该Switcher作为Endpoint客户端的网络特性

    name="SwitcherServerWebSocket" 定义了该Switcher作为WebSocket服务器的网络特性。

    例如,需要接入多个ISP,使用了多个网卡,可以克隆多份名为SwitcherServer的Manager节点,调整对应的name,配置各自的localIp,绑定不同的ISP的IP地址。


  • Auany

    Auany配置可由上述Properties,Trace,JmxServer,ThreadPoolSize,Manager,Auany,Zdb节点进行组合,可参考Limax源码提供的service-auany.xml进行调整。

    Zdb在这里用于存储整个运营环境下的用户SessionId分配关系。

    应用于实际的运营环境时,应该在Auany框架下,创建更多的limax.auany.PlatProcess接口实现,提供更多的三方平台支持。


  • GlobalId

    GlobalId配置可由上述Properties,Trace,JmxServer,ThreadPoolSize,Manager, Zdb节点进行组合,可参考Limax源码提供的service-globalid.xml进行调整。

    Zdb在这里用于存储分配的全局ID信息。


  • Provider

    Provider配置可由上述Properties,Trace,JmxServer,ThreadPoolSize,Manager, Zdb,GlobalId,ProviderId节点进行组合,可参考生成的服务器代码中的service-XXX.xml进行调整。

    一个Provider必须有且只有一个Provider节点。

    如果Provider提供的服务使用了GlobalId服务,则必须配置GlobalId节点,否则不用。

    如果Provider提供的服务使用了Zdb,则必须配置Zdb节点,否则不用。


  • java虚拟机参数

    limax.net.io.NetModel.delayPoolSize: 网络层触发各种超时动作使用的调度线程池大小,默认为1,一般无需调整。

    limax.util.ConcurrentEnvironment.timeoutSchedulerSize: 可超时执行器的调度线程池尺寸,可超时执行器用于Zdb的存储过程超时。默认认为3,一般无需调整。

    limax.zdb.Checkpoint.SCHED_PERIOD: zdb的checkpoint检测最小周期,默认为100ms,一般无需调整。

    limax.zdb.Lockeys.bucketShift: zdb内部锁hash桶尺寸移位参数。默认为10,表示桶尺寸为2<<10 == 1024。一般无需调整。

    limax.zdb.Zdb.useFixedThreadPool: boolean类型,如果设置为true,表示zdb的核心线程池、过程线程池使用固定线程池,这种情况下使用LinkedBlockingQueue排队任务,防止丢失。除非存储过程生成过多,导致瞬时重负荷,严重影响系统响应,不应该设置该参数。如果使用这种方式应该考虑zdb配置里面加大相应pool的配置。设置该参数应该被作为临时手段,修改设计才是合理考虑,必须意识到使用LinkedBlockingQueue排队任务,在任务间存在依赖关系的情况下,可能导致难以被检查到的饥饿。(正在执行的任务依赖了还在排队的任务)。

    limax.net.Engine.limitProtocolSize: 协议尺寸硬限制,限制了所有协议以及View协议的最大尺寸,超出尺寸连接中断,记录日志,默认1048576。一般来说对于交互性应用View的被改变字段尺寸,一次改变的字段的数量不应该过大,过大了将导致过多的网络传输,不是好的设计。对于数据传输应用,可以考虑在Provider,Switcher服务器上增大该参数。

    limax.net.Engine.intranetKeepAliveTimeout: 某些云环境下,内网可靠性不能保证,可以通过该参数配置服务器间keepalive检测的超时时长,一旦超时,关闭连接;作为服务器的服务器(通常是Switcher)清除相应的状态的信息,恢复到初始状态;作为客户端的服务器(通常是Provider),配置了断线重连的情况下,通过自动重连,试图恢复到正确的状态。默认为0ms,不作检测。

    limax.switcher.SwitcherListener.handShakeTimeout: 从Switcher接受Endpoint连接,到处理Endpoint握手请求之间允许的时间窗口,默认1000ms。除非Switcher服务器负荷过重或者客户端性能过低该限制才不能满足。服务器硬件性能不成问题的情况下可以在Switcher服务器上适当减小该参数,有利于更好抵抗攻击。

    limax.net.WebSocketServer.handShakeTimeout: 上述参数对于WebSocket方式运行的服务器无意义,因为WebSocket协议的设计决定了第一个HTTP请求分析处理完毕才切换进入WebSocket数据交换状态,这时所需的认证参数已经齐备。对于WebSocket方式下这个参数与上述参数具有同等意义。

    limax.net.WebSocketServer.maxMessageSize: WebSocket服务器允许的最大消息大小, 默认65536, 如果需要通过WebSocket交互大尺寸消息, 可以在Switcher服务器上增大该参数。过大的设置不利于Switcher抵抗流量攻击。

    limax.net.WebSocketServer.keyExchangeTimeout: 扩展的websocket方式下,密钥交换超时,默认3000ms。

    limax.net.WebSocketServer.dhGroupMax: 扩展的websocket方式下,密钥交换允许使用的最大DHGroup,默认2。

    limax.net.secureIp:如果Switcher处于DNAT环境下,通过该参数指定指定外网ip,确保native方式或者扩展的websocket方式下的密钥协商能够正确进行。

    limax.switcher.SwitcherListener.sessionLoginTimeout: Switcher与Endpoint握手成功直到正常上线允许的最长时间, 默认20000ms。超过这个时长一般意味着Switcher与Endpoint或者Auany之间的通讯出现问题。一般无需调整。

    limax.switcher.SwitcherListener.keepAliveTimeout: Endpoint周期性向Switcher发送Ping协议, 这个参数决定了Switcher收到Ping协议的最长允许间隔, 超出这个间隔, Switcher关闭网络连接。默认为60000ms。

    limax.switcher.SwitcherListener.pingProtect: Switcher的Ping保护周期,在保护周期内如果Switcher收到一个以上的Ping协议,服务器关闭网络连接。默认为30000ms。

    上述两个参数与Endpoint相关,发布版本的所有Endpoint使用50000ms的ping周期,在上述两个参数决定的窗口之内。如果要调整,需要保留一定宽容度。

    limax.node.js.EventLoop.corePoolSize: node.js框架事件循环线程池的最小线程数量,所有Cluster共享同一个线程池,默认64。

    limax.node.js.modules.Dns.corePoolSize: node.js框架中,dns模块的DirContext池容量,默认16,除非应用需要太多并发dns查询,一般不需要调整。

    limax.node.js.module.Net.TLSExchange.concurrency: node.js框架中, net模块的socket对象上启动TLS支持的情况下, 使用的SSLEngine的并发数量, 默认32, 重负荷TLS服务器, 可以试验性增加该值。

    limax.node.js.module.Sql.ConnectionFadeout: node.js框架中,sql模块的连接池中的连接淡出超时,默认60000ms,一般无需调整。


上一页 下一页