云上部署实践详解
上章节介绍完云上应用架构及产品选型,接下来本章将重点介绍下上云迁移的实践过程。在实际迁移过程中甚至会更加具体。由于文章内容已经很多了,所以在接下来实践迁移过程中会有部分内容会省略。先介绍一下整体迁移流程:
迁移整个应用到阿里云涉及到几个阶段,首先是数据库配置和数据迁移,然后是基础服务的部署,例如Dubbo服务和消息队列服务以及存储服务,其次是应用部署和配置,之后是功能测试以及集成测试,最后是流量切割和安全加固。
1、 数据库准备和配置
前面章节提到我们将原来自建的MySQL数据库改用云上的RDS替换,针对性能要求特别高的数据库(比如单台高配物理服务器已经无法满足性能要求的情况下),采用云上DRDS分布式关系数据库替换。下面主要介绍云上RDS数据库的创建和配置。
1.1 RDS配置
a) 创建实例
- 登录RDS管理控制台;
- 在实例列表页面,单击新建实例,进入创建页面;
- 选择包年包月或按量付费;
- 选择实例配置;
- 单击立即购买;
b) 初始化配置
为了数据库的安全稳定,在开始使用RDS实例前,需要将访问数据库的IP地址或者IP段加到目标实例的白名单中。正确使用白名单可以让RDS得到高级别的访问安全保护,建议定期维护白名单。
- 登录RDS管理控制台。
- 选择目标实例所在地域。
- 单击目标实例的ID,进入基本信息页面。
- 在左侧导航栏中选择数据安全性,进入数据安全性页面。
- 在白名单设置标签页面中,单击default白名单分组中的修改,如下图所示。
- 在修改白名单分组页面,在组内白名单栏中填写需要访问该实例的IP地址或IP段。若需要添加ECS的内网IP,请单击加载ECS内网IP,然后根据提示选择IP。如下图所示。
- 单击确定。
c) 创建初始账号
- 登录RDS管理控制台。
- 选择目标实例所在地域。
- 单击目标实例的ID,进入基本信息页面。
- 在左侧导航栏中,选择账号管理,进入账号管理页面。
- 单击创建初始账号。
- 输入要创建的账号信息,如下图所示。
- 单击确定。
d) 创建数据库 - 通过DMS登录RDS数据库,https://dms.console.aliyun.com/#/dms/rsList;
- 成功登录数据库后,在页面上方的菜单栏中,选择新建 > 数据库。
- 填写数据库信息。
- 单击确定
e) 创建用户
- 通过DMS登录RDS数据库,详细步骤请参见通过DMS登录RDS数据库。
- 成功登录数据库后,在页面上方的菜单栏中,选择新建 > 数据库用户,进入新建用户页面。
- 选择基本设置,填写用户的基本信息。
- 选择全局权限,设置该用户对于该实例中所有数据库的权限。
- 选择对象权限,设置该用户对某个数据库及对该数据库中的表和列的权限。
- 单击确定,进入SQL预览页面。
- 查看要创建用户的SQL信息,若确认无误,单击确定。
f) 数据迁移
当数据库、迁移账号都创建完成后,就可以开始配置迁移任务了。同理将线下的数据以此方式迁移到云上数据库中。下面详细介绍下具体的配置步骤。
- 进入数据传输DTS控制台,点击页面右上角 创建迁移任务 开始任务配置。
- 配置迁移实例连接信息。
- 在这个步骤中,主要配置迁移任务名称,迁移源实例及目标实例连接信息。
- 迁移对象及迁移类型配置
- 预检查。
如果预检查失败,那么可以点击具体检查项后的按钮,查看具体的失败详情,并根据失败原因修复后,重新进行预检查。
当点击查看后,可以查看到具体的预检查失败原因及修复方法:
当修复完成后,可以在任务列表中,选择这个任务,然后重新启动预检查。
- 启动迁移任务。
当预检查通过后,我们可以启动迁移任务,任务启动后,可以到任务列表中查看具体的迁移状态及进度。
g) 其他
1.2 Redis配置
前面提到由于传统自建Redis数据库通常存在集群节点扩容复杂,管理维护难等问题。所以我们改用云上数据库 Redis 版来替代,它具有性能卓越,弹性扩容,数据安全性高,可用性高,秒级监控,简单易用等优势。下面介绍云数据库Redis的创建和配置:
a) 创建实例
- 进入 云数据库 Redis 版产品首页,单击立即购买。或者进入 Redis 管理控制台,单击右上角的创建实例。
- 选择按量付费或预付费模式,完成网络类型、地域、可用区、架构类型等实例配置。两种付费模式的填写项基本一致。
- 单击立即购买,进入订单确认页面。阅读接受《云数据库 Redis 版服务条款》并确认订单信息无误后,单击去支付进行付款。
- 进入支付页面,选择支付方式,单击确认支付按钮。支付成功后会提示支付成功。等1-5分钟后进入控制台即可看见刚才购买的实例。
b) 客户端连接
由于云数据库 Redis 提供的数据库服务与原生的数据库服务完全兼容,连接数据库的方式也基本类似。任何兼容 Redis 协议的客户端都可以访问云数据库 Redis 版服务,可以根据自身应用特点选用任何 Redis 客户端。
注意:云数据库 Redis 版仅支持阿里云内网访问,不支持外网访问,即只有在同节点的 ECS上安装 Redis 客户端才能与云数据库建立连接并进行数据操作。
Redis 的客户端请参考 http://redis.io/clients
c) 数据迁移
将自建 Redis 中的数据迁移到云 Redis 实例中
使用数据传输 DTS可以进行 Redis 实例间的数据迁移。如果源实例为自建 Redis,那么 Redis 迁移支持增量数据同步功能,可以实现在本地应用不停写的情况下,平滑完成 Redis 数据迁移。
d) 迁移前置条件
如果待迁移的 Redis 是通过专线接入阿里云 VPC 的自建 Redis,或是专有网络的云 Redis 实例,那么需要架设代理,进行数据转发。下面介绍如何使用 nginx 进行 Redis 的转发配置,让 DTS 服务器可以访问专有网络内的 Redis 实例。
- nginx 部署
首先在 ECS 服务器上,通过如下命令部署 nginx。
yum install nginx
- nginx 转发配置
安装完 nginx,修改 nginx 配置文件 /etc/nginx/nginx.conf, 设置后端监听 redis。 注释掉配置文件中 http 的相关配置,添加 tcp 的配置内容。需要注释掉的 http 配置内容如下:
需要在配置文件中添加 tcp 配置内容:
例如,需要访问的 Redis 的连接地址为:
r-bp1b294374634044.redis.rds.aliyuncs.com:6379, nginx 代理转发端口为3333,那么 tcp 相关配置如下:
如果是传统IDC中自建redis,那么将上面redis的地址为内网地址。原理就是通过机房中具有公网IP 的nginx进行转发。
- 通过转发接口访问 Redis
当完成上面的配置后,运行 nginx 即成功启动 nginx 代理服务。假设 nginx 部署的 服务器的公网IP为:114.55.89.152,那么可以直接用 redis_cli 访问 nginx 转发端口,测试代理转发是否正常。
如上图所示,可以通过访问 nginx 代理转发端口来访问 Redis 实例。
e) 告警设置
- 登录 Redis 管理控制台,定位目标实例。
- 单击实例 ID 或者管理进入实例信息页面。
- 在左侧导航栏中,选择报警设置。
- 在报警设置页面单击报警设置,跳转到云监控控制台。可以单击刷新,手动刷新报警监控项当前状态,如下图所示。
- 单击报警规则>新建报警规则。
- 在批量设置报警规则页面,添加报警规则。
- 单击下一步,设置通知对象。 可以单击快速创建联系人组去新建报警联系人或者报警联系组。
- 单击确定,完成报警设置,单击关闭。
- 注意:设置完成后,可以在云监控控制台的报警规则页面修改、禁用、删除报警规则,并查看报警历史记录。
1.3 HBase配置
前面提到我们改用云上数据库HBase版来替换原来的MongoDB集群。HBase的高并发大数据量等特性非常适合海量数据存储,业务大屏,安全风控,搜索等场景。下面介绍下HBase的创建和配置:
a) HBase集群规格选型
- 选择的逻辑
HBase支持的场景比较多,可以根据业务形态选择。比例根据业务QPS、存储量、读写请求、相应延迟,稳定性相关。在选择 ApsaraDB for HBase 时,我们看到有SSD云盘、高效云盘、独享规格、通用规格,还有4cpu8g 到 32cpu128g等等。 - Master选择
Master节点不带存储,默认是主备保障单点容灾。
core数目 < 6,选择 2cpu4g即可
6 <= core数目 <20 选择4cpu8g即可
20 <= core数目 < 50 选择8cpu16g即可
50 <= core数目 < 100 选择 16cpu32g即可
- Core存储计算分离
磁盘维度:
SSD云盘比高效云盘,更加稳定,且对读有更好的性能,特别是随机读
独享通用规格:
独享比通用更加稳定,也就是24个小时内,独享这些资源,价格更加贵一些
规格大小:
4cpu8g属于入门版本,规格大一些对于热点有更好的支持。但是越大,GC的影响就越大。 推荐8cpu32g、16cpu64g的机型.
- 所以选择就是:
对于数据量多,响应延迟一般的:可以选择 普通的4cpu16g + 高效云盘,可以挂不少容量的磁盘
对于响应延迟要求高的:可以选择 独享的8cpu32g或者16cpu64g的机型,再加SSD云盘
对于QPS不是很大的,比如1w~10w QPS可以选择 4cpu8g、4cpu16g的
对于读要求高的选择:1:4内存的机型,读一般的1:2
- Core存储计算不分离(本地盘系统)
主要是为满足大规模的数据存储的需求,基本要求20T起步:目前提供集群:
4台 8cpu32g 4*5.5T 不可添加节点,可以向16cpu升级
4台 16cpu64g 8*5.5T 不可添加节点,可以向24cpu升级
4+n台 24cpu96g 12*5.5T 可以添加节点
b) 创建HBase集群
- 登录HBase管理控制台;
- 在实例列表页面,单击创建,进入创建集群页面;
- 选择包年包月或按量付费;
- 选择集群配置;
- 单击立即购买;
c) 开源软件访问
当新建一个集群以后,阿里云提供了一种快捷的方式来访问集群上的开源组件,如HBase、Ganglia和HDFS,操作方式如下:
- 登录HBase管理控制台,并选择目标实例,点击管理。
- 在集群详情tab中,最上方的开源软件栏会看到所有的快捷入口。
- 如果是第一次访问,那么需要初始化下访问用户名与密码。
- 设置访问的IP白名单,请参考IP白名单设置。
- 完成以后步骤以后,点击开源软件的链接,并输入之前设置的用户名密码,就可以直接访问对应组件的Web页面了。
注意:目前采取的https认证,注意点击 高级 确认通过。
d) 数据迁移
可通过数据集成工具建立数据同步任务来实现数据导入。方法请参考下面链接:
https://yq.aliyun.com/articles/165981?spm=a2c4g.11186623.2.9.yY4Noh
1.4 Elasticsearch配置
由于传统自建Elasticsearch集群存在性能不足,集群节点扩容复杂,管理维护难度高等问题,因此我们改用云上Elasticsearch服务,它具有丰富的预置插件(IK Analyzer,pinyin Analyzer,smart Chinese Analysis Plugin,Mapper Attachments Type plugin等等),还包括集成X-pack插件提供企业级权限管控,实时监控等强大功能。下面主要介绍如果创建和配置Elasticsearch集群。
a) 购买ES集群
- 通过阿里云产品导航,寻找到阿里云Elasticsearch的产品详情页面。
- 登录阿里云Elasticsearch控制台
- 点击创建,进入创建集群页面
- 选择相应配置、VPC网络、虚拟交换机,以及相应产品规格。注意购买阿里云ES产品,对应区域下必须要有 VPC 和 虚拟交换机(区域必须相同)
- 点击“立即购买”。
b) 基本配置
- 进入阿里云ES应用控制台界面后,可看到刚购买的ES实例,等待实例激活成功(需要等待几分钟)。
- 在为上面刚激活的ES实例,导入数据之前,需要先手动同时创建,索引和mapping。阿里云默认关闭了“自动创建索引”,因此需先创建索引和mapping,否则直接导入数据会报错。
c) 访问测试 - 账号密码
username:默认为 elastic
password:是在购买阿里云ES界面中指定的密码
注意:若创建的阿里云Elasticsearch实例版本包含 with_X-Pack 信息,则访问该阿里云ES实例时,必须指定用户名和密码。否则不用指定用户名和密码。
- 基于ECS访问前提
阿里云Elasticsearch 与依赖的阿里云ECS 必须处于同一个 VPC 下。 - curl 测试
指定用户名密码访问9200端口:
响应如下:
- 创建文档
使用 HTTP POST方式创建:
创建成功响应:
d) 数据导入
离线数据导入Elasticsearch,请参考下面文章:
https://help.aliyun.com/document_detail/62584.html?spm=a2c4g.11186623.6.557.uwwFYu
e) 配置监控报警
阿里云Elasticsearch已支持对实例进行监控,并允许通过短信报警。可根据需求,自定义报警阈值。
强烈建议配置如下监控报警:
集群状态。(主要监控集群状态是否为绿色或红色)
节点磁盘使用率(%)。(报警阀值控制在75%以下,不要超过80%)
节点HeapMemory使用率(%)。(报警阀值控制在85%以下,不要超过90%)
节点CPU使用率(%)。(报警阀值控制在95%以下,不要超过95%)
节点load_1m。(以CPU核数的80%为参考值)
集群查询QPS(Count/Second)。
集群写入QPS(Count/Second)。
两种方式配置监控报警:
登录ES控制台,进入ES实例基本信息界面,点击集群监控转到ES云监控。
或者使用账号登录阿里云控制台,选择产品导航栏下的云监控,再选择云服务监控菜单栏下的Elasticsearch。
监控指标配置方法:
- 选择需要查看的区域,点击ES实例ID
- 指标详情页面点击创建报警规则
可在此页面查看到集群既往监控数据,目前只保留1月内的监控信息。通过创建报警规则,可对此实例配置报警监控。
- 填写相应的规则名称及规则描述
以下配置主要以添加,磁盘报警监控、集群状态监控、节点HeapMemory使用率监控为例。
- 选择报警联系组
- 点击确认按钮,保存报警配置
2、 基础服务准备和配置
2.1 OSS对象存储配置
由于传统的自建NFS文件系统存在可靠性差,成本高,扩展要停机等问题,所以我们改用云上的对象存储OSS服务代替,下面简单介绍下OSS对象存储创建和配置方法:
a) 开通OSS服务
- 登录阿里云官网。
- 将鼠标移至产品找到并单击对象存储OSS打开OSS产品详情页面。
- 在OSS产品详情页中的单击立即开通。
- 开通服务后,在OSS产品详情页面单击管理控制台直接进入OSS管理控制台界面。
b) 购买OSS服务
- 开通 OSS 服务后,在OSS产品详情页单击折扣套餐,进入资源包售卖页。
- 选择需要购买的资源包类型和规格。
- 选择资源包购买时长。
- 选择开通时间(支持支付后立即生效或指定时间生效)。
- 选择资源包地域。
说明: 不同地域单价可能不一样,如海外地区与中国大陆地区目前不一样。
c) 创建存储空间
- 进入 OSS 管理控制台 界面。
- 单击左侧存储空间列表中的新增按钮 +,或者单击页面右上方的 新建 Bucket 按钮,打开新建 Bucket 对话框。
- 在 命名 框中,输入存储空间名称。
- 在 所属地域 框中,下拉选择该存储空间的数据中心。
- 在 存储类型 框中,下拉选择所需要的存储类型。
- 在 读写权限 框中,下拉选择对应的权限。
- 单击 确定。
d) 上传文件
- 登录 OSS 管理控制台。
- 在左侧存储空间列表中,单击要向其中上传文件的存储空间。
- 单击 文件管理 页签。
- 单击 上传文件,打开 上传文件 对话框。
- 在 目录地址 框中,设置文件上传到OSS中的存储路径。
- 在 文件ACL 区域中,选择文件的读写权限。默认为继承所在Bucket的读写权限。
- 在 上传文件 框内,将要上传的文件拖拽到此;或者单击 直接上传,选择要上传的文件。
- 在 手机验证 对话框中,单击 点击获取,输入收到的校验码,单击 确定,打开 上传任务 对话框,显示上传进度。也可以单击左侧下方的 上传任务 查看上传进度。
说明:将原有的nfs文件系统里的所有文件上传到OSS系统中去,另外应用已经改造为oss存储,移动app的所有数据将会存储在OSS。搭建一个基于OSS的移动应用数据直传服务,具有以下优势:
上传下载方式更加安全(临时、灵活的赋权鉴权)。
成本低,不需要准备很多服务器。移动应用直联云存储,只有控制流走应用服务器。
高并发,支持海量用户(OSS有海量的上传和下载带宽)。
弹性(OSS有无限扩容的存储空间)。
方便,可以方便的对接到媒体转码服务-视频多端适配,图片处理服务,CDN加速下载等。
2.2 消息队列服务配置
传统自建开源kafka消息队列通常存在各版本bug多,得不到官方技术支持,遇到疑难问题只能抓瞎等问题。所以我们改用云上消息队列kafka,它针对开源kafka提供全托管服务,彻底解决开源产品长期以来的痛点,用户只需专注于业务开发,无需部署运维,具有低成本,更弹性,更可靠等优势。下面介绍消息队列kafka的创建和配置。
a) 开通消息队列kafka服务
- 登录阿里云主页找到到产品 > 互联网中间件,单击消息队列kafka进入消息队列 Kafka 产品主页。
-
单击立即开通进入消息队列 Kafka 服务开通页面,根据提示完成服务开通。
b) 创建资源使用消息队列 Kafka 消息收发服务之前,先在消息队列 Kafka 控制台上创建资源否则将无法通过鉴权认证及使用相关的运维功能。创建资源的步骤如下:
创建 Topic 资源
创建 Consumer Group
创建阿里云 Access Key ID 和 Access Key Secret
创建消息主题(Topic)
消息主题(Topic)是消息队列 Kafka 里对消息进行的一级归类,比如可以创建“Topic_Trade”这一主题用来识别交易类消息。 使用消息队列 Kafka 的第一步就是先为应用创建 Topic。
请按照以下步骤创建 Topic:
- 登录消息队列 Kafka 控制台。
- 单击左侧菜单栏的Topic 管理。
- 在Topic 管理页面的上方选择相应的地域(例如“华东1”),然后单击Topic 申请按钮。
- 在Topic 申请页面输入 Topic 名称和备注,单击创建。
完成后,创建的 Topic 将出现在Topic 管理页面的列表中。
c) 发送消息测试
- 添加 Maven 依赖
添加 Maven 依赖的示例代码如下: - // 消息队列 Kafka 服务端版本是 0.10.0.0,客户端建议使用该版本
- org.apache.kafka
- kafka-clients
- 0.10.0.0
- // SASL 鉴权使用的库
- com.aliyun.openservices
- ons-sasl-client
- 0.1
- 配置 SASL
消息队列 Kafka 利用 SASL 机制对客户端进行身份验证。
创建文本文件:kafka_client_jaas.conf
可以使用 Demo 库中的文件进行修改,内容形式如下:
- KafkaClient {
- com.aliyun.openservices.ons.sasl.client.OnsLoginModule required
- AccessKey="*"
- SecretKey="*";
- };
说明:把 * 替换为阿里云账号的 AccessKey 和 SecretKey。
设置 kafka_client_jaas.conf 的路径
kafka_client_jaas.conf 的路径是系统变量,有以下两种办法进行设置(这里假设 kafka_client_jaas.conf 放在 /home/admin 下面,实际部署时请将其修改为自己的路径)。
程序启动时,启动 JVM 参数:
-Djava.security.auth.login.config=/home/admin/kafka_client_jaas.conf
在代码中设置参数(需要保证在 Kafka Producer 和 Consumer 启动之前):
- System.setProperty("java.security.auth.login.config", "/home/admin/kafka_client_jaas.conf");
- 配置 SSL
操作步骤如下:
下载根证书。
将根证书放入某个目录下,并且其路径直接配置在代码中。
- 客户端配置
准备配置文件:kafka.properties
请参考以下示例代码进行修改:
接入点,通过控制台获取
您在控制台获取的接入点
- bootstrap.servers=kafka-cn-internet.aliyun.com:8080
Topic,通过控制台创建
您在控制台创建的Topic
- topic=alikafka-topic-demo
Consumer Grouo,通过控制台创建
您在控制台创建的 Consumer Group
- group.id=CID-consumer-group-demo
ssl 根证书的路径,demo中有,请拷贝到自己的某个目录下,不能被打包到jar中
这里假设您的目录为/home/admin,请记得修改为自己的实际目录
- ssl.truststore.location=/home/admin/kafka.client.truststore.jks
sasl路径,demo中有,请拷贝到自己的某个目录下,不能被打包到jar中
这里假设您的目录为/home/admin,请记得修改为自己的实际目录
- java.security.auth.login.config=/home/admin/kafka_client_jaas.conf
加载配置文件
请参考以下示例代码进行修改:
- public class JavaKafkaConfigurer {
- private static Properties properties;
- public static void configureSasl() {
- //如果用 -D 或者其它方式设置过,这里不再设置
- if (null == System.getProperty("java.security.auth.login.config")) {
- // 请注意将 XXX 修改为自己的路径
- // 这个路径必须是一个文件系统可读的路径,不能被打包到 jar 中
- System.setProperty("java.security.auth.login.config", getKafkaProperties().getProperty("java.security.auth.login.config"));
- }
- }
- public synchronized static Properties getKafkaProperties() {
- if (null != properties) {
- return properties;
- }
- //获取配置文件 kafka.properties 的内容
- Properties kafkaProperties = new Properties();
- try {
- kafkaProperties.load(KafkaProducerDemo.class.getClassLoader().getResourceAsStream("kafka.properties"));
- } catch (Exception e) {
- // 没加载到文件,程序要考虑退出
- e.printStackTrace();
- }
- properties = kafkaProperties;
- return kafkaProperties;26. }27. }
d) 发布消息
使用 Java SDK 发送消息
示例代码如下:
- // 设置 sasl 文件的路径
- JavaKafkaConfigurer.configureSasl();
- // 加载 kafka.properties
- Properties kafkaProperties = JavaKafkaConfigurer.getKafkaProperties();
- Properties props = new Properties();
- // 设置接入点,请通过控制台获取对应 Topic 的接入点
- props.put(ProducerConfig.BOOTSTRAP_SERVERS_CONFIG, kafkaProperties.getProperty("bootstrap.servers"));
- // 设置SSL根证书的路径,请记得将 XXX 修改为自己的路径
- // 与 sasl 路径类似,该文件也不能被打包到 jar 中
- props.put(SslConfigs.SSL_TRUSTSTORE_LOCATION_CONFIG, kafkaProperties.getProperty("ssl.truststore.location"));
- // 根证书 store 的密码,保持不变
- props.put(SslConfigs.SSL_TRUSTSTORE_PASSWORD_CONFIG, "KafkaOnsClient");
- // 接入协议,目前支持使用 SASL_SSL 协议接入
- props.put(CommonClientConfigs.SECURITY_PROTOCOL_CONFIG, "SASL_SSL");
- // SASL 鉴权方式,保持不变
- props.put(SaslConfigs.SASL_MECHANISM, "ONS");
- // Kafka 消息的序列化方式
- props.put(ProducerConfig.KEY_SERIALIZER_CLASS_CONFIG, "org.apache.kafka.common.serialization.StringSerializer");
- props.put(ProducerConfig.VALUE_SERIALIZER_CLASS_CONFIG, "org.apache.kafka.common.serialization.StringSerializer");
- // 请求的最长等待时间
- props.put(ProducerConfig.MAX_BLOCK_MS_CONFIG, 30 * 1000);
- // 构造 Producer 对象,注意,该对象是线程安全的,一般来说,一个进程内一个 Producer 对象即可;
- //如果想提高性能,可以多构造几个对象,但不要太多,最好不要超过 5 个
- KafkaProducer producer = new KafkaProducer(props);
- // 构造一个 Kafka 消息
- String topic = kafkaProperties.getProperty("topic"); //消息所属的 Topic,请在控制台申请之后,填写在这里
- String value = "this is the message's value"; //消息的内容
- ProducerRecord kafkaMessage = new ProducerRecord(topic, value);
- try {
- // 发送消息,并获得一个 Future 对象
- Future metadataFuture = producer.send(kafkaMessage);
- // 同步获得 Future 对象的结果
- RecordMetadata recordMetadata = metadataFuture.get();
- System.out.println("Produce ok:" + recordMetadata.toString());
- } catch (Exception e) {
- // 要考虑重试
- System.out.println("error occurred");
- e.printStackTrace();39. }
e) 订阅消息测试
使用 Java SDK 订阅消息
示例代码如下:
- // 设置 sasl 文件的路径
- JavaKafkaConfigurer.configureSasl();
- // 加载 kafka.properties
- Properties kafkaProperties = JavaKafkaConfigurer.getKafkaProperties();
- Properties props = new Properties();
- // 设置接入点,请通过控制台获取对应 Topic 的接入点
- props.put(ProducerConfig.BOOTSTRAP_SERVERS_CONFIG, kafkaProperties.getProperty("bootstrap.servers"));
- // 设置 SSL 根证书的路径,请记得将 XXX 修改为自己的路径
- // 与 sasl 路径类似,该文件也不能被打包到 jar 中
- props.put(SslConfigs.SSL_TRUSTSTORE_LOCATION_CONFIG, kafkaProperties.getProperty("ssl.truststore.location"));
- // 根证书 store 的密码,保持不变
- props.put(SslConfigs.SSL_TRUSTSTORE_PASSWORD_CONFIG, "KafkaOnsClient");
- // 接入协议,目前支持使用 SASL_SSL 协议接入
- props.put(CommonClientConfigs.SECURITY_PROTOCOL_CONFIG, "SASL_SSL");
- // SASL 鉴权方式,保持不变
- props.put(SaslConfigs.SASL_MECHANISM, "ONS");
- // 两次 poll 之间的最大允许间隔
- // 请不要改得太大,服务器会掐掉空闲连接,不要超过 30000
- props.put(ConsumerConfig.SESSION_TIMEOUT_MS_CONFIG, 25000);
- // 每次 poll 的最大数量
- // 注意该值不要改得太大,如果 poll 太多数据,而不能在下次 poll 之前消费完,则会触发一次负载均衡,产生卡顿
- props.put(ConsumerConfig.MAX_POLL_RECORDS_CONFIG, 30);
- // 消息的反序列化方式
- props.put(ConsumerConfig.KEY_DESERIALIZER_CLASS_CONFIG, "org.apache.kafka.common.serialization.StringDeserializer");
- props.put(ConsumerConfig.VALUE_DESERIALIZER_CLASS_CONFIG, "org.apache.kafka.common.serialization.StringDeserializer");
- // 当前消费实例所属的消费组,请在控制台申请之后填写
- // 属于同一个组的消费实例,会负载消费消息
- props.put(ConsumerConfig.GROUP_ID_CONFIG, kafkaProperties.getProperty("group.id"));
- // 构造消息对象,也即生成一个消费实例
- KafkaConsumer consumer = new org.apache.kafka.clients.consumer.KafkaConsumer(props);
- // 设置消费组订阅的 Topic,可以订阅多个
- // 如果 GROUP_ID_CONFIG 是一样,则订阅的 Topic 也建议设置成一样
- List subscribedTopics = new ArrayList();
- // 如果需要订阅多个 Topic,则在这里 add 进去即可
- // 每个 Topic 需要先在控制台进行创建
- subscribedTopics.add(kafkaProperties.getProperty("topic"));
- consumer.subscribe(subscribedTopics);
- // 循环消费消息
- while (true){
- try {
- ConsumerRecords records = consumer.poll(1000);
- // 必须在下次 poll 之前消费完这些数据, 且总耗时不得超过 SESSION_TIMEOUT_MS_CONFIG
- // 建议开一个单独的线程池来消费消息,然后异步返回结果
- for (ConsumerRecord record : records) {
- System.out.println(String.format("Consume partition:%d offset:%d", record.partition(), record.offset()));
- }
- } catch (Exception e) {
- try {
- Thread.sleep(1000);
- } catch (Throwable ignore) {
- }
-
e.printStackTrace();53. }54. }
2.3 构建分布式应用配置中心
在云上我们改用阿里云的应用配置管理ACM产品。云上应用配置管理是一款在分布式架构环境中对应用配置进行集中管理和推送的应用配置中心产品。基于该应用配置中心产品,可以在微服务、DevOps、大数据等场景下极大地减轻配置管理的工作量,增强配置管理的服务能力。下面介绍如何利用ACM创建配置中心:
操作步骤:
1) 在ACM 上创建命名空间
a) 登录 ACM 控制台
b) 在左侧导航栏选择 命名空间,单击右上角的添加按钮:
c) 在新建命名空间对话框中输入命名空间名生产环境;
2) 在命名空间下创建配置
在配置列表中选择对应环境,例如生产环境;
点击新建配置;
提供 JSON,XML 格式语法校验能力。在配置格式中选择不同的格式,会提供不同格式预发校验,减少语法格式导致的问题。
点击发布
按照以上步骤完成所有应用配置的创建工作;
创建完配置后,就可以在代码里使用了。由于配置容易发生变化,因此经常需要在 ACM 控制台编辑配置。ACM 控制台提供了搜索、查看、编辑、删除配置等功能。
3) 代码使用API监听配置
关于如何使用API监听配置请参考阿里云官网介绍
https://help.aliyun.com/document_detail/59964.html?spm=a2c4g.11186623.6.546.bpA9S0
2.4 大数据计算服务配置
云上我们改用阿里云MaxCompute作为大数据离线计算服务,我们需要提前完成MaxCompute服务创建,初始化配置以及数据导入等工作,以便大数据开发人员快速展开大数据开发工作。下面介绍下MaxCompute创建和配置以及数据导入。
1) 开通MaxCompute
进入阿里云MaxCompute产品首页,单击立即购买,进入购买页面。可根据自身需求进行选择、购买,MaxCompute有按CU预付费和按I/O后付费两种付费方式。我们这里选择使用按量付费,我们刚开始使用还不知道需要会用多少量,所以等使用一段时间之后再根据情况改成包月形式。如下图所示:
2) 创建项目
登录DataWorks管理控制台,击控制台概览页面常用功能下的创建项目,如下图所示:
填写创建项目弹出框中的各配置项,选择Region及服务,如Region没有购买相关的服务,会直接显示该Region下暂无可用服务,数据开发、运维中心、数据管理默认是选中的。如下图所示:
配置新建项目的基本信息和高级设置
基本配置:
项目名:项目名长度需要在3到27个字符之间。
显示名:显示名不能超过27个字符。
高级配置:
启用调度周期:控制当前项目是否启用调度系统,如果关闭则无法周期性调度任务。
允许在本项目中直接编辑任务和代码:当前项目成员在本项目中新建/编辑代码文件的权限,如果关闭则无法新建/编辑代码文件。
本项目中能下载select结果:控制数据开发中select出的数据结果是否能够下载,如果关闭无法下载select的数据查询结果。
MaxCompute项目名称:创建项目过程中可以创建MaxCompute相同的名称项目。
MaxCompute访问身份:个人账号,系统账号。推荐安全要求高的企业用户使用个人账号。
Quota组切换:Quota用来实现磁盘配额。
3) 创建表
由于在MaxCompute中的操作对象(输入、输出)都是表,所以在处理数据之前,首先要创建表、分区。在和大数据开发人员确定好表名,分区等信息之后就可以开始创建表的工作了。
创建/删除表的方式有以下几种:
通过MaxCompute Studio实现可视化创建/修改/删除表。
通过DataWorks实现创建表和删除表。
通过客户端常用命令实现创建表和删除表。
这里我们通过DataWorks实现创建表和删除表。
进入用车报告项目点击新建表:
输入建表语句
按照以上步骤创建所有需要的表即可。
4) 导入数据
在 DataWorks中,使用数据集成功能,将系统中产生的业务数据导入到工作区,通过工作流任务的计算后,再将计算结果定期导出到指定的数据源中。目前数据集成功能支持从以下数据源中将数据导入工作空间或将数据从工作空间导出:RDS、MySQL、SQL Server、PostgreSQL、MaxCompute、OCS、DRDS、OSS、Oracle、FTP、 dm、Hdfs、MongoDB 等。操作步骤如下:
新增数据源
- 以项目管理员身份进入DataWorks管理控制台,单击项目列表下对应项目操、栏中的进入工作区。
- 单击顶部菜单栏中的数据集成,导航至数据源页面。
- 单击新增数据源。
- 在新增数据源弹出框中填写相关配置项。
- 单击测试连通性。
- 若测试连通性成功,单击保存即可。
通过数据集成导入数据
可以通过向导模式和脚本模式两种方式配置同步任务,这里介绍如何将MySQL的数据通过向导模式导入到MaxCompute中。
- 新建向导模式的同步任务
- 选择来源
选择MySQL数据源及源头表person,数据浏览默认是收起的,选择后单击 下一步。
- 选择目标
目标即MaxCompute(原ODPS),表可以是提前创建,也可以在此处单击 快速建表。
配置项说明:
分区信息:必须指定到最后一级分区。例如把数据写入一个三级分区表,必须配置到最后一级分区,例如pt=20150101,type=1,biz=2。非分区表无此项配置。
清理规则:
写入前清理已有数据:导数据之前,清空表或者分区的所有数据,相当于insert overwrite。
写入前保留已有数据:导数据之前不清理任何数据,每次运行数据都是追加进去的,相当于insert into。
- 映射字段
选择字段的映射关系。需对字段映射关系进行配置,左侧 源头表字段和右侧 目标表字段为一一对应的关系。
- 通道控制
单击下一步,配置作业速率上限和脏数据检查规则。
配置项说明如下:
作业速率上限:是指数据同步作业可能达到的最高速率,其最终实际速率受网络环境、数据库配置等的影响。
作业并发数:从单同步作业来看,作业并发数*单并发的传输速率=作业传输总速率。
- 预览保存
完成上述配置后,上下滚动鼠标可查看任务配置,如若无误单击保存。
运行同步任务
同步任务保存后,直接单击运行同步任务并查看运行同步任务日志情况,如下图所示:
5) 授权给开发人员
当数据导入工作完成之后,我们需要给开发人员配置角色以及授权,以便开发人员登录平台进行数据开发工作。
- 准备RAM子账号
主账号导航至 访问控制 > 用户管理 页面。如下图所示:
单击右上角的 新建用户,如下图所示:
填写弹出框的各配置项,如下图所示:
单击 确定,即可创建子账号。
允许子账号登录
成功创建子账号后,主账号进入 访问控制 > 用户管理 页面,单击对应子账号后的 管理,进入用户详情页面。单击 启用控制台登录 并重置密码,填写该子账号用于登录的密码。如下图所示:
创建子账号的运行秘钥
运行密钥对于DataWorks中创建的任务的顺利运行非常重要,因此主账号需要为子账号创建 AK,或者允许子账号用户自行创建和管理自己的 AK 信息。具体操作如下:
主账号进入 访问控制 > 用户管理 页面,单击对应子账号后的 管理,进入用户详情页面。单击 创建 Accesskey,填写手机收到的验证码,即可为子账号创建新的 AK。
主账号进入访问控制 > 设置 页面,单击 子用户安全设置。勾选子用户安全设置 页面中的 允许自主管理 AccessKey,单击 保存修改 即可生效。如下图所示:
主账号进入访问控制 > 设置页面,单击企业别名设置,即可看到自己的企业别名,并可编辑进行修改。如下图所示:
- 添加用户
主账号进入dataworks控制台>用车报告项目>单击项目管理>项目成员管理,单击添加成员。勾选账号,并设置角色为开发,点击确定。
- 交付子账号给开发人员
等我们完成添加dataworks项目成员之后,就可以将子账号交付给开发人员使用,让他们使用子账号登录dataworks控制台进行大数据开发工作。
交付子账号给其他用户使用时,需要提供如下信息:
RAM 用户登录链接。
所属主账号的企业别名。
该子账号的用户名和密码。
该子账号的 Access Key ID 和 Access Key Secret。
确认已经允许子账号 启用控制台登录。
确认已经 允许子账号自主管理 accesskeys。
3、 应用部署和配置
由于我们希望到云上可以Jenkins+docker方式构建持续集成,所以改用云上CodePipeline,阿里云CodePipeline是一款提供持续集成/持续交付能力,并完全兼容Jenkins的能力和使用习惯的SAAS化产品。它无需运维,开箱即用,全量兼容Jenkins插件,支持ECS,容器服务持续部署,快速上手。下面介绍利用codepipeline+kubernetes部署应用。
使用 CodePipeline 之前,需要先开通产品,下面介绍利用codepipeline构建Java应用并部署到kubernetes。
操作步骤如下:
1) 登录 CodePipeline 控制台。
2) 同意 RAM 的 CodePipeline 角色的授权。
- 单击 新建,输入项目名称,选择 构建一个Java的软件项目 ,单击 下一步。
- 代码构建配置。
Repository 中配置的是仓库地址和证书,默认值是CodePipeline公开的Code仓库地址。
Branches to build 中配置的是代码分支,默认值是master分支。
![image079](https://yqfile.alicdn.com/70e21e6208efc5dd884c572d9b0f697b4da53928.png)
构建 中配置的是代码构建命令,默认值是
mvn package -B –DskipTests
测试 中配置的是单元测试命令,默认值是mvn test。如果不需要做单元测试,可以不填写测试命令。
3) 选择部署方式,单击 部署到Kubernetes。
配置 镜像构建和发布
镜像仓库名称。镜像仓库名格式为namespace/镜像仓库名。
镜像版本号。如果为空,则默认是latest。
Registry地址。Registry地址 用来配置docker registry地址,如果为空,默认使用Docker hub registry ,https://index.docker.io/v1/;如果使用阿里云registry, 请填写https://registry.cn-beijing.aliyuncs.com/v2/,其中地域cn-beijing根据用户实际的镜像仓库地域来修改。
Registry证书。用来添加授权信息,请添加Registry授权类型的证书。
Dockerfile路径。填写Dockerfile文件在该项目工作空间的相对路径。如果该配置为空,则默认使用工作空间目录下命名为Dockerfile的文件。
配置 部署Kubernetes。
选择 认证方式。
CodePipeline目前支持 证书认证,用户名密码认证 和 Token认证 三种认证方式。如果是 阿里云容器服务Kubernetes集群,默认都是 证书认证。
填写 API服务器地址。
请输入Kubernetes API 服务器地址,您可以在阿里云容器服务控制台查看Kubernetes集群 API Server 公网连接端点,
例如https://1.12.123.134:6443。
添加 证书。
根据上文选择的 认证方式,决定添加的证书类型。
证书认证 的认证方式,添加 Docker授权 类型的证书。
如果是 阿里云容器服务Kubernetes集群,在集群 基本信息 页面,找到 配置集群凭据 中提供的 KubeConfig。
把 client-key-data 的内容(冒号后面的字符串)填入 客户端Key 对话框。
把 client-certificate-data 的内容(冒号后面的字符串)填入 客户端证书 对话框。
用户名密码认证 的认证方式,添加 用户名和密码 类型的证书。
Token认证 的认证方式,添加 用户名和密码 类型的证书。
添加 部署配置文件。
输入yaml格式的Kubernetes部署配置文件。如果文件在当前项目的workspace下,请直接输入文件名,如果在项目workspace的子目录中,请输入 ..子目录/文件名。不支持位于当前项目的workspace之外的文件。
添加 状态检查配置。
支持检验的 Kubernetes Kind:
pods,daemonsets,deployments,replicasets,replicationcontrollers,statefulsets。如果检验的不是 default namespace 下的资源,请在首行填写 namespace 名称。请用 “:” 分隔 Kubernetes Kind 和 Kind name, 用 “,” 分隔多个 Kind name。每一行描述一种 Kubernetes Kind。示例配置:
namespace:default
- pods:pods1,pods2
- deployments:ds1,ds2
注意:请严格按照说明填写单词,不要删减字母;请勿填写多余的空格或者换行。
添加 变量申明配置
支持系统环境变量,可以通过 ${JENKINS_URL}/env-vars.html/ 查看。如果使用了多个变量,请用”,”分隔。您可以在上文的部署配置文件中使用变量,请以 ${BUILD_NUMBER} 格式严格填写,其他格式插件将忽略。示例:BUILD_NUMBER,JOB_NAME
单击 下一步。
检查所有配置信息,单击 提交。
4) 执行构建
完成项目的任务配置后,可以单击左侧导航栏中的 立即构建,开始执行配置中的构建及部署命令。
可以在构建队列及构建历史中查看构建状态。单击 构建序号,进入该次构建具体信息页面。
然后在侧导航中,单击 控制台输出,可以查看该次构建日志。
4、 负载均衡配置
4.1 创建负载均衡实例
- 登录负载均衡管理控制台。
- 在实例管理页面,单击创建负载均衡。
- 在购买页面选择一种付费方式。
- 参考负载均衡配置,配置负载均衡实例。
- 单击立即购买,完成创建。
- 创建成功后,返回负载均衡管理控制台。
- 在实例管理页面, 将光标移至刚创建的负载均衡实例名称区域,单击出现的铅笔图标,输入SLB1作为负载均衡实例的名称,单击确定。
4.2 配置负载均衡实例 - 登录负载均衡管理控制台。
- 在实例管理页面,找到目标实例,然后单击实例ID链接进入详情页面。
- 在左侧导航栏,单击监听,然后单击添加监听。
- 根据如下信息,配置监听规则,其它配置保持默认选项。
- 单击下一步,配置健康检查。选择TCP健康检查,使用默认配置,然后单击确认。
- 在配置成功页面,单击确认完成监听的配置。
- 在左侧导航栏,单击服务器 > 后端服务器。
- 在负载均衡服务器池页面,单击未添加的服务器页签,勾选之前创建的ECS01和ECS02实例,然后单击批量添加。
- 在添加后端服务器对话框,保持默认的ECS权重设置,单击确认。
- 返回实例管理页面,单击刷新。当后端ECS的健康检查状态为正常时,表示后端ECS可以正常处理负载均衡转发的请求了。
4.3 域名解析
负载均衡配置完成后,需要将域名解析到负载均衡实例的公网服务地址上。例如,网站的域名为www.abc.com,运行在公网IP地址为1.1.1.1的ECS实例上。创建负载均衡实例后,系统分配的负载均衡实例的公网IP地址为2.2.2.2。需要要将ECS实例添加到负载均衡实例的后端服务器池,并将域名www.abc.com解析到2.2.2.2。通常情况下,建议使用A记录解析(即将域名解析到一个IP地址)即可。
- 登录云解析DNS管理控制台。
- 单击添加域名,添加需要配置的域名。
- 在域名解析列表页面,单击目标域名操作列下的解析设置, 根据设置域名解析中的步骤完成域名解析设置。
5、 测试验证
当我们的应用都已经部署完成并且正常启动之后,需要对应用做必要的测试验证工作,例如功能测试、集成测试,由于这部分工作主要集中在测试团队,所以暂时省略。
6、 流量割接
如果功能测试,集成测试,性能测试等相关测试都已经通过,没有任何问题的情况,下一步可以开始上线割,但需要提前做好客户及公司内部的维护通告(重大维护公告需至少提前一周通知用户和客户,并提前准备好各种预案)。正式迁移的时候,由于系统、代码、文件及数据库都已迁移过去。维护期间停止数据新的数据写入,开启数据库只读模式,这样可以减少用户的影响。等待数据库同步一致之后,开始迁移的最后一步是将域名解析至阿里云,这里需要特别提醒一下,域名需要提前备案的。
虽然域名已经解析到最新的ip,当前万网的刷新最新的解析记录的时间周期最短也仅仅10分钟。但是我们没法把控的客户端本地的DNS缓存,即还会有部分客户还是访问到老的站点。针对那些依旧访问IDC机房应用的客户,我们在IDC机房前端nginx上做302重定向跳转,将依旧还访问IDC的客户引流到阿里云。值得注意的是,由于nginx是七层负载均衡,需要匹配域名。这里nginx的server_name和跳转的链接配置的域名都是同一个,为了确保跳转的域名解析的地址为阿里云,我们可以在nginx所在服务器的hosts配置中强制将域名的解析ip设置为阿里云对应的IP。最后还要观察下一段时间,直到所有流量都平稳的切到阿里云上,但仍然建议老应用保留一段时间,以防不测。万一遇到任何问题还可以修改DNS解析快速恢复到原来的业务。如下图所示:
关于RollBack 计划稍微多说两句,企业都要根据自身业务来制定详细的rollback计划,例如业务很重要,不能出现一丝数据错误,那么建议在切到云上的时候,保持线下与线上数据库同步,云上可以设置为master,线下设置为从库,开启主从同步,保障数据的一致性。当然操作过程会很复杂,但是绝对有必要提前考虑到出现各种问题的风险,以及应对措施。针对比较重要的业务和数据,一定要做好详细的切割计划以及回滚计划。但也有人说我的业务是不太重要的,业务影响较小,回滚代价反而比较大,这种情况就需要灵活考虑。
7、 安全加固
7.1 DDOS高防IP配置
智能终端上报数据的地址为公网地址,为防止汽车上报的地址被他人恶意攻击,因此需要对该地址进行重点防护。可以通过配置DDoS高防IP,将攻击流量引流到高防IP,确保数据上报地址的稳定可靠。操作步骤如下:
a) 购买实例
- 登录云盾管理控制台
- 点击新购实例
- 配置实例
- 点击购买
b) 启用高防实例
购买高防实例后,需要启用该实例才可将业务接入高防进行防护。操作步骤如下:
- 登录云盾DDoS防护管理控制台。
- 定位到高防IP>实例列表,选择地域,找到想要启用的高防实例。
- 单击立刻启用。
- 选择线路,单击立即启用。
c) 配置四层转发 - 登录云盾管理控制台,定位到DDoS防护>高防IP,单击非网站。在非网站页面,可选择高防实例和高防IP。
- 选择需要配置规则的高防IP后,单击添加规则。
- 选择转发协议(目前支持TCP和UDP),设置转发端口(需要通过高防IP的哪个端口来访问,一般情况选择跟源站相同端口)。然后,填写源站端口(源站提供业务服务的真实端口)和源站IP。
- 单击确定。
d) 放行回源IP段 - 登录云盾DDoS防护管理控制台,定位到实例列表,单击高防回源IP段,查看详细的高防IP回源地址段。
- 关闭源站上的防火墙和其他任何安全类的软件,确保高防的回源IP不受源站安全策略的影响。
e) 验证配置生效
在云盾DDoS防护管理控制台配置完成后,DDoS高防预期可以把请求高防IP对应端口的报文转发到源站(真实服务器)的对应端口。为了最大程度保证业务的稳定,我们建议在全面切换业务之前先进行本地的测试。可以直接本地通过telnet命令访问高防IP的后端业务端口,telnet命令能连通则说明转发成功。
7.2 web应用防火墙配置
a) 购买web应用防火墙服务
- 登录云盾控制台,点击进入web应用防火墙页面
- 开通web应用防火墙
- 购买web应用防火墙
- 单击确定
b) 添加网站域名配置。 - 登录云盾Web应用防火墙管理控制台。
- 定位到管理>网站配置页面,根据WAF实例所在的地区,选择中国大陆或海外地区。
- 单击添加网站。
c) 放行WAF回源IP段。
回源IP是WAF用来代理客户端请求服务器时用的源IP,在服务器看来,接入WAF后所有源IP都会变成WAF的回源IP,而真实的客户端地址会被加在HTTP头部的XFF字段中。接入WAF后,WAF作为一个反向代理存在于客户端和服务器之间,服务器的真实IP被隐藏起来,客户端只能看到WAF,而看不到源站。如下图所示(origin为源站):
d) 验证域名转发配置是否生效。
在把业务流量切到WAF上之前,建议先通过本地验证的方式确保一切配置正常,WAF转发正常。首先需要修改本地hosts文件,使本地对于被防护站点的请求先经过WAF。修改hosts文件后保存。然后本地ping一下被防护的域名,预期此时解析到的IP地址应该是刚才绑定的WAF IP地址。如果依然是源站地址,可尝试刷新本地的DNS缓存(Windows的cmd下可以使用ipconfig/flushdns命令)。确认hosts绑定已经生效(域名已经本地解析为WAF的IP)后,打开浏览器,输入该域名进行访问,如果WAF的配置正确,网站预期能够正常打开。
e) 修改网站域名DNS解析记录将业务流量切换至WAF。
通过修改DNS将网站域名解析到WAF,完成业务正式接入。
- 登录万网控制台,定位到对应域名的域名解析>解析设置页面。正常情况下,网站域名已经存在一些解析记录。
- 选择所需解析的主机记录,单击修改,将记录类型修改为CNAME,记录值修改为WAF所分配的CNAME。
- DNS配置检查
将网站域名的DNS解析切换至WAF后,网站域名即接入WAF进行防护。解析记录配置完成后,可以通过Ping网站域名的方式其他工具观察DNS解析生效情况。