TiDB实战篇-Data Migration (DM) 同步数据

news2024/12/23 16:36:53

目录

简介

原理

任务管理

​编辑同步拓扑示例

使用场景

限制

硬件配置

安装&升级

部署

生成配置文件 

生成配置文件模板

更具自身的机器修改 

部署

启动集群&查看集群

实战

上游数据库前提

配置mysql的相关配置

编写DM的MySQL相关配置

把MySQL和DM master 产生关系

加入第二个MySQL(更具自己的情况选做)

查看数据源的连接信息

下游数据库前提

查看下上游要同步的数据库

编写同步配置问题

启动下游任务

查询任务

查看下DM状态

结果

MySQL1

MySQL2

TiDB

性能优化

结论

相关任务操作


简介

使用Data Migration (DM) 同步数据。

原理

  • DM worker负责读取上游的binlog(它是和上游兼容MySQL协议的数据库一对一的关系)。
  • DM master 监控和管理 DM worker。

任务管理

同步拓扑示例

 

使用场景

全量加增量的同步。

限制

 

  • 如果TiDB5.4之前,不支持其他的数据库的GBK同步数据过来。
  • 使用DM的时候会同步表的DDL语句,如果有些MySQL比较特殊的用法,TiDB不太支持。 

硬件配置

 

安装&升级

#安装
tiup install dm dmctl

#升级
tiup update --self && tiup update dm 

部署

生成配置文件 

生成配置文件模板

#生成配置文件
tiup dm template > topology.yaml

更具自身的机器修改 

# The topology template is used deploy a minimal DM cluster, which suitable
# for scenarios with only three machinescontains. The minimal cluster contains
# - 3 master nodes
# - 3 worker nodes
# You can change the hosts according your environment
---
global:
  user: "root"
  ssh_port: 22
  deploy_dir: "/home/tidb/dm/deploy"
  data_dir: "/home/tidb/dm/data"
  # arch: "amd64"

master_servers:
  - host: 192.168.66.10
  - host: 192.168.66.20
  - host: 192.168.66.21

worker_servers:
  - host: 192.168.66.10
  - host: 192.168.66.20
  - host: 192.168.66.21

monitoring_servers:
  - host: 192.168.66.10

grafana_servers:
  - host: 192.168.66.20

alertmanager_servers:
  - host: 192.168.66.21

部署

#查找支持的版本,找一个最新稳定的就行
tiup list dm-master

tiup dm deploy dm-deploy v7.0.0 ./topology.yaml --user root -p

启动集群&查看集群

#查看启动的集群
tiup dm list
#启动集群
tiup dm start dm-deploy
#查看集群状态
tiup dm display dm-deploy

实战

上游数据库前提

配置mysql的相关配置

#设置mysql的相关参数
mysql -h127.0.0.1 -P3306 -uroot -proot
在mysql端先查看下是否开启了binlog 
show variables like 'log_bin';
show variables like '%56%'; 
set global show_compatibility_56 ='ON';

编写DM的MySQL相关配置

注意下面的host不能够写127.0.0.1不然加入不成功。

#密码加密,配置文件里面的password就是这个root加密以后的字符串
tiup dmctl --encrypt 'root'
#创建数据源配置
vi mysql-source-config.yaml


source-id: "mysql-replice-01"
from:
  host: "192.168.66.10"
  port: 3306
  user: "root"
  password: "7EYsHL8G+fQUQnKp6fd+1UDUe/DO"

把MySQL和DM master 产生关系

#把MySQL和DM master 产生关系
tiup dmctl --master-addr=192.168.66.10:8261 operate-source create mysql-source-config.yaml

打印

[root@master output]# tiup dmctl --master-addr=192.168.66.10:8261 operate-source create mysql-source-config.yaml
tiup is checking updates for component dmctl ...
Starting component `dmctl`: /root/.tiup/components/dmctl/v7.0.0/dmctl/dmctl --master-addr=192.168.66.10:8261 operate-source create mysql-source-config.yaml
{
    "result": true,
    "msg": "",
    "sources": [
        {
            "result": true,
            "msg": "",
            "source": "mysql-replice-01",
            "worker": "dm-192.168.66.10-8262"
        }
    ]
}

加入第二个MySQL(更具自己的情况选做)

注意加入多个MySQL的时候source-id不能够相同

vi mysql-source-config1.yaml
 
 
source-id: "mysql-replice-02"
from:
  host: "192.168.66.10"
  port: 3307
  user: "root"
  password: "7EYsHL8G+fQUQnKp6fd+1UDUe/DO"
  
