Enterprise:使用 MySQL connector 同步 MySQL 数据到 Elasticsearch

news2024/11/24 1:35:04

Elastic MySQL 连接器是 MySQL 数据源的连接器。它可以帮我们把 MySQL 里的数据同步到 Elasticsearch 中去。在今天的文章里,我来详细地描述如何一步一步地实现。

在下面的展示中,我将使用 Elastic Stack 8.8.2 来进行展示。

无缝集成:将 Elasticsearch 连接到 MongoDB

Enterprise:使用 MySQL connector 同步 MySQL 数据到 Elasticsearch

可用性和先决条件

此连接器在 Elastic 版本 8.5.0 及更高版本中作为本机连接器提供。 要将此连接器用作本机连接器,请满足所有本机连接器 (Native Connector)要求。

此连接器也可用作 Python 连接器框架的连接器客户端。 要将此连接器用作连接器客户端,请满足所有连接器客户端要求。

除了上面链接的共享要求之外,此连接器没有其他先决条件。

用法

要将此连接器用作本机连接器,请使用连接器工作流程。 请参阅本机连接器。

要将此连接器用作连接器客户端,请参阅连接器客户端和框架。

在如下的展示中,我将使用连接器客户端来进行使用。

安装

Elasticsearch

我们可参考我之前的文章 “如何在 Linux,MacOS 及 Windows 上进行安装 Elasticsearch” 来安装 Elasticsearch。特别地,我们需要按照 Elastic Stack 8.x 的安装指南来进行安装。

在 Elasticsearch 终端输出中,找到 elastic 用户的密码和 Kibana 的注册令牌。 这些是在 Elasticsearch 第一次启动时打印的。

我们记下这个密码,并在下面的配置中进行使用。同时它也会生成相应的证书文件:

$ pwd
/Users/liuxg/elastic/elasticsearch-8.8.2/config/certs
$ ls
http.p12      http_ca.crt   transport.p12

为了方便下面的配置,我们把 http_ca.crt 证书拷贝到如下的一个目录中:

mkdir -p ~/connectors-python-config
cp http_ca.crt ~/connectors-python-config

保存密码、注册令牌和证书路径名。 你将在后面的步骤中需要它们。如果你对这些操作还不是很熟的话,请参考我之前的文章 “Elastic Stack 8.0 安装 - 保护你的 Elastic Stack 现在比以往任何时候都简单”。

安装 Kibana

我们接下来安装 Kibana。我们可以参考我之前的文章 “如何在 Linux,MacOS 及 Windows 上安装 Elastic 栈中的 Kibana” 来进行我们的安装。特别地,我们需要安装 Kibana 8.2 版本。如果你还不清楚如何安装 Kibana 8.2,那么请阅读我之前的文章 “Elastic Stack 8.0 安装 - 保护你的 Elastic Stack 现在比以往任何时候都简单”。在启动 Kibana 之前,我们可以修改 Kibana 的配置文件如下。添加如下的句子到 config/kibana.yml 中去:

config/kibana.yml

enterpriseSearch.host: http://localhost:3002

然后,我们使用如下的命令来启动 Kibana:

bin/kibana

我们在浏览器中输入上面输出的地址然后输入相应的 enrollment token 就可以把 Kibana 启动起来。

Java安装

你需要安装 Java。版本在 Java 8 或者 Java 11。我们可以参考链接来查找需要的 Java 版本。

Enterprise search 安装

我们在地址 Download Elastic Enterprise Search | Elastic 找到我们需要的版本进行下载。并按照页面上相应的指令来进行按照。如果你想针对你以前的版本进行安装的话,请参阅地址 https://www.elastic.co/downloads/past-releases#app-search。

等我们下载完 Enterprise Search 的安装包,我们可以使用如下的命令来进行解压缩:

$ pwd
/Users/liuxg/elastic
$ ls
elasticsearch-8.8.2                       kibana-8.8.2
elasticsearch-8.8.2-darwin-aarch64.tar.gz kibana-8.8.2-darwin-aarch64.tar.gz
enterprise-search-8.8.2.tar.gz
$ tar xzf enterprise-search-8.8.2.tar.gz 
$ cd enterprise-search-8.8.2
$ ls
LICENSE    NOTICE.txt README.md  bin        config     lib        metricbeat

