Mycat分片(分库分表)实践:一张逻辑表拆分为4台服务器的16张表

分库分表实战指南:从分片键选择到平滑扩容的架构演进 在互联网业务高速增长下,单一数据库实例往往面临存储容量与并发连接的双重瓶颈。当索引优化、缓存、读写分离等手段已经无法满足性能要求时,分库分表便成为高并发场景下数据架构演进的必然选择。从垂直拆分按业务模块解耦,到水平拆分按数据行分散存储,分片键的选取直接决定了数据分布的均匀性与查询路由效率,取模分片与范围分片各有优劣,数据倾斜与热点行问题则需要借助动态路由或全局字典表来应对。落地过程中,ShardingSphere-JDBC等中间件与雪花算法生成的分布式ID是常见技术组合,但同时也引入了跨库join、深度分页 阅读详情

需求

一张业务表有10亿数据,需要按身份证号字段certno拆分为4台服务器中的16个子表,怎么操作?

设计

使用mycat的分片功能实现分库分表

4台服务器,每台服务器起一个mysql实例,每个实例创建4个database,每个database建一张同名(tu_trade_ng)的表

制定mycat的分片规则,按certno字段的hash值进行分片

mysql 实例databasetablename
127.0.0.1:7006nifa_db_t0tu_trade_ng
nifa_db_t1tu_trade_ng
nifa_db_t2tu_trade_ng
nifa_db_t3tu_trade_ng
127.0.0.1:7007nifa_db_t0tu_trade_ng
nifa_db_t1tu_trade_ng
nifa_db_t2tu_trade_ng
nifa_db_t3tu_trade_ng
127.0.0.1:7008nifa_db_t0tu_trade_ng
nifa_db_t1tu_trade_ng
nifa_db_t2tu_trade_ng
nifa_db_t3tu_trade_ng
127.0.0.1:7009nifa_db_t0tu_trade_ng
nifa_db_t1tu_trade_ng
nifa_db_t2tu_trade_ng
nifa_db_t3tu_trade_ng

实现

mysql创建database

每个mysql实例中创建4个database,共计16个database:

CREATE DATABASE `nifa_db_t0` /*!40100 DEFAULT CHARACTER SET utf8 */;
CREATE DATABASE `nifa_db_t1` /*!40100 DEFAULT CHARACTER SET utf8 */;
CREATE DATABASE `nifa_db_t2` /*!40100 DEFAULT CHARACTER SET utf8 */;
CREATE DATABASE `nifa_db_t3` /*!40100 DEFAULT CHARACTER SET utf8 */;

mysql创建table

每个database中创建一个table,共计16个table:

# 复用了tu_trade_total_area_0的表结构
create table nifa_db_t0.tu_trade_ng like tu_trade_total_area_0;
create table nifa_db_t1.tu_trade_ng like tu_trade_total_area_0;
create table nifa_db_t2.tu_trade_ng like tu_trade_total_area_0;
create table nifa_db_t3.tu_trade_ng like tu_trade_total_area_0;

mycat制定

mycat需要配置的东西:
scheme.xml

<!-- 表名登记 以及分片规则、datanode关联 -->
<table name="tu_trade_ng" primaryKey="ID"  rule="certno-hashcode"  dataNode="dnng$1-16" />
<!-- 16个datanode -->
<dataNode name="dn1" dataHost="NIFADB_1" database="nifa_db_t0" />
<dataNode name="dn2" dataHost="NIFADB_1" database="nifa_db_t1" />
<dataNode name="dn3" dataHost="NIFADB_1" database="nifa_db_t2" />
<dataNode name="dn4" dataHost="NIFADB_1" database="nifa_db_t3" />
<dataNode name="dn5" dataHost="NIFADB_2" database="nifa_db_t0" />
<dataNode name="dn6" dataHost="NIFADB_2" database="nifa_db_t1" />
<dataNode name="dn7" dataHost="NIFADB_2" database="nifa_db_t2" />
<dataNode name="dn8" dataHost="NIFADB_2" database="nifa_db_t3" />
<dataNode name="dn9" dataHost="NIFADB_3" database="nifa_db_t0" />
<dataNode name="dn10" dataHost="NIFADB_3" database="nifa_db_t1" />
<dataNode name="dn11" dataHost="NIFADB_3" database="nifa_db_t2" />
<dataNode name="dn12" dataHost="NIFADB_3" database="nifa_db_t3" />
<dataNode name="dn13" dataHost="NIFADB_4" database="nifa_db_t0" />
<dataNode name="dn14" dataHost="NIFADB_4" database="nifa_db_t1" />
<dataNode name="dn15" dataHost="NIFADB_4" database="nifa_db_t2" />
<dataNode name="dn16" dataHost="NIFADB_4" database="nifa_db_t3" />
<!-- 4个mysql实例 -->
<dataHost name="NIFADB_1" maxCon="1000" minCon="10" balance="0"
        writeType="0" dbType="mysql" dbDriver="native" switchType="1"  slaveThreshold="100">
        <heartbeat>show slave status</heartbeat>
        <writeHost host="NIFADB_HOST_M1" url="127.0.0.1:7006" user="dusername" password="password">
        </writeHost>
</dataHost>
<dataHost name="NIFADB_2" maxCon="1000" minCon="10" balance="1"
        writeType="0" dbType="mysql" dbDriver="native" switchType="1"  slaveThreshold="100">
        <heartbeat>show slave status</heartbeat>
        <writeHost host="NIFADB_HOST_M2" url="127.0.0.1:7007" user="dusername" password="password">
        </writeHost>
</dataHost>
<dataHost name="NIFADB_3" maxCon="1000" minCon="10" balance="1"
        writeType="0" dbType="mysql" dbDriver="native" switchType="1"  slaveThreshold="100">
        <heartbeat>show slave status</heartbeat>
        <writeHost host="NIFADB_HOST_M3" url="127.0.0.1:7008" user="dusername" password="password">
        </writeHost>
</dataHost>
<dataHost name="NIFADB_4" maxCon="1000" minCon="10" balance="1"
        writeType="0" dbType="mysql" dbDriver="native" switchType="1"  slaveThreshold="100">
        <heartbeat>show slave status</heartbeat>
        <writeHost host="NIFADB_HOST_M4" url="127.0.0.1:7009" user="dusername" password="password">
        < /writeHost>
</dataHost>

rule.xml

<!-- 分片规则 columns是table中的列名 algorithm是分片算法  -->
<tableRule name="certno-hashcode">
    <rule>
        <columns>certno</columns>
        <algorithm>func_ng</algorithm>
    </rule>
</tableRule>
<!-- 分片算法 partitionCount是我们要分的16个表 partitionCount*partitionLength=1024  -->
<!-- 注意1024是固定值,不能变!!!  -->
<function name="func_ng" class="org.opencloudb.route.function.PartitionByLong">
    <property name="partitionCount">16</property>
    <property name="partitionLength">64</property>
</function>

说明:
使用mycat的固定分片hash 算法,本条规则类似于十进制的求模运算,区别在于是二进制的操作,是取id 的二进制低10 位,即id 二进制&1111111111。
此算法的优点在于如果按照10 进制取模运算,在连续插入1-10 时候1-10 会被分到1-10 个分片,增大了插入的事务控制难度,而此算法根据二进制则可能会分到连续的分片,减少插入事务事务控制难度。
1024是固定的,即最大支持1024 分区。

测试

# 插入121条数据 分了五个不等分的批次插入,插入10条到30条不等,每一条的certno字段都不一样(每批次的certno在数字上连续)
insert into tu_trade_ng (NAME , CERTTYPE , CERTNO , ...... ) values ('余崇天','0','110120199901012233',......);

# count总的数据量
select count(*) from tu_trade_ng;
+--------+
| COUNT0 |
+--------+
|    121 |
+--------+

# count每个table的数据量 
+-----------+
| count(* ) |
+-----------+
|        60 | // dn1
|         1 | // dn2
|         0 | // dn3
|         0 | // dn4
|         1 | // dn5
|         0 | // dn6
|         0 | // dn7
|         0 | // dn8
|         1 | // dn9
|         1 | // dn10
|         9 | // dn11
|         0 | // dn12
|         1 | // dn13
|         2 | // dn14
|        25 | // dn15
|        20 | // dn16
+-----------+