tiup dmctl --master-addr=192.168.66.10:8261 operate-source create mysql-source-config1.yaml

查看数据源的连接信息

#查看所有数据源的连接信息
tiup dmctl --master-addr=192.168.66.10:8261 operate-source show
#查看某一个数据源的连接信息
tiup dmctl --master-addr=192.168.66.10:8261 get-config source mysql-replice-02

打印信息

[root@master output]# tiup dmctl --master-addr=192.168.66.10:8261 operate-source show
tiup is checking updates for component dmctl ...
Starting component `dmctl`: /root/.tiup/components/dmctl/v7.0.0/dmctl/dmctl --master-addr=192.168.66.10:8261 operate-source show
{
    "result": true,
    "msg": "",
    "sources": [
        {
            "result": true,
            "msg": "",
            "source": "mysql-replice-01",
            "worker": "dm-192.168.66.10-8262"
        },
        {
            "result": true,
            "msg": "",
            "source": "mysql-replice-02",
            "worker": "dm-192.168.66.21-8262"
        }
    ]
}
[root@master output]# tiup dmctl --master-addr=192.168.66.10:8261 get-config source mysql-replice-02
tiup is checking updates for component dmctl ...
Starting component `dmctl`: /root/.tiup/components/dmctl/v7.0.0/dmctl/dmctl --master-addr=192.168.66.10:8261 get-config source mysql-replice-02
{
    "result": true,
    "msg": "",
    "cfg": "enable: true\nenable-gtid: false\nauto-fix-gtid: false\nrelay-dir: relay-dir\nmeta-dir: \"\"\nflavor: mysql\ncharset: \"\"\nenable-relay: false\nrelay-binlog-name: \"\"\nrelay-binlog-gtid: \"\"\nsource-id: mysql-replice-02\nfrom:\n  host: 192.168.66.10\n  port: 3307\n  user: root\n  password: '******'\n  max-allowed-packet: null\n  session: {}\n  security: null\npurge:\n  interval: 3600\n  expires: 0\n  remain-space: 15\nchecker:\n  check-enable: true\n  backoff-rollback: 5m0s\n  backoff-max: 5m0s\n  check-interval: 5s\n  backoff-min: 1s\n  backoff-jitter: true\n  backoff-factor: 2\nserver-id: 429524188\ntracer: {}\ncase-sensitive: false\nfilters: []\n"
}

下游数据库前提

查看下上游要同步的数据库

#查看有哪些数据库
mysql -h127.0.0.1 -P3306 -uroot -proot
mysql -h127.0.0.1 -P3307 -uroot -proot
show databases;
#创建TiDB的目标数据库
mysql -h127.0.0.1 -P4000 -uroot -ptidb
create database hue_mysql1;
create database gmall_config_mysql2;

编写同步配置问题

vi dm-task.yaml
# 任务名,多个同时运行的任务不能重名。
name: "test"
# 全量+增量 (all) 迁移模式。
task-mode: "all"
# 如果是分表分库里面就忽略自增主键了
ignore-checking-items: ["auto_increment_ID"]
target-database:
  host: "192.168.66.10"
  port: 4000
  user: "root"
  password: "2hcK5FlVHzKfM8GF6njtPECyxeRz"  #tiup dmctl --encrypt 'tidb' 加密得来
mysql-instances:
-
  source-id: "mysql-replice-01"
  block-allow-list: "log-ignored"  #对应下面的block-allow-list
  mydumper-config-name: "global"   #全量导入的配置
  route-rules: ["sharding-route-rules-table"] #对应下面的routes
  filter-rules: ["trace-filter-rule"] #对应下面的filters
-
  source-id: "mysql-replice-02"
  block-allow-list: "log-ignored"         
  mydumper-config-name: "global"
  route-rules: ["sharding-route-rules-schema"]

routes:
  sharding-route-rules-table:
    schema-pattern: gmall
    target-schema: hue_mysql1
  sharding-route-rules-schema:
    schema-pattern: gmall_config
    target-schema: gmall_config_mysql2
block-allow-list:                     
  log-ignored:
    ignore-dbs: ["test1"]     #在复制的时候忽略MySQL的test1数据库                     
mydumpers:
  global:
    threads: 4
    chunk-filesize: 64
filters: 
  trace-filter-rule:
    schema-pattern: "hue" #源库hue的desktop_settings的表下面的操作忽略
    table-pattern: "desktop_settings"
    events: ["truncate table","drop table","delete"]
    action: Ignore

