Apollo配置中心多环境HA简单部署

背景

随着项目的功能越来越复杂,各种各样的配置也越来越多,渐渐的开始面临以下问题:

  1. 各种配置到处都是,没有集中管理。

  2. 配置的存放方式也多种多样,如程序内部hard code、配置文件中、数据库中等等。

  3. 同一种配置,各处不统一。

  4. 配置修改后不能实时生效。

  5. 配置的修改没有完善的审核机制,想改就改等,出问题很难追溯。

基于此,就需要有一个完善的配置中心。Apollo便应用而生。

Apollo(阿波罗)是携程框架部门基于Spring Boot和Spring Cloud研发的配置中心,能集中化管理不同环境、不同集群、不同应用的配置,配置修改后能够实时推送到应用端,并且具有权限管理、流程控制、版本发布、灰度发布、一键回滚、集中审计日志等功能。

本文基于Apollo Wiki文档学习实践整理而成。

架构

这里简单起见,只有两个环境:Pro(生产环境)、Dev(开发环境)。架构如下:

注意:

  • Portal部署在Pro生产环境,通过它来管理Pro、Dev环境的配置。

  • Meta Server、Config Service和Admin Service需要在每个环境的每个节点都部署。

  • Meta Server和Config Service部署在同一个JVM进程内,Admin Service部署在同一台服务器的另一个JVM进程。基于目前的实现,启动Config Service进程就相当于也启动了Meta Server服务。

  • 每个环境使用独立数据库。资源有限,这里数据库均是单节点。Mysql数据库最好在5.6.5+以上(Apollo的表结构对timestamp使用了多个default声明,所以需要5.6.5以上版本)。

  • 此次部署省略了SLB部分,工作中用nginx等配置即可。

  • JDK最好在1.8以上。

节点规划

由上图可以,节点规划如下:

节点 角色
node1-Pro 环境 apollo-adminservice进程、apollo-configservice进程、ApolloConfigDB库、apollo-portal进程ApolloPortalDB库
node2-Pro 环境 apollo-adminservice进程、apollo-configservice进程、apollo-portal进程
node3-Dev 环境 apollo-adminservice进程、apollo-configservice进程、ApolloConfigDB库、
node4-Dev 环境 apollo-adminservice进程、apollo-configservice进程

部署

下载、解压、分发安装包

第一步:下载
#下载apollo-configservice
[root@node1 /data/software]# wget https://github.com/ctripcorp/apollo/releases/download/v1.3.0/apollo-configservice-1.3.0-github.zip

#下载apollo-adminservice
[root@node1 /data/software]# wget https://github.com/ctripcorp/apollo/releases/download/v1.3.0/apollo-adminservice-1.3.0-github.zip

#下载apollo-portal
[root@node1 /data/software]# wget https://github.com/ctripcorp/apollo/releases/download/v1.3.0/apollo-portal-1.3.0-github.zip

第二步: 解压
#解压apollo-configservice
[root@node1 /data/software]# unzip apollo-configservice-1.3.0-github.zip -d apollo-configservice

#解压apollo-adminservice
[root@node1 /data/software]# unzip apollo-adminservice-1.3.0-github.zip -d apollo-adminservice

#解压apollo-portal
[root@node1 /data/software]# unzip apollo-portal-1.3.0-github.zip -d apollo-portal

第三步: 分发
#将apollo-configservice拷贝至node2、node3、node4
[root@node1 /data/software]# scp -r apollo-configservice root@node2:/data/software/
[root@node1 /data/software]# scp -r apollo-configservice root@node3:/data/software/
[root@node1 /data/software]# scp -r apollo-configservice root@node4:/data/software/

#将apollo-adminservice拷贝至node2、node3、node4
[root@node1 /data/software]# scp -r apollo-adminservice root@node2:/data/software/
[root@node1 /data/software]# scp -r apollo-adminservice root@node3:/data/software/
[root@node1 /data/software]# scp -r apollo-adminservice root@node4:/data/software/

#将apollo-portal拷贝至node2
[root@node1 /data/software]# scp -r apollo-portal root@node2:/data/software/

创建ApolloPortalDB、ApolloConfigDB数据库

下载、解压、分发源码

源码中包含所需的建库sql语句。

#下载apollo源码
[root@node1 /data/software]# wget https://github.com/ctripcorp/apollo/archive/v1.3.0.tar.gz

#解压源码
[root@node1 /data/software]# tar -zxvf v1.3.0.tar.gz

#分发源码至node3节点
[root@node1 /data/software]# scp -r apollo-1.3.0 root@node3:/data/software/

创建node1上的ApolloPortalDB、ApolloConfigDB数据库

#创建ApolloPortalDB
mysql> source /data/software/apollo-1.3.0/scripts/db/migration/portaldb/V1.0.0__initialization.sql

#验证
mysql> select `Id`, `Key`, `Value`, `Comment` from `ApolloPortalDB`.`ServerConfig` limit 1;
+----+--------------------+-------+--------------------------+
| Id | Key                | Value | Comment                  |
+----+--------------------+-------+--------------------------+
|  1 | apollo.portal.envs | dev   | 可支持的环境列表         |
+----+--------------------+-------+--------------------------+


#创建ApolloConfigDB
mysql> source /data/software/apollo-1.3.0/scripts/db/migration/configdb/V1.0.0__initialization.sql

#验证
mysql> select `Id`, `Key`, `Value`, `Comment` from `ApolloConfigDB`.`ServerConfig` limit 1;
+----+--------------------+-------------------------------+------------------------------------------------------+
| Id | Key                | Value                         | Comment                                              |
+----+--------------------+-------------------------------+------------------------------------------------------+
|  1 | eureka.service.url | http://localhost:8080/eureka/ | Eureka服务Url,多个service以英文逗号分隔             |
+----+--------------------+-------------------------------+------------------------------------------------------+

创建node3上的ApolloConfigDB数据库

#创建ApolloConfigDB
mysql> source /data/software/apollo-1.3.0/scripts/db/migration/configdb/V1.0.0__initialization.sql

#验证
mysql> select `Id`, `Key`, `Value`, `Comment` from `ApolloConfigDB`.`ServerConfig` limit 1;
+----+--------------------+-------------------------------+------------------------------------------------------+
| Id | Key                | Value                         | Comment                                              |
+----+--------------------+-------------------------------+------------------------------------------------------+
|  1 | eureka.service.url | http://localhost:8080/eureka/ | Eureka服务Url,多个service以英文逗号分隔             |
+----+--------------------+-------------------------------+------------------------------------------------------+

配置数据库连接信息

注意:要确保有对应数据库的权限。否则,启动时会有权限异常的问题。

配置apollo-configservice的数据库连接信息

#node1、node2的apollo-configservice 配置如下
[root@node1 ~]# vim /data/software/apollo-configservice/config/application-github.properties
spring.datasource.url = jdbc:mysql://node1:3306/ApolloConfigDB?characterEncoding=utf8
spring.datasource.username = your_username
spring.datasource.password = your_passwd

#node3、node4的apollo-configservice 配置如下
[root@node3 /data/software]# vim /data/software/apollo-configservice/config/application-github.properties
spring.datasource.url = jdbc:mysql://node3:3306/ApolloConfigDB?characterEncoding=utf8
spring.datasource.username = your_username
spring.datasource.password = your_passwd

配置apollo-adminservice的数据库连接信息

#node1、node2的apollo-adminservice 配置如下
[root@node1 ~]# vim /data/software/apollo-adminservice/config/application-github.properties
spring.datasource.url = jdbc:mysql://node1:3306/ApolloConfigDB?characterEncoding=utf8
spring.datasource.username = your_username
spring.datasource.password = your_passwd

#node3、node4的apollo-adminservice 配置如下
[root@node3 ~]# vim /data/software/apollo-adminservice/config/application-github.properties
spring.datasource.url = jdbc:mysql://node3:3306/ApolloConfigDB?characterEncoding=utf8
spring.datasource.username = your_username
spring.datasource.password = your_passwd

配置apollo-portal的数据库连接信息

#node1、node2的apollo-portal 配置如下
[root@node1 ~]# vim /data/software/apollo-portal/config/application-github.properties
spring.datasource.url = jdbc:mysql://node1:3306/ApolloPortalDB?characterEncoding=utf8
spring.datasource.username = your_username
spring.datasource.password = your_passwd

其他配置

配置apollo-portal的meta service

Apollo Portal需要访问不同环境下的meta service(apollo-configservice)地址,所以我们需要在配置中提供这些信息。

注意:默认情况下,meta service和config service是部署在同一个JVM进程,所以meta service的地址就是config service的地址。

# node1、node2的apollo-portal meta service信息配置如下。
[root@node1 ~]# vim /data/software/apollo-portal/config/apollo-env.properties
dev.meta=http://node3:8080,http://node4:8080
pro.meta=http://node1:8080,http://node2:8080

调整ApolloPortalDB配置

apollo.portal.envs - 可支持的环境列表

默认值是dev,如果portal需要管理多个环境的话,以逗号分隔即可(大小写不敏感)。

