go-kafka
go kafka包
本文使用的是kafka-go 6.5k 这个包 其他包参考:
我们在细分市场中非常依赖GO和Kafka。不幸的是,在撰写本文时,Kafka的GO客户库的状态并不理想。可用选项是:
萨拉玛(Sarama) 10k,这是迄今为止最受欢迎的,但很难与之合作。它的记录不足,API暴露了Kafka协议的低级概念,并且不支持诸如上下文之类的GO。它还将所有值传递给引起大量动态内存分配,更频繁的垃圾收集和更高的内存使用情况的指针。
Confluent-kafka-Go 4.4k是围绕librdkafka的基于CGO的包装器,这意味着它将使用该软件包的所有GO代码引入了C库的依赖关系。它的文档比Sarama要好得多,但仍然缺乏对GO上下文的支持。
Goka2.2k 是GO的最新Kafka客户端,专注于特定的用法模式。它提供了将KAFKA用作服务之间的消息传递的消息,而不是事件的有序日志,但这并不是我们在细分市场的典型用例。该包还取决于与Kafka的所有互动的Sarama。
这就是Kafka-Go发挥作用的地方。它提供了低水平和高级API,可与Kafka进行交互,反映概念并实现GO标准库的接口,以使其易于使用并与现有软件集成。
go操作kafka
go get github.com/segmentio/kafka-go
简单的生产者:
package mainimport ("context""github.com/segmentio/kafka-go""log""time"
)func main() {// to produce messagestopic := "my-topic"partition := 0//默认没有主题会创建conn, err := kafka.DialLeader(context.Background(), "tcp", "192.168.59.131:9092", topic, partition)if err != nil {log.Fatal("failed to dial leader:", err)}conn.SetWriteDeadline(time.Now().Add(10 * time.Second))_, err = conn.WriteMessages(kafka.Message{Value: []byte("one!")},kafka.Message{Value: []byte("two!")},kafka.Message{Value: []byte("three!")},)if err != nil {log.Fatal("failed to write messages:", err)}if err := conn.Close(); err != nil {log.Fatal("failed to close writer:", err)}
}
简单的消费者:
package mainimport ("context""fmt""github.com/segmentio/kafka-go""log""time"
)func main() {// to consume messagestopic := "my-topic"partition := 0conn, err := kafka.DialLeader(context.Background(), "tcp", "192.168.59.131:9092", topic, partition)if err != nil {log.Fatal("failed to dial leader:", err)}conn.SetReadDeadline(time.Now().Add(10 * time.Second))batch := conn.ReadBatch(10e3, 1e6) // fetch 10KB min, 1MB maxb := make([]byte, 10e3) // 10KB max per messagefor {n, err := batch.Read(b)if err != nil {break}fmt.Println(n, string(b[:n]))}if err := batch.Close(); err != nil {log.Fatal("failed to close batch:", err)}if err := conn.Close(); err != nil {log.Fatal("failed to close connection:", err)}
}
输出
4 one!
4 two!
6 three!
2023/08/22 16:48:02 failed to close batch:[7] Request Timed Out: the request exceeded the user-specified time limit in the request
exit status 1
连接
会自动创建主题:
// to create topics when auto.create.topics.enable='true'
conn, err := kafka.DialLeader(context.Background(), "tcp", "localhost:9092", "my-topic", 0)
if err != nil {panic(err.Error())
}
连接 手动创建主题:
package mainimport ("github.com/segmentio/kafka-go""net""strconv"
)// kafka
func main() {// to create topics when auto.create.topics.enable='false'topic := "my-topic"conn, err := kafka.Dial("tcp", "192.168.59.131:9092")if err != nil {panic(err.Error())}defer conn.Close()controller, err := conn.Controller()if err != nil {panic(err.Error())}var controllerConn *kafka.ConncontrollerConn, err = kafka.Dial("tcp", net.JoinHostPort(controller.Host, strconv.Itoa(controller.Port)))if err != nil {panic(err.Error())}defer controllerConn.Close()topicConfigs := []kafka.TopicConfig{{Topic: topic,NumPartitions: 1,ReplicationFactor: 1,},}err = controllerConn.CreateTopics(topicConfigs...)if err != nil {panic(err.Error())}//---------------读取主题------------------pl, err := conn.ReadPartitions()if err != nil {panic(err.Error())}for _, p := range pl {fmt.Println(p.Topic)}
}
Reader 消费者
官网介绍:
A Reader is another concept exposed by the kafka-go package, which intends to make it simpler to implement the typical use case of consuming from a single topic-partition pair. A Reader also automatically handles reconnections and offset management, and exposes an API that supports asynchronous cancellations and timeouts using Go contexts.
Note that it is important to call Close() on a Reader when a process exits. The kafka server needs a graceful disconnect to stop it from continuing to attempt to send messages to the connected clients. The given example will not call Close() if the process is terminated with SIGINT (ctrl-c at the shell) or SIGTERM (as docker stop or a kubernetes restart does). This can result in a delay when a new reader on the same topic connects (e.g. new process started or new container running). Use a signal.Notify handler to close the reader on process shutdown.
阅读器(Reader)是 kafka-go 软件包暴露的另一个概念,它旨在简化从单个主题-分区对中消费的典型用例的实现。阅读器还会自动处理重新连接和偏移管理,并提供一个 API,使用 Go 上下文支持异步取消和超时。
需要注意的是,在进程退出时调用 Reader 上的 Close() 非常重要。kafka 服务器需要优雅地断开连接,以阻止它继续尝试向已连接的客户端发送消息。如果进程被 SIGINT(在 shell 中按 ctrl-c)或 SIGTERM(docker stop 或 kubernetes 重启)终止,给出的示例将不会调用 Close()。当同一主题上有新的阅读器连接时(例如,新进程启动或新容器运行),这可能会导致延迟。使用 signal.Notify 处理程序在进程关闭时关闭阅读器。
package mainimport ("context""fmt""github.com/segmentio/kafka-go""log"
)// kafka
func main() {// make a new reader that consumes from topic-A, partition 0, at offset 42r := kafka.NewReader(kafka.ReaderConfig{Brokers: []string{"192.168.59.131:9092", "192.168.59.131:9093", "192.168.59.131:9094"},Topic: "topic-A",Partition: 0,MaxBytes: 10e6, // 10MB})r.SetOffset(4)fmt.Println("start")for {m, err := r.ReadMessage(context.Background())if err != nil {break}fmt.Printf("message at offset %d: %s = %s\n", m.Offset, string(m.Key), string(m.Value))}if err := r.Close(); err != nil {log.Fatal("failed to close reader:", err)}
}
Consumer Groups 消费者组
kafka-go 还支持 Kafka 消费者组,包括代理管理的偏移量。要启用消费者组,只需在 ReaderConfig 中指定 GroupID。
使用消费者组时,ReadMessage 会自动提交偏移量
package mainimport ("context""fmt""github.com/segmentio/kafka-go""log"
)// kafka
func main() {// make a new reader that consumes from topic-A, partition 0, at offset 42r := kafka.NewReader(kafka.ReaderConfig{Brokers: []string{"192.168.59.131:9092", "192.168.59.131:9093", "192.168.59.131:9094"},Topic: "topic-A",Partition: 0,MaxBytes: 10e6, // 10MBGroupID: "AAA",})fmt.Println("start")for {m, err := r.ReadMessage(context.Background())if err != nil {break}fmt.Printf("message at offset %d: %s = %s\n", m.Offset, string(m.Key), string(m.Value))}if err := r.Close(); err != nil {log.Fatal("failed to close reader:", err)}
}
使用消费者组时有一些限制:
(*Reader).SetOffset 在设置 GroupID 时会返回错误信息
(*Reader).Offset在设置GroupID时将始终返回-1
(*Reader).Lag在GroupID被设置时总是返回-1
(*Reader).ReadLag 将在设置 GroupID 时返回错误信息
(*Reader).Stats在GroupID被设置时将返回-1的分区。
Explicit Commits 显式提交
没 CommitMessages 提交偏移量没变下次还会读到
package mainimport ("context""fmt""github.com/segmentio/kafka-go""log"
)// kafka
func main() {r := kafka.NewReader(kafka.ReaderConfig{Brokers: []string{"192.168.59.131:9092", "192.168.59.131:9093", "192.168.59.131:9094"},Topic: "topic-A",Partition: 0,MaxBytes: 10e6, // 10MBGroupID: "AAA",})fmt.Println("start")ctx := context.Background()for {m, err := r.FetchMessage(ctx)if err != nil {break}fmt.Printf("message at topic/partition/offset %v/%v/%v: %s = %s\n", m.Topic, m.Partition, m.Offset, string(m.Key), string(m.Value))if err := r.CommitMessages(ctx, m); err != nil {log.Fatal("failed to commit messages:", err)}}if err := r.Close(); err != nil {log.Fatal("failed to close reader:", err)}
}
Managing Commits 管理提交 周期性提交
通过在 ReaderConfig 上设置 CommitInterval 来周期性地向 Kafka 提交偏移量。
r := kafka.NewReader(kafka.ReaderConfig{Brokers: []string{"192.168.59.131:9092", "192.168.59.131:9093", "192.168.59.131:9094"},Topic: "topic-A",Partition: 0,MaxBytes: 10e6, // 10MBGroupID: "AAA",CommitInterval: time.Second,// flushes commits to Kafka every second})
Writer 生产者
To produce messages to Kafka, a program may use the low-level Conn API, but the package also provides a higher level Writer type which is more appropriate to use in most cases as it provides additional features:
- Automatic retries and reconnections on errors.
- Configurable distribution of messages across available partitions.
- Synchronous or asynchronous writes of messages to Kafka.
- Asynchronous cancellation using contexts.
- Flushing of pending messages on close to support graceful shutdowns.
- Creation of a missing topic before publishing a message. Note! it was the default behaviour up to the version v0.4.30
要向 Kafka 发送消息,程序可以使用底层的 Conn API,但软件包也提供了更高级的 Writer 类型,在大多数情况下更适合使用,因为它提供了更多的功能:
- 出错时自动重试和重新连接。
- 可配置的可用分区信息分配。
- 将消息同步或异步写入 Kafka。
- 使用上下文进行异步取消。
- 在关闭时刷新待处理消息,以支持优雅关机。
- 在发布消息前创建缺失的主题。注意!这是 v0.4.30 之前的默认行为。
package mainimport ("context""github.com/segmentio/kafka-go""log"
)func main() {// make a writer that produces to topic-A, using the least-bytes distribution// 使用最少字节分布,制作向主题-A 发送信息的写入器w := &kafka.Writer{Addr: kafka.TCP("192.168.59.131:9092", "192.168.59.131:9093", "192.168.59.131:9094"),Topic: "topic-A",Balancer: &kafka.LeastBytes{},}err := w.WriteMessages(context.Background(),kafka.Message{Key: []byte("Key-A"),Value: []byte("Hello World!One!"),},kafka.Message{Key: []byte("Key-B"),Value: []byte("Hello World!Two!"),},kafka.Message{Key: []byte("Key-C"),Value: []byte("Hello World!Three!"),},)if err != nil {log.Fatal("failed to write messages:", err)}if err := w.Close(); err != nil {log.Fatal("failed to close writer:", err)}
}
自动创建主题
package mainimport ("context""errors""github.com/segmentio/kafka-go""log""time"
)func main() {// Make a writer that publishes messages to topic-A.// The topic will be created if it is missing.w := &kafka.Writer{Addr: kafka.TCP("192.168.59.131:9092", "192.168.59.131:9093", "192.168.59.131:9094"),Topic: "topic-A",AllowAutoTopicCreation: true,}messages := []kafka.Message{{Key: []byte("Key-A"),Value: []byte("Hello One!"),},{Key: []byte("Key-B"),Value: []byte("Hello Two!"),},{Key: []byte("Key-C"),Value: []byte("Hello Three!"),},}var err errorconst retries = 3for i := 0; i < retries; i++ {ctx, cancel := context.WithTimeout(context.Background(), 10*time.Second)defer cancel()// 尝试在发布消息前创建主题err = w.WriteMessages(ctx, messages...)if errors.Is(err, kafka.LeaderNotAvailable) || errors.Is(err, context.DeadlineExceeded) {time.Sleep(time.Millisecond * 250)continue}if err != nil {log.Fatalf("unexpected error %v", err)}break}if err := w.Close(); err != nil {log.Fatal("failed to close writer:", err)}
}
多个主题
通常,WriterConfig.Topic 用于初始化单主题写入器。通过排除该特定配置,您可以通过设置 Message.Topic.WriterConfig.Topic 来按消息定义主题。
package mainimport ("context""github.com/segmentio/kafka-go""log"
)func main() {w := &kafka.Writer{Addr: kafka.TCP("192.168.59.131:9092", "192.168.59.131:9093", "192.168.59.131:9094"),// NOTE: When Topic is not defined here, each Message must define it instead.// 注意:如果这里没有定义主题,则每条信息都必须定义主题Balancer: &kafka.LeastBytes{},}err := w.WriteMessages(context.Background(),// NOTE: Each Message has Topic defined, otherwise an error is returned.// 注意:每条信息都定义了主题,否则将返回错误信息。kafka.Message{Topic: "topic-A",Key: []byte("Key-A"),Value: []byte("Hello World!"),},kafka.Message{Topic: "topic-B",Key: []byte("Key-B"),Value: []byte("One!"),},kafka.Message{Topic: "topic-C",Key: []byte("Key-C"),Value: []byte("Two!"),},)if err != nil {log.Fatal("failed to write messages:", err)}if err := w.Close(); err != nil {log.Fatal("failed to close writer:", err)}
}
相关文章:
go-kafka
go kafka包 本文使用的是kafka-go 6.5k 这个包 其他包参考: 我们在细分市场中非常依赖GO和Kafka。不幸的是,在撰写本文时,Kafka的GO客户库的状态并不理想。可用选项是: 萨拉玛(Sarama) 10k,这…...
如何在windows电脑上安装多个node,并可以进行随意切换
一、进入官网http://nvm.uihtm.com/ 下载 二、启动解压后的程序 1.开始安装nvm 选择要安装的目录 一直下一步–下一步–最后点击完成 3.最后点击完成即可 ![在这里插入图片描述](https://img-blog.csdnimg.cn/3656568c7e9946e8a04219811fc4c4d3.png 三、在cmd控制台进行操作…...
《机器学习核心技术》分类算法 - 决策树
「作者主页」:士别三日wyx 「作者简介」:CSDN top100、阿里云博客专家、华为云享专家、网络安全领域优质创作者 「推荐专栏」:小白零基础《Python入门到精通》 决策树 1、决策树API2、决策时实际应用2.1、获取数据集2.2、划分数据集2.3、决策…...
aws PinPoint发附件demo
php 版aws PinPoint发附件demo Laravel8框架,安装了"aws/aws-sdk-php": "^3.257" 主要代码: public function sendRawMail(Request $request) {$file $request->file(attachment);/*echo count($file);dd($file);*/$filenam…...
边写代码边学习之Bidirectional LSTM
1. 什么是Bidirectional LSTM 双向 LSTM (BiLSTM) 是一种主要用于自然语言处理的循环神经网络。 与标准 LSTM 不同,输入是双向流动的,并且它能够利用双方的信息。 它也是一个强大的工具,可以在序列的两个方向上对单词和短语之间的顺序依赖…...
Django学习笔记-实现联机对战
笔记内容转载自 AcWing 的 Django 框架课讲义,课程链接:AcWing Django 框架课。 CONTENTS 1. 统一长度单位2. 增加联机对战模式3. 配置Django Channels 1. 统一长度单位 多人模式中每个玩家所看到的地图相对来说应该是一样的,因此需要固定地…...
nacos总结1
5.Nacos注册中心 国内公司一般都推崇阿里巴巴的技术,比如注册中心,SpringCloudAlibaba也推出了一个名为Nacos的注册中心。 5.1.认识和安装Nacos Nacos是阿里巴巴的产品,现在是SpringCloud中的一个组件。相比Eureka功能更加丰富,…...
Web安全测试(三):SQL注入漏洞
一、前言 结合内部资料,与安全渗透部门同事合力整理的安全测试相关资料教程,全方位涵盖电商、支付、金融、网络、数据库等领域的安全测试,覆盖Web、APP、中间件、内外网、Linux、Windows多个平台。学完后一定能成为安全大佬! 全部…...
Webstorm 入门级玩转uni-app 项目-微信小程序+移动端项目方案
1. Webstorm uni-app语法插件 : Uniapp Support Uniapp Support - IntelliJ IDEs Plugin | Marketplace 第一个是不收费,第二个收费 我选择了第二个Uniapp Support ,有试用30天,安装重启webstorm之后,可以提高生产率…...
从零开始的Hadoop学习(三)| 集群分发脚本xsync
1. Hadoop目录结构 bin目录:存放对Hadoop相关服务(hdfs,yarn,mapred)进行操作的脚本etc目录:Hadoop的配置文件目录,存放Hadoop的配置文件lib目录:存放Hadoop的本地库(对…...
golang http transport源码分析
golang http transport源码分析 前言 Golang http库在日常开发中使用会很多。这里通过一个demo例子出发,从源码角度梳理golang http库底层的数据结构以及大致的调用流程 例子 package mainimport ("fmt""net/http""net/url""…...
spring boot 项目整合 websocket
1.业务背景 负责的项目有一个搜索功能,搜索的范围几乎是全表扫,且数据源类型贼多。目前对搜索的数据量量级未知,但肯定不会太少,不仅需要搜索还得点击下载文件。 关于搜索这块类型 众多,未了避免有个别极大数据源影响整…...
统计学补充概念-17-线性决策边界
概念 线性决策边界是一个用于分类问题的线性超平面,可以将不同类别的样本分开。在二维空间中,线性决策边界是一条直线,将两个不同类别的样本分隔开来。对于更高维的数据,决策边界可能是一个超平面。 线性决策边界的一般形式可以表…...
指针变量、指针常量与常量指针的区别
指针变量、指针常量与常量指针 一、指针变量 定义:指针变量是指存放地址的变量,其值是地址。 一般格式:基类型 指针变量名;(int p) 关键点: 1、int * 表示一种指针类型(此处指int 类型),p(变量…...
mq与mqtt的关系
文章目录 mqtt 与 mq的区别mqtt 与 mq的详细区别传统消息队列RocketMQ和微消息队列MQTT对比:MQ与RPC的区别 mqtt 与 mq的区别 mqtt:一种通信协议,规范 MQ:一种通信通道(方式),也叫消息队列 MQ…...
代码大全阅读随笔 (二)
软件设计 设计就是把需求分析和编码调试连在一起的活动。 设计不是在谁的头脑中直接跳出来了,他是不断的设计评估,非正式讨论,写实验代码以及修改实验代码中演化和完善。 作为软件开发人员,我们不应该试着在同一时间把整个程序都塞…...
vue 项目的屏幕自适应方案
方案一:使用 scale-box 组件 属性: width 宽度 默认 1920height 高度 默认 1080bgc 背景颜色 默认 "transparent"delay自适应缩放防抖延迟时间(ms) 默认 100 vue2版本:vue2大屏适配缩放组件(vu…...
23软件测试高频率面试题汇总
一、 你们的测试流程是怎么样的? 答:1.项目开始阶段,BA(需求分析师)从用户方收集需求并将需求转化为规格说明书,接 下来在项目组领导会组织需求评审。 2.需求评审通过后,BA 会组织项目经理…...
PHP8的匿名函数-PHP8知识详解
php 8引入了匿名函数(Anonymous Functions),它是一种创建短生命周期的函数,不需要命名,并且可以在其作用域内直接使用。以下是在PHP 8中使用匿名函数的知识要点: 1、创建匿名函数,语法格式如下&…...
Redis—Redis介绍(是什么/为什么快/为什么做MySQL缓存等)
一、Redis是什么 Redis 是一种基于内存的数据库,对数据的读写操作都是在内存中完成,因此读写速度非常快,常用于缓存,消息队列、分布式锁等场景。 Redis 提供了多种数据类型来支持不同的业务场景,比如 String(字符串)、…...
C语言链表梳理-2
链表头使用结构体:struct Class 链表中的每一项使用结构体:struct Student#include <stdio.h>struct Student {char * StudentName;int StudentAge;int StudentSex;struct Student * NextStudent; };struct Class {char *ClassName;struct Stude…...
【深度学习】实验03 特征处理
文章目录 特征处理标准化归一化正则化 特征处理 标准化 # 导入标准化库 from sklearn.preprocessing import StandardScalerfrom matplotlib import gridspec import numpy as np import matplotlib.pyplot as plt import warnings warnings.filterwarnings("ignore&quo…...
基于Dpabi的功能连接
1.预处理 这里预处理用Gretna软件进行,共分为以下几步: (1)DICOM转NIfTI格式 (2)去除前10个时间点(Remove first 10 times points):由于机器刚启动、被试刚躺进去也还需适应环境,导致刚开始扫描的数据很…...
在React项目是如何捕获错误的?
文章目录 react中的错误介绍解决方案后言 react中的错误介绍 错误在我们日常编写代码是非常常见的 举个例子,在react项目中去编写组件内JavaScript代码错误会导致 React 的内部状态被破坏,导致整个应用崩溃,这是不应该出现的现象 作为一个框架…...
基于内存池的 简单高效的数据库 SDK简介
基于内存池的 简单高效的数据库 SDK简介 下载地址: https://gitee.com/tankaishuai/powerful_sdks/tree/master/shm_alloc_db_heap shm_alloc_db_heap 是一个基于内存池实现的简单高效的文件型数据存储引擎,利用它可以轻松地像访问内存块一样读、写、增…...
python实例方法,类方法和静态方法区别
为python中的装饰器 实例方法 实例方法时直接定义在类中的函数,不需要任何修饰。只能通过类的实例化对象来调用。不能通过类名来调用。 类方法 类方法,是类中使用classmethod修饰的函数。类方法在定义的时候需要有表示类对象的参数(一般命名为cls&#…...
Pyecharts教程(四):使用pyecharts绘制3D折线图
Pyecharts教程(四):使用pyecharts绘制3D折线图 作者:安静到无声 个人主页 目录 Pyecharts教程(四):使用pyecharts绘制3D折线图准备工作数据准备绘制3D折线图推荐专栏在这篇文章中,我们将学习如何使用pyecharts库来绘制一个3D折线图。pyecharts是一个用于生成Echarts图表的…...
【stable-diffusion使用扩展+插件和模型资源(下)】
插件模型魔法图片等资源:https://tianfeng.space/1240.html 书接上文:(上) 插件推荐 1.lobe theme lobe theme是一款主题插件,直接可以在扩展安装 界面进行了重新布局,做了一些优化,有兴趣的…...
一文了解SpringBoot中的Aop
目录 1.什么是Aop 2.相关概念 3.相关注解 4.为什么要用Aop 5.Aop使用案例 1.什么是Aop AOP:Aspect Oriented Programming,面向切面,是Spring三大思想之一,另外两个是 IOC-控制反转 DI-依赖注入 (Autowired、Qualifier、Re…...
android系统启动流程之zygote如何创建SystemServer进程
SystemServer:是独立的进程,主要工作是管理服务的,它将启动大约90种服务Services. 它主要承担的职责是为APP的运行提供各种服务,像AMS,WMS这些服务并不是一个独立的进程, 它们其实都是SystemServer进程中需要管理的的众多服务之一…...
萍乡网站推广/手机seo关键词优化
{*rule !important}这个css规则当今在网页制作的时候的普及已经非常流行了,以前我对它的理解就停留在‘浏览器是否识别阶段’ 而没有真正去研究过,可是现在发生了变化。众所周知,!important这个规则对Ie6.0,Ie7.0和Firefox能写hack࿰…...
茂名网站建设方案外包/米拓建站
经纬度计算距离和方位角方位角(azimuthangle):从某点的指北方向线起,依顺时针方向到目标方向线之间的水平夹角,叫方位角。(一)方位角的种类由于每点都有真北、磁北和坐标纵线北三种不同的指北方向线,因此,从某点到某一…...
真人性做爰官方网站/成都seo培训
介绍 本文介绍,在Eclipse插件开发过程中,经常会遇到的有关菜单路径和工具栏路径的使用问题。最常见到的可能就是additions了,那除了这个还有些什么呢,请看下文。 菜单 工具栏 查看原文:http://surenpi.com/2015/08/2…...
wordpress远程ftp/企业营销策划有限公司
前几天做项目的时候,需要实现一个动态锚点的效果 如果是传统项目,这个效果就非常简单。但是放到 Vue 中,就有两大难题: 1. 在没有 jQuery 的 animate() 方法的情况下,如何实现平滑滚动? 2. 如何监听页面滚…...
网站制作切图/拼多多seo是什么意思
在最近项目开发中遇到一个问题,情况是这样的,第一天数据库操作完全正常的,第二天早上来,就报错invalid connection。明明第一天都是正常的,第二天来就报错了,这个问题比较尴尬。于是上网搜索后,…...
桂林二手房/英文seo实战派
14.7.4 InnoDB File-Per-Table Tablespaces从历史上看,所有的InnoDB 表和indexes 是存储在system 表空间。这个整体的方法是针对机器是整个用于数据库处理,精心策划的数据增长,任何磁盘存储分配给MySQL 不会被其他目的需要.InnoDB的file-per-table tablespace功能提供一个更加灵…...