mysql读写分离和组复制_实现mysql的读写分离(mysql-proxy)____1(mysql的主从复制,基于gtid的主从复制,半同步复制,组复制)...

主从复制原理:

4d84123f70a3b18e653635116a1a2d32.png

从库生成两个线程,一个I/O线程,一个SQL线程;

i/o线程去请求主库 的binlog,并将得到的binlog日志写到relay log(中继日志) 文件中;

主库会生成一个 log dump 线程,用来给从库 i/o线程传binlog;

SQL 线程,会读取relay log文件中的日志,并解析成具体操作,来实现主从的操作一致,而最终数据一致;

mysql的日志类型:

Error log 错误日志

General query log普通查询日志

Slow query log 慢查询日志(记录哪些查询比较慢 )

Binary log二进制日志文件(1、用于增量备份。2、主从)

要实现MySQL的主从复制,首先必须打开Master端的Binlog记录功能,否则就无法实现。因为整个复制过程实际上就是Slave从Master端获取BInlog日志,然后再在Slave上以相同顺序执行获取的binlog日志中记录的各种SQL操作。

1.传统的实现数据库主从复制

单向复制,只能slave复制master的,即slave对master库只读

base2 172.25.78.12 master

base3172.25.78.13slaver

# 在master上

[root@base2 ~]# tar xf mysql-5.7.24-1.el7.x86_64.rpm-bundle.tar

[root@base2 ~]# ls

mysql-5.7.24-1.el7.x86_64.rpm-bundle.tar

mysql-community-client-5.7.24-1.el7.x86_64.rpm

mysql-community-common-5.7.24-1.el7.x86_64.rpm

mysql-community-devel-5.7.24-1.el7.x86_64.rpm

mysql-community-embedded-5.7.24-1.el7.x86_64.rpm

mysql-community-embedded-compat-5.7.24-1.el7.x86_64.rpm

mysql-community-embedded-devel-5.7.24-1.el7.x86_64.rpm

mysql-community-libs-5.7.24-1.el7.x86_64.rpm

mysql-community-libs-compat-5.7.24-1.el7.x86_64.rpm

mysql-community-minimal-debuginfo-5.7.24-1.el7.x86_64.rpm

mysql-community-server-5.7.24-1.el7.x86_64.rpm

mysql-community-server-minimal-5.7.24-1.el7.x86_64.rpm

mysql-community-test-5.7.24-1.el7.x86_64.rpm

[root@base2 ~]# yum install -y mysql-community-client-5.7.24-1.el7.x86_64.rpm \

mysql-community-common-5.7.24-1.el7.x86_64.rpm \

mysql-community-libs-5.7.24-1.el7.x86_64.rpm \

mysql-community-libs-compat-5.7.24-1.el7.x86_64.rpm \

mysql-community-server-5.7.24-1.el7.x86_64.rpm # 只需要这五个即可

[root@base2 ~]# vim /etc/my.cnf

log-bin=mysql-bin # 启用二进制功能,主从复制基础

server-id=1 # id唯一

5d1c674877dab0f24fe65de55d39fd13.png

[root@base2 ~]# systemctl start mysqld

[root@base2 ~]# cat /var/log/mysqld.log | grep password # 查看临时密码

61f37165a14d744e6c200459ceb154c7.png

[root@base2 ~]# mysql -p # 我们可以用临时密码登录数据库,但是什么都干不了

Enter password:

mysql> show databases;

7ec982495c5715993f3b259ff1a95181.png

[root@base2 ~]# mysql_secure_installation # 初始化密码

6ee0d8a4a0eb0387c3838d93292981ed.png

5456cbbbe1a996b5334237d8619df2b3.png

0c77939fd5b067ffb2631f1bf3f43a35.png

[root@base2 ~]# mysql -p # 再次登录,可以正常使用

Enter password:

mysql> show databases;

82bb9870a85b588e6504d9bf93361ee6.png

mysql> grant replication slave on *.* to repl@'172.25.78.%' identified by 'Ting@666'; # 为服务器创建一个连接账户并授予权限,*.*表示所有权限;172.25.78.%表示这个网段的所有用户都有这个权限

mysql> show master status;

ab595c2d93d4b405cd72a5d9b3e8118c.png

# 在slave上

先测试master数据库是否能远程登录

[root@base2 ~]# mysql -h 172.25.78.12 -u repl -p

Enter password:

mysql> show databases; # 测试成功

31922ed4180762cf50156bdeb7cc54c9.png

mysql> quit

1

开始配置slave的数据库

[root@base3 ~]# tar xf mysql-5.7.24-1.el7.x86_64.rpm-bundle.tar

[root@base3 ~]# yum install -y mysql-community-client-5.7.24-1.el7.x86_64.rpm \

mysql-community-common-5.7.24-1.el7.x86_64.rpm \

mysql-community-libs-5.7.24-1.el7.x86_64.rpm \

mysql-community-libs-compat-5.7.24-1.el7.x86_64.rpm \

mysql-community-server-5.7.24-1.el7.x86_64.rpm

[root@base3 ~]# vim /etc/my.cnf

server-id=2

注:从服务器 ID 号,不能和主 ID 相同,如果设置多个从服务

器,每个从服务器必须有一个唯一的 server-id 值,必须与主服

务器的以及其它从服务器的不相同。可以认为 server-id 值

类似于 IP 地址:这些 ID 值能唯一识别复制服务器群集中的

每个服务器实例。

[root@base3 ~]# systemctl start mysqld

[root@base3 ~]# cat /var/log/mysqld.log | grep password

030611f12ce5058b538ad901e3f5b382.png

[root@base3 ~]# mysql_secure_installation # 初始化密码

[root@base3 ~]# mysql -p

mysql> change master to master_host='172.25.78.12',master_user='repl',master_password='Ting@666',master_log_file='mysql-bin.000002',master_log_pos=1003; # 从库和主库建立连接,必须和主服务器里查看到的数据保持一致

mysql> start slave;

mysql> show slave status\G;

936f46b1daaca5ac5f8e35ede3d90894.png

#在master上创建数据库

[root@base2 ~]# mysql -p

Enter password:

mysql> create database test;

mysql> use test;

mysql> create table userlist(

-> username varchar(15) not null,

-> password varchar(25) not null);

mysql> desc userlist;

d0a17bda49b3b849c79d57f48cc24de8.png

mysql> insert into userlist values ('userq','111');

mysql> insert into userlist values ('user1','222');

mysql> select * from userlist; # 建立成功

e2fdb29fa0edd01e9b508fa73d10816b.png

# 在slave上查看是否同步

[root@base3 ~]# mysql -p

Enter password:

mysql> show databases;

cf47a55818997db386bf205d89908110.png

mysql> use test;

mysql> show tables;

6186028b13758918f6c4baa1cf1c0e49.png

mysql> select * from userlist; # 同步成功

e1020f700711133376f5e984f2101b69.png

2.gtid实现主从复制

相比于传统的主从复制优点:不需要知道复制哪个文件,也不需要知道从哪个号开始复制

# 在master上

[root@base2 ~]# vim /etc/my.cnf

log-bin=mysql-bin

server-id=1

gtid_mode =ON

enforce-gtid-consistency=true

[root@base2 ~]# systemctl restart mysqld

[root@base2 ~]# mysql -p

Enter password:

mysql> grant replication slave on *.* to repl@'172.25.78.%' identified by 'Ting@666'; # 为服务器创建一个连接账户并授予权限,*.*表示所有权限;172.25.78.%表示这个网段的所有用户都有这个权限

# 在slave上

[root@base3 ~]# vim /etc/my.cn

server-id=2

gtid_mode =ON

enforce-gtid-consistency=true

[root@base3 ~]# systemctl restart mysqld

[root@base3 ~]# mysql -p

Enter password:

mysql> stop slave;

mysql> change master to master_host='172.25.78.12',master_user='repl',master_password='Ting@666',MASTER_AUTO_POSITION=1; # 改变slave服务器用于连接master服务器的参数,此处把MASTER值设为动态

mysql> start slave;

mysql> show slave status\G;

6669dfcd8721382f832d9cb00cb4f668.png

# 在master上创建数据库

mysql> show master status; # 数据已经改变

c1565efdd09645c7d7ea8faaab3a0674.png

mysql> create database westos;

mysql> show databas

d919f76738c53fee6a1a9e64f62a4d7e.png

# 在slave端查看是否同步

mysql> show databases;

8aeabfe8f8b0a8d9fd603db54f36a043.png

[root@base3 ~]# mysql -p

Enter password:

mysql> use mysql;

mysql> show tables;

27fdd8237d32c8fed13c50ff80d1d5c5.png

mysql> select * from gtid_executed;

9473ecb2c542888f38874ade23f46a6d.png

[root@base3 ~]# cd /var/lib/mysql

[root@base3 mysql]# ls

64620b7846c65ddeeabe641b5ce2344a.png

mysql主从复制存在的问题:

1.主库宕机后,数据可能丢失

2.从库只有一个sql Thread,主库写压力大,复制很可能延时

# 解决方法:

1.半同步复制----解决数据丢失的问题

2.并行复制----解决从库复制延迟的问题

4.基于gtid实现半同步

关于半同步:

介于异步复制和全同步复制之间,主库在执行完客户端提交的事务后

不是立刻返回给客户端,而是等待至少一个从库接收到并写到relay log中才

返回给客户端。相对于异步复制,半同步复制提高了数据的安全性,同时

它也造成了一定程度的延迟,这个延迟最少是一个TCP/IP往返的时间。

所以,半同步复制最好在低延时的网络中使用。

6795fe8c64d9e15a595c3c6d7f9e23cf.png

# 在master上

mysql> install plugin rpl_semi_sync_master soname 'semisync_master.so'; # 下载插件

mysql> SELECT PLUGIN_NAME, PLUGIN_STATUS FROM INFORMATION_SCHEMA.PLUGINS WHERE PLUGIN_NAME LIKE '%semi%'; # 查看插件是否加载成功

a4fcdbf669469548478ab3439ca44986.png

mysql> show global variables like '%semi%';

mysql> set global rpl_semi_sync_master_enabled=1; # 设置变量,启用半同步复制,这是临时设置,永久设置需要编辑文件/etc/my.cnf写入rpl_semi_sync_master_enabled=1

mysql> show global variables like '%semi%';

1e605918256b56659ce2e031a99ca6d7.png

mysql> show global status like '%semi%'; # 可以用这些参数进行监控

f93db994724ba8d38729d3d6aab1b379.png

mysql> show status like 'Rpl_semi_sync_master_status'; # 查看半同步是否在运行

0736b1700561c784552358514bea0ca5.png

# 配置slave服务器

mysql> install plugin rpl_semi_sync_slave soname 'semisync_slave.so'; # 下载插件

mysql> set global rpl_semi_sync_slave_enabled=1; # 设置变量,启用半同步复制

mysql> stop slave IO_THREAD; # 重启slave上的IO线程,重启后,slave会在master上注册为半同步复制的slave角色,否则还是异步复制

mysql> start slave IO_THREAD;

mysql> show global variables like '%semi%';

b535dd5377ff37be2ac4ec7d6ea8b326.png

mysql> show status like 'Rpl_semi_sync_slave_status'; # 查看半同步是否在运行

0880e2ea4c030235693753c6039d8858.png

# 测试:

(1)在Slave执行stop slave后,master的create操作需要10.76s才返回,而这与rpl_semi_sync_master_timeout参数的时间相吻合。

在slave上

mysql> stop slave;

mysql> show status like 'Rpl_semi_sync_slave_status';

41564eb4a921e99dc062ad92373766a8.png

在master上

mysql> create database student;

11ed76bef6c8e9f09156458658ac8f1a.png

mysql> show global status like '%semi%';

c4cc5cebf5d9a93216a4611f73e9e491.png

(2)在Slave执行stop slave之前,master的drop操作很快就能返回。

在slave上

mysql>mysql> start slave IO_THREAD;

mysql> show databases; # 当slave启动时,数据会自动同步,不会丢失

95edbb4969a0f7ae30f19d22470d8524.png

mysql> show status like 'Rpl_semi_sync_slave_status';

03f53366fc18d9008a2137c8556557d0.png

在master上

mysql> drop database student;

d1683ec12651e4d0064029b4224a973c.png

事实上,半同步复制并不是严格意义上的半同步复制,当半同步复制发生超时时(由rpl_semi_sync_master_timeout参数控制,单位是毫秒,默认为10000,即10s),会暂时关闭半同步复制,转而使用异步复制。当master dump线程发送完一个事务的所有事件之后,如果在rpl_semi_sync_master_timeout内,收到了从库的响应,则主从又重新恢复为半同步复制。

5.基于gtid实现并行复制

为什么会出现并行复制呢?

因为在5.7的mysql生产环境中,slave端进行复制时,IO线程和SQL线程都是单线程,而master端

是多线程,多新城肯定比单线程快的多,这就出现了复制延迟的问题,我们用并行复制就可以解决

这个问题,并行复制的目的就是要让slave尽可能的多线程跑起来,当然基于库级别的多线程也是

一种方式(不同库的事务,没有锁冲突)

# 在slave端

[root@base3 ~]# vim /etc/my.cnf

slave-parallel-type=LOGICAL_CLOCK # 并行的类型

slave-parallel-workers=5 # 开启多少个线程

master_info_repository=TABLE # maste.info和relay.info是以表的形式存储的

relay_log_info_repository=TABLE # 存储日志以表的形式

relay_log_recovery=ON # 支持恢复

[root@base3 ~]# systemctl restart mysqld

[root@base3 ~]# mysql -p

Enter password:

mysql> show processlist;

ed4444df1e836f738a7ed5a7053c5e1f.png

6.组复制

MySQL 组复制实现了基于复制协议的多主更新。

1)复制组由多个 server成员构成,并且组中的每个 server 成员可以独立地执行事务。但所有读

写(RW)事务只有在冲突检测成功后才会提交。只读(RO)事务不需要在冲突检测,可以立即提交。

一.特点:

● 高一致性

基于原生复制及 paxos 协议的组复制技术,并以插件的方式提供,提供一致数据安全保证;

● 高容错性

只要不是大多数节点坏掉就可以继续工作,有自动检测机制,当不同节点产生资源争用冲突时,不会出现错误,按照先到者优先原则进行处理,并且内置了自动化脑裂防护机制;

● 高扩展性

节点的新增和移除都是自动的,新节点加入后,会自动从其他节点上同步状态,直到新节点和其他节点保持一致,如果某节点被移除了,其他节点自动更新组信息,自动维护新的组信息;

● 高灵活性

有单主模式和多主模式,单主模式下,会自动选主,所有更新操作都在主上进行;

多主模式下,所有 server 都可以同时处理更新操作。

二、什么样的应用场景适合用组复制?

1、弹性的数据库复制环境

组复制可以灵活的增加和减少集群中的数据库实例

2、高可用的数据库环境

组复制允许数据库实例宕机,只要集群中大多数服务器可用,则整个数据库服务可用

3、替代传统主从复制结构的数据库环境

base2172.25.78.12master1

base3172.25.78.13master2

base4172.25.78.14master3

恢复环境,准备重新初始化

# base2上

[root@base2 ~]# systemctl stop mysqld

[root@base2 ~]# cd /var/lib/mysql

[root@base2 mysql]# rm -fr *

[root@base2 mysql]# ps ax | grep mysqld # 确保没有mysqld进程

82e51df62b1bd77d75d2d9a50875e210.png

[root@base2 mysql]# uuidgen # 随机生成uuid

e3c782ed-8970-4905-a7f8-1d0547d81f0c

[root@base2 mysql]# vim /etc/my.cnf

server_id=1

gtid_mode=ON # 启用二进制日志

enforce_gtid_consistency=ON

master_info_repository=TABLE

relay_log_info_repository=TABLE

binlog_checksum=NONE

log_slave_updates=ON # 开启日志同步

log_bin=binlog

binlog_format=ROW # 二进制日志格式

transaction_write_set_extraction=XXHASH64

loose-group_replication_group_name="e3c782ed-8970-4905-a7f8-1d0547d81f0c" # 这是随机生成的,但是一旦设定,uuid就是确定的

loose-group_replication_start_on_boot=off # 开机不启动

loose-group_replication_local_address="172.25.78.12:24901" # 绑定本地的172.25.78.12以及24901端口接受其他组成员的连接

loose-group_replication_group_seeds="172.25.78.12:24901,172.25.78.13:24901,172.25.78.14:24901" # 组复制的成员

loose-group_replication_bootstrap_group=off # 配置不自动引导组

loose-group_replication_ip_whitelist="127.0.0.1,172.25.78.0/24" # 允许网段

loose-group_replication_enforce_update_everywhere_checks=ON # 更新检测

loose-group_replication_single_primary_mode=OFF # 设置组自动选择一个 server 来处理读/写工作。

88accdde566bab4a80475e7355afc294.png

[root@base2 mysql]# systemctl start mysqld # 开启数据库

[root@base2 mysql]# cat /var/log/mysqld.log | grep password # 获取初始密码

097b5d27e5dbe67f90c903fb7c93b369.png

[root@base2 mysql]# mysql -p # 用初始密码登录数据库

Enter password:

mysql> alter user root@localhost identified by 'Ting@666'; # 修改本地用户密码

mysql> SET SQL_LOG_BIN=0; # 关闭二进制日志,避免在从服务上复制

mysql> CREATE USER rpl_user@'%' IDENTIFIED BY 'Ting@666'; # 赋予用户密码

mysql> GRANT REPLICATION SLAVE ON *.* TO rpl_user@'%'; # 授权

mysql> FLUSH PRIVILEGES; # 刷新

mysql> SET SQL_LOG_BIN=1; # 开启日志

mysql> CHANGE MASTER TO MASTER_USER='rpl_user', MASTER_PASSWORD='Ting@666' FOR CHANNEL 'group_replication_recovery'; # 配置组用户

mysql> INSTALL PLUGIN group_replication SONAME 'group_replication.so'; # 安装plugin插件

mysql> SET GLOBAL group_replication_bootstrap_group=ON; #这句只有base2,在第一次执行引导组的时候执行

mysql> START GROUP_REPLICATION; # 开启组复制

mysql> SET GLOBAL group_replication_bootstrap_group=OFF;

mysql> SELECT * FROM performance_schema.replication_group_members; # 查看组复制成员

b553bbbfb54b41e3ab0f0a1e02368b55.png

mysql> CREATE DATABASE test: # 创建数据库

mysql> use test;

Database changed

mysql> CREATE TABLE t1 (c1 INT PRIMARY KEY, c2 TEXT NOT NULL); # 创建表

mysql> INSERT INTO t1 VALUES (1, 'Luis');

mysql> SELECT * FROM t1;

e1d5cf1f3b98ac9681d13302df446cbc.png

###### # 在base3上

[root@base3 ~]# systemctl stop mysqld

[root@base3 ~]# cd /var/lib/mysql

[root@base3 mysql]# rm -fr *

[root@base3 mysql]# vim /etc/my.cnf

server_id=2

gtid_mode=ON # 启用二进制日志

enforce_gtid_consistency=ON

master_info_repository=TABLE

relay_log_info_repository=TABLE

binlog_checksum=NONE

log_slave_updates=ON # 开启日志同步

log_bin=binlog

binlog_format=ROW # 二进制日志格式

transaction_write_set_extraction=XXHASH64

loose-group_replication_group_name="e3c782ed-8970-4905-a7f8-1d0547d81f0c" # 这是随机生成的,但是一旦设定,uuid就是确定的

loose-group_replication_start_on_boot=off # 开机不启动

loose-group_replication_local_address="172.25.78.13:24901"

loose-group_replication_group_seeds="172.25.78.12:24901,172.25.78.13:24901,172.25.78.14:24901" # 组复制的成员

loose-group_replication_bootstrap_group=off

loose-group_replication_ip_whitelist="127.0.0.1,172.25.78.0/24" # 允许网段

loose-group_replication_enforce_update_everywhere_checks=ON # 更新检测

loose-group_replication_single_primary_mode=OFF

219faad7538bdda36fab088f1beac46d.png

[root@base3 mysql]# systemctl start mysqld

[root@base3 mysql]# cat /var/log/mysqld.log | grep password

2c1ee12fc8d4450810c89c3edde4769b.png

[root@base3 mysql]# mysql -p

Enter password:

mysql> alter user root@localhost identified by 'Ting@666';

mysql> SET SQL_LOG_BIN=0;

mysql> CREATE USER rpl_user@'%' IDENTIFIED BY 'Ting@666';

mysql> GRANT REPLICATION SLAVE ON *.* TO rpl_user@'%';

mysql> FLUSH PRIVILEGES;

mysql> SET SQL_LOG_BIN=1;

mysql> CHANGE MASTER TO MASTER_USER='rpl_user', MASTER_PASSWORD='Ting@666' FOR CHANNEL 'group_replication_recovery';

mysql> INSTALL PLUGIN group_replication SONAME 'group_replication.so';

mysql> START GROUP_REPLICATION;

4f066db78a9c06dad954c838203019f9.png

mysql> STOP GROUP_REPLICATION;

mysql> reset master;

mysql> START GROUP_REPLICATION;

# base4上

[root@base4 ~]# ls

mysql-community-client-5.7.24-1.el7.x86_64.rpm

mysql-community-libs-compat-5.7.24-1.el7.x86_64.rpm

mysql-community-common-5.7.24-1.el7.x86_64.rpm

mysql-community-server-5.7.24-1.el7.x86_64.rpm

mysql-community-libs-5.7.24-1.el7.x86_64.rpm

[root@base4 ~]# yum install -y *

[root@base4 ~]# vim /etc/my.cnf

server_id=3

gtid_mode=ON # 启用二进制日志

enforce_gtid_consistency=ON

master_info_repository=TABLE

relay_log_info_repository=TABLE

binlog_checksum=NONE

log_slave_updates=ON # 开启日志同步

log_bin=binlog

binlog_format=ROW # 二进制日志格式

transaction_write_set_extraction=XXHASH64

loose-group_replication_group_name="e3c782ed-8970-4905-a7f8-1d0547d81f0c" # 这是随机生成的,但是一旦设定,uuid就是确定的

loose-group_replication_start_on_boot=off # 开机不启动

loose-group_replication_local_address="172.25.78.14:24901"

loose-group_replication_group_seeds="172.25.78.12:24901,172.25.78.13:24901,172.25.78.14:24901" # 组复制的成员

loose-group_replication_bootstrap_group=off

loose-group_replication_ip_whitelist="127.0.0.1,172.25.78.0/24" # 允许网段

loose-group_replication_enforce_update_everywhere_checks=ON # 更新检测

loose-group_replication_single_primary_mode=OFF

[root@base4 ~]# systemctl start mysqld

[root@base4 ~]# cat /var/log/mysqld.log | grep password

e92ecf582b585fcdbc6519243ecd5869.png

[root@base4 ~]# mysql -p

Enter password:

mysql> alter user root@localhost identified by 'Ting@666';

mysql> SET SQL_LOG_BIN=0;

mysql> CREATE USER rpl_user@'%' IDENTIFIED BY 'Ting@666';

mysql> GRANT REPLICATION SLAVE ON *.* TO rpl_user@'%';

mysql> FLUSH PRIVILEGES;

mysql> SET SQL_LOG_BIN=1;

mysql> CHANGE MASTER TO MASTER_USER='rpl_user', MASTER_PASSWORD='Ting@666' FOR CHANNEL 'group_replication_recovery';

mysql> INSTALL PLUGIN group_replication SONAME 'group_replication.so';

mysql> reset master;

mysql> START GROUP_REPLICATION; # 开启组复制

mysql> SELECT * FROM performance_schema.replication_group_members; # 查看组成员成员状态

f53ffa70641886e0696e88502f0ed53a.png

mysql> show databases; # 直接查看,把master1上的数据同步成功

525bc73c42194bbc9287d05e17bf42b9.png

mysql> use test;

Database changed

mysql> show tables;

b316d4e416f211c65a23804cebf6cc25.png

# 在master2上查看,也同步成功

mysql> use test;

Database changed

mysql> select * from t1;

d172cdc60576ece0c0bdc79294539937.png

# 在任意一方插入数据都可以成功,也都能查看到插入的数据

mysql> INSERT INTO t1 VALUES (2, ‘lala');

mysql> INSERT INTO t1 VALUES (3, ‘haha');

mysql> select * from t1;

d2a17b15eed1048a2a3e8ec0004ad43f.png

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值