codeigniter 不支持开箱即用的分布式数据库集群路由,因其 $db 配置仅支持静态命名连接组(如 default、master、slave1),无自动读写分离或连接解析器;所有路由逻辑须在 model 或服务层手动控制,通过显式调用 db('master') 或 $this->load->database('slave1', true) 实现运行时分库,并需自行处理事务一致性、主从延迟及表结构同步等陷阱。

CodeIgniter 本身不内置分布式数据库集群路由能力,所谓“集群路由”必须靠手动分组 + 条件判断 + 多库连接实现,不是开箱即用的功能。
为什么不能直接配置「集群路由」
CodeIgniter 的 $db 配置数组只支持静态命名连接组(如 default、slave1、master),没有类似 Laravel 的「database connection resolver」或自动读写分离中间件。所有路由逻辑必须由开发者在 Model 或服务层显式控制。
实际可行的多库连接定义方式
在 app/Config/Database.php(CI4)或 application/config/database.php(CI3)中,按角色定义多个连接组:
-
default:建议设为只读从库(避免意外写入) -
master:主库,仅用于 INSERT/UPDATE/DELETE -
slave2、slave3:额外从库,可用于负载分散或地域就近读取 - 每个连接组必须有唯一键名,且
hostname、username、database等字段独立填写
示例(CI4 风格):
当代理已经知道网站路由或内容URL,并且在启动前需要有效的sitemap XML、sitemap索引或robots.txt引用时,请使用sitemap。这是一个发布构件技能,而不是爬虫或SEO平台。
public $default = [
'DSN' => '',
'hostname' => '10.0.1.10',
'username' => 'readonly_user',
'password' => '***',
'database' => 'myapp',
'DBDriver' => 'MySQLi',
// ...
];
public $master = [
'DSN' => '',
'hostname' => '10.0.1.5',
'username' => 'write_user',
'password' => '***',
'database' => 'myapp',
'DBDriver' => 'MySQLi',
// ...
];
Model 中如何做「运行时路由」
不能依赖框架自动判断读写,必须在业务逻辑中明确指定使用哪个连接:
- 写操作一律用
$this->db = $this->load->database('master', true)(CI3)或DB('master')(CI4) - 读操作可加简单策略:比如用
rand(1,3)选slave1/slave2/slave3,但要注意事务一致性——跨从库的关联查询可能因主从延迟出错 - 关键读(如用户登录态校验、订单状态)应走
master,避免脏读 - 不要在同一个事务里混用多个数据库连接,CI 不支持跨连接事务提交
容易被忽略的兼容性陷阱
不同从库之间表结构必须完全一致,否则 JOIN 或 UNION 类查询会失败;主从延迟导致的「刚写入就查不到」问题,不能靠重试掩盖,得靠业务层加缓存或延时补偿。
真正复杂的路由(比如按用户 ID 分片、按地域调度、故障自动降级)需要自己封装一个 DatabaseRouter 类,而不是指望改几行 database.php 就能搞定。










