MySQL 主从复制搭建全流程:基于 Docker 与 Harbor 仓库

news2025/5/23 0:26:26

一、引言

在数据库管理中,MySQL 主从复制是一种非常重要的技术,它可以实现数据的备份、读写分离,减轻主数据库的压力。本文将详细介绍如何使用 Docker 和 Harbor 仓库来搭建 MySQL 主从复制环境,适合刚接触数据库和 Docker 的新手学习。


二、MySQL 主从复制原理

2.1 基本概念

主从复制是指一台服务器充当主数据库服务器(Master),另一台或多台服务器充当从数据库服务器(Slave),主服务器中的数据会自动复制到从服务器之中。对于多级复制,数据库服务器既可以充当主机,也可以充当从机。MySQL 主从复制的基础是主服务器对数据库修改记录二进制日志,从服务器通过主服务器的二进制日志自动执行更新。

2.2 角色职责

  • 主数据库(Master):负责处理写操作和更新数据,是业务操作的主要入口。
  • 从数据库(Slave):复制主数据库的数据,通常用于读操作和数据备份,以减轻主数据库的压力。

2.3 复制流程

  1. 主库记录并发送日志
    • 当主库发生更新事件(如 UPDATEINSERTDELETECREATE)时,这些操作会被顺序地写入二进制日志(binlog)中。
    • 主库会开启一个 binlog dump 线程,负责将 binlog 日志中的事件发送给从库。
  2. 从库接收并写入中继日志
    • 从库通过 IO 线程连接到主库,并请求 binlog 日志的内容。
    • 主库的 binlog dump 线程将 binlog 日志中的事件发送给从库的 IO 线程。
    • 从库的 IO 线程接收这些事件,并将其写入到从库的中继日志(relay log)中。
  3. 从库同步数据
    • 从库开启一个 SQL 线程,实时监控 relay log 的内容是否有更新。
    • SQL 线程解析 relay log 中的 SQL 语句,并在从库上执行这些语句,从而实现数据的同步。


三、拉取 MySQL 镜像

3.1 从 Harbor 仓库拉取镜像

可以使用以下命令从 Harbor 仓库拉取 MySQL 9.3.0 版本的镜像:

[root@mysql docker]# docker pull harbor.registry.com/library/mysql:9.3.0

参数解释

  • docker pull:用于从镜像仓库中拉取镜像。
  • harbor.registry.com/library/mysql:9.3.0:指定要拉取的镜像的地址和版本,harbor.registry.com 是 Harbor 仓库的地址,library/mysql 是镜像的名称,9.3.0 是镜像的版本号。

如果没有仓库,可以直接执行这个命令:

docker pull mysql:9.3.0 

尝试从 Docker Hub(官方 Docker 镜像仓库)拉取 mysql 镜像的 9.3.0 版本。Docker Hub 是 Docker 官方的公共镜像仓库,当你使用 docker pull 命令并且不指定具体仓库地址时,Docker 客户端默认会从 Docker Hub 拉取镜像。

3.2 检查镜像是否拉取成功

使用以下命令查看本地镜像列表:

[root@mysql docker]# docker images
REPOSITORY                          TAG       IMAGE ID       CREATED       SIZE
harbor.registry.com/library/mysql   9.3.0     2c849dee4ca9   5 weeks ago   859MB

参数解释

  • docker images:用于列出本地所有的镜像,显示镜像的仓库名、标签、镜像 ID、创建时间和大小等信息。

3.3 处理拉取镜像时的 TLS 证书验证失败问题

如果在使用 docker pull 命令拉取镜像时,由于 TLS 证书验证失败导致报错,例如:

[root@mysql docker]# docker pull harbor.registry.com/library/mysql:9.3.0
Error response from daemon: Get "https://harbor.registry.com/v2/": tls: failed to verify certificate: x509: certificate signed by unknown authority

可以创建 /etc/docker/daemon.json 文件,并写入以下内容:

{
    "default-ipc-mode": "shareable",
    "data-root": "/data/docker",
    "exec-opts": ["native.cgroupdriver=systemd"],
    "log-driver": "json-file",
    "log-opts": {
        "max-size": "100m",
        "max-file": "50"
    },
    "insecure-registries": ["https://harbor.registry.com"],
    "registry-mirrors": [
        "https://docker.m.daocloud.io",
        "https://docker.imgdb.de",
        "https://docker-0.unsee.tech",
        "https://docker.hlmirror.com",
        "https://docker.1ms.run",
        "https://func.ink",
        "https://lispy.org",
        "https://docker.xiaogenban1993.com"
    ]
}

参数解释

  • default-ipc-mode:设置默认的 IPC(进程间通信)模式为 shareable
  • data-root:指定 Docker 数据存储的根目录为 /data/docker
  • exec-opts:设置容器执行时的选项,native.cgroupdriver=systemd 表示使用 systemd 作为 cgroup 驱动。
  • log-driver:指定日志驱动为 json-file,将容器日志以 JSON 文件的形式存储。
  • log-opts:设置日志的选项,max-size 表示单个日志文件的最大大小为 100mmax-file 表示最多保留 50 个日志文件。
  • insecure-registries:添加不安全的镜像仓库地址,允许从该仓库拉取镜像,这里是 https://harbor.registry.com
  • registry-mirrors:设置镜像加速地址,提高镜像拉取的速度。

3.4 添加 Harbor 仓库映射

在 /etc/hosts 文件中添加 Harbor 仓库的映射:

[root@mysql docker]# cat /etc/hosts
127.0.0.1   localhost localhost.localdomain localhost4 localhost4.localdomain4
::1         localhost localhost.localdomain localhost6 localhost6.localdomain6
192.168.220.20  harbor.registry.com harbor

参数解释

  • /etc/hosts:是一个本地的域名解析文件,通过添加 192.168.220.20 harbor.registry.com harbor 这一行,将 harbor.registry.com 域名映射到 192.168.220.20 这个 IP 地址。

 注意:

四、启动 MySQL 容器

4.1 启动初始容器

使用以下命令启动一个 MySQL 容器:

[root@mysql docker]# docker run --name mysql -d -p 3306:3306 -e MYSQL_ROOT_PASSWORD="123456" harbor.registry.com/library/mysql:9.3.0

参数解释

  • docker run:用于创建并启动一个新的容器。
  • --name mysql:为容器指定一个名称为 mysql
  • -d:表示在后台运行容器。
  • -p 3306:3306:将宿主机的 3306 端口映射到容器内部的 3306 端口,这样可以通过宿主机的 3306 端口访问容器内的 MySQL 服务。
  • -e MYSQL_ROOT_PASSWORD="123456":设置容器内 MySQL 的 root 用户密码为 123456
  • harbor.registry.com/library/mysql:9.3.0:指定要使用的镜像。

4.2 检查容器是否启动成功

使用以下命令查看正在运行的容器:

[root@mysql docker]# docker ps

参数解释

  • docker ps:用于列出正在运行的容器,显示容器的 ID、镜像、命令、创建时间、状态、端口映射和名称等信息。

4.3 查看容器日志

如果容器启动报错,可以使用以下命令查看容器的日志,以寻找出错原因:

[root@mysql docker]# docker logs mysql

参数解释

  • docker logs:用于查看指定容器的日志信息,mysql 是容器的名称。

4.4 进入容器

使用以下命令进入正在运行的容器:

[root@mysql docker]# docker exec -it mysql /bin/bash

参数解释

  • docker exec:用于在运行的容器中执行命令。
  • -it:表示以交互模式进入容器,-i 保持标准输入打开,-t 分配一个伪终端。
  • mysql:是容器的名称。
  • /bin/bash:指定要执行的命令,即进入容器的 bash 终端。

bash-5.1# cd etc
bash-5.1# ls
# 找到my.cnf文件

五、配置主从服务器

5.1 复制配置文件

在新的会话窗口中创建两个目录:

[root@mysql docker]# mkdir /data/master/conf -p
[root@mysql docker]# mkdir /data/slave/conf -p

参数解释

  • mkdir:用于创建目录。
  • -p:表示如果父目录不存在,则先创建父目录。

将刚刚找到的 my.cnf 配置文件,并将其拷贝到 /data/master/conf 目录下:

[root@mysql docker]# cd /data/master/conf/
[root@mysql conf]# docker cp mysql:/etc/my.cnf .

参数解释

  • cd etc:进入容器的 etc 目录。
  • ls:列出当前目录下的文件和文件夹。
  • exit:退出容器。
  • docker cp:用于在宿主机和容器之间复制文件,mysql:/etc/my.cnf 表示容器 mysql 内的 /etc/my.cnf 文件,. 表示当前目录。

5.2 修改配置文件

编辑 /data/master/conf/my.cnf 文件,添加 server-id=1

[root@mysql conf]# vim /data/master/conf/my.cnf

参数解释

  • vim:是一个文本编辑器,用于编辑文件内容。
  • server-id=1:为 MySQL 服务器指定一个唯一的 ID,主服务器的 ID 通常为 1

 

将修改后的 my.cnf 文件拷贝到 /data/slave/conf 文件夹下面,并将 server-id 的值改为 2

[root@mysql conf]# cp my.cnf ../../slave/conf/
[root@mysql conf]# vim /data/slave/conf/my.cnf

参数解释

  • cp:用于复制文件,my.cnf 是要复制的文件,../../slave/conf/ 是目标目录。
  • server-id=2:从服务器的 ID 需要与主服务器不同,这里设置为 2

5.3 停止并删除初始容器

退出容器后,停掉并删除初始容器:

bash-5.1# exit
[root@mysql docker]# docker stop mysql
[root@mysql docker]# docker rm mysql

参数解释

  • docker stop:用于停止正在运行的容器,mysql 是容器的名称。
  • docker rm:用于删除容器,mysql 是容器的名称。

查看发现,容器已经删除,没有任何容器了:

[root@mysql docker]# docker ps -a
CONTAINER ID   IMAGE     COMMAND   CREATED   STATUS    PORTS     NAMES

六、创建主服务器

使用以下命令创建主服务器容器:

[root@mysql docker]# docker run -d \
--name mysql-master \
-e MYSQL_ROOT_PASSWORD=123456 \
-v /data/master/conf/my.cnf:/etc/my.cnf \
-p 3306:3306 \
harbor.registry.com/library/mysql:9.3.0 \
--character-set-server=utf8mb4 \
--collation-server=utf8mb4_unicode_ci

参数解释

  • -d:在后台运行容器。
  • --name mysql-master:为容器指定名称为 mysql-master
  • -e MYSQL_ROOT_PASSWORD=123456:设置容器内 MySQL 的 root 用户密码为 123456
  • -v /data/master/conf/my.cnf:/etc/my.cnf:将宿主机的 /data/master/conf/my.cnf 文件挂载到容器内的 /etc/my.cnf 文件,实现配置文件的持久化。
  • -p 3306:3306:将宿主机的 3306 端口映射到容器内部的 3306 端口。
  • harbor.registry.com/library/mysql:9.3.0:指定要使用的镜像。
  • --character-set-server=utf8mb4:设置服务器的字符集为 utf8mb4
  • --collation-server=utf8mb4_unicode_ci:设置服务器的排序规则为 utf8mb4_unicode_ci

6.1 进入主服务器容器

使用以下命令进入主服务器容器:

[root@mysql docker]# docker exec -it mysql-master /bin/bash
bash-5.1# mysql -uroot -p123456
mysql: [Warning] Using a password on the command line interface can be insecure.
Welcome to the MySQL monitor.  Commands end with ; or \g.
Your MySQL connection id is 9
Server version: 9.3.0 MySQL Community Server - GPL

Copyright (c) 2000, 2025, Oracle and/or its affiliates.

Oracle is a registered trademark of Oracle Corporation and/or its
affiliates. Other names may be trademarks of their respective
owners.

Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.

参数解释

  • docker exec -it mysql-master /bin/bash:以交互模式进入 mysql-master 容器的 bash 终端。
  • mysql -uroot -p123456:使用 root 用户和密码 123456 登录 MySQL。

6.2 创建用户并授权

在主服务器的 MySQL 中创建一个用于同步的用户,并授予其复制从服务器的权限:

# 创建用户:
mysql> create user 'backups'@'%' identified by '123456';
Query OK, 0 rows affected (0.021 sec)

# 给权限:
mysql> grant replication slave on *.* to 'backups'@'%';
Query OK, 0 rows affected (0.003 sec)

# 刷新权限:
mysql> flush privileges;
Query OK, 0 rows affected, 1 warning (0.003 sec)

参数解释

  • create user 'backups'@'%' identified by '123456':创建一个名为 backups 的用户,允许从任何主机连接,密码为 123456
  • grant replication slave on *.* to 'backups'@'%':授予 backups 用户在所有数据库和所有表上的复制从服务器的权限。
  • flush privileges:刷新权限,使新的权限设置生效。

6.3 查看同步起始位置

使用以下命令查看主服务器的二进制日志状态,获取同步的起始位置:

mysql> show binary log status;
-- 或者
mysql> show binary log status\G;

例如:
mysql> show binary log status;
+---------------+----------+--------------+------------------+-------------------+
| File          | Position | Binlog_Do_DB | Binlog_Ignore_DB | Executed_Gtid_Set |
+---------------+----------+--------------+------------------+-------------------+
| binlog.000002 |      863 |              |                  |                   |
+---------------+----------+--------------+------------------+-------------------+
1 row in set (0.000 sec)

mysql> show binary log status\G;
*************************** 1. row ***************************
             File: binlog.000002
         Position: 863
     Binlog_Do_DB: 
 Binlog_Ignore_DB: 
Executed_Gtid_Set: 
1 row in set (0.001 sec)

ERROR: 
No query specified

参数解释

  • show binary log status:显示主服务器的二进制日志状态,包括当前正在使用的二进制日志文件、位置等信息。
  • \G:以垂直格式显示查询结果,方便查看。

七、创建从服务器

7.1 创建从服务器容器

在新的窗口中使用以下命令创建从服务器容器:

[root@mysql conf]# docker run -d \
--name mysql-slave \
-e MYSQL_ROOT_PASSWORD=123456 \
-v /data/slave/conf/my.cnf:/etc/my.cnf \
-p 3307:3306 \
harbor.registry.com/library/mysql:9.3.0 \
--character-set-server=utf8mb4 \
--collation-server=utf8mb4_unicode_ci

参数解释

  • 大部分参数与创建主服务器容器的参数相同,不同之处在于:
    • --name mysql-slave:为容器指定名称为 mysql-slave
    • -p 3307:3306:将宿主机的 3307 端口映射到容器内部的 3306 端口,避免与主服务器的端口冲突。

7.2 进入从服务器容器

使用以下命令进入从服务器容器:

[root@mysql conf]# docker exec -it mysql-slave /bin/bash
bash-5.1# mysql -uroot -p123456

参数解释

  • 与进入主服务器容器的命令和参数解释相同。

7.3 配置主从复制

在从服务器的 MySQL 中配置主从复制:

mysql> CHANGE REPLICATION SOURCE TO \
SOURCE_HOST='192.168.220.198',SOURCE_USER='backups',SOURCE_PASSWORD='123456', \
SOURCE_LOG_FILE='binlog.000002',SOURCE_LOG_POS=863,GET_SOURCE_PUBLIC_KEY=1;

参数解释

  • CHANGE REPLICATION SOURCE TO:用于配置从服务器的复制源。
  • SOURCE_HOST='192.168.220.198':指定主服务器的 IP 地址。
  • SOURCE_USER='backups':指定用于复制的用户。
  • SOURCE_PASSWORD='123456':指定用于复制的用户的密码。
  • SOURCE_LOG_FILE='binlog.000002':指定主服务器的二进制日志文件。
  • SOURCE_LOG_POS=863:指定主服务器二进制日志的起始位置。
  • GET_SOURCE_PUBLIC_KEY=1:表示获取主服务器的公钥。

 

7.4 启动复制并查看状态

执行以下命令启动复制,并查看复制状态:

mysql> start replica;
mysql> show replica status\G;

参数解释

  • start replica:启动从服务器的复制进程。
  • show replica status\G:显示从服务器的复制状态,以垂直格式显示结果,方便查看各个参数的值。 

八、验证主从复制

8.1 在主服务器创建测试数据库和表

进入主服务器容器并登录 MySQL:

[root@mysql docker]# docker exec -it mysql-master /bin/bash
bash-5.1# mysql -uroot -p123456

在 MySQL 中创建一个测试数据库和表,并插入一些数据:

mysql> CREATE DATABASE test_db;
Query OK, 1 row affected (0.00 sec)

mysql> USE test_db;
Database changed

mysql> CREATE TABLE test_table (id INT AUTO_INCREMENT PRIMARY KEY, name VARCHAR(255));
Query OK, 0 rows affected (0.01 sec)

mysql> INSERT INTO test_table (name) VALUES ('test_value');
Query OK, 1 row affected (0.00 sec)

8.2 在从服务器验证数据同步

进入从服务器容器并登录 MySQL:

[root@mysql docker]# docker exec -it mysql-slave /bin/bash
bash-5.1# mysql -uroot -p123456

在 MySQL 中检查是否能看到主服务器创建的数据库和表,以及插入的数据:

mysql> SHOW DATABASES;
+--------------------+
| Database           |
+--------------------+
| information_schema |
| mysql              |
| performance_schema |
| sys                |
| test_db            |
+--------------------+

mysql> USE test_db;
Database changed

mysql> SELECT * FROM test_table;
+----+------------+
| id | name       |
+----+------------+
|  1 | test_value |
+----+------------+

如果能在从服务器看到主服务器创建的数据库、表和插入的数据,说明主从复制配置成功。

九、总结

通过以上步骤,我们成功地使用 Docker 和 Harbor 仓库搭建了 MySQL 主从复制环境,并完成了验证。主从复制可以提高数据库的可用性、读写性能和数据安全性,在实际的生产环境中有着广泛的应用。希望本文对刚接触 MySQL 和 Docker 的新手有所帮助。

以上就是完整的 MySQL 主从复制搭建及验证过程,每一步都有详细的命令参数解释,相信新手也能轻松理解和操作。

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

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

相关文章

Django框架的前端部分使用Ajax请求一

Ajax请求 目录 1.ajax请求使用 2.增加任务列表功能(只有查看和新增) 3.代码展示集合 这篇文章, 要开始讲关于ajax请求的内容了。这个和以前文章中写道的Vue框架里面的axios请求, 很相似。后端代码, 会有一些细节点, 跟前几节文章写的有些区别。 一、ajax请求使用 我们先…

cmd如何从C盘默认路径切换到D盘某指定目录

以从C盘cmd打开后的默认目录切换到目录"D:\Program Files\MySQL\MySQL Server 8.0\bin\mysqld"为例 打开cmd 首先点击开始键,搜索cms,右键以管理员身份运行打开管理员端的命令行提示符 1、首先要先切换到D盘 直接输入D:然后回车就可以&…

每日Prompt:实物与手绘涂鸦创意广告