启动下游任务

tiup dmctl --master-addr="192.168.66.10:8261" start-task dm-task.yaml

打印

[root@master output]# tiup dmctl --master-addr="192.168.66.10:8261" start-task dm-task.yarml
tiup is checking updates for component dmctl ...
Starting component `dmctl`: /root/.tiup/components/dmctl/v7.0.0/dmctl/dmctl --master-addr=192.168.66.10:8261 start-task dm-task.yarml
{
    "result": true,
    "msg": "",
    "sources": [
        {
            "result": true,
            "msg": "",
            "source": "mysql-replice-01",
            "worker": "dm-192.168.66.10-8262"
        },
        {
            "result": true,
            "msg": "",
            "source": "mysql-replice-02",
            "worker": "dm-192.168.66.21-8262"
        }
    ],
    "checkResult": "fail to check synchronization configuration with type: no errors but some warnings
    	detail: {
		"results": [
			{
				"id": 22,
				"name": "table structure compatibility check",
				"desc": "check compatibility of table structure",
				"state": "warn",
				"errors": [
					{
						"severity": "warn",
						"short_error": "table `metastore`.`SORT_COLS` Foreign Key SORT_COLS_FK1 is parsed but ignored by TiDB."
					},
					{
						"severity": "warn",
						"short_error": "table `hue`.`oozie_email` Foreign Key oozie_email_node_ptr_id_b6164766_fk_oozie_node_id is parsed but ignored by TiDB."
					},
					{
						"severity": "warn",
						"short_error": "table `gmall`.`base_province` primary/unique key does not exist"
					},
					{
						"severity": "warn",
						"short_error": "table `metastore`.`PARTITION_KEYS` Foreign Key PARTITION_KEYS_FK1 is parsed but ignored by TiDB."
					},
					{
						"severity": "warn",
						"short_error": "table `metastore`.`SKEWED_COL_NAMES` Foreign Key SKEWED_COL_NAMES_FK1 is parsed but ignored by TiDB."
					},
					{
						"severity": "warn",
						"short_error": "table `hue`.`oozie_kill` Foreign Key oozie_kill_node_ptr_id_6e3b4c7f_fk_oozie_node_id is parsed but ignored by TiDB."
					},
					{
						"severity": "warn",
						"short_error": "table `metastore`.`TBL_PRIVS` Foreign Key TBL_PRIVS_FK1 is parsed but ignored by TiDB."
					},
					{
						"severity": "warn",
						"short_error": "table `hue`.`oozie_bundledcoordinator` Foreign Key oozie_bundledcoordin_bundle_id_c0a51e15_fk_oozie_bun is parsed but ignored by TiDB."
					},
					{
						"severity": "warn",
						"short_error": "table `hue`.`oozie_bundledcoordinator` Foreign Key oozie_bundledcoordin_coordinator_id_deb5052a_fk_oozie_coo is parsed but ignored by TiDB."
					},
					{
						"severity": "warn",
						"short_error": "table `metastore`.`SKEWED_STRING_LIST_VALUES` Foreign Key SKEWED_STRING_LIST_VALUES_FK1 is parsed but ignored by TiDB."
					}
				],
				"instruction": "TiDB does not support foreign key constraints. See the document: https://docs.pingcap.com/tidb/stable/mysql-compatibility#unsupported-features; You need to set primary/unique keys for the table. Otherwise replication efficiency might become very low and exactly-once replication cannot be guaranteed."
			}
		],
		"summary": {
			"passed": true,
			"total": 23,
			"successful": 22,
			"failed": 0,
			"warning": 1
		}
	}"
}

查询任务

tiup dmctl --master-addr="192.168.66.10:8261" query-status test

打印

[root@master output]# tiup dmctl --master-addr="192.168.66.10:8261" query-status test
tiup is checking updates for component dmctl ...
Starting component `dmctl`: /root/.tiup/components/dmctl/v7.0.0/dmctl/dmctl --master-addr=192.168.66.10:8261 query-status test
{
    "result": true,
    "msg": "",
    "sources": [
        {
            "result": true,
            "msg": "",
            "sourceStatus": {
                "source": "mysql-replice-01",
                "worker": "dm-192.168.66.10-8262",
                "result": null,
                "relayStatus": null
            },
            "subTaskStatus": [
                {
                    "name": "test",
                    "stage": "Running",
                    "unit": "Load",
                    "result": null,
                    "unresolvedDDLLockID": "",
                    "load": {
                        "finishedBytes": "0",
                        "totalBytes": "0",
                        "progress": "0.00 %",
                        "metaBinlog": "(mysql-bin.000046, 154)",
                        "metaBinlogGTID": "",
                        "bps": "0"
                    },
                    "validation": null
                }
            ]
        },
        {
            "result": true,
            "msg": "",
            "sourceStatus": {
                "source": "mysql-replice-02",
                "worker": "dm-192.168.66.21-8262",
                "result": null,
                "relayStatus": null
            },
            "subTaskStatus": [
                {
                    "name": "test",
                    "stage": "Running",
                    "unit": "Sync",
                    "result": null,
                    "unresolvedDDLLockID": "",
                    "sync": {
                        "totalEvents": "0",
                        "totalTps": "0",
                        "recentTps": "0",
                        "masterBinlog": "(mysql-bin.000045, 154)",
                        "masterBinlogGtid": "",
                        "syncerBinlog": "(mysql-bin.000045, 154)",
                        "syncerBinlogGtid": "",
                        "blockingDDLs": [
                        ],
                        "unresolvedGroups": [
                        ],
                        "synced": true,
                        "binlogType": "remote",
                        "secondsBehindMaster": "0",
                        "blockDDLOwner": "",
                        "conflictMsg": "",
                        "totalRows": "0",
                        "totalRps": "0",
                        "recentRps": "0"
                    },
                    "validation": null
                }
            ]
        }
    ]
}

查看下DM状态

#查看下DM状态 发现对饮的 dm-worker 变成了Bound状态
tiup dm list
tiup dm display dm-deploy

打印

[root@master output]# tiup dm display dm-deploy
tiup is checking updates for component dm ...
Starting component `dm`: /root/.tiup/components/dm/v1.12.1/tiup-dm display dm-deploy
Cluster type:       dm
Cluster name:       dm-deploy
Cluster version:    v7.0.0
Deploy user:        tidb
SSH type:           builtin
Grafana URL:        http://192.168.66.20:3000
ID                  Role          Host           Ports      OS/Arch       Status     Data Dir                              Deploy Dir
--                  ----          ----           -----      -------       ------     --------                              ----------
192.168.66.21:9093  alertmanager  192.168.66.21  9093/9094  linux/x86_64  Up         /home/tidb/dm/data/alertmanager-9093  /home/tidb/dm/deploy/alertmanager-9093
192.168.66.10:8261  dm-master     192.168.66.10  8261/8291  linux/x86_64  Healthy    /home/tidb/dm/data/dm-master-8261     /home/tidb/dm/deploy/dm-master-8261
192.168.66.20:8261  dm-master     192.168.66.20  8261/8291  linux/x86_64  Healthy    /home/tidb/dm/data/dm-master-8261     /home/tidb/dm/deploy/dm-master-8261
192.168.66.21:8261  dm-master     192.168.66.21  8261/8291  linux/x86_64  Healthy|L  /home/tidb/dm/data/dm-master-8261     /home/tidb/dm/deploy/dm-master-8261
192.168.66.10:8262  dm-worker     192.168.66.10  8262       linux/x86_64  Bound      /home/tidb/dm/data/dm-worker-8262     /home/tidb/dm/deploy/dm-worker-8262
192.168.66.20:8262  dm-worker     192.168.66.20  8262       linux/x86_64  Free       /home/tidb/dm/data/dm-worker-8262     /home/tidb/dm/deploy/dm-worker-8262
192.168.66.21:8262  dm-worker     192.168.66.21  8262       linux/x86_64  Bound      /home/tidb/dm/data/dm-worker-8262     /home/tidb/dm/deploy/dm-worker-8262
192.168.66.20:3000  grafana       192.168.66.20  3000       linux/x86_64  Up         -                                     /home/tidb/dm/deploy/grafana-3000
192.168.66.10:9090  prometheus    192.168.66.10  9090       linux/x86_64  Up         /home/tidb/dm/data/prometheus-9090    /home/tidb/dm/deploy/prometheus-9090
Total nodes: 9

结果

MySQL1

mysql> show databases;
+--------------------+
| Database           |
+--------------------+
| information_schema |
| dolphinscheduler   |
| gmall              |
| gmall_config       |
| hivemetastore      |
| hue                |
| metastore          |
| mysql              |
| performance_schema |
| shishimaxwell      |
| sys                |
| test1              |
| uploadfile         |
+--------------------+
13 rows in set (0.00 sec)

MySQL2

