ci4不处理数据同步,因其数据库层仅负责sql路由,主从一致性完全依赖mysql自身复制机制;框架无法干预binlog传输、gtid同步或延迟检测,这些属数据库运维范畴,非应用框架职责。

CodeIgniter 4 本身不提供数据库层的数据同步能力,读写分离架构下的主从数据一致性完全依赖 MySQL(或 PostgreSQL)自身的复制机制,框架只负责路由查询到正确节点。
为什么 CI4 不处理数据同步
CI4 的数据库抽象层(Query Builder / Database Library)在执行 $this->db->insert() 或 $this->db->update() 时,只是把 SQL 发给当前连接的 DB 实例;它不会、也不能干预底层数据库之间的 binlog 传输、GTID 同步、延迟检测或冲突解决。这些属于数据库运维范畴,不是应用框架该做的事。
- 所谓“同步延迟”(如主库写入后从库查不到)是 MySQL 复制 lag 导致的,和 CI4 配置无关
- CI4 的“读写分离”本质是手动或自动切换
$this->db所指向的连接对象,不是内置代理或中间件 - 没有
sync_with_master()这类方法——它根本不存在
实际能做的:规避同步延迟影响
当业务对强一致性有要求(例如刚注册就跳转到个人页),不能依赖从库读取最新数据,必须强制走主库。CI4 没有开箱即用的“强制主库读”开关,需自行控制:
- 在模型中显式使用主库连接:
$this->primary_db->where('id', $id)->get('users'),而不是$this->db - 避免在事务内混用主从连接:CI4 的事务不跨连接,
$this->db->transStart()只作用于当前$this->db实例 - 对关键读操作加
/*+ MASTER */注释(需驱动支持)并配合自定义 Query Builder 扩展,但 MySQL 官方不识别该 hint,仅部分中间件(如 MyCat)支持——CI4 原生不解析或转发这类 hint
配置层面容易被忽略的坑
很多人以为配好两个数据库连接(primary 和 replica)就完成了读写分离,但以下三点常被跳过:
-
autoinit => FALSE必须设为FALSE:否则每次加载连接都会尝试连上,哪怕后续只读不写,白白消耗连接和超时等待 - 从库连接的
read_only => TRUE应在 MySQL 层设置,而非 CI4 配置项——CI4 没有该配置项,设了也无效 - PHP 连接池(如 mysqlnd_ms)或代理(如 ProxySQL)不在 CI4 控制范围内,但它们才是解决“自动故障转移+延迟感知”的正解;CI4 只能被动适配其暴露的连接地址
真正要解决数据同步问题,得看 SHOW SLAVE STATUS\G 的 Seconds_Behind_Master,调优 innodb_flush_log_at_trx_commit 和 sync_binlog,或者引入 Canal / Debezium 做异步补偿——这些都发生在 CI4 之外。











