Mycat数据库中间件初步实践

数据库中间件 -- MyCat 1. 读写分离2. 数据分片垂直拆分(分库)、水平拆分(分表)、垂直+水平拆分(分库分表)3. 多数据源整合Mycat-web 是 Mycat 可视化运维的管理和监控平台,弥补了 Mycat 在监控上的空白。帮 Mycat 分 担统计任务和配置管理任务。Mycat-web 引入了 ZooKeeper 作为配置中心,可以管理多个节点。Mycat-web 主要管理和监控 Mycat 的流量、连接、活动线程和内存等,具备 IP 白名单、邮件告警等模 块,还可以统计 SQL 并分析慢 SQL 和高频 SQL 等。 阅读详情

认识Mycat

Mycat是一款数据库中间件,对于开发透明,可以快速便捷的对数据库进行垂直分库,具备热备份,负载均衡,读写分离的功能,是一款程序的数据库路由

一般试用数据规模比较大的应用,方便对数据库进行拓展。

Mycat下载与安装

官网:http://www.mycat.io/

linux 服务器直接下载:

wget http://dl.mycat.io/1.6-RELEASE/Mycat-server-1.6-RELEASE-20161028204710-linux.tar.gz

解压安装

tar -xvf Mycat-server-1.6-RELEASE-20161028204710-linux.tar.gz

命令启动

[root@crawlerdev bin]# ./mycat start

linux:
./mycat start 启动
./mycat stop 停止
./mycat console 前台运行
./mycat install 添加到系统自动启动(暂未实现)
./mycat remove 取消随系统自动启动(暂未实现)
./mycat restart 重启服务
./mycat pause 暂停
./mycat status 查看启动状态
win:
直接运行startup_nowrap.bat,如果出现闪退,在cmd 命令行运行,查看出错原因。

测试mycat与测试mysql完全一致,mysql怎么连接,mycat就怎么连接。

推荐先采用命令行测试:

mysql -uroot -proot -P8066 -h127.0.0.1

如果采用工具连接,1.4,1.3目前部分工具无法连接,会提示database not selected,建议采用高版本,navicat测试。1.5已经修复了部分工具连接。

Mycat多节点配置

配置文件:

<?xml version="1.0"?>
<!DOCTYPE mycat:schema SYSTEM "schema.dtd">
<mycat:schema xmlns:mycat="http://io.mycat/">

	<schema name="node" checkSQLschema="false" sqlMaxLimit="100" dataNode="dn1">
	<schema name="node2" checkSQLschema="false" sqlMaxLimit="100" dataNode="dn2">
		<!-- auto sharding by id (long) 
		<table name="user" primaryKey="id"  dataNode="dn1,dn2"/>-->

		<!-- global table is auto cloned to all defined data nodes ,so can join
			with any table whose sharding node is in the same data node 
		<table name="company" primaryKey="ID" type="global" dataNode="dn1,dn2" />
		<table name="goods" primaryKey="ID" type="global" dataNode="dn1,dn2" />-->
		<!-- random sharding using mod sharind rule 
		<table name="hotnews" primaryKey="ID" autoIncrement="true" dataNode="dn1,dn2,dn3"
			   rule="mod-long" />-->
		<!-- <table name="dual" primaryKey="ID" dataNode="dnx,dnoracle2" type="global"
			needAddLimit="false"/> <table name="worker" primaryKey="ID" dataNode="jdbc_dn1,jdbc_dn2,jdbc_dn3"
			rule="mod-long" /> -->
		<!--<table name="employee" primaryKey="ID" dataNode="dn1,dn2"
			   rule="sharding-by-intfile" />
		<table name="customer" primaryKey="ID" dataNode="dn1,dn2"
			   rule="sharding-by-intfile">
			<childTable name="orders" primaryKey="ID" joinKey="customer_id"
						parentKey="id">
				<childTable name="order_items" joinKey="order_id"
							parentKey="id" />
			</childTable>
			<childTable name="customer_addr" primaryKey="ID" joinKey="customer_id"
						parentKey="id" />
		</table>-->
		<!-- <table name="oc_call" primaryKey="ID" dataNode="dn1$0-743" rule="latest-month-calldate"
			/> -->
	</schema>
	<!-- <dataNode name="dn1$0-743" dataHost="localhost1" database="db$0-743"
		/> -->
	<dataNode name="dn1" dataHost="localhost1" database="springdemo" />
	<dataNode name="dn2" dataHost="localhost2" database="springdemo" />
	<!-- <dataNode name="dn3" dataHost="localhost1" database="db3" />
	<dataNode name="dn4" dataHost="sequoiadb1" database="SAMPLE" />
	 <dataNode name="jdbc_dn1" dataHost="jdbchost" database="db1" />
	<dataNode	name="jdbc_dn2" dataHost="jdbchost" database="db2" />
	<dataNode name="jdbc_dn3" 	dataHost="jdbchost" database="db3" /> -->
	<dataHost name="localhost1" maxCon="1000" minCon="10" balance="0"
			  writeType="0" dbType="mysql" dbDriver="native" switchType="1"  slaveThreshold="100">
		<heartbeat>select user()</heartbeat>
		<writeHost host="localhost2" url="10.200.133.19:3306" user="channel_19"
				   password="wG@dUIVVkR" />
		 <!--<writeHost host="hostM2" url="localhost:3316" user="root" password="123456"/>-->
	</dataHost>



	<dataHost name="localhost2" maxCon="1000" minCon="10" balance="0"
                          writeType="0" dbType="mysql" dbDriver="native" switchType="1"  slaveThreshold="100">
                <heartbeat>select 1</heartbeat>
                <!-- can have multi write hosts -->
                <writeHost host="hostM1" url="10.200.133.17:3306" user="channel_17" password="8HUma8n#Eg"/>
                
        </dataHost>

	<!--
		<dataHost name="sequoiadb1" maxCon="1000" minCon="1" balance="0" dbType="sequoiadb" dbDriver="jdbc">
		<heartbeat> 		</heartbeat>
		 <writeHost host="hostM1" url="sequoiadb://1426587161.dbaas.sequoialab.net:11920/SAMPLE" user="jifeng" 	password="jifeng"></writeHost>
		 </dataHost>

	  <dataHost name="oracle1" maxCon="1000" minCon="1" balance="0" writeType="0" 	dbType="oracle" dbDriver="jdbc"> <heartbeat>select 1 from dual</heartbeat>
		<connectionInitSql>alter session set nls_date_format='yyyy-mm-dd hh24:mi:ss'</connectionInitSql>
		<writeHost host="hostM1" url="jdbc:oracle:thin:@127.0.0.1:1521:nange" user="base" 	password="123456" > </writeHost> </dataHost>

		<dataHost name="jdbchost" maxCon="1000" 	minCon="1" balance="0" writeType="0" dbType="mongodb" dbDriver="jdbc">
		<heartbeat>select 	user()</heartbeat>
		<writeHost host="hostM" url="mongodb://192.168.0.99/test" user="admin" password="123456" ></writeHost> </dataHost>

		<dataHost name="sparksql" maxCon="1000" minCon="1" balance="0" dbType="spark" dbDriver="jdbc">
		<heartbeat> </heartbeat>
		 <writeHost host="hostM1" url="jdbc:hive2://feng01:10000" user="jifeng" 	password="jifeng"></writeHost> </dataHost> -->

	<!-- <dataHost name="jdbchost" maxCon="1000" minCon="10" balance="0" dbType="mysql"
		dbDriver="jdbc"> <heartbeat>select user()</heartbeat> <writeHost host="hostM1"
		url="jdbc:mysql://localhost:3306" user="root" password="123456"> </writeHost>
		</dataHost> -->
</mycat:schema>

server.xml

<?xml version="1.0" encoding="UTF-8"?>
<!-- - - Licensed under the Apache License, Version 2.0 (the "License"); 
	- you may not use this file except in compliance with the License. - You 
	may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 
	- - Unless required by applicable law or agreed to in writing, software - 
	distributed under the License is distributed on an "AS IS" BASIS, - WITHOUT 
	WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - See the 
	License for the specific language governing permissions and - limitations 
	under the License. -->
