用OMS进行 OceanBase 租户间数据迁移的测评

基本概念

OceanBase迁移服务(,简称OMS),可以让用户在同构或异构 RDBMS 与OceanBase 数据库之间进行数据交互,支持数据的在线迁移,以及实时增量同步的复制功能。

OMS 提供了可视化的集中管控平台,通过简单的配置用户即可完成数据的实时迁移,且对源数据库和业务系统的影响开销可忽略不计。OMS 旨在帮助用户以最低的风险、极小的开销和最高的效率实现同构/异构数据库向 OceanBase 数据库进行实时数据迁移和数据同步。OMS 社区版支持数据迁移功能,您可以通过该功能实时进行 MySQL 数据库与 OceanBase 社区版之间的数据迁移,以及 OceanBase 社区版与 OceanBase 社区版之间的数据迁移。

同时,通过 OMS 用户可以在不停服的情况下无缝将数据迁移到 OceanBase 数据库上。在业务应用切换数据库到 OceanBase 数据库前,OMS 可以启用反向数据同步链路,再执行应用切换到 OceanBase 数据库,重新建立主备关系,此时所有在切换后发生在 OceanBase 数据库上的数据变更都将实时同步至切换前的源端数据库,以此来应对紧急回切的需求场景,最大程度的降低业务迁移风险,助力企业用户构建高可用和高可靠的数据体系架构。

测试目的

本节主要测试 OceanBase 数据库不同租户之间的数据同步。当迁移的源端数据库为 OceanBase 时,会通过 OCP 获取相关信息,所以需要关联 OCP。OMS 社区版会通过 JDBC 直连 OCP 的元信息库,来查询数据迁移流程中需要使用的信息,然后发送数据给目标端 OceanBase 租户。该方法同样也适用于 MySQL 与 OceanBase 以及 OceanBase 与 OceanBase 之间的数据同步。

前提条件

1、 已部署 OCP 社区版 3.3.0,详细操作请参见 OCP 部署指南。

2、 已部署 OMS 社区版 3.3.0,详细操作请参见 OMS 部署指南。

3、部署待迁移的 OceanBase 集群(含 OBProxy),必须使用 OCP 接管或创建。详细操作请参见 创建集群 和 使用 OCP 接管 OBD 部署的集群。

数据同步测试

环境准备

1、登录 OCP,使用 OCP 为待迁移的集群创建租户、数据库及迁移所用的用户。具体操作请参见:管理租户。

租户数据库用户备注
test1test_oms_1oms源端1
test2test_oms_2oms源端2
test3test_oms_3oms目标端

2、登录 OMS 社区版控制台。

3、关联 OCP。

当 OMS 社区版的运行涉及 OceanBase 数据源时,会通过 OCP 获取相关信息,所以需要关联 OCP。具体操作请参见 关联 OCP。添加完成后,可在关联 OCP 页面中看到已关联的 OCP。

1679474663

4、添加 OceanBase 社区版数据源(源端和目标端),具体操作请参见 添加 OceanBase-CE 数据源,添加完成后可在数据源管理中看到已添加的数据源列表。

1679474683

测试一:

测试目的:测试能否正常将租户 test1 表 t1 的数据和租户 test2 表 t2 的数据,分别迁移至租户 test3 的表 t1 和 表 t2 中。

测试步骤:

  • 全量迁移:在 OMS 社区版中创建两个迁移项目,将源端租户 test1 和租户 test2 的全量数据迁移至目标端租户 test3 中。
  • 增量同步:在源端租户 test1 的表 t1 和租户 test2 的表 t2 中进行 insertdeleteupdate,查看目标端租户 test3 的表 t1 和 表 t2 数据的变化。
  • 反向增量同步:正常增量同步完成后,开启租户 test3 到 租户 test1 的反向增量同步。在目标端租户 test3 的表 t1 中进行 insertdeleteupdate,查看源端租户 test1 的表 t1 数据的变化。
租户数据库用户备注
test1test_oms_1omst1源端1
test2test_oms_2omst2源端2
test3test_oms_3omst1,t2目标端

1、在客户端使用 oms 用户分别登录租户 test1 和 test2,创建表 t1 和 t2。

