少湖说 | 科技自媒体

互联网,科技,数码,鸿蒙

背景

公司项目部署在阿里云,因故需要将所有服务迁移到新账号,使用的服务包括 ECS,RDS (MySQL),Redis, 短信,OSS,CDN, 负载均衡, 消息队列 RabbitMQ ,WAF, 日志,云监控, Mongo, EMAS(移动研发平台),消息推送,内容安全,号码认证,文字识别,SSL证书,数据库审计,日志审计等

整体迁移方案

服务迁移,如果允许停服,那就比较简单,ECS 等都可以直接在新账号下创建,重新部署,数据库可以通过脚本导入导出实现迁移。本文重点讨论不停服迁移方案。

本次迁移涉及跨账号、跨地域(机房),在迁移过程中需要保障不停服,平稳迁移,需要考虑以下问题:

  1. 服务器如何迁移

如果原服务器环境部署复杂,可以考虑直接将原服务器过户到新账号,也可以考虑创建磁盘镜像,基于这个自定义创建新的服务器。

  1. 数据库如何迁移`

这里需要考虑使用数据库同步工具,保持数据双向同步。

  1. OSS 如何迁移

讨论如何使用阿里云 OSS 复制功能,并切换绑定域名。

  1. 流量如何平稳的切换

DNS 切换以后,全球刷新 DNS 缓存需要比较长的时间,大部分地区几分钟可以刷新完成,但有些地区需要长达 1-2 天的时间,这就需要考虑如何处理指定旧环境的流量。

  1. IP 如何迁移/过户

涉及第三方调用时,往往需要添加 IP 白名单,这时候添加白名单可能比较麻烦,所以如果能将出网 IP 迁移至新账号,继续使用原有 IP,也是不错的方案。

  1. 其他服务如何迁移

除了以上提到的服务,还有诸如 CDN,WAF,负载均衡等等非常多的服务,也需要考虑如何迁移。

本系列将围绕以上主题,分别进行探讨。

ECS 迁移

最简单的方式是 ECS 过户,不过这里有一些限制,如果原账号是个人账号,那么目标账号无限制。如果原账号是企业账号,则指定过户给相同实名认证的企业账号。

alt text

具体操作步骤可以参考官方文档 ECS过户 进行操作。

本文重点介绍使用自定义镜像迁移服务器,以及创建新的空白服务器迁移服务。

服务器架构图

alt text

创建自定义镜像

如果服务器较少,或者服务器环境安装配置复杂,不想再重新安装,那么可以使用自定义镜像进行迁移。

  1. 首先在原 ECS 的实例详情中,找到 “创建自定义镜像”,点击创建

  2. 共享自定义镜像

将自定义镜像共享给目标账号,需要注意的是,镜像只能在相同的区域共享,如果想跨区域共享,则需要使用镜像复制,将镜像复制到目标区域,然后再共享给新账号。

  1. 创建实例

在新账号接收共享镜像,然后创建 ECS 实例,创建时选择该自定义镜像进行创建。

使用标准镜像创建

  1. 可以批量创建 ECS 实例,使用标准镜像进行创建。

  2. 创建成功后考虑安装像 ansible 这样的工具进行批量配置环境。

参考资料

概述

数据库迁移主要有两种方案,一种是导出数据库脚本,然后在新账号创建的数据库中执行,完成导入。这种情况需要停服。
另一种方案,如果需要不停服,则可以使用数据传输服务DTS, 本文主要讲解DTS方案。

准备工作

  1. 在新账号购买 RDS 数据库,创建实例。
  2. 参考文章跨阿里云账号任务如何配置RAM授权, 在原账号处理添加角色,名称如 ram-for-dts,并配置信任策略如下:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
{
"Statement": [
{
"Action": "sts:AssumeRole",
"Effect": "Allow",
"Principal": {
"RAM": [
"acs:ram::<阿里云账号ID>:root"
],
"Service": [
"<阿里云账号ID>@dts.aliyuncs.com"
]
}
}
],
"Version": "1"
}

将<阿里云账号ID>,替换成新账号的阿里云账号ID。

  1. 创建 DTS 实例。

打开数据传输服务中的数据同步,点击创建任务,根据提示配置任务。左侧配置源数据库信息,也是原账号的数据信息,注意选择“跨账号”,

右侧配置目标数据库信息,也就是新账号的数据库信息。

配置好之后,根据提示进入下一步操作,配置全量同步和增量同步。

  1. 配置反向同步

第 3 步配置好了从原账号到新账号的数据同步,然后再添加一个任务,按照类似的操作,配置从新账号到原账号的数据同步。这样就完成了数据双向同步。

alt text

参考资料

普通过户

如资料过户按量付费EIP所述,如果原账号是个人账号,则目标账号无限制,如果原账号是企业账号,则目标账号必须为相同认证主体的企业账号。

其主要操作就是,在原账号发起过户,在新账号接收过户。具体请看参考资料,这种场景不是本文讨论的重点。

企业跨认证主体迁移

整体流程

  1. 首先在需要将原账号的 ID,添加白名单

联系阿里云售后,添加白名单,提交工单或者钉钉技术支持,将原账号ID添加白名单,这样释放的IP不会进入公共资源池。

  1. 在原账号释放 IP

alt text

IP资源池会在每个整点刷新,我们选择在整点时间后,如 9:02-9:30, 释放原IP。注意在释放前,必须记好释放的 IP 地址,我们将在新账号申请时用到。

  1. 新新账号申请指定EIP

alt text

立即在新账号处,选择申请指定EIP,输入原账号释放的IP,然后选择申请。这样IP就转移到新账号了。

alt text

注意在申请时,左上角的地域,要选择与原IP所属的相同地域。

注意,万一申请失败,可以回到原账号,用上面第 3 条相同的方式,通过申请特定EIP找回7天内释放的历史EIP。

参考资料

概述

Bucket 复制分为两种,同区域复制和跨区域复制

同账号复制比较简单,根据提示填写信息即可,本文主要介绍跨账号复制。

同区域复制

alt text

授权角色选择 “AliyunOSSRole”, 创建方法见 “跨区域复制”。然后点击确定即可。

跨区域复制

假设我们将原账号的 old-raw-files (华为2 北京), 迁移至新账号的 tests-copy(华东2 上海)

在原账号配置授权角色 “AliyunOSSRole”

跨账号复制时,需要首先在原账号添加授权角色,打开 RAM 访问控制/角色, 添加一个名为 AliyunOSSRole 的角色,增加授权 AliyunOSSFullAccess

alt text

添加成功后,在角色详情中,找到 ARM,点击复制,复制的内容将在后面新账号处用到。

在接收侧面配置授权

打开新账号中的目标 Bucket,进入管理界面,在左侧菜单栏中,依次找到 “文件管理/权限控制/Bucket授权策略”,点击“接收复制对象”,

alt text

在右侧弹窗中,使用默认配置 “从源端复制RAM角色ARN获取”,下方的 “源端复制RAM角色ARN”,粘贴前面复制好的 ARM,之后点击生成 Policy, 点击保存。

成功后显示如下:

alt text

开启复制

alt text

建议使用默认配置,即勾选 “全部文件进行同步”以及“增/改 同步”,“复制历史数据”。这意思是说,首次同步时会进行一次全量复制,之后会将增加/修改的文件,增量同步新的 Bucket。

alt text

点击“确定”,之后点击 “确认开启”,等待数据复制开启。

稍等片刻,可以看到状态为运行中。

alt text

等到 OSS 迁移完成之后,可以再关闭复制。

切换域名

  1. 如果你的 Bucket 绑定了自定义域名,则在新的 Bucket 中,重新添加绑定的域名即可,绑定成功后,旧的 Bucket 处,自定义域名会自动失效。

  2. 如果没有使用自定义域名,则需要批量更新数据库中存储的 oss 域名,或者考虑保留原来的 Bucket 名称,如 3 所述。

  3. Bucket 的名称默认全国唯一,如果希望保留原来的名称,可以使用以下方式间接实现:

这里需要创建三个 Bucket,A(name-1) 数据迁移到 B(name-2),删除 A,新建与 A 同名的 C(name-1), 再将 B 数据迁移到 C

其他

CDN 切换

完成 Bucket 迁移后,在新账号重新绑定域名和配置 CDN,参考 快速接入阿里云CDN, 首先在 Bucket 中的 “数据处理/Bucket配置/域名管理”处添加绑定域名,然后在 CDN 控制台添加域名。

参考资料

同账号同区域复制
跨账号同区域复制

概述

按前面的步骤,所有服务迁移完毕之后,最后就剩下 DNS 解析修改了。

修改解析

alt text

在域名解析处,修改域名的解析地址即可。

如果 IP 已经过户到了新账号,则不需要修改解析。

何确保业务稳定

域名解析更换时,由于 DSN 解析存在缓存,各运营商的解析缓存刷新时间会有所不同,短则一两分钟,长则一两天。所以,为了确保业务稳定,可以采用以下两种方案。

双可用模式

原账号中的服务器仍然保持运行,数据库参考 03.数据库迁移 中的方案,使用双向同步。

这样,如果存在部分流量指向旧的服务器,则仍然可用,直到所有流量都指向新的服务器再行关闭。

  1. 使用 网络拨测工具 检查 DNS 解析生效情况。

alt text

  1. 通过查询原账号服务器中的 Nginx 等访问日志,检查是否仍有流量存在。

代理模式

在原服务器的网关入口处,通过搭建 Nginx 代理,将流程转发至新的服务器。

1
2
3
  location / {
proxy_pass https://10.8.8.8/;
}

参考资料

概述

当完成了服务器、数据库、IP、OSS等迁移后,剩下的就是其他服务了。

短信网关

短信模板只能一个个创建,不能批量操作。但是可以使用以下方式优化操作。

  1. 在原账号导出模板列表

alt text

  1. 考虑通过调用 API 来创建模板

通过脚本读取导出的模板列表,然后调用 申请短信模板API 来创建。

Redis

Redis 同样可以使用 DTS 工具进行迁移,用法与数据库迁移类似,这里不再赘述。

同时 Redis 也可以使用 AOF 文件方式迁移,参考 使用AOF文件进行迁移 进行操作。

其他

以下服务只能通过手动创建,无法直接迁移使用,如 短信推送、消息队列、内容安全、SSL证书、负载均衡、WAF、日志存储等。

参考资料

概述

阿里云迁移往往因为各种各样的原因,如公司主体变更、财务费用原因等。

迁移过程中,还需要考虑其他的问题

迁移前

  1. 迁移之前要制定迁移计划,最好逐步分开实施,例如,可以先迁移测试环境,跑通整个流程,再迁移生产环境。

  2. 对于生产环境,可以先迁移短信、消息推送、OSS 存储等非核心业务,等没有问题后再迁移 ECS、数据库等,或者反过来操作,如果工作量太大,不要选择一次全部完成。

节约过程中

如何节约迁移过程中产生的成本,可以从下方式考虑

  1. 由于 ECS 等服务续费有固定的周期,如ECS是按月续费, 最好赶在周期过期之前完成,以进一步缩减成本。
  2. 迁移完成之后,一般不会立即释放原服务,需要观察一段时间,确认无误后再行释放。 ECS 可以转成按量付费,并使用停机不收费模式,这样 ECS 停机后,只收取存储费
  3. 同样,其他服务,优先由包年包月切换成按量付费,这样在留存期间,只会产生少量费用

迁移完成后

  1. 迁移完成后,一定要清理原账号中的服务,避免产生费用,如 OSS 需要清理原 bucket 中的文件,但 bucket 库可以保留,空文件不会产生费用
  2. 其他服务,磁盘镜像、快照、以及各种实例,都需要退订、释放。
  3. 当确认迁移无误后,原服务保留的观察时间也足够以后,可以尽快退订和释放,这样不使用的服务可以一定程序上退回相应的费用。

参考资料

产品介绍

区块链是一个典型的分布式协同系统,多方共同维护一个不断增长的分布式数据记录,这些数据通过密码学技术保护内容和时序,使得任何一方难以篡改、抵赖、造假。

蚂蚁区块链开放联盟链是一个低成本、低门槛开放普惠的区块链服务网络,依赖蚂蚁区块链联盟链强大的技术基础、创新公有许可机制,联合各行业权威节点合作伙伴共同打造。开放联盟链致力于解决现有区块链网络费用高、开发门槛高、无法大规模商用落地等问题。本着生态共建,合作共赢的原则,向广大开发者开放该服务网络,赋能全行业开发者,共建生态繁荣。

功能特性

蚂蚁区块链开放联盟链具备以下功能特性:

公有许可机制

  • 面向广大开发者和中小微企业提供服务。
  • 联盟参与方加入需经过许可,权威公正。
  • 无需建链即可享受蚂蚁区块链服务。

生态服务共建

  • 联盟用户均可参与服务设计与输出,共享生态收益。
  • 开放联盟链提供阿里经济体流量、服务承接。

优秀开发工具

  • Cloud IDE 及智能合约开发模板。
  • 多语言 SDK 集成服务。
  • 功能强大、丰富多样的中间件。

基础能力强大

  • 支持分布式数字身份。
  • 支持链上统一积分。
  • 提供强大的隐私计算能力。
    -提供企业身份认证、实人认证、内容安全、金融级风控等能力。

应用场景

蚂蚁区块链开放联盟链是一个低成本、低门槛开放普惠的区块链服务网络。区块链技术是由 P2P 网络、链式数据结构、加密技术、共识算法、智能合约等技术巧妙组合而成,具有分布式一致、防篡改、可追溯的特征,以其作为底层的基础设施可以构建一个可信的多方协作的价值网络,适合所有需要通过技术增加信任、提升协作效率的场景,包含但不限于:

商品溯源

商品溯源是指追踪记录商品从生产到零售的全部环节,它的实现需要产业链上下游各方共同参与。商品溯源属于一种多环节协同的综合性商业行为,集合了 IoT 技术、防伪技术、信息系统与溯源机制。

版权保护

以区块链为核心技术,结合大数据和人工智能等多种先进技术,对生产者和产物的数据进行存储和探索,可以实现所有权的溯源,从而达到保护生产者版权的作用。

供应链金融

将供应链上的核心企业以及与其相关的上下游企业看作一个整体,以核心企业为依托,以真实贸易为前提,运用自偿性贸易融资的方式,对供应链上下游企业提供的综合性金融产品和服务。根据融资担保品的不同,金融机构将供应链金融分为在应收账款类、预付类和存货类融资。

而区块链的信任传递,能很好解决供应链金融下中小企业缺乏信用的问题,让优质核心企业闲置的银行信用额度传递给中小企业,实现整个链条上信任流通。

去中心化游戏

将区块链技术应用于游戏当中,可以将游戏的所有权下放给所有的玩家,游戏不再受中心组织的控制。游戏交由玩家社区自治,运行机制透明,每一笔交易数据都上链不可篡改,避免了中心组织捏造虚假数据。玩家对自己的资产持有真正的把控权,只要区块链网络存在,玩家的资产就永远不会凭空消失。

公益

区块链可以用提高公益事业的信息透明度,给予捐赠者以良好的反馈。记录其继续捐助,形成良性的循环。如利用区块链技术追踪钱款的来源和流向,对受捐赠者的身份进行确认,建立公益领域的问责机制,从而提升组织效率。

保险

利用区块链技术,将保险产品信息及投保过程、流通过程、营销过程、理赔过程的信息进行整合并写入区块链,实现了全流程追溯、数据在交易各方之间公开透明,以及保险公司、保险机构、监管部门、消费者之间的信任共享,降低各方信息不对称程度,大大提升保险各环节业务效率。

电子票据

传统“智慧医疗”模式下,患者通过网络交费、移动支付后,仍需线下人工打印纸质票据,严重制约了智慧医疗发展,给患者带来不便。而区块链票据模式则可实现非税、应税票据全面电子化,链上化,保证票据信息的真实性、唯一性,大幅提高报销效率。

跨境支付

区块链技术通过分布式账本技术将原来像接力赛一样逐个节点确认传递的汇款模式,改变为业务节点实时同步并行确认,提升了效率,改变了运营模式。在汇出端钱包发起汇款的同时所有参与方同时收到该信息,在完成合规等所需的审核后,区块链上协同各方同时完成这一笔汇款交易。

资产数字化

各类资产,如股权、债券、票据、收益凭证、仓单等均可被整合进区块链中,成为链上数字资产,使得资产所有者无需通过各种中介机构就能直接发起交易。上述功能可以借助于行业基础设施类机构实现,让其扮演托管者的角色,确保资产的真实性与合规性,并在托管库和分布式账本之间搭建一座桥梁,让分布式账本平台能够安全地访问托管库中的可信任资产。

参考资料

安装定位工具

1
appium plugin install --source=npm appium-inspector-plugin

运行

1
appium --use-plugins=inspector --allow-cors

打开浏览器

在浏览器中打开 http://localhost:4723/inspector

在右侧编辑 json, 点击保存按钮,点击 Start Session

1
2
3
4
5
{
"platformName": "iOS",
"appium:automationName": "XCUITest",
"appium:udid": "00000030-0018581E1E43402E"
}

alt text

点击 +号,开启位置定位查询

alt text

编写测试代码

index.js

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
// Appium 服务配置
const APPIUM_HOST = '127.0.0.1';
const APPIUM_PORT = 4723;
// Appium 配置
const iosOptions = {
capabilities: {
platformName: "iOS",
"appium:udid": "00000030-0018581E1E43402E",
"appium:platformVersion": "16.2", // 修改为你的 iOS 版本
"appium:deviceName": "iPhone", // 修改为你的设备名称
"appium:automationName": "XCUITest",
"appium:bundleId": "com.xxx.xxx", // bundle ID
"appium:noReset": true,
"appium:newCommandTimeout": 300
},
hostname: APPIUM_HOST,
port: APPIUM_PORT,
};

async function startTest() {
// 初始化 Appium 驱动
const driver = await wdio.remote(iosOptions);
// 模拟点击事件
await driver.performActions([{
type: 'pointer',
id: 'finger1',
parameters: { pointerType: 'touch' },
actions: [
{ type: 'pointerMove', duration: 0, x: 80, y: 300 },
{ type: 'pointerDown', button: 0 },
{ type: 'pause', duration: 100 },
{ type: 'pointerUp', button: 0 }
]
}]);
}

// 启动测试
startTest().catch(console.error);

启动测试

首先启动 Appium 服务器

1
appium

然后运行测试代码

1
node index.js

更多问题

非iOS原生应用,如何解决复制粘贴问题?

这种情况下无法直接复制或者发送文本,一个思路是使用微信输入法的剪贴板/常用语,通过模拟点击操作,间接实现输入功能。

参考资料

0%