在复杂多云的环境下,数据库迁移成为了一个既常见又头疼的问题,所以又快又好并保证数据一致性的数据库迁移服务就显得非常必要了。基于这点的考量,Microsoft Azure 也发布了自己的数据迁移服务 Azure Database Migration Service 来帮助想把各类数据库迁移到 Azure 的客户解决数据库迁移的后顾之忧。
2. Azure Database Migration Service 介绍
Azure Migration Service 是完全托管的服务,旨在实现从多个数据库源无缝迁移到 Azure 并只让应用程序的停机时间最短。该服务集成了一些现有工具和服务的功能从而为客户提供高度可用的综合解决方案,例如使用数据迁移助手生成评估报告,这些报告可以提供建议并能够指导执行迁移之前完成所需的更改。该过程利用了 Microsoft 的最佳实践,因此客户可以在启动迁移项目后便高枕无忧。数据库迁移的过程原理如下图所示:
导入之后需要删除 Azure MySQL PaaS employees 库里的 Foreign Key(s),查询外键的 SQL 如下:
1 2 3 4 5 6 7 8 9 10 11
$ mysql> SELECT SchemaName, GROUP_CONCAT(DropQuery SEPARATOR ';\n') as DropQuery, GROUP_CONCAT(AddQuery SEPARATOR ';\n') as AddQuery -> FROM -> (SELECT -> KCU.REFERENCED_TABLE_SCHEMA as SchemaName, KCU.TABLE_NAME, KCU.COLUMN_NAME, -> CONCAT('ALTER TABLE ', KCU.TABLE_NAME, ' DROP FOREIGN KEY ', KCU.CONSTRAINT_NAME) AS DropQuery, -> CONCAT('ALTER TABLE ', KCU.TABLE_NAME, ' ADD CONSTRAINT ', KCU.CONSTRAINT_NAME, ' FOREIGN KEY (`', KCU.COLUMN_NAME, '`) REFERENCES `', KCU.REFERENCED_TABLE_NAME, '` (`', KCU.REFERENCED_COLUMN_NAME, '`) ON UPDATE ',RC.UPDATE_RULE, ' ON DELETE ',RC.DELETE_RULE) AS AddQuery -> FROM INFORMATION_SCHEMA.KEY_COLUMN_USAGE KCU, information_schema.REFERENTIAL_CONSTRAINTS RC -> WHERE -> KCU.CONSTRAINT_NAME = RC.CONSTRAINT_NAME -> AND KCU.REFERENCED_TABLE_SCHEMA = RC.UNIQUE_CONSTRAINT_SCHEMA) Queries -> GROUP BY SchemaName;
选择出结果中关于 Drop 的语句并执行:
1 2 3 4 5 6 7
mysql> use employees; mysql> ALTER TABLE dept_emp DROP FOREIGN KEY dept_emp_ibfk_1; mysql> ALTER TABLE dept_emp DROP FOREIGN KEY dept_emp_ibfk_2; mysql> ALTER TABLE dept_manager DROP FOREIGN KEY dept_manager_ibfk_1; mysql> ALTER TABLE dept_manager DROP FOREIGN KEY dept_manager_ibfk_2; mysql> ALTER TABLE salaries DROP FOREIGN KEY salaries_ibfk_1; mysql> ALTER TABLE titles DROP FOREIGN KEY titles_ibfk_1;
至此,Schema 在 Azure MySQL PaaS 上迁移完毕。
3.2.5 创建 Migration Project 并做 Online Migration
创建过程按照 Migration Wizards 一步一步操作即可,注意需要在 Azure MySQL PaaS 上配置允许 Azure DMS 的访问,Source Database 类型选择 MySQL 或者 Amazon RDS MySQL 都可以。
配置好之后,直接 Run Migration 就可以开始做迁移了,迁移结束后的状态如图所示。值得注意的是,由于选择的迁移类型是 Online 的,所以迁移结束后,DMS 还处于 Running 状态。如果此时需要停止,可以进行 Cutover。
$ for time in $(seq 10 153) > do > mysql -u'msadmin' -p'Microsoft2019!' -h'rm-uf626yx145z16o277so.mysql.rds.aliyuncs.com' -e "INSERT INTO employees.employees (emp_no, first_name, last_name) VALUES ('$time', 'Xinsheng$time', 'Wang$time');" > sleep 1 > done
为了方便更直观的查看结果,该结果使用 Navicat 12 连接数据库,具体插入同步结果如下: Aliyun RDS MySQL
# Create Azure Kubernetes Service Cluster resource "azurerm_log_analytics_workspace""myterraform_log_analytics_workspace" { # The WorkSpace name has to be unique across the whole of azure, not just the current subscription/tenant. name = "${var.log_analytics_workspace_name}" location = "${azurerm_resource_group.myterraformgroup.location}" resource_group_name = "${azurerm_resource_group.myterraformgroup.name}" sku = "${var.log_analytics_workspace_sku}" } resource "azurerm_log_analytics_solution""myterraform_log_analytics_solution" { solution_name = "ContainerInsights" location = "${azurerm_resource_group.myterraformgroup.location}" resource_group_name = "${azurerm_resource_group.myterraformgroup.name}" workspace_resource_id = "${azurerm_log_analytics_workspace.myterraform_log_analytics_workspace.id}" workspace_name = "${azurerm_log_analytics_workspace.myterraform_log_analytics_workspace.name}"
az aks get-credentials --resource-group aksrg001 --name akscluster001
集群节点信息:
1 2 3 4 5
$ kubectl get node NAME STATUS ROLES AGE VERSION aks-agentpool-26667448-0 Ready agent 17m v1.14.8 aks-agentpool-26667448-1 Ready agent 16m v1.14.8 aks-agentpool-26667448-2 Ready agent 16m v1.14.8
RUN set -x && \ sed -i -e "s/jobmanager\.heap\.size:.*/jobmanager.heap.size: 128m/g"$FLINK_CONF && \ sed -i -e "s/taskmanager\.heap\.size:.*/taskmanager.heap.size: 256m/g"$FLINK_CONF
$ nc -lk 9999 Sep 18 05:17:16 localhost journal: Runtime journal is using 8.0M (max allowed 398.2M, trying to leave 597.3M free of 3.8G available → current limit 398.2M).
$ kubectl apply -f flink-batch-on-aks-jobmanager.yaml $ kubectl get pods NAME READY STATUS RESTARTS AGE flink-batch-on-aks-jobmanager-7ddb5cf4bc-nh7b8 1/1 Running 0 7s
$ ./bin/flink run -m 10.11.4.4:8081 ./examples/streaming/WordCount.jar --input ./input.txt Starting execution of program Printing result to stdout. Use --output to specify output path. Program execution finished Job with JobID 7a9037a6c6573a6a7f01f36e6e9d7382 has finished. Job Runtime: 138 ms
az aks update -n aksspark0001 -g akssparkrg --attach-acr akssparkacr0001 az aks update -n aksspark0001 -g akssparkrg --attach-acr /subscriptions/53a326cc-f961-4540-8701-2bfd1003242b/resourceGroups/akssparkrg/providers/Microsoft.ContainerRegistry/registries/akssparkacr0001
Hello,大家好!第一篇正式的博客,我们先来说说 WSL。WSL可以让开发者在 Windows 10 下通过 Bash Shell 运行原生的 Ubuntu 用户态二进制程序,工程师们不用再苦恼所用的 Windows 平台上没有合适的 Linux 工具和库了。对于 Linux 的重度用户来说,福音来了。之所以第一篇技术博客介绍 WSL,也是因为我未来技术博客中的实验环境都会以此为基础。那还等什么,让我们来动手实战一下,感受一下 WSL 的强大吧 !
2. WSL简介和原理
WSL 相关代码早在 2016 年 1 月下旬便被微软悄悄内置进了 Windows 10 Build 14251 预览版中,此后微软的开发人员制订了 lxcore.sys 与 lxss.sys 这两个新的子系统文件,让其成为 Windows 程序员开发 Linux 应用程序的桥梁。WSL 是由 Windows 内核团队与 Canonical 合作设计和开发的,可以让 Windows 10 下的开发者们在拥有 Windows 中那些强力支持之外,还能使用 Linux 下丰富的开发环境与工具而不用启动另外的操作系统或者使用虚拟机。这绝对是一个“来自开发者,服务开发者”的 Windows 10 特色,它的目的是让开发者们每天的开发工作都变得顺畅而便捷。我们先来看一下 WSL 的架构和原理图:
WSL 对于 Windows 系统来说属于用户态程序,通过虚拟文件系统接口,以 DriveFs 文件系统挂载到 Windows 从而提供和 Windows 的互操作能力。 lxss.sys 和 lxcore.sys 这两个驱动负责模拟 Linux 内核并实时拦截系统调用。相应的驱动会将 Linux 内核调用映射为对应的 Windows 内核调用。根据从微软内部的压力测试工具据来看,WSL 的性能表现非常接近用相同硬件直接运行 Linux 的性能,几乎可以获得同等的 CPU、内存和 I/O 性能,这证明 WSL 在性能方面的表现很出色。
3. WSL配置
3.1 启用 WSL Feature
顺序:Windows 设置 -> 应用和功能 -> 右侧的程序和功能 -> 启动或关闭windows功能 -> 勾选适用于 Linux 的 Windows 子系统
3.2 安装 WSL
Microsoft store 提供了很多 Linux 发行版本可供选择,用户可以根据自己的爱好和习惯去选择自己喜欢的 Linux 发行版本。本文选择 Ubuntu 进行安装,点击启动,第一次会进行初始化安装。