<!DOCTYPE mycat:server SYSTEM "server.dtd">
<mycat:server xmlns:mycat="http://io.mycat/">
	<system>
	<property name="nonePasswordLogin">0</property> <!-- 0为需要密码登陆、1为不需要密码登陆 ,默认为0,设置为1则需要指定默认账户-->
	<property name="useHandshakeV10">1</property>
	<property name="useSqlStat">0</property>  <!-- 1为开启实时统计、0为关闭 -->
	<property name="useGlobleTableCheck">0</property>  <!-- 1为开启全加班一致性检测、0为关闭 -->

		<property name="sequnceHandlerType">2</property>
	<property name="subqueryRelationshipCheck">false</property> <!-- 子查询中存在关联查询的情况下,检查关联字段中是否有分片字段 .默认 false -->
      <!--  <property name="useCompression">1</property>--> <!--1为开启mysql压缩协议-->
        <!--  <property name="fakeMySQLVersion">5.6.20</property>--> <!--设置模拟的MySQL版本号-->
	<!-- <property name="processorBufferChunk">40960</property> -->
	<!-- 
	<property name="processors">1</property> 
	<property name="processorExecutor">32</property> 
	 -->
        <!--默认为type 0: DirectByteBufferPool | type 1 ByteBufferArena | type 2 NettyBufferPool -->
		<property name="processorBufferPoolType">0</property>
		<!--默认是65535 64K 用于sql解析时最大文本长度 -->
		<!--<property name="maxStringLiteralLength">65535</property>-->
		<!--<property name="sequnceHandlerType">0</property>-->
		<!--<property name="backSocketNoDelay">1</property>-->
		<!--<property name="frontSocketNoDelay">1</property>-->
		<!--<property name="processorExecutor">16</property>-->
		<!--
			<property name="serverPort">8066</property> <property name="managerPort">9066</property> 
			<property name="idleTimeout">300000</property> <property name="bindIp">0.0.0.0</property> 
			<property name="frontWriteQueueSize">4096</property> <property name="processors">32</property> -->
		<!--分布式事务开关,0为不过滤分布式事务,1为过滤分布式事务(如果分布式事务内只涉及全局表,则不过滤),2为不过滤分布式事务,但是记录分布式事务日志-->
		<property name="handleDistributedTransactions">0</property>
		
			<!--
			off heap for merge/order/group/limit      1开启   0关闭
		-->
		<property name="useOffHeapForMerge">1</property>

		<!--
			单位为m
		-->
        <property name="memoryPageSize">64k</property>

		<!--
			单位为k
		-->
		<property name="spillsFileBufferSize">1k</property>

		<property name="useStreamOutput">0</property>

		<!--
			单位为m
		-->
		<property name="systemReserveMemorySize">384m</property>


		<!--是否采用zookeeper协调切换  -->
		<property name="useZKSwitch">false</property>

		<!-- XA Recovery Log日志路径 -->
		<!--<property name="XARecoveryLogBaseDir">./</property>-->

		<!-- XA Recovery Log日志名称 -->
		<!--<property name="XARecoveryLogBaseName">tmlog</property>-->
		<!--如果为 true的话 严格遵守隔离级别,不会在仅仅只有select语句的时候在事务中切换连接-->
		<property name="strictTxIsolation">false</property>
		
		<property name="useZKSwitch">true</property>
		
	</system>
	
	<!-- 全局SQL防火墙设置 -->
	<!--白名单可以使用通配符%或着*-->
	<!--例如<host host="127.0.0.*" user="root"/>-->
	<!--例如<host host="127.0.*" user="root"/>-->
	<!--例如<host host="127.*" user="root"/>-->
	<!--例如<host host="1*7.*" user="root"/>-->
	<!--这些配置情况下对于127.0.0.1都能以root账户登录-->
	<!--
	<firewall>
	   <whitehost>
	      <host host="1*7.0.0.*" user="root"/>
	   </whitehost>
       <blacklist check="false">
       </blacklist>
	</firewall>
	-->

	<user name="root" defaultAccount="true">
		<property name="password">123456</property>
		<property name="schemas">node</property>
		
		<!-- 表级 DML 权限设置 -->
		<!-- 		
		<privileges check="false">
			<schema name="TESTDB" dml="0110" >
				<table name="tb01" dml="0000"></table>
				<table name="tb02" dml="1111"></table>
			</schema>
		</privileges>		
		 -->
	</user>
	<user name="user">
		<property name="password">123456</property>
		<property name="schemas">node2</property>
		<property name="readOnly">true</property>
	</user>