提示词 一则简约且富有创意的广告,设置在纯白背景上。 一个真实的 [真实物体] 与手绘黑色墨水涂鸦相结合,线条松散而俏皮。涂鸦描绘了:[涂鸦概念及交互:以巧妙、富有想象力的方式与物体互动]。在顶部或中部加入粗体黑色 [广告文案…

学习笔记:黑马程序员JavaWeb开发教程(2025.4.8)

12.11 登录校验-Filter-详解(过滤器链) 过滤器链及其执行顺序,一个Filter一个过滤器链,类名排名越靠前(按照ABC这样的顺序),就先执行谁 12.12 登录校验-Filter-登录校验过滤器 获取请求参数&…

Ubuntu部署私有Gitlab

这个东西安装其实挺简单的,但是因为我这边迁移了数据目录和使用自己安装的 nginx 代理还是踩了几个坑,所以大家可以注意下 先看下安装 # 先安装必要组件 sudo apt update sudo apt install -y curl openssh-server ca-certificates tzdata perl# 添加gi…

genicamtl_lmi_gocator_objectmodel3d

目录 一、在halcon中找不到genicamtl_lmi_gocator_objectmodel3d例程二、在halcon中运行genicamtl_lmi_gocator_objectmodel3d,该如何配置三、代码分段详解(一)传感器连接四、代码分段详解(二)采集图像并显示五、代码分段详解(三)坐标变换六、常见问题一、在halcon中找不…

[LevelDB]LevelDB版本管理的黑魔法-为什么能在不锁表的情况下管理数据?

文章摘要 LevelDB的日志管理系统是怎么通过双链表来进行数据管理为什么LevelDB能够在不锁表的情况下进行日志新增 适用人群: 对版本管理机制有开发诉求,并且希望参考LevelDB的版本开发机制。数据库相关从业者的专业人士。计算机狂热爱好者,对计算机的…

bisheng系列(二)- 本地部署(前后端)

一、导读 环境:Ubuntu 24.04、open Euler 23.03、Windows 11、WSL 2、Python 3.10 、bisheng 1.1.1 背景:需要bisheng二开商用,故而此处进行本地部署,便于后期调试开发 时间:20250519 说明:bisheng前后…

【网络编程】十二、两万字详解 IP协议

文章目录 Ⅰ. 基本概念1、网络层解决的问题2、保证数据可靠的从一台主机送到另一台主机的前提3、路径选择4、主机和路由器的区别 Ⅱ. IP协议格式IP如何将报头与有效载荷进行分离?IP如何决定将有效载荷交付给上层的哪一个协议?理解socket编程 Ⅲ. 分片与组…

Linux探秘:驾驭开源,解锁高效能——基础指令

♥♥♥~~~~~~欢迎光临知星小度博客空间~~~~~~♥♥♥ ♥♥♥零星地变得优秀~也能拼凑出星河~♥♥♥ ♥♥♥我们一起努力成为更好的自己~♥♥♥ ♥♥♥如果这一篇博客对你有帮助~别忘了点赞分享哦~♥♥♥ ♥♥♥如果有什么问题可以评论区留言或者私信我哦~♥♥♥ ✨✨✨✨✨✨ 个…

WebSocket解决方案的一些细节阐述

今天我们来看看WebSocket解决方案的一些细节问题: 实际上,集成WebSocket的方法都有相关的工程挑战,这可能会影响项目成本和交付期限。在最简单的层面上,构建 WebSocket 解决方案似乎是添加接收实时更新功能的前进方向。但是&…

Java 代码生成工具:如何快速构建项目骨架?

Java 代码生成工具:如何快速构建项目骨架? 在 Java 项目开发过程中,构建项目骨架是一项繁琐但又基础重要的工作。幸运的是,Java 领域有许多代码生成工具可以帮助我们快速完成这一任务,大大提高开发效率。 一、代码生…

Nginx核心服务

一.正向代理 正向代理(Forward Proxy)‌是一种位于客户端和原始服务器之间的代理服务器,其主要作用是将客户端的请求转发给目标服务器,并将响应返回给客户端 Nginx 的 正向代理 充当客户端的“中间人”,代…

第22天-Python ttkbootstrap 界面美化指南

环境安装 pip install ttkbootstrap 示例1:基础主题切换器 import ttkbootstrap as ttk from ttkbootstrap.constants import *def create_theme_switcher():root = ttk.Window(title="主题切换器", themename="cosmo")def change_theme():selected = t…

Kubernetes控制平面组件:Kubelet详解(七):容器网络接口 CNI

云原生学习路线导航页(持续更新中) kubernetes学习系列快捷链接 Kubernetes架构原则和对象设计(一)Kubernetes架构原则和对象设计(二)Kubernetes架构原则和对象设计(三)Kubernetes控…

web应用技术第6次课---Apifox的使用

Apifox - API 文档、调试、Mock、测试一体化协作平台。拥有接口文档管理、接口调试、Mock、自动化测试等功能,接口开发、测试、联调效率,提升 10 倍。最好用的接口文档管理工具,接口自动化测试工具。 第一个问题:为什么需要用Apif…

Redis队列与Pub/Sub方案全解析:原理、对比与实战性能测试

一、为什么选择Redis实现消息队列? Redis凭借其内存级操作(微秒级响应)、丰富的数据结构以及持久化能力,成为构建高性能消息队列的热门选择。相比传统消息队列(如Kafka/RabbitMQ),Redis在以下场…

OBOO鸥柏丨AI数字人触摸屏查询触控人脸识别语音交互一体机上市

OBOO鸥柏丨AI数字人触摸屏查询触控人脸识别语音交互一体机上市分析 OBOO鸥柏品牌推出的AI数字人触摸屏查询触控人脸识别语音交互一体机,是其在智能交互设备领域的又一创新产品。该一体机整合了触摸屏查询、AI人脸识别、AI声源定位语音麦克风,触控交互以…

第5天-python饼图绘制

一、基础饼图绘制(Matplotlib) 1. 环境准备 python 复制 下载 pip install matplotlib numpy 2. 基础饼图代码 python 复制 下载 import matplotlib.pyplot as plt# 数据准备 labels = [1, 2, 3, 4] sizes = [30, 25, 15, 30] # 各部分占比(总和建议100) colors…

2023 睿抗机器人开发者大赛CAIP-编程技能赛-本科组(国赛) 解题报告 | 珂学家

前言 题解 2023 睿抗机器人开发者大赛CAIP-编程技能赛-本科组(国赛)。 vp了下,题目挺好的,难度也适中,但是彻底红温了。 第二题,题意不是那么清晰, M i n ( K 1 , K 2 ) Min(K_1, K_2) Min(K1​,K2​)容易求&#x…