如上所示,它含有一个叫做 config 的目录。我们在启动  Enterprise Search 之前,必须做一些相应的配置。我们需要修改 config/enterprise-search.yml 文件。在这个文件中添加如下的内容:

config/enterprise-search.yml

allow_es_settings_modification: true
secret_management.encryption_keys: ['q3t6w9z$C&F)J@McQfTjWnZr4u7x!A%D']
elasticsearch.username: elastic
elasticsearch.password: "JUYrx8L3WOeG6zysQY2D"
elasticsearch.host: https://127.0.0.1:9200
elasticsearch.ssl.enabled: true
elasticsearch.ssl.certificate_authority: /Users/liuxg/elastic/elasticsearch-8.8.2/config/certs/http_ca.crt
kibana.external_url: http://localhost:5601

在上面,请注意 elasticsearch.password 是我们在 Elasticsearch 安装过程中生成的密码。elasticsearch.ssl.certificate_authority 必须根据自己的 Elasticsearch 安装路径中生成的证书进行配置。在上面的配资中,我们还没有配置 secret_management.encryption_keys。我们可以使用上面的配置先运行,然后让系统帮我们生成。在配置上面的密码时,我们需要添加上引号。我发现在密码中含有 * 字符会有错误的信息。我们使用如下的命令来启动:

bin/enterprise-search

在启动的过程中,我们可以看到生成的用户名及密码信息:

      username: enterprise_search
      password: r9kcpyb5x2g9dken

我们记下这个用户名及密码。在启动的过程中,我们还可以看到一个生成的 secret_session_key:

我们也把它拷贝下来,并添加到配置文件中去:

allow_es_settings_modification: true
secret_management.encryption_keys: ['q3t6w9z$C&F)J@McQfTjWnZr4u7x!A%D'] 
elasticsearch.username: elastic
elasticsearch.password: "JUYrx8L3WOeG6zysQY2D"
elasticsearch.host: https://127.0.0.1:9200
elasticsearch.ssl.enabled: true
elasticsearch.ssl.certificate_authority: /Users/liuxg/elastic/elasticsearch-8.8.2/config/certs/http_ca.crt
kibana.external_url: http://localhost:5601

secret_session_key: 3a6d8ab8993a9818728eabd6513fd1c448263be6f5497c8d286bc8be05b87edffd95073582e3277f1e8fb8f753a3ab07a5749ce4394a16f69bdc4acb3d2826ae
feature_flag.elasticsearch_search_api: true

为了能够使得我们能够在 App Search 中使用 Elasticsearch 搜索,我们必须设置
feature_flag.elasticsearch_search_api: true。 我们再次重新启动 enterprise search:

./bin/enterprise-search 

这次启动后,我们再也不会看到任何的配置输出了。这样我们的 enterprise search 就配置好了。

MySQL

对于本教程,你需要一个供 Logstash 读取的源 MySQL 实例。 MySQL Community Downloads 站点的 MySQL Community Server 部分提供了免费版本的 MySQL。我们可以通过如下的命令来登录 MySQL:

mysql -u root -p

在上面,我们使用 root 的密码来进行登录。针对我的情况,密码为 1234。等我们登录后,我们运行如下的命令:

CREATE DATABASE sample_db;
USE sample_db;

CREATE TABLE person (
    person_id INT AUTO_INCREMENT PRIMARY KEY,
    name VARCHAR(255),
    age INT
);

CREATE TABLE address (
    address_id INT AUTO_INCREMENT PRIMARY KEY,
    address VARCHAR(255)
);

INSERT INTO person (name, age) VALUES ('Alice', 30);
INSERT INTO person (name, age) VALUES ('Bob', 25);
INSERT INTO person (name, age) VALUES ('Carol', 35);

INSERT INTO address (address) VALUES ('123 Elm St');
INSERT INTO address (address) VALUES ('456 Oak St');
INSERT INTO address (address) VALUES ('789 Pine St');

在上面,我们创建了数据库 sample_db,也同时创建了两个表格 address 及 person。

 

同步数据到 Elasticsearch

步骤一:下载示例配置文件

下载示例配置文件。 你可以手动下载或运行以下命令:

curl https://raw.githubusercontent.com/elastic/connectors-python/main/config.yml --output ~/connectors-python-config/config.yml

我们可以查看文件:

$ pwd
/Users/liuxg/connectors-python-config
$ ls
config.yml  http_ca.crt

