
Apollo 是携程框架部门开源的配置中心,集中管理应用不同环境、不同集群的 Key-Value 配置,修改后实时推送到应用端,带权限和流程治理。配置按四个维度管理:application(应用)、environment(环境)、cluster(集群)、namespace(命名空间)。项目地址:github.com/ctripcorp/apollo。
架构与环境规划
生产环境的部署形态:Portal 部署在生产机房,通过它管理 FAT、UAT、PRO 等环境的配置;Meta Server、Config Service、Admin Service 每个环境单独部署、用独立数据库;生产环境这套服务部署在两个机房做双活;Meta Server 和 Config Service 合在同一个 JVM 进程,Admin Service 跑在同一台服务器的另一个 JVM 进程。
本次实验 5 台机器:192.168.66.210 跑 apollo-portal(8070),211/212/213/214 分别是 DEV/FAT/UAT/PRO,各跑 apollo-configservice(8080)和 apollo-adminservice(8090),应用本机各带一套 MySQL5.7+(3306)。ApolloPortalDB 全公司只要一套(portal 节点),ApolloConfigDB 每个环境一套。所有节点 JDK 1.8,RPM 安装。
环境初始化
五台机器分别设置主机名:
[root@localhost ~]# hostnamectl set-hostname apollo-portal
[root@localhost ~]# hostnamectl set-hostname apollo-dev
[root@localhost ~]# hostnamectl set-hostname apollo-fat
[root@localhost ~]# hostnamectl set-hostname apollo-uat
[root@localhost ~]# hostnamectl set-hostname apollo-pro
portal 上配置 hosts 解析:
[root@apollo-portal ~]# vi /etc/hosts
192.168.66.210 apollo-portal
192.168.66.211 apollo-dev
192.168.66.212 apollo-fat
192.168.66.212 apollo-uat
192.168.66.212 apollo-pro
portal 到各节点做 ssh 免密:
[root@apollo-portal ~]# ssh-keygen -t rsa
[root@apollo-portal ~]# ssh-copy-id root@192.168.66.210
[root@apollo-portal ~]# ssh-copy-id root@192.168.66.211
[root@apollo-portal ~]# ssh-copy-id root@192.168.66.212
[root@apollo-portal ~]# ssh-copy-id root@192.168.66.213
[root@apollo-portal ~]# ssh-copy-id root@192.168.66.214
把 hosts 分发给各节点,再按主机名补一遍免密:
[root@apollo-portal ~]# for i in 192.168.66.{211..214}; do echo ">>> $i";scp /etc/hosts root@$i:/etc/; done
[root@apollo-portal ~]# ssh-copy-id root@apollo-dev
[root@apollo-portal ~]# ssh-copy-id root@apollo-fat
[root@apollo-portal ~]# ssh-copy-id root@apollo-uat
[root@apollo-portal ~]# ssh-copy-id root@apollo-pro
批量关闭 SELINUX:
[root@apollo-portal ~]# for i in 192.168.66.{210..214}; do echo ">>> $i";ssh root@$i "sed -ri 's/SELINUX=enforcing/SELINUX=disabled/' /etc/selinux/config"; done
[root@apollo-portal ~]# for i in 192.168.66.{210..214}; do echo ">>> $i";ssh root@$i "setenforce 0 && getenforce"; done
统一装常用工具包:
[root@apollo-portal ~]# for i in 192.168.66.{210..214};do echo ">>> $i";ssh root@$i "yum -y install gcc gcc-c++ libaio make cmake zlib-devel openssl-devel pcre pcre-devel wget git curl lynx lftp mailx mutt rsync ntp net-tools vim lrzsz screen sysstat yum-plugin-security yum-utils createrepo bash-completion zip unzip bzip2 tree tmpwatch pinfo man-pages lshw pciutils gdisk system-storage-manager git gdbm-devel sqlite-devel chrony";done
[root@apollo-portal ~]# for i in 192.168.66.{210..214};do echo ">>> $i";ssh root@$i "yum install -y epel-release";done
时间同步用 chrony。portal 节点对互联网时间源:
[root@apollo-portal ~]# vim /etc/chrony.conf

[root@apollo-portal ~]# systemctl start chronyd.service
[root@apollo-portal ~]# systemctl enable chronyd.service
[root@apollo-portal ~]# systemctl status chronyd.service
#防火墙放通ntp服务端口:123
[root@apollo-portal ~]# firewall-cmd --zone=public --permanent --add-port=123/udp
[root@apollo-portal ~]# firewall-cmd --reload
检查主节点时间:
[root@apollo-portal ~]# timedatectl

其余节点停掉 ntpd,chrony 指向 portal:
[root@apollo-portal ~]# for i in 192.168.66.{211..214};do echo ">>> $i";ssh root@$i "systemctl stop ntpd && systemctl disable ntpd && systemctl status ntpd";done
~]# vim /etc/chrony.conf
server 192.168.66.210 iburst

[root@apollo-portal ~]# for i in 192.168.66.{211..214};do echo ">>> $i";ssh root@$i "systemctl restart chronyd.service && systemctl enable chronyd.service && systemctl status chronyd.service";done
验证同步状态,来源前带 ^* 表示已同步:
[root@apollo-portal ~]# for i in 192.168.66.{211..214};do echo ">>> $i";ssh root@$i "chronyc sources ";done

JDK 所有节点直接 rpm 安装,安装包从 oracle 官网下载:
rpm -ivh jdk-8u231-linux-x64.rpm
部署数据库
MySQL 用 RPM 方式,包从 https://dev.mysql.com/downloads/mysql/ 取:mysql-community-server、mysql-community-client、mysql-community-common、mysql-community-libs、mysql-community-devel、mysql-community-libs-compat。所有机器执行:
#卸载掉系统默认的mariadb
[root@apollo-portal ~]# rpm -qa|grep mariadb|xargs rpm -e --nodeps
[root@apollo-portal ~]# mkdir -p /opt/soft && cd /opt/soft
[root@apollo-portal soft]# yum install mysql-community-*
每个节点都要启动 MySQL:
[root@apollo-portal ~]# systemctl start mysqld
[root@apollo-portal ~]# systemctl enable mysqld
[root@apollo-portal ~]# systemctl status mysqld
重置 root 密码,先降 validate_password 策略再改:
[root@apollo-portal ~]# cat /var/log/mysqld.log |grep password
[root@apollo-portal ~]# mysql -uroot -p
Enter password:
#修改密码策略
mysql> set global validate_password_policy=0;
mysql> set global validate_password_mixed_case_count=0;
mysql> set global validate_password_number_count=3;
mysql> set global validate_password_special_char_count=0;
mysql> set global validate_password_length=3;
mysql> ALTER USER 'root'@'localhost' IDENTIFIED BY 'dqz123456';
mysql> flush privileges;
Portal 节点部署
portal 节点下载 apollo-portal(1.6.2),包统一放 /opt/soft,解压到 /usr/local:
[root@apollo-portal ~]# mkdir -p /opt/soft/
[root@apollo-portal ~]# mkdir /usr/local/apollo-portal
[root@apollo-portal ~]# cd /opt/soft/
[root@apollo-portal soft]# unzip apollo-portal-1.6.2-github.zip -d /usr/local/apollo-portal/
ApolloPortalDB 只在 portal 节点的库上导入,SQL 在项目 apollo/scripts/sql/apolloportaldb.sql:
[root@apollo-portal ~]# mysql -uroot -p
Enter password:
mysql> source /usr/local/apollo/scripts/sql/apolloportaldb.sql
mysql> show databases;
+--------------------+
| Database |
+--------------------+
| information_schema |
| ApolloPortalDB |
| mysql |
| performance_schema |
| sys |
+--------------------+
5 rows in set (0.00 sec)
#导入成功后,可通过以下语句检查
mysql> select `Id`, `Key`, `Value`, `Comment` from `ApolloPortalDB`.`ServerConfig` limit 1;
+----+--------------------+-------+--------------------------+
| Id | Key | Value | Comment |
+----+--------------------+-------+--------------------------+
| 1 | apollo.portal.envs | dev | 可支持的环境列表 |
+----+--------------------+-------+--------------------------+
1 row in set (0.00 sec)
建一个有读写 ApolloPortalDB 权限的用户:
mysql> CREATE USER 'portal'@'%' IDENTIFIED BY 'dqz123456';
mysql> grant all privileges on ApolloPortalDB.* to portal@'%';
mysql> flush privileges;
改数据库连接信息。应用和库在同一台机器,填 127.0.0.1 即可;注意用户必须对 ApolloPortalDB 有读写权限:
[root@apollo-portal soft]# cd /usr/local/apollo-portal/config/
[root@apollo-portal config]# vim application-github.properties