测试说明了:

  1. 我们的分库分表生效了,从mycat中查询的数据量等于从mysql中分表查询的数据量
  2. 固定分片hash 算法的优点:算法根据二进制则可能会分到连续的分片,减少插入事务事务控制难度

注意

mycat不支持insert into ... select ...这种sql:

insert into tu_trade_ng (NAME , CERTTYPE , CERTNO , ......) 
select NAME , CERTTYPE , CERTNO , ......  from an_old_table;

注意schema中的mysql实例账号(下面的user字段),要保证该账号能访问每一个tu_trade_ng表,不然使用mycat操作的tu_trade_ng会失败:

<writeHost host="NIFADB_HOST_M3" url="127.0.0.1:7008" user="dusername" password="password">

以上实践参考官方文档。

海量数据大课学习笔记(16)-热恋的感觉-海量数据下的分库分表 技术栈讲解一-小滴课堂 简介: 大话业界常见分库分表中间件介绍业界常见分库分表中间件Cobar(已经被淘汰没使用了)TDDL淘宝根据自己的业务特点开发了 TDDL (Taobao Distributed Data Layer)基于JDBC规范,没有server,以client-jar的形式存在,引入项目即可使用开源功能比较少,阿里内部使用为主Mycat地址Java语言编写的MySQL数据库网络协议的开源中间件,前身 Cobar遵守Mysql原生协议,跨语言,跨平台,跨数据库的通用中间件代理。... 阅读详情

相关推荐

人工智能-CS188 Project 2: Multi-agents

一、项目介绍 项目介绍网页 项目代码下载 本项目是采用Berkeley的CS188课程内容实习二的内容,在这个项目中,我们将为经典版本的Pacman 设计自动算法,包括幽灵。在此过程中,我们将实现 minimax 和 expectimax 搜索并尝试评估函数设计 完成作业只需要完成5个题目,按照项目介绍的步骤进行完成,主要是在multiAgents.py文件中进行补充代码 二、代码详情 1、Question1:Reflex Agent 略 2、Question2:Minimax 套用ppt上的minm

xiten的博客 8282

Mycat实现分库分表_mycat如何对现有库做分库分表