</mycat:server>

注意

<schema name="node" checkSQLschema="false" sqlMaxLimit="100" dataNode="dn1">

与

<user name="root" defaultAccount="true">
		<property name="password">123456</property>
		<property name="schemas">node</property>
		
		<!-- 表级 DML 权限设置 -->
		<!-- 		
		<privileges check="false">
			<schema name="TESTDB" dml="0110" >
				<table name="tb01" dml="0000"></table>
				<table name="tb02" dml="1111"></table>
			</schema>
		</privileges>		
		 -->
	</user>

配置对应

大小写无关

反例https://coding.imooc.com/learn/questiondetail/74573.html
验证:
在这里插入图片描述

基于Mycat 多租户数据隔离

mycat本事主要作用是数据库垂直分库

基于多个节点的配置可以实现 数据库实例或者数据库级别的数据库隔离
或者配置为逻辑隔离

MyCAT数据库中间件:让你的数据库无缝扩展! 它被广泛用于大数据和高并发的场景中,作为传统关系数据库(如MySQL)的扩展,以提高性能和扩展能力。MyCAT支持将读请求和写请求分离,通过主从复制(master-slave replication)机制来实现高效的读写操作。写操作通常指向主库,而读操作可以由从库处理,从而提高读操作的效率。MyCAT允许将大型数据库表拆分为更小的部分(即分片),这些分片可以存储在不同的数据库实例中。MyCAT能够将数据库请求分配到不同的后端数据库实例,均衡负载。MyCAT支持跨多个数据库实例的事务处理,确保数据的一致性。 阅读详情

相关推荐

Mycat【什么是Mycat、Mycat与其他中间件区别、Mycat应用场景、核心概念详解、Mycat原理】(一)-全面详解(学习总结---从入门到深化)

Mycat【什么是Mycat、Mycat与其他中间件区别、Mycat应用场景、核心概念详解、Mycat原理】(一)-全面详解(学习总结---从入门到深化)

4190

高可用中间件之Keepalived的原理介绍与部署实践

Keepalived是一个用c语言编写的路由软件。这个实验的主要目标是为Linux系统和基于Linux的基础设施提供简单而健壮的负载平衡和高可用性工具。本文介绍了其基本原理以及讲解了部署单vip和双vip的详细步骤

fruitless的博客 1479

保姆级教程:用STM32CubeMX配置GD32的CAN总线(含异常处理)

本文提供了一份详细的STM32CubeMX配置GD32 CAN总线开发指南,涵盖从HAL库移植到异常处理的全过程。重点解析GD32与STM32在CAN总线初始化、报文发送优先级处理等方面的关键差异,并提供优化代码维护与版本控制的实用策略,帮助开发者高效完成项目迁移。

onion的博客 828

搭建:Mycat 读写分离数据库分库分表中间件及简单使用

通过本文的介绍,你已经了解了如何搭建 Mycat 中间件,并使用它实现数据库的读写分离和分库分表功能。你还学习了如何配置数据源、数据节点和读写分离规则,并通过一个简单的案例演示了 Mycat 的使用。Mycat 提供了强大的功能,可以帮助我们在应用程序中实现高性能和高可用性的数据库访问。通过读写分离和分库分表的功能,我们可以根据需求合理地分配数据库资源,并提升系统的并发能力和数据处理能力。使用 Mycat 可以极大地简化我们对数据库的管理和配置工作,同时提供了灵活的配置选项,以适应不同的应用场景和需求。

good7ob的博客 260

MavLink协议入门

MAVLink是一个非常轻量化的开源的消息协议,用于无人机之间的通信以及无人机机载设备之间的通信。

ffffffeiyu的博客 2472

FPGA 上的 YOLOv8 实时目标检测:从模型优化到硬件加速全解析

