目录 搜索
基础 安装ThinkPHP5.1 开发规范 目录结构 配置基础 架构 路由 控制器 请求 架构总览 入口文件 URL访问 模块设计 命名空间 容器和依赖注入 Facade 钩子和行为 路由定义 变量规则 路由地址 闭包支持 路由参数 跨域请求 注解路由 路由分组 MISS路由 资源路由 快捷路由 路由别名 路由绑定 域名路由 URL生成 控制器定义 前置操作 跳转和重定向 空操作和空控制器 分层控制器 资源控制器 请求对象 输入变量 请求类型 HTTP头信息 伪静态 参数绑定 请求缓存 响应 响应输出 响应参数 重定向 数据库 模型 视图 连接数据库 查询数据 添加数据 更新数据 删除数据 查询表达式 链式操作 where table alias field strict limit page order group having join union distinct lock cache comment fetchSql force partition failException sequence 聚合查询 时间查询 高级查询 视图查询 JSON字段 子查询 原生查询 查询事件 事务操作 监听SQL 存储过程 数据集 分布式数据库 定义 新增 更新 删除 查询 JSON数据字段 获取器 修改器 自动时间戳 只读字段 软删除 类型转换 数据完成 查询范围 模型输出 事件 关联 一对一关联 一对多关联 远程一对多 多对多关联 多态关联 关联预载入 关联统计 关联输出 视图渲染 视图赋值 视图过滤 模板引擎 模板 变量输出 使用函数 运算符 原样输出 模板注释 模板布局 模板继承 包含文件 输出替换 标签库 内置标签 循环标签 比较标签 条件判断 资源文件加载 标签嵌套 原生PHP 定义标签 错误和日志 异常处理 日志处理 调试 验证 杂项 命令行 扩展库 安全和性能 附录 调试模式 性能调试 SQL调试 变量调试 远程调试 验证器 验证规则 错误信息 验证场景 路由验证 内置规则 独立验证 静态调用 表单令牌 缓存 Session Cookie 多语言 分页 上传 自动生成目录结构 创建类库文件 生成类库映射文件 清除缓存文件 生成配置缓存文件 生成数据表字段缓存 生成路由映射缓存 自定义指令 验证码 图像处理 Time 数据库迁移工具 Workerman MongoDb 单元测试 安全建议 优化建议 助手函数 升级指导 更新日志
文字

分布式支持

数据访问层支持分布式数据库,包括读写分离,要启用分布式数据库,需要开启数据库配置文件中的deploy参数:

return [
    // 启用分布式数据库
    'deploy'    =>  1,
    // 数据库类型
    'type'        => 'mysql',
    // 服务器地址
    'hostname'    => '192.168.1.1,192.168.1.2',
    // 数据库名
    'database'    => 'demo',
    // 数据库用户名
    'username'    => 'root',
    // 数据库密码
    'password'    => '',
    // 数据库连接端口
    'hostport'    => '',
];

启用分布式数据库后,hostname参数是关键,hostname的个数决定了分布式数据库的数量,默认情况下第一个地址就是主服务器。

主从服务器支持设置不同的连接参数,包括:


连接参数
username
password
hostport
database
dsn
charset

如果主从服务器的上述参数一致的话,只需要设置一个,对于不同的参数,可以分别设置,例如:

return [
    // 启用分布式数据库
    'deploy'   => 1,
    // 数据库类型
    'type'     => 'mysql',
    // 服务器地址
    'hostname' => '192.168.1.1,192.168.1.2,192.168.1.3',
    // 数据库名
    'database' => 'demo',
    // 数据库用户名
    'username' => 'root,slave,slave',
    // 数据库密码
    'password' => '123456',
    // 数据库连接端口
    'hostport' => '',
    // 数据库字符集
    'charset'  => 'utf8',
];

记住,要么相同,要么每个都要设置。

还可以设置分布式数据库的读写是否分离,默认的情况下读写不分离,也就是每台服务器都可以进行读写操作,对于主从式数据库而言,需要设置读写分离,通过下面的设置就可以:

   'rw_separate' => true,

在读写分离的情况下,默认第一个数据库配置是主服务器的配置信息,负责写入数据,如果设置了master_num参数,则可以支持多个主服务器写入(每次随机连接其中一个主服务器)。其它的地址都是从数据库,负责读取数据,数量不限制。每次连接从服务器并且进行读取操作的时候,系统会随机进行在从服务器中选择。同一个数据库连接的每次请求只会连接一次主服务器和从服务器,如果某次请求的从服务器连接不上,会自动切换到主服务器进行查询操作。

如果不希望随机读取,或者某种情况下其它从服务器暂时不可用,还可以设置slave_no 指定固定服务器进行读操作,slave_no指定的序号表示hostname中数据库地址的序号,从0开始。

调用查询类或者模型的CURD操作的话,系统会自动判断当前执行的方法是读操作还是写操作并自动连接主从服务器,如果你用的是原生SQL,那么需要注意系统的默认规则: 写操作必须用数据库的execute方法,读操作必须用数据库的query方法,否则会发生主从读写错乱的情况。

发生下列情况的话,会自动连接主服务器:

  • 使用了数据库的写操作方法(execute/insert/update/delete以及衍生方法);

  • 如果调用了数据库事务方法的话,会自动连接主服务器;

  • 从服务器连接失败,会自动连接主服务器;

  • 调用了查询构造器的lock方法;

  • 调用了查询构造器的master方法

主从数据库的数据同步工作不在框架实现,需要数据库考虑自身的同步或者复制机制。如果在大数据量或者特殊的情况下写入数据后可能会存在同步延迟的情况,可以调用master()方法进行主库查询操作。

在实际生产环境中,很多云主机的数据库分布式实现机制和本地开发会有所区别,但通常会采下面用两种方式:

  • 第一种:提供了写IP和读IP(一般是虚拟IP),进行数据库的读写分离操作;

  • 第二种:始终保持同一个IP连接数据库,内部会进行读写分离IP调度(阿里云就是采用该方式)。

上一篇: 下一篇: