1. 什么是 federated 存储引擎
federated 是 mysql 的一个特殊存储引擎,它允许你访问远程 mysql 服务器上的表数据,而无需使用复制(replication)或集群(cluster)技术。本地创建一个 federated 表,它实际上是一个指向远程表的链接。
2. 工作原理
本地 mysql 服务器 远程 mysql 服务器
┌─────────────────┐ ┌─────────────────┐
│ federated 表 │─────>│ 实际数据表 │
│ (只存结构) │ │ (存储真实数据) │
└─────────────────┘ └─────────────────┘
↓ ↓
元数据 数据存储
(无数据) (真实数据)核心机制:
- 本地不存储任何数据,只保存表结构
- 所有查询操作通过 mysql client api 发送到远程服务器
- 每次查询都是实时的,直接获取远程数据
- 支持 insert、update、delete 等操作
3. 使用场景
✅ 适合的场景:
1. 数据整合:需要跨多个 mysql 实例查询数据
2. 分布式查询:避免数据迁移,实时访问远程数据
3. 数据同步中间方案:作为 etl 的临时方案
4. 报表系统:汇总多个数据源的数据
5. 遗留系统集成:访问旧系统数据而不影响原有架构
❌ 不适合的场景:
1. 高性能要求的应用
2. 频繁大量数据操作
3. 网络不稳定的环境
4. 需要事务一致性的关键业务
4. 使用方法
步骤 1:启用 federated 引擎
-- 检查是否启用 show engines; -- 如果未启用,在 my.cnf/my.ini 中添加 [mysqld] federated -- 或者动态加载(如果已编译) install plugin federated soname 'ha_federated.so';
步骤 2:创建远程表(在远程服务器)
-- 在远程服务器 (例如:192.168.1.100:3306)
create database remote_db;
use remote_db;
create table users (
id int primary key auto_increment,
username varchar(50),
email varchar(100),
created_at datetime
) engine=innodb;步骤 3:创建本地 federated 表
方法一:使用 connection 参数
use local_db;
create table users (
id int primary key auto_increment,
username varchar(50),
email varchar(100),
created_at datetime
) engine=federated
connection='mysql://username:password@192.168.1.100:3306/remote_db/users';方法二:使用 data directory 和 index directory(旧版本)
create table users (
id int primary key auto_increment,
username varchar(50),
email varchar(100),
created_at datetime
) engine=federated
data directory='mysql://user:pass@host:port/db/table';步骤 4:使用示例
-- 查询远程数据(和本地表一样使用)
select * from users where username = 'john';
-- 插入数据(实际插入到远程)
insert into users (username, email) values ('alice', 'alice@example.com');
-- 更新操作
update users set email = 'new@example.com' where id = 1;
-- 删除操作
delete from users where id = 1;
-- join 本地表和 federated 表
select l.*, f.*
from local_table l
inner join users f on l.user_id = f.id;5. 配置选项
# my.cnf / my.ini [mysqld] # 启用 federated federated # 可选配置 federated_max_connections=100 # 最大连接数 read_buffer_size=256k # 读缓冲区 read_rnd_buffer_size=256k # 随机读缓冲区
6. 优缺点分析
✅ 优点:
1. 实时性:直接访问远程最新数据
2. 透明性:对应用层透明,像使用本地表一样
3. 灵活性:支持跨库、跨服务器查询
4. 无需复制:不需要配置主从复制
5. 节省空间:本地不存储数据
❌ 缺点:
1. 性能问题:每次查询都需要网络往返
2. 单点故障:远程服务器宕机则无法访问
3. 不支持索引下推:所有过滤在本地进行
4. 事务限制:不支持分布式事务
5. 调试困难:问题排查复杂
7. 废弃原因
federated 存储引擎在 mysql 8.0 中被标记为弃用(deprecated),主要原因:
1. 维护成本高:代码复杂,维护团队少
2. 性能瓶颈:网络延迟导致性能差
3. 功能限制多:
- 不支持 alter table
- 不支持索引优化
- 不支持批量操作优化
- 不支持子查询优化
4. 稳定性问题:容易出现连接中断、数据不一致
5. 更好的替代方案:
- mysql replication:主从复制更可靠
- mysql cluster:集群方案更强大
- mysql fabric:高可用方案
- etl 工具:定期同步数据
- 应用层解决:微服务 api 调用
8. 替代方案示例
方案一:使用视图 + 复制
-- 在主库 create view all_users as select * from db1.users union all select * from db2.users; -- 通过复制到从库,从库查询视图
方案二:应用层聚合
// java 示例
@service
public class userservice {
@autowired
private userrepository localrepo;
@autowired
@qualifier("remoteuserrepository")
private userrepository remoterepo;
public list<user> getallusers() {
list<user> all = new arraylist<>();
all.addall(localrepo.findall());
all.addall(remoterepo.findall());
return all;
}
}方案三:使用 etl 工具
# 使用 datax 同步
{
"job": {
"content": [{
"reader": {
"name": "mysqlreader",
"parameter": {
"connection": [{
"table": ["users"],
"jdbcurl": ["jdbc:mysql://remote:3306/db"]
}]
}
},
"writer": {
"name": "mysqlwriter",
"parameter": {
"connection": [{
"table": ["users"],
"jdbcurl": "jdbc:mysql://local:3306/db"
}]
}
}
}]
}
}
9. 总结建议
如果是新项目,建议使用其他方案替代 federated。如果是现有系统在使用,建议制定迁移计划,逐步替换为更可靠的方案。
到此这篇关于mysql 存储引擎 federated的文章就介绍到这了,更多相关mysql存储引擎federated内容请搜索代码网以前的文章或继续浏览下面的相关文章希望大家以后多多支持代码网!
发表评论