mysql> show databases;
+--------------------+
| Database           |
+--------------------+
| information_schema |
| gmall_config       |
| mysql              |
| performance_schema |
| sys                |
+--------------------+
5 rows in set (0.00 sec)

TiDB

mysql> show databases;
+---------------------+
| Database            |
+---------------------+
| INFORMATION_SCHEMA  |
| METRICS_SCHEMA      |
| PERFORMANCE_SCHEMA  |
| dm_meta             |
| dolphinscheduler    |
| gmall_config        |
| gmall_config_mysql2 |
| hivemetastore       |
| hue                 |
| hue_mysql1          |
| metastore           |
| mysql               |
| shishimaxwell       |
| test                |
| test1               |
| uploadfile          |
+---------------------+
16 rows in set (0.00 sec)

性能优化

 

 

结论

Table BlockAllow: 作用是过滤掉不同步的库。

Binlog Event Fliter: 作用是表级别的操作过滤 ,比如不监听Delete那么源删除数据,目标不会删除数据。

Table Routing: 库和表的路由配置,也就是分表分库的合表合库操作。

上面没有把MySQL的库全部配置在  Routing 里面,但是其他的库也同步过去了,配置  Routing 的库,也成功同步过去了。也就是说默认是全库同步,可以配置Table BlockAllow忽略那些库不同步。

相关任务操作

#启动
tiup dmctl --master-addr="192.168.66.10:8261" start-task dm-task.yaml
#暂停(Binlog暂时不读)
tiup dmctl --master-addr="192.168.66.10:8261" pause-task dm-task.yaml
#恢复(开始从Binlog暂停的地方读取)
tiup dmctl --master-addr="192.168.66.10:8261" resume-task dm-task.yaml
#查询
tiup dmctl --master-addr="192.168.66.10:8261" query-status dm-task.yaml
#停止任务(这个停止以后不会记录Binlog)
tiup dmctl --master-addr="192.168.66.10:8261" stop-task dm-task.yaml

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

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

相关文章

【JavaEE】Bean的作用域和生命周期

目录 Bean的作用域 作用域分类 设置作用域 通过注解设置 通过配置文件设置 Bean的生命周期 Bean的作用域 Bean的作用域是指:在整个Spring容器中Bean的行为模式。这个模式有六种。 作用域分类 singleton:单例作用域。 在这个模式下,容器…

网络地址转换应用

如图所示,企业使用一台AR 路由器作为出口设备,路由器配置NAT Outbound为私网用户提供访问Internet服务,同时配置NAT Server将私网WEB服务器发布到公网上,对外网用户提供服务。运营商仅为该单位分配了一个公网IP,此地址既作为AR出接口的IP地址,也作为NAT Outbound和NAT Se…

【Atlas500】华为Atals MindStudio配置指南

目录 安装推理用ubuntu版docker配置docker内的ssh服务安装ubuntu系统中的依赖项:检查root用户的umask安装依赖项安装CANN连接到CANN Setting 安装推理用ubuntu版docker 华为的atlas500自带的欧拉系统是一个裁剪系统,一般通过在其上运行官方的ubuntu dock…

【消息队列】Kafka高水位和Leader Epoch原理

什么是高水位 首先高水位也就是HW,而对应的有LEO,其实这都是Kafka副本中针对位移的概念,其目的就是为了保证多副本间数据的一致性。 LEO (Log End Offet):每个副本的最后一个offset,LEO其实就是…

你猜我猜不猜 (猜数字游戏) 快来小玩一把叭

🤩本文作者:大家好,我是paperjie,感谢你阅读本文,欢迎一建三连哦。 🥰内容专栏:这里是《C语言》专栏,笔者用重金(时间和精力)打造,将C语言知识一网打尽,希望可…

解决Vue热更新失效问题

解决Vue热更新失效 一、问题描述二、出现原因三、解决方案四、总结 🚀 欢迎访问我的个人博客:https://wk-blog.vip 一、问题描述 之前在本地测试Vue项目时,是可以热更新的,但是最近一段时间发现Vue的热更新失效了。然后通过vs co…

【大厂直通车】美团_测开面经

哈喽,大家好,我是小浪;那么最近暑假实习,日常实习是卷的飞起,无论是开发岗,测试岗,算法岗,都一片死寂;不过还是有很多大佬,成功绞杀很多大厂,offer也是拿到手软; 团子暑期实习offer: 📱本专栏致力于持续更新最新各大厂面经,实习消息,招聘要求; 那么目前价格…

ISCSI个人理解与简要说明