本文全面解析了将YOLOv8目标检测模型部署到FPGA进行硬件加速的完整流程。通过模型裁剪、混合精度量化等优化手段,结合HLS设计专用计算引擎与数据流,实现了高能效比的实时推理。文章深入探讨了软硬协同部署、性能调试与优化技巧,为追求极致实时性与低功耗的边缘AI应用提供了从算法到硬件的实战指南。

weixin_29031161的博客 604

MyCat入门及案例实操

1. Mycat概述 如今随着互联网的发展,数据的量级也是成指数的增长,从 GB 到 TB 到 PB。对数据的各种操作也是愈加的困难,传统的关系性数据库已经无法满足快速查询与插入数据的需求。这个时候 NoSQL 的出现暂时解决了这一危机。它通过降低数据的安全性,减少对事务的支持,减少对复杂查询的支持,来获取性能上的提升。 但是,在有些场合 NoSQL 一些折衷是无法满足使用场景的,就比如有些使用场景是绝对要有事务与安全指标的。这个时候 NoSQL 肯定是无法满足的,所以还是需要使用关系性数据库。如何使用

q287573145的博客 1565

Unity实时控制佳能单反拍照全流程(附EDSDK 3.6.1配置避坑指南)

本文详细介绍了在Unity中实时控制佳能单反相机进行拍照的完整流程,重点提供了EDSDK 3.6.1的配置与避坑指南。内容涵盖从SDK获取、环境搭建、相机初始化、参数设置到实现拍照控制,并深入探讨了实时取景的延迟优化方案与资源管理,旨在帮助开发者高效集成专业相机,提升AR/VR及摄影测量等应用的视觉输入质量。

go5gopher的博客 183

数据库分库分表中间件-MyCat简介

1.MyCat简介 MyCat 是目前最流行的基于 java 语言编写的数据库中间件,是一个实现了 MySQL 协议的服务器,前端用户可以把它看作是一个数据库代理,用 MySQL 客户端工具和命令行访问,而其后端可以用 MySQL 原生协议与多个 MySQL 服务器通信,也可以用 JDBC 协议与大多数主流数据库服务器通信,其核心功能是分库分表。配合数据库的主从模式还可实现读写分离。 MyCa...

【折翼天使不孤单】的博客 516

eNSP-交换机VLAN配置

VLAN

乌托托的博客 8803

华南理工大学-大学物理实验-不良导体热导率测量

不良导体热导率测量 引言 导热系数(又叫热导率)是反映材料热性能的重要物理量。热传导是热交换的三种(热传导、对流和辐射)基本形式之一,是工程热物理、材料科学、固体物理及能源、环保等各个研究领域的课题。材料的导热机理在很大程度上取决于它的微观结构,热量的传递依靠原子、分子围绕平衡位置的振动以及自由电子的迁移。在金属中电子流起支配作用,在绝缘体和大部分半导体中则以晶格振动起主导作用。因此,某种材料的导热系数不仅与构成材料的物质种类密切相关,而且还与材料的微观结构、温度、压力及杂质含量相联系。在科学实验和工程设计

mohen_777的博客 871

分布式数据库中间件Mycat介绍

从Cobar到Mycat,从闭源到开源,作为一个开源的分布式数据库中间件,Mycat已经被众多开源项目使用。本文简要介绍下Mycat的特性、基本架构以及分库分表和读写分离的配置。

牧羊人的方向 2464

ERROR: Ignored the following yanked versions: 0.8.3, 0.10.19.dev18 的解决办法

关于这个问题,博主是在进行项目中的python依赖包安装的时候遇见的,遇到的异常:关于这个问题,是在。

Spring Boot-Common On With You 641

MySQL-中间件mycat(一)

mycat目前已经出mycat2版本了,虽然还没有全面普及,但是大概这两年各大企业逐步升级mycat2,但是mycat1还是要有一定的了解。本次mycat分三章讲解,熟悉mycat1后,可以去官网下载一个mycat2学习

大虾好吃吗 6547

MFC实现图书管理系统(附完整源码)

MFC实现图书管理系统(附完整源码)

希望我的博客,能帮上你解决学习中工作中所遇到的问题 799

Probability and Statistics - 4th edition

Probability and Statistics - 4th edition

Mycat中间件

(1)了解Mycat提供的读写分离功能。(2)了解MySQL数据库的主从架构。(3)构建以Mycat为中间件的读写分离数据库集群。

2301_80286384的博客 1882

迈瑞BS系列全自动生化分析仪LIS协议接口手册(内含HL7和ASTM)

迈瑞BS系列全自动生化分析仪LIS协议接口手册,内含HL7和ASTM)

MyCat —— 性能最好的数据库中间件

课程介绍 1. MyCat简介 1.1 MyCat 引入 如今随着互联网的发展,数据的量级也是成指数式的增长,从GB到TB到PB。对数据的各种操作也是愈 加的困难,传统的关系性数据库已经无法满足快速查询与插入数据的需求,这个时候NoSQL的出现暂时 解决了这一危机。它通过降低数据的安全性,减少对事务的支持,减少对复杂查询的支持,来获取性能 上的提升。但是,在有些场合NoSQL一些折衷是无法满足使用场景的,就比如有些使用场景是绝对要有 事务与安全指标的。这个时候NoSQL肯定是无法满足的,所以还是需要使用关

qq_22075913的博客 2919

SAP B1中文培訓教材_SDK

公司内部培训资料,对开发工具 ,DIAPI, UIAPI,Add-ON有详细解说

精雕软件(JDpaint) 5.5 绿色版

精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版

MyCat数据库中间件

2)

m0_63233901的博客 833

数据库中间件-mycat

后端技术-数据库中间件-mycat

qq_45930942的博客 2311

数据库中间件Mycat

Mycat是基于Java编写的实现了MySQL协议的数据库中间件,可以将它看成一个数据库代理,可以直接用MySQL客户端工具访问。其核心功能是分库分表和读写分离。MyCat 是基于阿里开源的 Cobar 产品而研发,Cobar 的稳定性、可靠性、优秀的架构和性能以及众多成熟的使用案例使得 Mycat 变得非常的强大。官网。

qq_36037795的博客 1223

MyCat 数据库中间件

MyCat 数据库中间件

weixin_61428407的博客 1617

【mysql数据库】mycat中间件

Mycat 是数据库 中间件。 ### 2、 为什么要用 Mycat ① Java 与数据库紧耦合 。 ② 高访问量高并发对数据库的压力 。 ③ 读 写请求数据不一致。

翡翠泪滴的博客 2042

揭秘Mycat数据库中间件的神奇魔法

通过本文的生动描绘,我们深入了解了Mycat数据库中间件的原理和使用方法。Mycat就像是一位神奇的魔法师,通过高级的分库分表、读写分离等魔法,为我们的数据库操作增色不少。在这次奇妙的探险中,我们了解了Mycat的核心架构和工作流程,就像是跟随向导探索未知的领域。然后,我们共同完成了Mycat的安装和配置,就像是为自己的城堡添置新的家具。通过一个简单而生动的例子,我们演示了Mycat的基本用法,就像是在一场精彩的表演中,为观众呈现出一幕幕精彩的画面。

繁依Fanyi的博客 1440

中间件读写分离(MyCat)

MySQL优化 查看引擎: mysql> show engines; mysql> SHOW variables like '%storage_engine%'; mysql> show create table t1; mysql> show table status like 't1'; 临时指定引擎: mysql> create table innod...

little_baixb的博客 2098

MySQL 的 ShardingSphere MyCAT 分片中间件实战

随着互联网业务规模的增长,数据库的单点瓶颈问题日益凸显。为了提高 MySQL 的性能和扩展性,**分库分表(Sharding)**成为常见的解决方案。然而,手动实现分片逻辑复杂度较高,因此,**ShardingSphere 和 MyCAT** 等分片中间件应运而生。本文将介绍 **ShardingSphere 和 MyCAT** 的核心原理,并通过实际案例展示如何使用它们进行 MySQL 分片。

1374
上一篇: Linux硬盘管理
下一篇: 爬虫第五篇 :Java httpclient 采集内网
hamish-wu
博客等级 码龄15年 2814粉丝 162原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值