mysql> update ApolloPortalDB.ServerConfig set Value="dev,pro" where `key`='apollo.portal.envs';

organizations - 部门列表

Portal中新建Application都需要选择部门,所以需要在这里配置可选的部门信息,默认如下:

[{"orgId":"TEST1","orgName":"样例部门1"},{"orgId":"TEST2","orgName":"样例部门2"}]
mysql> update ApolloPortalDB.ServerConfig set Value='[{"orgId":"bigdata","orgName":"大数据部门"}]' where `key`='organizations';

调整ApolloConfigDB配置

eureka.service.url - Eureka服务Url

apollo-configservice、apollo-adminservice都需要向eureka服务注册,所以需要配置eureka服务地址。

按照目前的实现,apollo-configservice本身就是一个eureka服务,所以只需要填入apollo-configservice的地址即可,如有多个,用逗号分隔(不要忘了/eureka/后缀)。

注意:每个环境只填入自己环境的eureka服务地址。

#Pro环境
mysql> update ApolloConfigDB.ServerConfig set Value='http://node1:8080/eureka/,http://node2:8080/eureka/' where `key`='eureka.service.url';

#Dev环境
update ApolloConfigDB.ServerConfig set Value='http://node3:8080/eureka/,http://node4:8080/eureka/' where `key`='eureka.service.url';

启动

启动apollo-configservice
[root@node1 /data/software]# apollo-configservice/scripts/startup.sh
[root@node2 /data/software]# apollo-configservice/scripts/startup.sh
[root@node3 /data/software]# apollo-configservice/scripts/startup.sh
[root@node4 /data/software]# apollo-configservice/scripts/startup.sh

启动apollo-adminservice
[root@node1 /data/software]# apollo-adminservice/scripts/startup.sh
[root@node2 /data/software]# apollo-adminservice/scripts/startup.sh
[root@node3 /data/software]# apollo-adminservice/scripts/startup.sh
[root@node4 /data/software]# apollo-adminservice/scripts/startup.sh

启动apollo-portal
[root@node1 /data/software]# apollo-portal/scripts/startup.sh
[root@node2 /data/software]# apollo-portal/scripts/startup.sh

验证

WebUI查看

查看任意一台Apollo Portal WebUI,如这里http://node2:8070,默认用户名密码apollo:admin,即可看到如下界面:

查看管理员工具=>系统信息即可看到各环境下的Config ServicesAdmin Services

手动挂掉某一节点后,服务正常。

Rest API查询

创建项目

通过首页=>创建项目=>创建如下项目。

创建Namespace

注意:一个项目下可以有多个Namespace,一个Namespace就相当于某一个配置文件。

通过首页=>点击test_apollo=>添加Namespace来创建如下Namespace,并添加Namespace的修改和发布权限。

增加配置

创建Namespace后即可添加配置,然后发布即可。

注意:

  1. 发布时需要在两个环境都发布,才会在两个环境都生效。

  2. 生产中可以先发布到Dev环境,没问题后,再发布到Pro环境。

Apollo配置中心多环境HA简单部署_第1张图片

Apollo配置中心多环境HA简单部署_第2张图片

通过Config Service获取配置

URL: {config_server_url}/configs/{appId}/{clusterName}/{namespaceName}?releaseKey={releaseKey}&ip={clientIp}

  1. 获取Pro环境配置
[wangpei@localhost ~]$ curl -s 'http://node2:8080/configs/test_apollo/default/bigdata.public_config?ip=192.168.99.228'|jq
{
  "appId": "test_apollo",
  "cluster": "default",
  "namespaceName": "bigdata.public_config",
  "configurations": {
    "kafka.brokers": "kafkaNode1:9092,kafkaNode2:9092,kafkaNode3:9092",
    "kibana.url": "http://kibanaNode:5601"
  },
  "releaseKey": "20190303010149-7fee7b8c0c72f5a1"
}

2.获取Dev环境配置

[wangpei@localhost ~]$ curl -s 'http://node4:8080/configs/test_apollo/default/bigdata.public_config?ip=192.168.99.228'|jq
{
  "appId": "test_apollo",
  "cluster": "default",
  "namespaceName": "bigdata.public_config",
  "configurations": {
    "kafka.brokers": "kafkaNode1:9092,kafkaNode2:9092,kafkaNode3:9092",
    "kibana.url": "http://kibanaNode:5601"
  },
  "releaseKey": "20190303005628-7fee76237a673284"
}

手动挂掉某一节点后,查询等正常。

你可能感兴趣的:(Apollo)