ISCSI个人理解与简要说明 一、如何理解ISCSI二、iscsi 命令iscsiadm(管理客户端)tgtadm(管理服务端) 三、ISCSI中的概念四、从DAS,NAS,SAN的角度扩展理解ISCSI 一、如何理解ISCSI 理解一个东西&#xff0c…

Niginx的rewrite

常用的Nginx正则表达式 ^匹配输入字符串的起始位置 $匹配输入字符串的结束位置 *匹配前面的字符零次或多次。如“ol*" 能匹配"o”及“ol”、“oll” 匹配前面的字符一次或多次。如“ol" 能匹配“ol"及“ol1”、“olll", 但不能匹配“o” ?…

服务器版本的表白墙

目录 1.步骤 2.提供两个接口: 3.流程 4.代码 1.前端代码 2.sql创建表 3.后端代码 MessageServlet.java DBUtil.java 1.步骤 1.约定前后端交互的接口 2.开发服务器代码 a.编写servlet处理前端发来的请求 b.编写数据库代码,存储获取关键的数据 3.开发客户端代码 a.基于…

java学习中遇到的问题及解答

你好,我想问一下,为什么在idea编译环境下,有异常的地方它会报错,让你主动添加抛出错误代码呢? 在Java中,有两种类型的异常,一种是受检异常(checked exception)&#xff0…

一级结构规范 合集

极限状态设计原则4.1限态4.11 极限状态可分为承载能力极限状态、正常使用极限状态和耐久性极限状态。极限状态应符合下列规定:1当结构或结构构件出现下列状态之一时,应认定为超过了承载能力极限状态;1) 结构构件或连接因超过材料强度而破坏,或因过度变形…

安捷伦E4433B信号发生器

E4433B Agilent E4433B ESG-D系列 4G信号发生器安捷伦250kHz-4GHz 品  牌: Agilent 简单介绍 频率范围: E4430B 250K-1GHz E4431B 250K-2GHz E4432B 250K-3GHz E4433B 250K-4GHz 18320918653 供单信道和多信道CDMA用的测量卡用于I和Q的20 MH…

第六章 建造者模式

文章目录 前言一、传统方式解决盖房子需求完整代码抽象房子类 AbstractHouse实现子类 普通房子实现子类 高楼大厦客户端盖房子 二、引入建造者模式建造者模式的四个角色: 产品、抽象建造者、具体建造者、指挥者完整代码House类 (产品角色)抽象父类(抽象建…

Node内置模块 【Event事件模块】

文章目录 🌟前言🌟Event事件模块🌟EventEmitter类🌟加载events模块🌟实例化eventEmitter对象 🌟事件方法列表🌟使用事件🌟异步与同步 🌟写在最后 🌟前言 哈喽…

ZLMeidiaKit实现推流时(FFmpeg推rtmp流)时非127.0.0.1被拒绝需要鉴权的解决方式

场景 开源流媒体服务器ZLMediaKit在Windows上运行、配置、按需拉流拉取摄像头rtsp视频流)并使用http-flv网页播放: 开源流媒体服务器ZLMediaKit在Windows上运行、配置、按需拉流拉取摄像头rtsp视频流)并使用http-flv网页播放_霸道流氓气质的博客-CSDN博客 在上面搭建ZLMedia…

CE作业(3)

1.基于域名[www.openlab.com](http://www.openlab.com)可以访问网站内容为 welcome to openlab!!! ​ 2.给该公司创建三个子界面分别显示学生信息,教学资料和缴费网站,基于[www.openlab.com/student](http://www.openlab.com/student) 网站访问学生信息&…

windows和linux上证书的增删查

文章目录 引言windows上对个人证书的增删查创建证书证书的查找证书的删除证书的安装 Linux上对个人证书的增删查创建证书证书的安装证书的查看证书的删除 Linux上对系统证书的增删查 引言 PS: 我之前看过《图解密码技术》,已经对证书这些概念有基本的了解&#xff…

Docker容器---dockerfile简介

Docker容器---dockerfile简介 一、dockerfile概念1、dockerfile介绍2、基于dockerfile创建3、docker镜像加载原理 二、镜像的创建1、基于现有镜像创建2、基于本地模板创建3、基于dockerfile创建 三、Dockerfile编写1、dockerfile操作指令(1)FROM 镜像&am…

9. 自注意力机制(Self-attention Part2)

P27 自注意力机制(Self-attention Part2) 视频链接 P27 自注意力机制(Self-attention Part2) 计算流程: Multi-head: 应用: