apollo 分布式多机房部署手册

一. 服务组成

apollo 主要由以下几个角色组成

  • 架构图
  • 分布式部署手册

  • Config Service 职责

    • 提供配置的读取、推送等功能,服务对象是 Apollo 客户端
  • Meta Server 职责
    • Eureka 之上架了一层 Meta Server 用于封装 Eureka 的服务发现接口(这是为了支持 JAVA 意外的客户端, 支持服务发现)
    • 为了简化部署,实际上会把 Config Service、Eureka 和 Meta Server 三个逻辑角色部署在同一个 JVM 进程中
  • Admin Service 职责
    • 提供配置的修改、发布等功能
  • Portal 职责
    • 配置管理、发布修改、组织架构权限等操作
    • Portal 通过域名访问 Meta Server 获取 Admin Service 服务列表(IP+Port)
    • Portal 拿到 Admin Service 地址后, 而后直接通过 IP+Port 访问 Admin Service 服务,同时在 Portal 会做 load balance、错误重试
  • ENV 环境概念
    • DEV Development environment 开发环境
    • FAT Feature Acceptance Test environment 特性验收测试环境
    • UAT User Acceptance Test environment 用户验收测试环境
    • PRO Production environment 产品环境生产环境
  • 三大核心概念
    • 应用 应用唯一标识
    • 环境 软件各类环境
    • 集群 不同机房
    • 命名空间 配置分层

二. 准备工作

1. 环境配置要求

  • MySQL 5.6 +
    • 参数: 不区分大小写 lower_case_table_names = 1
  • JDK 1.8

2. 编译版本和修改配置

2.1 下载脚本修改配置

  1. # 下载脚本
  2. git clone git@gitee.com:java-project/apollo.git
  3. git fetch origin feature-v1.4.0:feature-v1.4.0
  4. git checkout feature-v1.4.0

2.2 打开 ide 导入项目, 修改相关配置

  1. 1. apollo-configservice 项目修改日志地址、端口、脚本
  2. conf/
  3. apollo-configservice.conf
  4. LOG_FOLDER=/opt/logs/service/apollo/configservice/
  5. resources/
  6. application.yml
  7. logging:
  8. file: /opt/logs/service/apollo/configservice/apollo-configservice.log
  9. server:
  10. port: 20101 (old: 8080)
  11. configservice.properties
  12. logging.file= /opt/logs/service/apollo/configservice/apollo-configservice.log
  13. server.port= 20101
  14. scripts/
  15. startup.sh
  16. LOG_DIR=/opt/logs/service/apollo/configservice
  17. SERVER_PORT=20101
  18. 2. apollo-adminservice 项目修改日志地址、端口、脚本
  19. conf/
  20. apollo-adminservice.conf
  21. LOG_FOLDER=/opt/logs/service/apollo/adminservice/
  22. resources/
  23. application.yml
  24. logging:
  25. file: /opt/logs/service/apollo/adminservice/apollo-adminservice.log
  26. server:
  27. port: 20102 (old: 8090)
  28. configservice.properties
  29. logging.file= /opt/logs/service/apollo/adminservice/apollo-adminservice.log
  30. server.port= 20102
  31. scripts/
  32. startup.sh
  33. LOG_DIR=/opt/logs/service/apollo/adminservice
  34. SERVER_PORT=20102
  35. 3. apollo-portal 项目修改日志地址、端口、脚本
  36. conf/
  37. apollo-portal.conf
  38. LOG_FOLDER=/opt/logs/service/apollo/portal/
  39. resources/
  40. application.yml
  41. logging:
  42. file: /opt/logs/service/apollo/portal/apollo-portal.log
  43. server:
  44. port: 20100 (old: 8070)
  45. scripts/
  46. startup.sh
  47. LOG_DIR= /opt/logs/service/apollo/portal
  48. SERVER_PORT=20100

2.3 编译脚本

  1. # 编译脚本
  2. apollo/scripts/build.sh
  3. 编译完成后会有 3 个包 zip 压缩包, apollo-portalapollo-adminserviceapollo-portal, 目录如下
  4. apollo/apollo-configservice/target/apollo-configservice-1.4.0-SNAPSHOT-github.zip
  5. apollo/apollo-adminservice/target/apollo-adminservice-1.4.0-SNAPSHOT-github.zip
  6. apollo/apollo-portal/target/apollo-portal-1.4.0-SNAPSHOT-github.zip