obclient -hxxx.xxx.xxx.xxx -P2883 -uoms@test1#testoms -pXXX -A test_oms_1CREATE TABLE `t1` (
`id` int NOT NULL,
`name` varchar(45) DEFAULT NULL,
`remark` varchar(45) DEFAULT NULL,
PRIMARY KEY (`id`)
) CHARSET=utf8mb4;MySQL [test_oms_1]> insert into t1(id,name,remark) values(10,'aa','test10');
MySQL [test_oms_1]> insert into t1(id,name,remark) values(11,'bb','test11');
MySQL [test_oms_1]> select * from t1;
+----+------+--------+
| id | name | remark |
+----+------+--------+
| 10 | aa   | test10 |
| 11 | bb   | test11 |
+----+------+--------+
2 rows in set (0.002 sec)
obclient -hxxx.xxx.xxx.xxx -P2883 -uoms@test2#testoms -pXXX -A test_oms_2CREATE TABLE `t2` (
`id` int NOT NULL,
`name` varchar(45) DEFAULT NULL,
`remark` varchar(45) DEFAULT NULL,
PRIMARY KEY (`id`)
) CHARSET=utf8mb4;MySQL [test_oms_2]> insert into t2(id,name,remark) values(20,'aa','test20');
MySQL [test_oms_2]> insert into t2(id,name,remark) values(21,'bb','test21');
Query OK, 1 row affected (0.002 sec)MySQL [test_oms_2]> select * from t2;
+----+------+--------+
| id | name | remark |
+----+------+--------+
| 20 | aa   | test20 |
| 21 | bb   | test21 |
+----+------+--------+
2 rows in set (0.002 sec)

2、创建数据迁移项目,具体操作请参见 数据迁移

2.1、选择源节点和目标节点,这里选择源端1和目标端,即源端租户 test1 和目标端租户 test3。

1679474699

2.2、选择要迁移的源端数据库表,单击“>”,添加至目标端对象中,默认生成与源端相同的表名,也可以进行重命名。

1679474705

2.3、启动任务之后,可以看到任务的基本信息及迁移步骤详情。

1679474717

2.4、同理继续创建第二迁移项目(源端租户 test2 和目标端租户 test3),创建完成后,可在迁移项目列表中,查看添加的项目。

1679474726

3、验证迁移结果

3.1、全量迁移验证

登录目标端租户 test3 ,查看全量迁移的结果。可以看到 test1 租户的表 t1,和 test2 租户表 t2 已经迁移成功。 

[admin@126 ~]$obclient -hxxx.xxx.xxx.xxx -P2883 -uoms@test3#testoms -pXXX -A test_oms_3MySQL [test_oms_3]> show tables;
+----------------------+
| Tables_in_test_oms_3 |
+----------------------+
| t1                   |
| t2                   |
+----------------------+
2 rows in set (0.001 sec)MySQL [test_oms_3]> select * from t1;
+----+------+--------+
| id | name | remark |
+----+------+--------+
| 10 | aa   | test10 |
| 11 | bb   | test11 |
+----+------+--------+
2 rows in set (0.001 sec)MySQL [test_oms_3]> select * from t2;
+----+------+--------+
| id | name | remark |
+----+------+--------+
| 20 | aa   | test20 |
| 21 | bb   | test21 |
+----+------+--------+
2 rows in set (0.001 sec)

3.2、增量同步验证

  • 分别在源端租户 test1 的表 t1 和租户 test2 的表 t2 中插入一条数据,在目标端租户 test3 中,查看数据同步的结果。可以看到新插入的数据已被同步过来。
MySQL [test_oms_1]> insert into t1(id,name,remark) values(12,'cc','test12');
MySQL [test_oms_2]> insert into t2(id,name,remark) values(22,'cc','test22');MySQL [test_oms_3]> select * from t1;
+----+------+--------+
| id | name | remark |
+----+------+--------+
| 10 | aa   | test10 |
| 11 | bb   | test11 |
| 12 | cc   | test12 |
+----+------+--------+
3 rows in set (0.000 sec)MySQL [test_oms_3]> select * from t2;
+----+------+--------+
| id | name | remark |
+----+------+--------+
| 20 | aa   | test20 |
| 21 | bb   | test21 |
| 22 | cc   | test22 |
+----+------+--------+
3 rows in set (0.001 sec)MySQL [test_oms_3]>

  • 在源端租户 test1 的表 t1 中修改一条数据,在目标端租户 test3 中,查看数据同步的结果。可以看到修改的数据已被同步过来。

