分布式部署

Linkis的单机部署方式简单,过多的进程在同一个服务器上会让服务器压力过大,生产环境为了保证服务的高可用,推荐使用分部署部署。 部署方案的选择,和公司的用户规模、用户使用习惯、集群同时使用人数都有关,一般来说,我们会以使用Linkis的同时使用人数和用户对执行引擎的偏好来做依据进行部署方式的选择。

Linkis的每个微服务都支持多活的部署方案,当然不同的微服务在系统中承担的角色不一样,有的微服务调用频率很高,资源会处于高负荷的情况, 在安装EngineConnManager的机器上,由于会启动用户的引擎进程,机器的内存负载会比较高,其他类型的微服务对机器的负载则相对不会很高, 对于这类微服务我们建议启动多个进行分布式部署,Linkis动态使用的总资源可以按照如下方式计算。

EngineConnManager使用总资源
= 总内存 + 总核数
= 同时在线人数 * (所有类型的引擎占用内存) *单用户最高并发数+ 同时在线人数 * (所有类型的引擎占用核数) *单用户最高并发数

例如:

  1. 只使用sparkhivepython引擎且单用户最高并发数为1的情况下,同时使用人数50人,
  2. sparkDriver内存1Ghive client内存1Gpython client 1G,每个引擎都使用1个核
  3. EngineConnManagerECM)使用总资源
  4. = 50 *(1+1+1G *1 + 50 *(1+1+1)核*1
  5. = 150G 内存 + 150 CPU

分布式部署时微服务本身占用的内存可以按照每个2G计算,对于使用人数较多的情况下建议调大ps-publicservice的内存至6G,同时建议预留10G内存作为buffer。

以下配置假设每个用户同时启动两个引擎为例对于64G内存的机器,参考配置如下:

EngineConnManager使用总资源 = 总内存 + 总核数 = 同时在线人数 * (所有类型的引擎占用内存) *单用户最高并发数+ 同时在线人数 * (所有类型的引擎占用核数) *单用户最高并发数

总内存:同时在线人数 50 单个引擎 1G内存 每个用户同时启动两个引擎 2 = 100G内存

服务器配置推荐4台服务器,分别命名为S1,S2,S3,S4

ServiceHost nameRemark
cg-engineconnmanagerS1、S2(共128G)每台机器单独部署
Other servicesS3、S4Eureka高可用部署

总内存:同时在线人数 100 单个引擎 1G内存 每个用户同时启动两个引擎 2 = 200G内存

服务器配置推荐:6台服务器,分别命名为S1,S2,S3,S4,S5,S6

ServiceHost nameRemark
cg-engineconnmanagerS1-S4(共256G)每台机器单独部署
Other servicesS5、S6Eureka高可用部署

总内存:同时在线人数 300 单个引擎 1G内存 每个用户同时启动两个引擎 2 = 600G内存

服务器配置推荐:12台服务器,分别命名为S1,S2..S12

ServiceHost nameRemark
cg-engineconnmanagerS1-S10(共640G)每台机器单独部署
Other servicesS11、S12Eureka高可用部署

服务器配置推荐:20台服务器,分别命名为S1,S2..S20

ServiceHost nameRemark
cg-engineconnmanagerS1-S18每台机器单独部署
Other servicesS19、S20Eureka高可用部署,部分微服务如果请求量上万可以考虑扩容,目前双活部署可以支持行内上千用户使用

按照同时在线800人估算 服务器配置推荐:34台服务器,分别命名为S1,S2..S34

ServiceHost nameRemark
cg-engineconnmanagerS1-S32每台机器单独部署
Other servicesS33、S34Eureka高可用部署,部分微服务如果请求量上万可以考虑扩容,目前双活部署可以支持行内上千用户使用

以下只是一个参考样例,以两台服务器为例进行分布式部署。目前一键安装脚本对分布式部署还没有很好的支持,需要手动进行调整部署。

假如已经在服务器A上,成功以单机方式部署了linkis,现在想添加一台服务器B,进行分布式部署,可以参考以下步骤

模式:Eureka服务多活部署 ,部分服务部署在服务器A,部分服务部署在服务器B上

和服务器A一样,服务器B需要进行基础的环境准备,请参考Linkis环境准备

注册中心Eureka服务,需要部署在服务器A和服务器B上,

修改Eureka配置文件,把两台Eureka的配置地址都加上,让Eureka服务之间相互注册。
在服务器A上,进行如下配置修改

  1. 修改 $LINKIS_HOME/conf/application-eureka.yml$LINKIS_HOME/conf/application-linkis.yml配置
  2. eureka:
  3. client:
  4. serviceUrl:
  5. defaultZone: http:/eurekaIp1:port1/eureka/,http:/eurekaIp2:port2/eureka/
  6. 修改 $LINKIS_HOME/conf/linkis.properties 配置
  7. wds.linkis.eureka.defaultZone=http:/eurekaIp1:port1/eureka/,http:/eurekaIp2:port2/eureka/

在服务器A上,将linkis的成功安装的目录$LINKIS_HOME 打包,然后拷贝并解压到服务器B的相同目录下。 此时,如果在服务器A上以及服务器B上,启动sbin/linkis-start-all.sh命令启动所有服务,那么所有服务都有两个实例。 可以访问eureka服务展示页面 http:/eurekaIp1:port1,或http:/eurekaIp2:port2 查看

根据实际情况,确定服务器A和服务器B上需要部署的服务, 比如 微服务linkis-cg-engineconnmanager 不会部署在服务器A上, 则修改服务器A的一键启停脚本,sbin/linkis-start-all.shsbin/linkis-stop-all.sh,将cg-engineconnmanager服务相关的启停命令,注释掉

  1. sbin/linkis-start-all.sh
  2. #linkis-cg-linkismanage
  3. #SERVER_NAME="cg-linkismanager"
  4. #SERVER_IP=$MANAGER_INSTALL_IP
  5. #startApp
  6. sbin/linkis-stop-all.sh
  7. #linkis-cg-engineconnmanager(ecm)
  8. #SERVER_NAME="cg-engineconnmanager"
  9. #SERVER_IP=$ENGINECONNMANAGER_INSTALL_IP
  10. #stopApp
  • 分部署部署时,linkis的安装目录建议保持一致,方便统一管控,相关的配置文件最好也保持一致
  • 如果某些服务器,端口已被其他应用占用,无法使用时,需要调整该服务端口
  • mg-gateway的多活部署,目前因为登陆session不支持分布式,用一个用户的请求,需要请求到同一个gateway实例上,可以通过nginx的ip hash负载均衡方式来支持
  • 一键启停脚本,根据实际情况,进行调整,对于不再本本服务器上部署的微服务,需要在一键启动脚本中,将对应的启停命令注释掉。