三. 分布式部署

  • 分布式部署图纸
  • 支持环境有 (DEV/FAT/UAT/PRO), 支持多机房
  • 部署的顺序为 configservice > adminservice > portal

1. 部署 Config Service / Admin Service

  • 本案例使用 PRO 环境为例, 其他环境模式相同, 直接 copy 即可.

  • PRO 环境(多机房部署)

    • 无锡机房, 同一台物理机器同时部署 Configservice 和 Adminservice
    • 宁波机房, 同一台物理机器同时部署 Configservice 和 Adminservice
  • DEV 环境(单机房部署)

1.1 配置环境独立 ApolloConfigDB(apollo_config_db) 数据库

  • 相同环境, 共用一个数据库服务器, 多个机房也共用一个数据库服务器
  • 不同环境, 各自使用独立的数据库服务器
  • 例如
    • PRO 环境, 部署在一个或者两个机房, 只需要一个数据库服务器
    • DEV 环境 / PRO 环境, 属于两个环境, 要分开, 各自使用不同的数据库服务器
  1. 1. 创建 apollo_config_db 数据库
  2. # 创建数据库
  3. CREATE DATABASE IF NOT EXISTS apollo_config_db DEFAULT CHARACTER SET = utf8mb4;
  4. # 授权用户
  5. GRANT ALL PRIVILEGES ON apollo_config_db.* TO 'apollo'@'%' IDENTIFIED BY 'your_password' WITH GRANT OPTION ;
  6. 2. 导入数据文件 scripts/db/migration/configdb/V1.0.0__initialization.sql apollo_config_db
  7. 3. 修改 ApolloConfigDB.serverconfig Eureka 参数
  8. # 在多机房部署时 Config Service / Admin Service 希望只向同机房的 eureka 注册
  9. a) 利用 Cluster 字段, 添加 Cluster wuxi 机房的配置, 配置如下(如果不指定 Cluster, 则全部使用 default 的配置)
  10. Key: eureka.service.url
  11. Cluster: wuxi
  12. Value: http://hotname1:20101/eureka/,http://hotname2:20101/eureka/,http://hotname3:20101/eureka/
  13. Comment: wuxi 机房的 Eureka 服务 Url
  14. b) 创建配置文件 /opt/settings/server.properties, 设置 idc 属性为无锡机房, 此时 Config Service / Admin Service 启动时会向指定机房注册
  15. idc=wuxi
  16. 4. 其他优化配置
  17. a) 开启缓存
  18. config-service.cache.enabled true

1.2 部署 Config Service 服务

  • Config Service 本身就是一个 Eureka 服务, 其中包含了(Config Service、Meta Server、Eureka) 所以启动了 Config Service, 这 3 个服务全部启动
  • Config Service / Admin Service 都需要向 Eureka 服务注册
  1. 1. 部署脚本
  2. # 解压
  3. unzip -o apollo/apollo-configservice/target/apollo-configservice-1.4.0-SNAPSHOT-github.zip
  4. # 修改 application-github.properties 数据库配置
  5. vim config/application-github.properties
  6. # DataSource
  7. spring.datasource.url = jdbc:mysql://{your_db_host}:3306/apollo_config_db?characterEncoding=utf8
  8. spring.datasource.username = apollo
  9. spring.datasource.password = {your_password}
  10. 2. 启动和关闭
  11. # 创建日志目录
  12. mkdir -p /opt/logs/service/apollo/configservice
  13. # 关闭
  14. scripts/shutdown.sh
  15. # 启动
  16. scripts/startup.sh
  17. 3. 启动成功
  18. netstat -tunlp | grep 20101 有数据表示启动成功

1.3 部署 Admin Service 服务

  • Admin Service 与 Config Service 部署在同一台物理机上
  • Admin Service 与 Config Service 使用同一个 apollo_config_db
  1. 1. 部署脚本
  2. # 解压
  3. unzip -o apollo/apollo-adminservice/target/apollo-adminservice-1.4.0-SNAPSHOT-github.zip
  4. 2. 修改 application-github.properties 配置
  5. # 修改数据库配置
  6. vim config/application-github.properties
  7. # DataSource (使用 Config Service 中 apollo_config_db 同样的数据库配置)
  8. spring.datasource.url = jdbc:mysql://{your_db_host}:3306/apollo_config_db?characterEncoding=utf8
  9. spring.datasource.username = apollo
  10. spring.datasource.password = {your_password}
  11. 3. 启动和关闭
  12. # 创建日志目录
  13. mkdir -p /opt/logs/service/apollo/adminservice
  14. # 关闭
  15. scripts/shutdown.sh
  16. # 启动
  17. scripts/startup.sh
  18. 4. 启动成功
  19. netstat -tunlp | grep 20102 有数据表示启动成功