MySQL [test_oms_1]> update t1 set name = 'dd' where id = 12;MySQL [test_oms_3]> select * from t1;
+----+------+--------+
| id | name | remark |
+----+------+--------+
| 10 | aa   | test10 |
| 11 | bb   | test11 |
| 12 | dd   | test12 |
+----+------+--------+
3 rows in set (0.000 sec)

  • 在源端租户 test2 的表 t2 中删除一条数据,在目标端租户 test3 中,查看数据同步的结果,可以看到 id =20的数据被删除。

MySQL [test_oms_2]> delete from t2 where id = 20;MySQL [test_oms_3]> select * from t2;
+----+------+--------+
| id | name | remark |
+----+------+--------+
| 21 | bb   | test21 |
| 22 | cc   | test22 |
+----+------+--------+
2 rows in set (0.000 sec)

3.3、反向增量验证

以租户 test3 反向增量迁移至租户 test1 为例,进行反向增量同步前,请确认正向增量同步已完成,

全量校验完成后,单击【进入下一阶段】,进行正向切换。

注意:启动正向切换前,请确保源端数据源为即将停写或者已经停写状态。

1679474742

1679474753

反向增量任务启动成功后,在目标端租户 test3 的表 t3 中插入一条数据,在源端租户 test1 中,查看数据反向同步的结果。可以看到新插入的数据已被反向同步过来。

MySQL [test_oms_3]> select * from t1;
+----+------+--------+
| id | name | remark |
+----+------+--------+
| 10 | aa   | test10 |
| 11 | bb   | test11 |
| 12 | dd   | test12 |
+----+------+--------+
3 rows in set (0.003 sec)MySQL [test_oms_3]> insert into t1(id,name,remark) values(14,'ee','test14');MySQL [test_oms_1]> select * from t1;
+----+------+--------+
| id | name | remark |
+----+------+--------+
| 10 | aa   | test10 |
| 11 | bb   | test11 |
| 12 | dd   | test12 |
| 14 | ee   | test14 |
+----+------+--------+
4 rows in set (0.000 sec)

在目标端租户 test3 的表 t1 中修改一条数据,在源端租户 test1 中,查看数据同步的结果。可以看到id = 10数据已被删除。

MySQL [test_oms_3]> delete from t1 where id = 10;MySQL [test_oms_1]> select * from t1;
+----+------+--------+
| id | name | remark |
+----+------+--------+
| 11 | bb   | test11 |
| 12 | dd   | test12 |
| 14 | ee   | test14 |
+----+------+--------+
3 rows in set (0.000 sec)

测试二:

测试目的:测试能否正常将租户 test1 和租户 test2 中两张结构相同的表,迁移至租户 test3 的一张表中。

测试步骤:

  • 全量迁移:在 OMS 社区版中创建两个迁移项目,将源端租户 test1 和租户 test2 的全量数据迁移至目标端租户 test3 中。
  • 增量同步:在源端租户 test1 的表 t3 和租户 test2 的表 t3 中进行 insertdeleteupdate,查看目标端租户 test3 的表 t3 数据的变化。

测试结果:

同时将两个相同结构的表往另一张表汇总时,在进行全量迁移的过程中,若存在 id 相同的数据,后迁移的数据不会被同步过来,会导致后迁移的数据丢失。但是在增量同步的过程中,若插入的 id 相同,则后表插入的数据会覆盖前表插入的数据,导致前表插入的数据丢失。

租户数据库用户备注
test1test_oms_1omst3源端1
test2test_oms_2omst3源端2
test3test_oms_3omst3目标端

1、在客户端使用 oms 用户分别登录租户 test1 和 test2,创建表 t3。

obclient -hxxx.xxx.xxx.xxx -P2883 -uoms@test1#testoms -pXXX -A test_oms_1CREATE TABLE `t3` (
`id` int NOT NULL,
`name` varchar(45) DEFAULT NULL,
`remark` varchar(45) DEFAULT NULL,
PRIMARY KEY (`id`)
) CHARSET=utf8mb4;MySQL [test_oms_1]> insert into t3(id,name,remark) values(010,'aa','r1');
MySQL [test_oms_1]> insert into t3(id,name,remark) values(011,'bb','r2');MySQL [test_oms_1]> select * from t3;
+----+------+--------+
| id | name | remark |
+----+------+--------+
| 10 | aa   | r1     |
| 11 | bb   | r2     |
+----+------+--------+
2 rows in set (0.002 sec)
obclient -hxxx.xxx.xxx.xxx -P2883 -uoms@test2#testoms -pXXX -A test_oms_2CREATE TABLE `t3` (
`id` int NOT NULL,
`name` varchar(45) DEFAULT NULL,
`remark` varchar(45) DEFAULT NULL,
PRIMARY KEY (`id`)
) CHARSET=utf8mb4;MySQL [test_oms_1]> insert into t3(id,name,remark) values(010,'zz','r3');
MySQL [test_oms_1]> insert into t3(id,name,remark) values(012,'yy','r4');MySQL [test_oms_2]> select * from t3;
+----+------+--------+
| id | name | remark |
+----+------+--------+
| 10 | zz   | r3     |
| 12 | yy   | r4     |
+----+------+--------+
2 rows in set (0.002 sec)