配置各环境的 meta service:
[root@apollo-portal config]# vim apollo-env.properties

再把 ApolloPortalDB 的 ServerConfig 里 apollo.portal.envs 添加上全部环境参数:

放通 8070:
[root@apollo-portal ~]# firewall-cmd --permanent --zone=public --add-port=8070/tcp
[root@apollo-portal ~]# firewall-cmd --reload
各环境节点部署
DEV/FAT/UAT/PRO 每台需要 apollo-configservice 和 apollo-adminservice 两个包(GitHub 拉取慢可以用 gitee 的发布包):
[root@apollo-dev ~]# mkdir /opt/soft
[root@apollo-dev ~]# mkdir /usr/local/apollo-configservic
[root@apollo-dev ~]# mkdir /usr/local/apollo-adminservic
[root@apollo-dev ~]# cd /opt/soft/
[root@apollo-dev soft]# unzip apollo-adminservice-1.6.2-github.zip -d /usr/local/apollo-adminservic/
[root@apollo-dev soft]# unzip apollo-configservice-1.6.2-github.zip -d /usr/local/apollo-configservic/
ApolloConfigDB 要在 DEV/FAT/UAT/PRO 每个环境的数据库里导入,SQL 是 apollo/scripts/sql/apolloconfigdb.sql:
mysql> source /usr/local/apollo/scripts/sql/apolloconfigdb.sql
mysql> show databases;
+--------------------+
| Database |
+--------------------+
| information_schema |
| ApolloConfigDB |
| mysql |
| performance_schema |
| sys |
+--------------------+
5 rows in set (0.00 sec)
#导入成功后通过以下语句检查
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以英文逗号分隔 |
+----+--------------------+-------------------------------+------------------------------------------------------+
1 row in set (0.00 sec)
每个环境的库建 apollo 读写用户:
mysql> CREATE USER 'apollo'@'%' IDENTIFIED BY 'dqz123456';
mysql> grant all privileges on ApolloConfigDB.* to apollo@'%';
mysql> flush privileges;
同环境的 configservice 和 adminservice 数据库配置必须一致,分别修改:
cd /usr/local/apollo-configservic/config/
vim application-github.properties

cd /usr/local/apollo-adminservic/config/
vim application-github.properties

启动与验收
启动顺序固定:apollo-configservice → apollo-adminservice → apollo-portal。启动 scripts/startup.sh,关闭 scripts/shutdown.sh,日志在 /opt/logs,启动失败先翻日志。在 portal 上批量操作各环境节点:
#放通各环境8080、8090监听端口
[root@apollo-portal ~]# for i in 192.168.66.{211..214}; do echo ">>> $i";ssh root@$i "firewall-cmd --permanent --zone=public --add-port=8080/tcp && firewall-cmd --permanent --zone=public --add-port=8090/tcp && firewall-cmd --reload"; done
#启动各节点服务
[root@apollo-portal ~]# for i in 192.168.66.{211..214}; do echo ">>> $i";ssh root@$i "/usr/local/apollo-configservic/scripts/startup.sh && /usr/local/apollo-adminservic/scripts/startup.sh"; done
#最后启动apollo-portal
[root@apollo-portal ~]# cd /usr/local/apollo-portal/scripts/
[root@apollo-portal scripts]# ./startup.sh

也可以在节点本机单独拉起:
[root@apollo-dev ~]# cd /usr/local/apollo-configservic/scripts/
[root@apollo-dev scripts]# ./startup.sh
浏览器访问 http://192.168.66.210:8070/signin#/error,默认账号密码 apollo/admin:


进集群管理确认 DEV/FAT/UAT/PRO 四套环境状态都正常:


最后新建一个项目,走一遍加配置、发布的流程验证闭环:





几个坑:ApolloConfigDB 是每个环境一套,只导一遍后面环境全报错;hosts 文件里 fat/uat/pro 三行当时都写成了 212,严格对照环境表 IP 检查一遍再分发;密码策略不降,ALTER USER 会直接报错。

















暂无评论内容