IPschemaorders分库操作不是在原来的老数据库上进行操作,需要准备两台机器分别安装新的数据库。在数据节点dn1dn2上分别创建数据库ordersMycat登录切换到创建四个表,客户表(customer)、订单表(orders)、订单详细表() 、订单状态字典表(查看表信息,可以看到成功分库。

2301_82241942的博客 922

Jetson-nano 编译实时内核并烧录

前言 之前一篇文章介绍了正常的烧录过程,使用的是默认内核,实际工作中需要对内核打补丁升级为实时内核,并对其重编译。 一、准备内容 官网大法好 官方内核下载链接 官方交叉编译器下载链接 官方文档 ubuntu主机一台 根据官网选择下载对应的文件, 1、L4TDriver Package (BSP) source jetson内核文件。 2、官方交叉编译器 因为我们不是在jetson上直接编译,而jetson是arm平台,所以要进行交叉编译。 二、使用步骤 1.解压 内核 tar -xjf public_s

ldl371122的博客 3286

[原创]分表处理设计思想和实现

分表处理设计思想和实现 作者:heiyeluren (黑夜路人) 博客:http://blog.youkuaiyun.com/heiyeshuwu 时间:2007-01-19 01:44:20 一、概述 分表是个目前算是比较炒的比较流行的概念,特别是在大负载的情况下,分表是一个良好分散数据库压力的好方法。 首先要了解为什么要分表,分表的好处是什么。我们先来大...

197

GD32F470移植LWIP协议,PHY芯片DP83848I

也就是说前24位是有规定的,其中48位MAC中的前几位也是有着对应的含义的。2、旧版LWIP(如1.4.1)存在DHCP状态机卡死问题,建议升级至2.1.3+。

m0_61973119的博客 1587

XGBoost原生接口和Sklearn接口参数详解

XGBoost原生接口和Sklearn接口参数详解

算法工程师 2654

【MySQL】③MyCat分库分表分片规则配置详解与实战

在mycat中,主要提供了9中不同的分片规则,他们分别是:按照范围分片、取模分片、一致性hash分片、枚举分片、应用指定算法分片、固定hash算法分片、字符hash解析分片、按天分片、按自然月份分片。简单来说,一个电商部门有很多业务场景,例如秒杀、营销、商品、库存、B端管理、订单、交易、配送、售后、结算等等,垂直分库就是不同的业务模块小组单独使用一个库。-- rule.xml文件,可以看出是 根据 id 的值进行分片,具体的分片算法是 rang-long -->

weixin_44921942的博客 1002

LLCC68芯片系统架构与LoRa驱动开发核心解析

LoRa射频收发器是低功耗广域物联网(LPWAN)的关键组件,其本质是集成了调制解调器、协议引擎、数据缓冲区与电源管理的专用SoC。理解其工作模式状态机(Sleep/Standby/TX/RX)与SPI主机接口时序规范,是实现稳定通信的基础。LLCC68通过寄存器映射与命令集双接口抽象硬件控制,支持LoRa扩频调制与FSK兼容模式,具备高链路预算(157 dB)和DC-DC/LDO动态电源切换能力。典型应用场景包括远距离传感器节点、智能表计与工业无线监测系统。本文深入剖析LLCC68的信号链路径、中断机制与

weixin_29859471的博客 281

Mycat 水平拆分----分表

mycat和mysql环境搭建如前几篇文章。 主从机IP如下说明: 192.168.1.111 主机 dn1 192.168.1.109 从机 dn2 分表: 1. 修改schema.xml,将orders表挂载在两个节点(dn1,dn2)上 vim /usr/local/mycat/conf/schema.xml <table name="o...

robinson_911的专栏 865

北斗导航 | 从北一到北二再到北三,你应该知道的北斗导航系统

博主github:https://github.com/MichaelBeechan 博主优快云:https://blog.youkuaiyun.com/u011344545 一、引言 我国高度重视北斗系统的建设和发展。自20世纪80年代开始探索适合我们国家国情的卫星导航系统发展道路,形成了“三步走”的发展战略:2000年底,建成北斗一号导航系统,向我国广大用户提供服务;2012年底,建成北斗二号导航系统,...

尘世冰封的专栏 3078

C#与天文观测:Celestia模拟星空的奇幻之旅

Celestia就像一艘穿梭在星海中的小飞船,带领我们遨游宇宙。C#则是这艘飞船的智能导航系统,用代码指挥它飞向任何我们向往的星球或星系。首先,下载并安装Celestia,熟悉其基本操作和功能。创建一个星空目标列表,包括不同的恒星、行星和星系。// 示例:定义观察目标列表new SpaceObject("太阳"),new SpaceObject("月球"),new SpaceObject("火星")

java专栏 1455

Mycat(3)——Mycat水平拆分(分表)

一、水平切分 相对于垂直拆分,水平拆分不是将表做分类,而是按照某个字段的某种规则来分散到多个库之中,每个表中包含一部分数据。简单来说,我们可以将数据的水平切分理解为是按照数据行的切分,就是将表中的某些行切分到一个数据库,而另外的某些行又切分到其他的数据库中,如图: 拆分数据就需要定义分片规则。关系型数据库是行列的二维模型,拆分的第一原则是找到拆分维度。比如: 从会员的角度来分析,商户订单交易类系统中查询会员某天某月某个订单,那么就需要按照会员结合日期来拆分,不同的数据按照会员 ID 做分组,这样所有的数

tingxuejianghu的博客 512

锂电池充电器电路设计 里面有电路

锂电池充电器电路设计 里面有电路 3.7V升压到5V电路设计。

Linux最新MyCat2介绍以及部署和读写分离 分库分表(MyCat2,非常适合收藏的Linux运维进阶重难点笔记

总用量 32drwxr-xr-x 2 root root 36 6月 28 2021 clustersdrwxr-xr-x 2 root root 41 5月 29 11:01 datasources-rw-r--r-- 1 root root 3338 3月 5 2021 dbseq.sql-rw-r--r-- 1 root root 316 11月 2 2021 logback.xml-rw-r--r-- 1 root root 0 3月 5 2021 mycat.lock。

m0_61943758的博客 1504

Probability and Statistics - 4th edition

Probability and Statistics - 4th edition

C# WinForm 基于DirectShow.dll编写的程序,可边预览边保存视频,音频和图片

基于微软的DirectShow.dll的二次开发1.自动识别连接的摄像头跟麦克风且可以对其进行选择(默认选中第一个)2.可录制wmv和avi两种格式的视频并且都带有音频,avi可以录制的分辨率和帧数进行选择,wmv默认进行了淸晰度优化如不喜欢可去除代码中有相关提示3.可在预览点开之后进行拍照,也可边录制视频边拍照4.添加了视频和音频的压缩功能(酌情使用)这次二次开发发现C#对DirectShow的相关信息太少,这次做完也不敢藏私共享出来,还望大家指正

基于shardingsphere分库分表

文章目录前言一、分库分表1、what2、why3、带来的问题二、组件对比1、shardingsphere2、mycat三、核心概念1、SQL逻辑表真实表数据节点绑定表广播表2、分片分片键分片算法标准分片算法复合分片算法Hint分片算法分片策略标准分片策略复合分片策略Hint分片策略不分片策略四、实践方案总结 前言 一、分库分表 1、what 从字面上理解,把原本存储于一个库的数据分块存储到多个库上,把原本存储于一个表的数据分块存储到多个表上 2、why (1)mysql单机存储上限。(mysql表中的数据都

butt168的博客 549

VC中sqlite的使用

在VC中对sqlite的使用,实现数据库大批数据的快速插入,读取数据库中的数据在ListCtrl中显示

mysql数据库分库分表6_16 MySQL 分库分表

MySQL 分库分表[toc]分库 分表将存放在一个数据库( 主机 )中的数据,按照特定方式进行拆分,分散存放到多个数据库 ( 主机 )中,以达到分散单台设备负载的效果目的解决单数据库服务器的访问压力和存储压力解决单表过大的问题水平分割横向切分按照表中某个字段的某种规则,把表中的许多记录按行切分,分散到多个数据库中.1550144306328垂直分割纵向切分将单个表,拆分成多个表,并分散到不同的数...

weixin_39621860的博客 366

Sharding-JDBC分库分表原理与实践指南

分库分表是解决数据库性能瓶颈的核心技术,通过将大表数据分散到多个数据库实例,显著提升查询效率。其技术原理基于数据水平切分与路由机制,Sharding-JDBC作为轻量级Java框架,在JDBC层实现透明化分片,相比传统中间件方案减少30%查询延迟。该技术特别适用于电商订单、社交Feed流等千万级数据场景,支持标准分片、复合分片等5种策略,通过绑定表关系优化JOIN查询。实践中需注意分片键选择、分布式ID生成等关键问题,结合Spring Boot可快速实现配置。

weixin_33716941的博客 495

手把手带你搞懂数据库中间件MyCat

分库分表之MyCat 前言 随着业务和用户数量的增多, 企业对于程序的高可用,高并发能力有了更高的要求.MyCat作为一个优秀的分库分表中间件应运而生. 可以理解它是一个虚拟数据库,准确地说是数据库的一个代理 在程序中扮演的角色如下 MyCat的三大重要特性 读写分离 分库分表 主从切换 分库分表 ...

笑三年-Dylen 188

MySQL分库分表实战:从核心原理到ShardingSphere-JDBC实现

数据库水平扩展是应对海量数据和高并发场景的核心技术。其基本原理是通过数据分片,将集中式的数据存储与访问压力分散到多个物理节点,从而突破单机在IO、CPU和连接数上的瓶颈,实现系统吞吐量的线性提升和查询延迟的降低。这项技术对于构建高性能、高可用的互联网应用具有关键价值,广泛应用于电商、社交、金融等需要处理大规模用户数据的业务场景。本文聚焦于MySQL分库分表这一具体实践,深入剖析了其背后的技术原理,并详细演示了如何借助ShardingSphere-JDBC这一主流中间件,从零开始实现一个完整的、可落地的分库分

congsikuai0611的博客 351

分库分表实战:从核心原理到工程落地,解决海量数据存储与高并发访问难题

在数据库架构设计中,当单库单表面临数据量与并发访问的极限时,分库分表成为关键的横向扩展方案。其核心原理是通过垂直拆分(按业务模块)与水平拆分(按数据行)将集中式存储压力分散到多个节点,从而突破单点数据库在IO、CPU、连接数及存储上的瓶颈。这项技术的核心价值在于提升系统的整体容量、吞吐量和可用性,尤其适用于电商、社交等用户与数据量高速增长的互联网应用场景。在工程实践中,分片键的选择、路由算法(如一致性哈希)以及平滑扩容策略是决定方案成败的关键。通过引入Sharding-JDBC等中间件,并结合双写迁移、分布

weixin_30613433的博客 315

分布式环境中分库分表、读写分离相关问题总结

一、为什么要用分库分表 当不使用分库分表的情况下,系统的性能瓶颈主要体现在: 当面临高并发场景的时候,为了避免Mysql崩溃(MySql性能一般的服务器建议2000/s读写并发以下),只能使用消息队列来削峰。 受制于单机限制。数据库磁盘容量吃紧。 数据库单表数据量太大,sql越跑越慢 而分...

chuobenggu7592的博客 886

MySQL(运维篇)

MySQL日志管理与主从复制配置 本文主要介绍了MySQL的日志管理和主从复制技术。MySQL日志包括错误日志、二进制日志、查询日志和慢查询日志,分别记录服务器运行状态、数据变更、客户端操作和执行缓慢的SQL语句。主从复制通过二进制日志实现数据同步,搭建过程包括主库和从库的配置、账户授权及坐标关联。 分库分表部分讲解了垂直拆分和水平拆分策略,以及使用MyCat中间件实现分片的方法。MyCat通过schema.xml配置逻辑库表和数据节点,支持多种分片规则如范围分片、取模分片等。读写分离基于主从复制实现,可通

m0_61925586的博客 424

JB3-4-SpringBoot(五)

分库分表(垂直分库,水平分表,水平分库,水平分表),分片算法(字段取模,范围限定,范围取模,预定义),分布式ID(单库,UUID,雪花算法),ShardingSphere,MyBatisFlex(工具封装,单表操作,多表操作)等。

周航宇的博客 1132

海量数据处理商用短链接生成器平台 - 6

简介: 大话业界常见分库分表中间件介绍业界常见分库分表中间件Cobar(已经被淘汰没使用了)TDDL淘宝根据自己的业务特点开发了 TDDL (Taobao Distributed Data Layer)基于JDBC规范,没有server,以client-jar的形式存在,引入项目即可使用开源功能比较少,阿里内部使用为主Mycat地址 http://www.mycat.org.cn/Java语言编写的MySQL数据库网络协议的开源中间件,前身 Cobar。

weixin_41544125的博客 991

MySQL 入门

本文全面介绍了MySQL数据库及其相关技术,内容涵盖: 数据库基础概念:包括数据库系统组成、关系型与非关系型数据库对比、MySQL核心特点等; MySQL操作管理:详细讲解了安装配置、SQL语句分类、数据类型、索引原理等核心内容; 高级特性:深入分析事务、锁机制、存储引擎、主从复制等关键特性; 扩展架构:系统介绍了读写分离、集群部署、分库分表等企业级解决方案; 开发集成:提供了JDBC连接、MyCat中间件等实践指南。 文章采用结构化组织方式,从基础到高级层层递进,包含了大量实用性强的代码示例和配置模板

weixin_51689532的博客 1243

MySQL入门到精通

分类 数据定义语言,用来定义数据库对象(数据库,表,字段) 表操作 查询 创建 数据类型 修改 删除 DML 数据操作语言,对数据进行增删改 改 删 DQL 数据查询语言,用来查询数据库中表的记录 条件查询练习 聚合函数 分组查询 where条件在分组前执行,having在分组后执行 where不能对聚合函数进行判断,having可以 练习 执行顺序:where > 聚合函数 > having 分组之后,查询的字段一般为聚合函数和分组字段,查询其他字段无任何意义 分页查询 练习 执行顺序

m0_37949220的博客 227
上一篇: 一次接口报错java.io.EOFException: Premature EOF的排查经过[问题已解决]
下一篇: 一个公平的红包算法(java)
西城月老
博客等级 码龄11年 40粉丝 29原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值