2、创建租户 test1 至 租户test3 的数据迁移项目,具体操作请参见 数据迁移。

3、创建租户 test2 至 租户test3 的数据迁移项目。

3.1、选择源节点和目标节点,这里选择源端2和目标端,即源端租户 test2 和目标端租户 test3。

1679474776

3.2、选择要迁移的源端数据库表,单击“>”,添加至目标端对象中,默认生成与源端相同的表名,也可以进行重命名。

1679474788

3.3、配置迁移选项,这里注意在高级配置中,允许全量迁移目标表非空,因为前面已经创建了租户 test1 表1 至 test3 表 t3 的迁移项目,项目启动后,目标表非空。

1679474810

3.4、租户 test1 表1 至 test3 表 t3 的迁移项目,已经在租户 test3 中创建了表 t3,此时不需要再创建表,因此可直接跳过结构迁移,再单击右上角的“恢复”,继续进行下一步。

1679474818

创建完成后可在迁移项目列表中,查看到已创建的迁移项目。

1679474824

4、验证迁移结果

4.1、全量迁移验证

登录目标端租户 test3 ,查看全量迁移的结果。可以看到租户 test2 中 id = 10 因为和 租户 test1 中的 id 相同,导致数据未被迁移过来。在项目详情的全量校验中也可以看到数据不一致的提示。

1679474830

MySQL [test_oms_3]> select * from t3;
+----+------+--------+
| id | name | remark |
+----+------+--------+
| 10 | aa   | r1     |
| 11 | bb   | r2     |
| 12 | yy   | r4     |
+----+------+--------+
3 rows in set (0.001 sec)

3.2、增量同步验证

  • 分别在源端租户 test1 的表 t3 和租户 test2 的表 t3 中插入一条数据,在目标端租户 test3 中,查看数据同步的结果。可以看到新插入的数据已被同步过来。
MySQL [test_oms_1]> insert into t3(id,name,remark) values(013,'cc','r5');
MySQL [test_oms_2]> insert into t3(id,name,remark) values(014,'xx','r6');MySQL [test_oms_3]> select * from t3;
+----+------+--------+
| id | name | remark |
+----+------+--------+
| 10 | aa   | r1     |
| 11 | bb   | r2     |
| 12 | yy   | r4     |
| 13 | cc   | r5     |
| 14 | xx   | r6     |
+----+------+--------+
5 rows in set (0.001 sec)
  • 分别在源端租户 test1 的表 t1 和租户 test2 的表 t2 中插入一条 id 相同的数据,在目标端租户 test3 中,查看数据同步的结果。可以看到当 id 相同时后插入的数据会覆盖前插入的数据。
MySQL [test_oms_1]> insert into t3(id,name,remark) values(015,'dd','r7');
MySQL [test_oms_3]> select * from t3;
+----+------+--------+
| id | name | remark |
+----+------+--------+
| 10 | aa   | r1     |
| 11 | bb   | r2     |
| 12 | yy   | r4     |
| 13 | cc   | r5     |
| 14 | xx   | r6     |
| 15 | dd   | r7     |
+----+------+--------+
6 rows in set (0.001 sec)MySQL [test_oms_2]> insert into t3(id,name,remark) values(015,'ww','r8');
MySQL [test_oms_3]> select * from t3;
+----+------+--------+
| id | name | remark |
+----+------+--------+
| 10 | aa   | r1     |
| 11 | bb   | r2     |
| 12 | yy   | r4     |
| 13 | cc   | r5     |
| 14 | xx   | r6     |
| 15 | ww   | r8     |
+----+------+--------+
6 rows in set (0.000 sec)
  • 在源端租户 test1 的表 t3 中修改一条数据,在目标端租户 test3 中,查看数据同步的结果。可以看到修改的数据已被同步过来。
