codeigniter的数据库故障转移(failover)是在主库连接失败时按序尝试备用配置的机制,需在database.php中为$db['default']等组显式定义'failover'数组,各备用项须完整独立、驱动一致,仅初始化时生效,不支持运行时自动切换或嵌套。

CodeIgniter 的数据库故障转移(failover)功能,是用来在主数据库连接失败时,自动尝试连接备用数据库的机制。它不依赖外部中间件,而是由框架在初始化 DB 实例时按顺序尝试配置列表中的连接项。
failover 配置的基本结构
在 application/config/database.php 中,每个数据库组(如 $db['default'])都支持 'failover' 键,其值是一个包含多个备用连接配置的数组。每个备用项结构与主连接完全一致,但必须是独立、可运行的数据库实例。
- 所有 failover 条目必须是完整、自包含的配置数组,不能复用主配置字段
- 每个条目需明确指定
'hostname'、'username'、'password'、'database'和'dbdriver' - 不支持嵌套 failover(即 failover 项自身不能再配 failover)
一个可用的 failover 配置示例
以下是在 $db['default'] 中启用两个备用节点的写法:
$db['default'] = array(
'dsn' => '',
'hostname' => '192.168.1.10',
'username' => 'app_user',
'password' => 'secret123',
'database' => 'main_db',
'dbdriver' => 'mysqli',
// ... 其他常规参数(char_set、pconnect 等)
'failover' => array(
array(
'hostname' => '192.168.1.11',
'username' => 'app_user',
'password' => 'secret123',
'database' => 'backup_db_1',
'dbdriver' => 'mysqli',
'port' => 3306,
),
array(
'hostname' => '192.168.1.12',
'username' => 'app_user',
'password' => 'secret123',
'database' => 'backup_db_2',
'dbdriver' => 'mysqli',
'port' => 3307,
),
),
);
框架会按数组顺序依次尝试:主库 → 第一个 failover → 第二个 failover,任一成功即停止并返回 DB 实例;全部失败则抛出连接异常。
failover 生效的前提和限制
该机制只在 CodeIgniter 初始化数据库连接时触发,比如调用 $this->load->database() 或首次访问 $this->db 时。它不是运行时动态切换,也不监控连接健康状态或自动重连。
- 连接建立后,后续查询始终使用已成功初始化的那个 DB 实例,不会中途切到其他节点
- 如果主库在连接成功后中途宕机,现有连接会报错,但不会自动 fallback 到备用库——需要应用层捕获异常并手动重载 DB 实例
- 不支持跨驱动 failover(例如主库用 mysqli,failover 用 pdo_mysql),各条目 dbdriver 必须兼容且可用
- DSN 驱动(如 PDO)下,建议显式提供完整 DSN 字符串,避免因字段缺失导致解析失败
验证 failover 是否工作
最直接的方式是临时停掉主数据库服务,然后执行一个简单查询:
// 在控制器中
$this->load->database();
$result = $this->db->query("SELECT 1 as ok")->row(); // 应能正常返回
var_dump($result);
若输出 object(stdClass)#... { ["ok"]=> int(1) },说明 failover 成功接管;若仍报 “Unable to connect”,请检查:
– 备用库是否真实可达(telnet 或 mysql 命令行验证)
– 备用库账号是否有对应数据库的访问权限
– PHP 是否启用了对应数据库扩展(如 mysqli)
– 日志中是否有更具体的连接错误(开启 db_debug)