如果你的目录名称不同,或者你想使用不同的配置文件名,请记住更新 --output 参数值。

步骤二:更新自管理连接器的配置文件

使用以下设置更新配置文件以匹配你的环境:

  • elasticsearch.host
  • elasticsearch.password
  • connector_id
  • service_type

使用 mysql 作为 service_type 值。 不要忘记取消 yaml 文件源部分中 mysql 的注释。

如果你针对 Elasticsearch 和 Kibana 的 Docker 化版本运行连接器服务,你的配置文件将如下所示:

elasticsearch:
  host: http://host.docker.internal:9200
  username: elastic
  password: <YOUR_PASSWORD>

connector_id: <CONNECTOR_ID_FROM_KIBANA>
service_type: mysql

sources:
  # UNCOMMENT "mysql" below to enable the MySQL connector

  #mongodb: connectors.sources.mongo:MongoDataSource
  #s3: connectors.sources.s3:S3DataSource
  #dir: connectors.sources.directory:DirectoryDataSource
  #mysql: connectors.sources.mysql:MySqlDataSource
  #network_drive: connectors.sources.network_drive:NASDataSource
  #google_cloud_storage: connectors.sources.google_cloud_storage:GoogleCloudStorageDataSource
  #azure_blob_storage: connectors.sources.azure_blob_storage:AzureBlobStorageDataSource
  #postgresql: connectors.sources.postgresql:PostgreSQLDataSource
  #oracle: connectors.sources.oracle:OracleDataSource
  #mssql: connectors.sources.mssql:MSSQLDataSource

请注意,你下载的配置文件可能包含更多条目,因此你需要手动复制/更改适用于您的设置。 通常,你只需要更新 elasticsearch.host、elasticsearch.password、connector_id 和 service_type 即可运行连接器服务。

我们来从 Kibana 界面得到这些配置:

 

~/connectors-python-config/config.yml

elasticsearch:
  host: https://192.168.0.3:9200
  api_key: "OUkyM1E0a0JrWktfLVd2OTRPZkE6TmkxbUNuN3dROGlrT2cwWlNVaEZKQQ=="
  ca_certs: "/usr/share/certs/http_ca.crt"
  ssl: true
  bulk:
    queue_max_size: 1024
    queue_max_mem_size: 25
    display_every: 100
    chunk_size: 1000
    max_concurrency: 5
    chunk_max_mem_size: 5
    concurrent_downloads: 10
  request_timeout: 120
  max_wait_duration: 120
  initial_backoff_duration: 1
  backoff_multiplier: 2
  log_level: info

service:
  idling: 30
  heartbeat: 300
  max_errors: 20
  max_errors_span: 600
  max_concurrent_content_syncs: 1
  max_concurrent_access_control_syncs: 1
  job_cleanup_interval: 300
  log_level: INFO

connector_id: '8423Q4kBkZK_-Wv9z-en'
service_type: 'mysql'

sources:
  # mongodb: connectors.sources.mongo:MongoDataSource
  # s3: connectors.sources.s3:S3DataSource
  # dir: connectors.sources.directory:DirectoryDataSource
  mysql: connectors.sources.mysql:MySqlDataSource
  # network_drive: connectors.sources.network_drive:NASDataSource
  # google_cloud_storage: connectors.sources.google_cloud_storage:GoogleCloudStorageDataSource
  # google_drive: connectors.sources.google_drive:GoogleDriveDataSource
  # azure_blob_storage: connectors.sources.azure_blob_storage:AzureBlobStorageDataSource
  # postgresql: connectors.sources.postgresql:PostgreSQLDataSource
  # oracle: connectors.sources.oracle:OracleDataSource
  # sharepoint_server: connectors.sources.sharepoint_server:SharepointServerDataSource
  # mssql: connectors.sources.mssql:MSSQLDataSource
  # jira: connectors.sources.jira:JiraDataSource
  # confluence: connectors.sources.confluence:ConfluenceDataSource
  # dropbox: connectors.sources.dropbox:DropboxDataSource
  # servicenow: connectors.sources.servicenow:ServiceNowDataSource
  # sharepoint_online: connectors.sources.sharepoint_online:SharepointOnlineDataSource
  # github: connectors.sources.github:GitHubDataSource

