MySQL - [04] 分布式部署&主从复制&读写分离

 

 

 

一、前言

Q1:为什么需要主从复制?

1、在业务复杂的系统中,有一条SQL语句需要锁表,导致暂时不能使用读的服务,那么就很影响运行中的业务。使用主从复制,让主库负责写,从库负责读,这样即使主库出现了锁表的情景,通过读从库也可以保证业务的正常运作。

2、做数据的热备

3、架构的扩展。业务量越来越大,I/O 访问频率过高,单机无法满足,此时做多库的存储,降低磁盘I/O范围的频率,提高单个机器的I/O性能。

Q2:什么是主从复制?

MySQL主从复制是指数据可以从一个MySQL数据库服务器主节点复制到一个或多个从节点。MySQL默认采用异步复制方式,这样从节点不用一直访问主服务器来更新自己的数据,数据的更新可以在远程连接上进行,从节点可以复制主数据库中的所有数据库或者特定的数据库,或者特定的表。

Q3:主从复制原理

(1)master服务器将数据的改变记录二进制binlog文件,当master上的数据发生改变时,则将其改变写入二进制日志中;

(2)slave服务器会在一定时间间隔内对master二进制日志进行探测其是否发生改变,如果发生改变,则开始一个I/O Thread请求master二进制事件。

(3)同时主节点为每个I/O线程启动一个dump线程,用于向其发送二进制事件,并保存至从节点本地的中继日志中,从节点将启动SQL线程从中继日志中读取二进制日志,在本地重放,使得其数据和主节点的保持一致,最后I/O Thread和SQL Thread将进入睡眠状态,等待下一次被唤醒。

也就是说:

  • 从库会生成两个线程,一个I/O线程,一个SQL线程;
  • I/O线程会去请求主库的binlog,并将得到的binlog写到本地的relay-log(中继日志)文件中;
  • 主库会生成一个log dump线程,用来给从库 I/O 线程传binlog;
  • SQL线程,会读取relay log文件中的日志,并解析成sql语句逐一执行。

注意:

1、master将操作语句记录到binlog日志中,然后授予slave远程连接的权限(master一定要开启binlog二进制日志功能;通常为了数据安全考虑,slave也开启binlog功能)。

2、slave开启两个线程:IO线程和SQL线程。其中:IO线程负责读取master的binlog内容到中继日志relay log里;SQL线程负责从relay log日志里读取binlog内容,并更新到slave的数据库里,这样就能保证slave数据和master数据保持一致了。

3、MySQL复制至少需要两个MySQL的服务,当然MySQL服务可以分布在不同的服务器上,也可以在一台服务器上启动多个服务。

4、MySQL复制最好确保master和salve服务器上的MySQL版本相同(如果不能满足版本一致,那么要保证master主节点的版本低于slave从节点的版本)

5、master和slave两节点间时间需同步

具体步骤:

1、从库通过手工执行change master to 语句连接主库,提供了连接的用户一切条件(user、password、port、ip),并且让从库知道,二进制日志的起点位置(file名position号);start slave

2、从库的IO线程和主句的dump线程建立连接。

3、从库根据change master to语句提供的file名和position号,IO线程向主库发起binlog的请求。

4、主库dump线程根据从库的请求,将本地binlog以events的方式发给从库IO线程。

5、从库IO线程接收binlog events,并存放到本地relay-log中,传送过来的信息,会记录到master.info中

6、从库SQL线程应用relay-log,并且把应用过的记录到relay-log.info中,默认情况下,已经应用过的relay会自动被清理purge

 

 

 

Step1:基础环境准备

虚拟机环境:VMware workstation

服务器信息:

主机名 IP 操作系统
node01 192.168.1.131 CentOS Linux release 7.9.2009 (Core)
node02 192.168.1.132 CentOS Linux release 7.9.2009 (Core)
node03 192.168.1.133 CentOS Linux release 7.9.2009 (Core)
node04 192.168.1.134 CentOS Linux release 7.9.2009 (Core)

防火墙:已关闭,并禁止开机自启

systemctl stop firewalld && systemctl disable firewalld

SELinux:已禁用

sed -i "s/SELINUX=enforcing/SELINUX=disabled/g" /etc/selinux/config

 

Step2:MySQL主从库角色分配

主机名 IP 角色
node01 192.168.1.131 不进行操作
node02 192.168.1.132 主库
node03 192.168.1.133 从库
node04 192.168.1.134 从库

 

 

Step3:安装MySQL

1、卸载CentOS 7.9默认安装的MariaDB

[root@node02 ~]# rpm -qa | grep mysql
[root@node02 ~]#
[root@node02 ~]#
[root@node02 ~]# rpm -qa | grep mariadb
mariadb-libs-5.5.68-1.el7.x86_64
[root@node02 ~]#
[root@node02 ~]# rpm -e --nodeps mariadb-libs-5.5.68-1.el7.x86_64
[root@node02 ~]# rpm -qa | grep mariadb

2、官网下载mysql安装包,上传到node02节点(/root/0_0)并解压

# 在root目录下创建一个中转站的目录0_0(根据个人习惯)
[root@node02 0_0]# pwd
/root/0_0
[root@node02 0_0]# ll
总用量 823256
-rw-r--r-- 1 root root 843008000 1月  10 00:00 mysql-8.0.28-1.el7.x86_64.rpm-bundle.tar
[root@node02 0_0]#
[root@node02 0_0]#
[root@node02 0_0]#
[root@node02 0_0]# tar -xvf mysql-8.0.28-1.el7.x86_64.rpm-bundle.tar
mysql-community-client-8.0.28-1.el7.x86_64.rpm
mysql-community-client-plugins-8.0.28-1.el7.x86_64.rpm
mysql-community-common-8.0.28-1.el7.x86_64.rpm
mysql-community-devel-8.0.28-1.el7.x86_64.rpm
mysql-community-embedded-compat-8.0.28-1.el7.x86_64.rpm
mysql-community-icu-data-files-8.0.28-1.el7.x86_64.rpm
mysql-community-libs-8.0.28-1.el7.x86_64.rpm
mysql-community-libs-compat-8.0.28-1.el7.x86_64.rpm
mysql-community-server-8.0.28-1.el7.x86_64.rpm
mysql-community-test-8.0.28-1.el7.x86_64.rpm
[root@node02 0_0]#
[root@node02 0_0]#
[root@node02 0_0]# ll -l
总用量 1646504
-rw-r--r-- 1 root root  843008000 1月  10 00:00 mysql-8.0.28-1.el7.x86_64.rpm-bundle.tar
-rw-r--r-- 1 7155 31415  55199948 12月 18 2021 mysql-community-client-8.0.28-1.el7.x86_64.rpm
-rw-r--r-- 1 7155 31415   5933684 12月 18 2021 mysql-community-client-plugins-8.0.28-1.el7.x86_64.rpm
-rw-r--r-- 1 7155 31415    645388 12月 18 2021 mysql-community-common-8.0.28-1.el7.x86_64.rpm
-rw-r--r-- 1 7155 31415   7763684 12月 18 2021 mysql-community-devel-8.0.28-1.el7.x86_64.rpm
-rw-r--r-- 1 7155 31415  23637584 12月 18 2021 mysql-community-embedded-compat-8.0.28-1.el7.x86_64.rpm
-rw-r--r-- 1 7155 31415   2215928 12月 18 2021 mysql-community-icu-data-files-8.0.28-1.el7.x86_64.rpm
-rw-r--r-- 1 7155 31415   4935572 12月 18 2021 mysql-community-libs-8.0.28-1.el7.x86_64.rpm
-rw-r--r-- 1 7155 31415   1265072 12月 18 2021 mysql-community-libs-compat-8.0.28-1.el7.x86_64.rpm
-rw-r--r-- 1 7155 31415 473116268 12月 18 2021 mysql-community-server-8.0.28-1.el7.x86_64.rpm
-rw-r--r-- 1 7155 31415 268279684 12月 18 2021 mysql-community-test-8.0.28-1.el7.x86_64.rpm

3、按照以下顺序安装

[root@node02 0_0]# rpm -ivh mysql-community-common-8.0.28-1.el7.x86_64.rpm
警告:mysql-community-common-8.0.28-1.el7.x86_64.rpm: 头V4 RSA/SHA256 Signature, 密钥 ID 3a79bd29: NOKEY
准备中...                          ################################# [100%]
正在升级/安装...
   1:mysql-community-common-8.0.28-1.e################################# [100%]
[root@node02 0_0]# rpm -ivh mysql-community-client-plugins-8.0.28-1.el7.x86_64.rpm
警告:mysql-community-client-plugins-8.0.28-1.el7.x86_64.rpm: 头V4 RSA/SHA256 Signature, 密钥 ID 3a79bd29: NOKEY
准备中...                          ################################# [100%]
正在升级/安装...
   1:mysql-community-client-plugins-8.################################# [100%]
[root@node02 0_0]#
[root@node02 0_0]# rpm -ivh mysql-community-libs-8.0.28-1.el7.x86_64.rpm
警告:mysql-community-libs-8.0.28-1.el7.x86_64.rpm: 头V4 RSA/SHA256 Signature, 密钥 ID 3a79bd29: NOKEY
准备中...                          ################################# [100%]
正在升级/安装...
   1:mysql-community-libs-8.0.28-1.el7################################# [100%]
[root@node02 0_0]# rpm -ivh mysql-community-client-8.0.28-1.el7.x86_64.rpm
警告:mysql-community-client-8.0.28-1.el7.x86_64.rpm: 头V4 RSA/SHA256 Signature, 密钥 ID 3a79bd29: NOKEY
准备中...                          ################################# [100%]
正在升级/安装...
   1:mysql-community-client-8.0.28-1.e################################# [100%]
[root@node02 0_0]#
[root@node02 0_0]# rpm -ivh mysql-community-icu-data-files-8.0.28-1.el7.x86_64.rpm
警告:mysql-community-icu-data-files-8.0.28-1.el7.x86_64.rpm: 头V4 RSA/SHA256 Signature, 密钥 ID 3a79bd29: NOKEY
准备中...                          ################################# [100%]
正在升级/安装...
   1:mysql-community-icu-data-files-8.################################# [100%]
[root@node02 0_0]# rpm -ivh mysql-community-server-8.0.28-1.el7.x86_64.rpm
警告:mysql-community-server-8.0.28-1.el7.x86_64.rpm: 头V4 RSA/SHA256 Signature, 密钥 ID 3a79bd29: NOKEY
准备中...                          ################################# [100%]
正在升级/安装...
   1:mysql-community-server-8.0.28-1.e################################# [100%]
[root@node02 0_0]#

在这一步可能会遇到以下问题

# 发现缺少类库文件
[root@node03 0_0]# rpm -ivh mysql-community-server-8.0.28-1.el7.x86_64.rpm
警告:mysql-community-server-8.0.28-1.el7.x86_64.rpm: 头V4 RSA/SHA256 Signature, 密钥 ID 3a79bd29: NOKEY
错误:依赖检测失败:
        libaio.so.1()(64bit) 被 mysql-community-server-8.0.28-1.el7.x86_64 需要
        libaio.so.1(LIBAIO_0.1)(64bit) 被 mysql-community-server-8.0.28-1.el7.x86_64 需要
        libaio.so.1(LIBAIO_0.4)(64bit) 被 mysql-community-server-8.0.28-1.el7.x86_64 需要
# 可以通过yum provides libaio.so* 查询是哪个包提供该文件
[root@node03 0_0]# yum provides libaio.so*
已加载插件:fastestmirror
Loading mirror speeds from cached hostfile
 * base: ftp.sjtu.edu.cn
 * extras: ftp.sjtu.edu.cn
 * updates: mirrors.ustc.edu.cn
libaio-0.3.109-13.el7.i686 : Linux-native asynchronous I/O access library
源    :base
匹配来源:
提供    :libaio.so.1(LIBAIO_0.4)
提供    :libaio.so.1.0.0
提供    :libaio.so.1.0.0(LIBAIO_0.1)
提供    :libaio.so.1(LIBAIO_0.1)
提供    :libaio.so.1
提供    :libaio.so.1.0.0(LIBAIO_0.4)



libaio-0.3.109-13.el7.x86_64 : Linux-native asynchronous I/O access library
源    :base
匹配来源:
提供    :libaio.so.1.0.0(LIBAIO_0.1)(64bit)
提供    :libaio.so.1(LIBAIO_0.4)(64bit)
提供    :libaio.so.1.0.0(LIBAIO_0.4)(64bit)
提供    :libaio.so.1.0.0()(64bit)
提供    :libaio.so.1(LIBAIO_0.1)(64bit)
提供    :libaio.so.1()(64bit)



libaio-0.3.109-13.el7.x86_64 : Linux-native asynchronous I/O access library
源    :@base
匹配来源:
提供    :libaio.so.1.0.0(LIBAIO_0.1)(64bit)
提供    :libaio.so.1(LIBAIO_0.4)(64bit)
提供    :libaio.so.1.0.0(LIBAIO_0.4)(64bit)
提供    :libaio.so.1.0.0()(64bit)
提供    :libaio.so.1(LIBAIO_0.1)(64bit)
提供    :libaio.so.1()(64bit)
# 然后可以执行yum list 过滤出相关的包
[root@node03 0_0]# yum list | grep libaio
libaio.i686                                 0.3.109-13.el7             base
libaio.x86_64                               0.3.109-13.el7             base
libaio-devel.i686                           0.3.109-13.el7             base
libaio-devel.x86_64                         0.3.109-13.el7             base
[root@node03 0_0]#
# 检查这个包是否已经安装(肯定没安装)
[root@node03 0_0]# yum list installed | grep libaio
[root@node03 0_0]#
# 根据操作系统安装对应的包
[root@node03 0_0]# yum -y install libaio.x86_64
已加载插件:fastestmirror
Loading mirror speeds from cached hostfile
 * base: ftp.sjtu.edu.cn
 * extras: ftp.sjtu.edu.cn
 * updates: mirrors.ustc.edu.cn
正在解决依赖关系
--> 正在检查事务
---> 软件包 libaio.x86_64.0.0.3.109-13.el7 将被 安装
--> 解决依赖关系完成

依赖关系解决

===========================================================================================================================================================================================================
 Package                                        架构                                           版本                                                     源                                            大小
===========================================================================================================================================================================================================
正在安装:
 libaio                                         x86_64                                         0.3.109-13.el7                                           base                                          24 k

事务概要
===========================================================================================================================================================================================================
安装  1 软件包

总下载量:24 k
安装大小:38 k
Downloading packages:
libaio-0.3.109-13.el7.x86_64.rpm                                                                                                                                                    |  24 kB  00:00:00
Running transaction check
Running transaction test
Transaction test succeeded
Running transaction
警告:RPM 数据库已被非 yum 程序修改。
** 发现 2 个已存在的 RPM 数据库问题, 'yum check' 输出如下:
2:postfix-2.10.1-9.el7.x86_64 有缺少的需求 libmysqlclient.so.18()(64bit)
2:postfix-2.10.1-9.el7.x86_64 有缺少的需求 libmysqlclient.so.18(libmysqlclient_18)(64bit)
  正在安装    : libaio-0.3.109-13.el7.x86_64                                                                                                                                                           1/1
  验证中      : libaio-0.3.109-13.el7.x86_64                                                                                                                                                           1/1

已安装:
  libaio.x86_64 0:0.3.109-13.el7

完毕!

 

 

4、根据需要修改安装目录权限,将安装目录的拥有者改为mysql,如果系统没有,需要添加mysql用户及分组

只是用mysql运行程序,禁止mysql登录,增加安全性

另外需要注意,在上一步安装rpm之后,/var/lib/mysql目录下应该是有相关文件生成,可以提前检查一下。

如果/var/lib/mysql下的文件的属组未修改为 mysql:mysql,那么mysqld服务是起不来的。

[root@node02 0_0]# id mysql
id: mysql: no such user
[root@node02 0_0]# groupadd mysql
[root@node02 0_0]# useradd mysql -s /usr/sbin/nologin -g mysql
[root@node02 0_0]# id mysql
uid=1000(mysql) gid=1000(mysql) 组=1000(mysql)
[root@node02 0_0]# chown -R mysql:mysql /var/lib/mysql

4、初始化数据库

[root@node02 0_0]# mysqld --initialize --console
[root@node02 0_0]#

5、启动mysql服务,并查看初始化密码

[root@node02 0_0]# systemctl status mysqld
● mysqld.service - MySQL Server
   Loaded: loaded (/usr/lib/systemd/system/mysqld.service; enabled; vendor preset: disabled)
   Active: inactive (dead)
     Docs: man:mysqld(8)
           http://dev.mysql.com/doc/refman/en/using-systemd.html
[root@node02 0_0]#
[root@node02 0_0]#
[root@node02 0_0]#
[root@node02 0_0]#
[root@node02 0_0]# systemctl start mysqld
[root@node02 0_0]#
[root@node02 0_0]# systemctl status mysqld
● mysqld.service - MySQL Server
   Loaded: loaded (/usr/lib/systemd/system/mysqld.service; enabled; vendor preset: disabled)
   Active: active (running) since 三 2024-01-10 00:08:09 CST; 3s ago
     Docs: man:mysqld(8)
           http://dev.mysql.com/doc/refman/en/using-systemd.html
  Process: 3204 ExecStartPre=/usr/bin/mysqld_pre_systemd (code=exited, status=0/SUCCESS)
 Main PID: 3228 (mysqld)
   Status: "Server is operational"
   CGroup: /system.slice/mysqld.service
           └─3228 /usr/sbin/mysqld

1月 10 00:08:08 node02 systemd[1]: Starting MySQL Server...
1月 10 00:08:09 node02 systemd[1]: Started MySQL Server.
[root@node02 0_0]#
[root@node02 0_0]# cat /var/log/mysqld.log | grep localhost
2024-01-09T16:04:24.123912Z 6 [Note] [MY-010454] [Server] A temporary password is generated for root@localhost: #s?deDDo(1sW
[root@node02 0_0]# mysql -uroot -p#s?deDDo(1sW
-bash: 未预期的符号 `(' 附近有语法错误
[root@node02 0_0]# mysql -uroot -p'#s?deDDo(1sW'
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 8
Server version: 8.0.28

Copyright (c) 2000, 2022, 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.

mysql>

6、修改root密码

mysql> alter user 'root'@'localhost' identified by '123456';
Query OK, 0 rows affected (0.00 sec)

mysql> exit
Bye
[root@node02 0_0]# 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: 8.0.28 MySQL Community Server - GPL

Copyright (c) 2000, 2022, 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.

mysql>

7、在node03、node04也部署上mysql

8、设置字符集为utf-8(配置/etc/my.cnf)(根据需要设置)

# 在[mysqld]部分添加
character-set-server=utf8mb4
# 在文件末尾新增[client]段,并在[client]段添加
default-character-set=utf8mb4

9、修改远程访问权限

mysql> grant all on *.* to 'root'@'%' with grant option;
Query OK, 0 rows affected (0.01 sec)

mysql> flush privileges;
Query OK, 0 rows affected (0.00 sec)

 

Step4:主从复制

前提条件:在node03、node04也进行mysql的安装

(1)一主一从

(2)主主复制

(3)一主多从

(4)多主一从

(5)联级复制(灾备)

 

(1)一主一从

1、在主节点(node02)服务器进行如下配置

vi /etc/my.cnf
# ---------------------------------[/etc/my.cnf]-----------------------------------
[mysqld]
# 在mysqld模块中添加如下配置信息
log-bin=master-bin # 二进制文件名称
binlog-format=ROW # 二进制日志格式,有row、statement、mixed三种格式
# row指的是把改变的内容复制过去,而不是把命令在从服务器上执行一遍
# statement指的是在主服务器上执行的SQL语句,在从服务器上执行同样的语句。MySQL默认采用基于语句的复制,效率比较高。
# mixed指的是默认采用基于语句的复制,一旦发现基于语句的无法精确的复制时,就会采用基于行的复制。

server-id=1 # 要求各个服务器的id必须不一样
binlog-do-db=msb # 同步的数据库名称
# ---------------------------------[/etc/my.cnf]-----------------------------------

2、修改/etc/my.cnf之后需要重启服务

systemctl restart mysqld

3、在主库创建用于主从复制的用户slave,并查看主库的file名称和position(在主库执行)

mysql> create user 'slave'@'%' identified with mysql_native_password by 'Admin#2023';
Query OK, 0 rows affected (0.01 sec)

mysql> grant replication slave on *.* to 'slave'@'%';
Query OK, 0 rows affected (0.01 sec)

mysql> flush privileges;
Query OK, 0 rows affected (0.00 sec)

mysql> show master status;
+-------------------+----------+--------------+------------------+-------------------+
| File              | Position | Binlog_Do_DB | Binlog_Ignore_DB | Executed_Gtid_Set |
+-------------------+----------+--------------+------------------+-------------------+
| master-bin.000005 |     1041 | msb          |                  |                   |
+-------------------+----------+--------------+------------------+-------------------+
1 row in set (0.00 sec)

4、修改从服务器的配置文件,修改后重启mysqld服务(在从库执行)

vi /etc/my.cnf
# ---------------------------------[/etc/my.cnf]-----------------------------------
[mysqld]
log-bin=master-bin
binlog-format=ROW
server-id=2
# ---------------------------------[/etc/my.cnf]-----------------------------------

5、在从服务器修改master,并启动slave,查看slave的Slave_IO_RunningSlave_SQL_Running的状态是否是Yes(在从库执行)

mysql> change master to master_host='192.168.1.132',master_port=3306,master_user='slave',master_password='Admin#2023',master_log_file='master-bin.000005',master_log_pos=1041;
Query OK, 0 rows affected, 9 warnings (0.01 sec)
mysql> start slave;
Query OK, 0 rows affected, 1 warning (0.00 sec)

mysql> show slave status \G
*************************** 1. row ***************************
               Slave_IO_State: Waiting for source to send event
                  Master_Host: 192.168.1.132
                  Master_User: slave
                  Master_Port: 3306
                Connect_Retry: 60
              Master_Log_File: master-bin.000005
          Read_Master_Log_Pos: 1041
               Relay_Log_File: node03-relay-bin.000002
                Relay_Log_Pos: 327
        Relay_Master_Log_File: master-bin.000005
             Slave_IO_Running: Yes
            Slave_SQL_Running: Yes

6、在主库msb数据库下新增一个表aa,并insert几条数据,查看从库msb下变化

[node02]

mysql> use msb;
Database changed
mysql> show tables;
Empty set (0.00 sec)

mysql> 
mysql> 
mysql> create table aa(id int,name varchar(255));
Query OK, 0 rows affected (0.01 sec)

mysql> show  tables;
+---------------+
| Tables_in_msb |
+---------------+
| aa            |
+---------------+
1 row in set (0.00 sec)

mysql> insert into aa values (1,'路飞');
Query OK, 1 row affected (0.00 sec)

mysql> insert into aa values (2,'索隆');
Query OK, 1 row affected (0.00 sec)

[node03]

mysql> show tables from msb;
Empty set (0.00 sec)

mysql> show tables from msb;
+---------------+
| Tables_in_msb |
+---------------+
| aa            |
+---------------+
1 row in set (0.00 sec)

mysql> 
mysql> 
mysql> select * from aa;
ERROR 1046 (3D000): No database selected
mysql> select * from msb.aa;
Empty set (0.00 sec)

mysql> 
mysql> 
mysql> 
mysql> select * from msb.aa;
Empty set (0.00 sec)

mysql> select * from msb.aa;
+------+--------+
| id   | name   |
+------+--------+
|    1 | 路飞   |
|    2 | 索隆   |
+------+--------+
2 rows in set (0.00 sec)

一主一从配置完毕

如果同步出错,则停止同步,重置后再次开启同步。

 

(2)主主复制

(3)一主多从

(4)多主一从

(5)联级复制(灾备)

 

 

 

未完待续......

posted @   HOUHUILIN  阅读(119)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· SQL Server 2025 AI相关能力初探
· AI编程工具终极对决:字节Trae VS Cursor,谁才是开发者新宠?
· 开源Multi-agent AI智能体框架aevatar.ai,欢迎大家贡献代码
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
点击右上角即可分享
微信分享提示