2. 配置 Portal 服务

  • Portal 是控制管理界面, 管理所有环境(DEV/FAT/UAT/PRO), 所以 Portal 要能够与所有环境通讯
  • Portal 会连接不同环境的 Meta Server 拿到 Admin Service 地址与之通讯

2.1 创建 ApolloPortalDB(apollo_portal_db) 数据库

  • ApolloPortalDB 只需要单独部署一个即可, 不需要分环境
  1. 1. 创建 apollo_portal_db 数据库
  2. # 创建数据库
  3. CREATE DATABASE IF NOT EXISTS apollo_portal_db DEFAULT CHARACTER SET = utf8mb4;
  4. # 授权用户
  5. GRANT ALL PRIVILEGES ON apollo_portal_db.* TO 'apollo'@'%' IDENTIFIED BY 'your_password' WITH GRANT OPTION ;
  6. 2. 导入数据文件 scripts/db/migration/portaldb/V1.0.0__initialization.sql apollo_portal_db
  7. 3. 修改系统表 ApolloPortalDB.serverconfig 参数
  8. a) 设置目前支持的环境(DEV,FAT,UAT,PRO)多个用逗号分隔, 没有的环境注释掉不要填写, 不然启动会报错
  9. apollo.portal.envs PRO

2.2 配置 Portal 脚本

  • Portal 必须基于已有环境(DEV/FAT/UAT/PRO) 的 Config Service 和 Admin Service
  1. 1. 部署脚本
  2. # 解压
  3. unzip -o apollo/apollo-portal/target/apollo-portal-1.4.0-SNAPSHOT-github.zip
  4. 2. 设置 Portal 支持环境属性 (DEV/FAT/UAT/PRO)
  5. a) 修改 config/apollo-env.properties 设置已经有的环境, 建议使用 nginx slb 软负载, 只填写一个 host 地址
  6. #local.meta=http://localhost:20101
  7. # dev 测试环境所在的 Config Service 地址
  8. dev.meta=http://apollo-dev-meta-server:20101
  9. #
  10. fat.meta=http://apollo-fat-meta-server:20101
  11. uat.meta=http://apollo-uat-meta-server:20101
  12. lpt.meta=${lpt_meta}
  13. # PRO 生产环境所在的 Config Service 地址
  14. pro.meta=http://apollo-pro-meta-server1:20101,http://apollo-pro-meta-server2:20101,http://apollo-pro-meta-server3:20101
  15. 3. 修改 application-github.properties 配置
  16. # 修改数据库配置
  17. vim config/application-github.properties
  18. # DataSource
  19. spring.datasource.url = jdbc:mysql://app1:3306/apollo_portal_db?characterEncoding=utf8
  20. spring.datasource.username = apollo
  21. spring.datasource.password = apollo_818
  22. 4. 启动和关闭
  23. # 创建日志目录
  24. mkdir -p /opt/logs/service/apollo/portal
  25. # 关闭
  26. scripts/shutdown.sh
  27. # 启动
  28. scripts/startup.sh
  29. 5. 启动成功
  30. netstat -tunlp | grep 20100 有数据表示启动成功
  31. 6. 问题
  32. a) 启动的时候如果报错
  33. [Apollo-ServiceLocator-1] c.c.f.a.p.c.AdminServiceAddressLocator : Get admin server address from meta server failed. env: DEV, meta server address:http://apollo.meta
  34. 详见: https://github.com/ctripcorp/apollo/issues/1743
  35. b) 如果出现网络超时, 设置
  36. 修改 scripts/startup.sh 脚本, 添加 eureka 指定注册地址
  37. -Deureka.instance.ip-address=xxx.xxx.com
  38. 例如:
  39. export JAVA_OPTS="$JAVA_OPTS -Deureka.instance.ip-address=xxx.xxx.com -Dserver.port=$SERVER_PORT -Dlogging.file=$LOG_DIR/$SERVICE_NAME.log -Xloggc:$LOG_DIR/gc.log -XX:NumberOfGCLogFiles=5 -XX:GCLogFileSize=5M -XX:HeapDumpPath=$LOG_DIR/HeapDumpOnOutOfMemoryError/"