在上面,请注意:

  • host 是 Elasticsearch 的访问地址

  • api_key 是用来访问 Elasticsearch 的 API key。如果你使用用户名和密码组合,这个就不需要了

  • ca_certs 是用来访问 Elasticsearch 的证书。这个是针对 self-managed 的 Elasticsearch 集群而言的

  • sevice_type 必须是 mysql

  • connector_id 是在上面的配置中生成的。用来标识该连接器

步骤三:运行 Docker 镜像

docker run \
-v ~/connectors-python-config:/config \
--volume="$PWD/http_ca.crt:/usr/share/certs/http_ca.crt:ro" \
--network "elastic" \
--tty \
--rm \
docker.elastic.co/enterprise-search/elastic-connectors:8.8.2.0-SNAPSHOT \
/app/bin/elastic-ingest \
-c /config/config.yml

当运行完上面的命令后,我们再次回到 Kibana 的界面:

接下来我们来配置 MySQL。由于我们的连接器客户端是在 docker 容器里运行的,二我们的 MySQL 只能在 localhost:3306 进行访问。容器里的代码是没有办法访问到外面的 localhost 地址的。为此,我参照之前的文章 “Kibana:创建一个 webhook alert - Elastic Stack 8.2”。运行如下的命令:

bore local 3306 --to bore.pub

这样 MySQL 就可以被一个公网地址 bore.pub:3332 所访问。我们接下来使用这个地址来进行配置:

我们定于每天的 UTC 零点时间来进行同步。当然,我们也可以选择不定时同步。点击 Save:

我们点击上面的 Sync:

为了验证它是否能够正确地同步新的文档,我们在 MySQL 中添加一个新的文档:

我们在 Kibana 中再次手动 Sync:

 

由于一些原因,在测试中,我发现在最新的 connector 发布中,它含有 Sync rules,而在我运行的版本中是没有的。它需要在最新的发布版中才有,但是 snapshot 的运行中有一个错误。

我们可以通过  Sync rule 来同步我们需要的数据,比如:

[
  {
    "tables": [
      "person"
    ],
    "query": "SELECT * FROM sample_db.person LIMIT 1;"
  },
  {
    "tables": [
      "address"
    ],
    "query": "SELECT * FROM sample_db.address LIMIT 1;"
  }
]

 

这样,当同步的时候,它只会同步 address 及 person 里的一条数据。 

 

同样,我们可以定义如下的 WHERE query:

[
  {
    "tables": ["person"],
    "query": "SELECT * FROM sample_db.person WHERE sample_db.person.age > 25;"
  }
]

 它只会同步年龄大于 25 岁的 person 里的文档。

在 Kibana 中查看同步的过来的文档

我们可以通过如下的方法来查找索引:

GET _cat/indices

我们可以通过如下的命令来查看它的文档:

GET search-mysql/_search

使用 Docker 来安装 MySQL

在上面,我们使用本机来安装 MySQL。在实际的测试中,我们可以使用 Docker 更为方便地安装 MySQL:

docker run --name mysql_container -p 3306:3306 -e MYSQL_ROOT_PASSWORD=changeme -e MYSQL_USER=elastic -e MYSQL_PASSWORD=changeme -d mysql:latest

授予用户权限:

docker exec -it mysql_container mysql -u root -p
GRANT ALL PRIVILEGES ON sample_db.* TO 'elastic'@'%';
FLUSH PRIVILEGES;

创建数据库及表格:

CREATE DATABASE sample_db;
USE sample_db;

CREATE TABLE person (
    person_id INT AUTO_INCREMENT PRIMARY KEY,
    name VARCHAR(255),
    age INT
);

CREATE TABLE address (
    address_id INT AUTO_INCREMENT PRIMARY KEY,
    address VARCHAR(255)
);

INSERT INTO person (name, age) VALUES ('Alice', 30);
INSERT INTO person (name, age) VALUES ('Bob', 25);
INSERT INTO person (name, age) VALUES ('Carol', 35);

INSERT INTO address (address) VALUES ('123 Elm St');
INSERT INTO address (address) VALUES ('456 Oak St');
INSERT INTO address (address) VALUES ('789 Pine St');

在配置的时候,我们可以参考如下的内容来进行配置:

由于 Connector 和 MySQL 都同时运行于 Docker 中,我们可以使用地址  http://host.docker.internal 来填写 MySQL 的访问地址。

总结 

在本文中,我们非常详细地描述如何使用 MySQL connector 来同步 MySQL 和 Elasticsearch 的索引。它使用起来非常方便。如果大家对 Logstash 很熟悉的话,请参阅我之前的文章 “Elastic:开发者上手指南” 中的 “数据库数据同步 章节。我们还可以使用 Pipeline 对数据进行清洗。这个就不做展示了。

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

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

相关文章

两只小企鹅(Python实现)

目录 1 和她浪漫的昨天 2 未来的旖旎风景 3 Python完整代码 1 和她浪漫的昨天 是的,春天需要你。经常会有一颗星等着你抬头去看&#xff1b; 和她一起吹晚风吗﹖在春天的柏油路夏日的桥头秋季的公园寒冬的阳台&#xff1b; 这世界不停开花&#xff0c;我想放进你心里一朵&#…

docker 里面各种 command not found 总结

一、ip&#xff1a;command not found 执行命令&#xff1a; apt-get update & apt-get install -y iproute2 二、yum&#xff1a;command not found 执行命令&#xff1a; apt-get update & apt-get install -y yum 三、ping&#xff1a;command not found 执行命…

113、基于51单片机的智能电子密码锁控制系统设计(程序+原理图+PCB源文件+Proteus仿真+参考论文+开题报告+设计资料+焊接指导书+元器件清单等)

摘 要 在日常的生活和工作中, 住宅与部门的安全防范、单位的文件档案、财务报表以及一些个人资料的保存多以加锁的办法来解决。具有防盗报警等功能的电子密码锁代替密码量少、安全性差的机械式密码锁已是必然趋势。随着科学技术的不断发展&#xff0c;人们对日常生活中的安全保…

多元融合:流媒体传输网络的全盘解法

我们在寻找「网络」的全盘解法。 音视频数字化在消费领域的红利俨然见顶&#xff0c;而产业级视频应用激活了更多场景下的业务模式。与此同时&#xff0c;音视频客户也从单一的业务需求&#xff0c;趋向于多种业务并行存在的需求。 固有的网络能满足新兴的业态吗&#xff1f;延…

帧同步实现PuppetMaster布娃娃系统的问题

1&#xff09;帧同步实现PuppetMaster布娃娃系统的问题 ​2&#xff09;如何屏蔽Unity打包在IQOO安卓手机上出现一侧是黑边的现象 3&#xff09;SLG或者策略游戏的联盟边界线是如何实现的 这是第343篇UWA技术知识分享的推送&#xff0c;精选了UWA社区的热门话题&#xff0c;涵盖…

Acwing算法基础 前缀和与差分