MySQL [test_oms_1]> update t3 set remark='test1' where id = 10;
MySQL [test_oms_3]> select * from t3;
+----+------+--------+
| id | name | remark |
+----+------+--------+
| 10 | aa   | test1  |
| 11 | bb   | r2     |
| 12 | yy   | r4     |
| 13 | cc   | r5     |
| 14 | xx   | r6     |
| 15 | ww   | r8     |
+----+------+--------+
6 rows in set (0.001 sec)
  • 在源端租户 test2 的表 t3 中删除一条数据,在目标端租户 test3 中,查看数据同步的结果,可以看到 id = 12 的数据已被删除。
MySQL [test_oms_2]> delete from t3 where id = 12;
MySQL [test_oms_3]> select * from t3;
+----+------+--------+
| id | name | remark |
+----+------+--------+
| 10 | aa   | test1  |
| 11 | bb   | r2     |
| 13 | cc   | r5     |
| 14 | xx   | r6     |
| 15 | ww   | r8     |
+----+------+--------+
5 rows in set (0.000 sec)

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/886434.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

IDEA一键部署SpringBoot项目到服务器

安装Alibaba Cloud Toolkit插件 配置部署环境 1:设置服务名称 2:选择文件上传的类型 3:选择打包之后的jar文件 4: 添加需要上传的服务器信息 5:需要上传到服务器的地址 输入绝对路径 6: 选择上传文件后执行的脚本 可以参考另一篇文章 Linux启…

渗透测试之信息收集 DNS主机发现探测方式NetBIOS 协议发现主机 以及相关PorCheck scanline工具的使用哟

目录 主机发现 利用NetBIOS 协议发现主机 利用TCP/UDP发现主机 PorCheck scanline 利用DNS协议发现主机 主机发现 信息收集中的一项重要工作是发现内网中的主机、数据库、IP段网络设备、安全设备等资产,以便于更快地获取更多权限和密码,更加接近红…

打造专业问答社区:Windows部署Apache Answer结合cpolar实现公网访问

文章目录 前言1. 本地安装Docker2. 本地部署Apache Answer2.1 设置语言选择简体中文2.2 配置数据库2.3 创建配置文件2.4 填写基本信息 3. 如何使用Apache Answer3.1 后台管理3.2 提问与回答3.3 查看主页回答情况 4. 公网远程访问本地 Apache Answer4.1 内网穿透工具安装4.2 创建…

基于java的医院门诊信息管理系统

一、作品包含 源码数据库设计文档万字PPT全套环境和工具资源部署教程 二、项目技术 前端技术:Html、Css、Js、Vue、Element-ui 数据库:MySQL 后端技术:Java、Spring Boot、MyBatis 三、运行环境 开发工具:IDEA/eclipse 数据…

67页PDF |埃森哲_XX集团信息发展规划IT治理优化方案(限免下载)

一、前言 这份报告是埃森哲_XX集团信息发展规划IT治理优化方案,报告中详细阐述了XX集团如何优化IT治理结构以适应新的要求。报告还分析了集团管控模式的变化,提出了六大业务中心的差异化管控策略,并探讨了这些变化对IT治理模式的影响。报告进…

【AI大模型】ELMo模型介绍:深度理解语言模型的嵌入艺术

学习目标 了解什么是ELMo.掌握ELMo的架构.掌握ELMo的预训练任务.了解ELMo的效果和成绩.了解ELMo的优缺点. 目录 🍔 ELMo简介 🍔 ELMo的架构 2.1 总体架构 2.2 Embedding模块 2.3 两部分的双层LSTM模块 2.4 词向量表征模块 🍔 ELMo的预…

【srm,招标询价】采购电子化全流程,供应商准入审核,在线询价流程管理(JAVA+Vue+mysql)

前言: 随着互联网和数字技术的不断发展,企业采购管理逐渐走向数字化和智能化。数字化采购平台作为企业采购管理的新模式,能够提高采购效率、降低采购成本、优化供应商合作效率,已成为企业实现效益提升的关键手段。系统获取在文末…

优选算法 - 4 ( 链表 哈希表 字符串 9000 字详解 )

一:链表 1.1 链表常用技巧和操作总结 1.2 两数相加 题目链接:两数相加 /*** Definition for singly-linked list.* public class ListNode {* int val;* ListNode next;* ListNode() {}* ListNode(int val) { this.val val; }* …

小鸡模拟器 1.8.11 | 街机怀旧重温经典游戏,支持手柄

小鸡模拟器是一款支持多种经典游戏机模拟的游戏应用,包括街机、索尼(SONY)、世嘉、任天堂等主流掌机游戏以及PSP、GBA、NDS、SFC(超级任天堂SNES)、FC(红白机NES)、MD(世嘉MEGA DRIVE)、PS1、PS2等。应用支持手柄完美操作,兼容安卓手柄,让玩家…

用go语言后端开发速查

文章目录 一、发送请求和接收请求示例1.1 发送请求1.2 接收请求 二、发送form-data格式的数据示例 用go语言发送请求和接收请求的快速参考 一、发送请求和接收请求示例 1.1 发送请求 package mainimport ("bytes""encoding/json""fmt""ne…

针对股票评论的情感分类器

🏡作者主页:点击! 🤖编程探索专栏:点击! ⏰️创作时间:2024年11月16日13点39分 神秘男子影, 秘而不宣藏。 泣意深不见, 男子自持重, 子夜独自沉。 论文链接 点击开启你的论文编程之旅…

Transformer学习笔记(一)

Transformer学习笔记 基于 3B1B 可视化视频 自注意力机制 1.每个词的初始嵌入是一个高维向量,只编码该单词含义,与上下文没有关联 2.对初始向量进行位置编码,在高维向量中编码进位置信息(单词在语言序列中的位置信息&#xff…

antd table表格设置最小宽度,列宽等比例显示

最近ui有个设计稿,表格要求如图: 由于本地antd table列宽column没有设置最小宽度minWidth属性,只有width属性,所以开发时我考虑按照列宽等比例计算后去设置width属性; 一、实现: 1.表头数组中设置minWidth…

算法沉淀一:双指针

目录 前言: 双指针介绍 对撞指针 快慢指针 题目练习 1.移动零 2.复写零 3.快乐数 4.盛水最多的容器 5.有效三角形的个数 6.和为s的两个数 7.三数之和 8.四数之和 前言: 此章节介绍一些算法,主要从leetcode上的题来讲解&#xff…

若点集A=B则A必能恒等变换地变为B=A这一几何常识推翻直线(平面)公理

黄小宁 关键词:“更无理”复数 复平面z各点z的对应点z1的全体是z1面。z面平移变为z1面就使x轴⊂z面沿本身平移变为ux1轴。R可几何化为R轴,R轴可沿本身平移变为R′轴,R′轴可沿本身平移变为R″轴,...。直线公理和平面公理使几百年…

HelloMeme 上手即用教程

HelloMeme是一个集成空间编织注意力的扩散模型,用于生成高保真图像和视频。它提供了一个代码库,包含实验代码和预训练模型,支持PyTorch和FFmpeg。用户可以通过简单的命令行操作来生成图像和视频。 本文将详细介绍,如何在GPU算力租…

Vue2+ElementUI:用计算属性实现搜索框功能

前言: 本文代码使用vue2element UI。 输入框搜索的功能,可以在前端通过计算属性过滤实现,也可以调用后端写好的接口。本文介绍的是通过计算属性对表格数据实时过滤,后附完整代码,代码中提供的是死数据,可…

blind-watermark - 水印绑定

文章目录 一、关于 blind-watermark安装 二、bash 中使用三、Python 调用1、基本使用2、attacks on Watermarked Image3、embed images4、embed array of bits 四、并发五、相关 Project 一、关于 blind-watermark Blind watermark 基于 DWT-DCT-SVD. github : https://githu…

【小白可懂】微信小程序---课表渲染

结果展示:(代码在最后) WeChat_20241116174431 项目简介 在数字化校园建设的大背景下,为了更好地服务于在校师生,我们开发了一款基于微信小程序的课表管理系统。该系统采用了现代化的前端技术和优雅的设计风格&#x…

Kafka一些常用的命令行操作【包含主题命令、生产者和消费者命令】

文章目录 1、主题命令2、生产者命令行操作3、消费者命令行操作 1、主题命令 查看当前服务器中的所有 topic: kafka-topics.sh --bootstrap-server node01:9092 --list 创建topic: kafka-topics.sh --bootstrap-server node01:9092 --create --topic to…