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_Running
和Slave_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)联级复制(灾备)
未完待续......
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· SQL Server 2025 AI相关能力初探
· AI编程工具终极对决:字节Trae VS Cursor,谁才是开发者新宠?
· 开源Multi-agent AI智能体框架aevatar.ai,欢迎大家贡献代码
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南