前缀和与差分 AcWing 795. 前缀和 import java.util.*; public class Main{public static void main(String[] args ){Scanner scnew Scanner(System.in);int nsc.nextInt();int msc.nextInt();int[] arrnew int[n1];arr[0]0;for(int i1;i<n;i) {arr[i]sc.nextInt()arr[i-1…

基于Java+Swing实现表白墙的效果

JavaSwingmysql员工工资管理系统 一、系统介绍二、功能展示1.效果展示 三、系统实现1.salary.java 四、其它系统五、获取源码 一、系统介绍 使用javaswing桌面编程技术实现的一个表白墙的效果 二、功能展示 1.效果展示 基于javaswing表白墙的效果 三、系统实现 1.salary.ja…

Python实现AdaBoost回归模型(AdaBoostRegressor算法)并应用网格搜索算法调优项目实战

说明&#xff1a;这是一个机器学习实战项目&#xff08;附带数据代码文档代码讲解&#xff09;&#xff0c;如需数据代码文档代码讲解可以直接到文章最后获取。 1.项目背景 AdaBoost算法&#xff08;Adaptive Boosting&#xff09;是一种有效而实用的Boosting算法&#xff0c;…

C++ | 反向迭代器

目录 前言 一、基本框架 二、起始位置和结束位置 三、反向迭代器的自增与自减 四、反向迭代器的判断 五、list类的修改 六、单独设计反向迭代器类的意义 前言 反向迭代器实际上与我们前面的stack、queue、priority一样&#xff0c;都是适配器&#xff1b;我们可以通过正向…

国网技术学院MySQL课堂练习

一、数据库的安装和配置 在虚拟机中安装WINDOWS7操作系统 正常安装&#xff0c;查询安装教程即可安装必备组件和MYSQL5.7数据库 正常安装&#xff0c;查询安装教程即可修改my.ini配置文件中关于character_set的相关设置 直接补下面的代码即可&#xff0c;作用为设置默认的内…

Hudi基础知识讲解

Hudi概述 Hudi是一种数据湖的存储格式&#xff0c;在Hadoop文件系统之上提供了更新数据和删除数据的能力以及消费变化数据的能力。支持多种计算引擎&#xff0c;提供IUD接口&#xff0c;在 HDFS的数据集上提供了插入更新和增量拉取的流原语。 基础架构图 Hudi特性 ACID事务能…

将一个数组对象里的属性值全部追加到另外一个数组的对象里

介绍 将一个数组对象里的属性值全部追加到另外一个数组的对象里&#xff0c;这里需要使用到 map 遍历&#xff0c;循环数组&#xff0c;依次处理元素&#xff0c;实现重组数组对象 tips&#xff1a; map() 不会对空数组进行检测。 map() 不会改变原始数组。 Object.assign(),…

RocketMQ5.0消息存储<二>_消息存储流程

RocketMQ5.0消息存储<二>_消息存储流程 一、消息存储概览 如下图所示,是消息从生产者发送消息到消费者消费消息的大致流程。 step1:生产者发送消息到消息存储Broker端; step2:单一文件Commitlog存储所有主题消息,确保顺序写入,提高吞吐量; step3:消息通过堆外缓存,…

YOLOv5解析 | 第五篇:yolo.py文件解读

一、前言 文件位置:**./models/yolo.py** 这个文件是YOLOv5网络模型的搭建文件,如果你想改进YOLOv5,那么这么文件是你必须进行修改的文件之一。文件内容看起来多,其实真正有用的代码不多的,重点理解好我文中提到的一个函数两个类即可。 注:由于YOLOv5版本众多,同一个文件…

Nacos详解

Nacos详解 注册中心常见的注册中心ZookeeperEurekaConsulNacos Nacos 注册中心Docker安装&#xff1a;使用&#xff1a;1、引入 Maven&#xff1a;2、添加注解3、配置Nacos其他使用&#xff1a; Nacos 配置中心统一配置管理添加配置文件从微服务拉取配置依赖 Maven&#xff1a;…

工业大数据的来源是什么?有什么用?和工业互联网有关系么?

工业大数据的来源因特定行业和企业而不尽相同。常见的数据来源包括&#xff1a; 1.传感器数据&#xff1a;工业系统和设备通常配备传感器&#xff0c;用于收集温度、压力、湿度、振动等各种参数的数据。 2.机器生成的数据&#xff1a;包括机器和工业设备在运行过程中产生的数…

Java之SpringCloud Alibaba【三】【微服务Nacos-config配置中心】

Java之SpringCloud Alibaba【三】【微服务Nacos-config配置中心】 一、Nacos-config配置中心1、官方文档 二、快速配置1、Nacos-config基本操作2、Nacos配置中心使用3、Nacos客户端 每10ms去 注册中心 进行判断 根据MD54、基于dataid 为yaml的文件扩展名方式5、支持自定义Group…

阿里云OSS使用(小白也看得懂)

oss简介 oss是对象存储服务&#xff08;Object Storage Service&#xff09;的缩写&#xff0c;是一种分布式存储服务&#xff0c;用于存储和访问大规模数据。它提供了可靠、安全、低成本的数据存储解决方案&#xff0c;可以通过网络随时随地访问存储的数据。oss常用于存储图片…

Vue中实现图片黏贴上传到服务器:功能分析和实现

主要的知识点是&#xff0c;浏览的paste事件&#xff0c;clipboardData。 paste 一个标准的Dom事件&#xff0c;粘贴事件&#xff0c;会在用户按下Ctrlv ,或者通过鼠标复制时触发.像其他事件一样&#xff0c;我们可以通过addEventListener为一个Element添加一个粘贴事件的监听…

华为、阿里巴巴、字节跳动 100+ Python 面试问题总结(三)

系列文章目录 个人简介&#xff1a;机电专业在读研究生&#xff0c;CSDN内容合伙人&#xff0c;博主个人首页 Python面试专栏&#xff1a;《Python面试》此专栏面向准备面试的2024届毕业生。欢迎阅读&#xff0c;一起进步&#xff01;&#x1f31f;&#x1f31f;&#x1f31f; …