CodeIgniter可通过主从多库配置与手动路由实现读库轮询或随机分发的软性负载均衡。需在database.php中定义多个从库,禁用持久连接,封装选择逻辑,动态加载从库实例,写操作固定走主库,并避开主从延迟、事务及强一致性场景。

CodeIgniter 本身不内置数据库负载均衡机制,但可通过主从多库配置 + 手动路由逻辑,实现读操作在多个从库间轮询或随机分发,达到软性负载均衡效果。关键不在“自动均衡”,而在“可控制的读库分发”。
配置多个从库连接组
在 application/config/database.php 中定义多个只读从库(如 slave1、slave2、slave3),与主库(master)分离:
- 每个从库使用独立键名,例如
$db['slave1']、$db['slave2'] - 确保所有从库配置中
'pconnect' => FALSE(避免连接复用干扰轮询) - 建议统一
'db_debug'和'char_set'等参数,减少兼容性风险 - 无需修改
$active_group,它仅影响默认加载组,此处由代码显式选择
封装从库选择逻辑
在模型或自定义数据库工具类中,实现简单轮询或随机选取:
- 维护一个从库列表数组:
$slaves = ['slave1', 'slave2', 'slave3'] - 轮询可用:用静态变量记录当前索引,每次取后递增并取模
- 随机更轻量:
$chosen = $slaves[array_rand($slaves)] - 进阶可加入健康检查(如 ping 连接),跳过不可用从库
在模型中按需加载对应从库
读操作不再用 $this->db,而是动态加载选定的从库实例:
- 构造函数中不预加载,改在具体方法内调用:
$slave_db = $this->load->database($chosen_slave, TRUE) -
TRUE参数表示返回 DB 实例而非赋给$this->db,避免覆盖 - 写操作仍固定使用主库:
$this->load->database('master', TRUE) - 注意:查询链式调用需基于该实例,如
$slave_db->select()->from()->get()
避免事务与读写混用陷阱
负载均衡仅适用于纯读请求;以下情况必须绕过从库分发:
- 刚执行完
INSERT/UPDATE就立即SELECT(存在主从延迟,应查主库) - 涉及事务的操作(
start_transaction等),全部走主库 - 使用了
last_insert_id()、@@identity等依赖主库状态的函数 - 若业务要求强一致性,某些关键读接口也应回退到主库











