y OneProxy 系 列 OneProxy 透 明 读 写 分 离 不 用 修 改 应 用 程 序, 实 现 透 明 读 写 分 离 的 高 可 用 方 案 楼 方 鑫 著 杭 州 平 民 软 件 有 限 公 司 2015/1/25 OneProxy 透 明 读 写 分 离 第 一 页
目 录 一 OneProxy 简 介... 三 二 OneProxy 功 能... 三 三 OneProxy 读 写 分 离 方 法... 四 四 OneProxy 读 写 分 离 功 能 实 现... 七 第 二 页
不 用 修 改 应 用 程 序, 也 可 以 实 现 透 明 读 写 分 离 的 高 可 用 方 案 一 OneProxy 简 介 OneProxy 平 民 软 件 完 全 自 主 开 发 的 分 布 式 数 据 访 问 层, 帮 助 用 户 在 MySQL/PostgreSQL 集 群 上 快 速 搭 建 支 持 分 库 分 表 的 分 布 式 数 据 库 中 间 件, 也 是 一 款 具 有 SQL 白 名 单 ( 防 SQL 注 入 ) 及 IP 白 名 单 功 能 的 SQL 防 火 墙 软 件 采 用 与 MySQL Proxy 一 致 的 反 向 协 议 输 出 模 式, 对 应 用 非 常 简 单 和 透 明 易 用, 让 用 户 畏 惧 的 分 库 分 表 (Horizontal Partitioning) 工 作 变 得 极 其 简 单 可 控! 基 于 Libevent 机 制 实 现, 单 个 实 例 可 以 实 现 25 万 的 SQL 转 发 能 力, 用 一 个 OneProxy 节 点 可 以 带 动 整 个 MySQL 集 群 二 OneProxy 功 能 从 信 息 服 务 的 角 度, 数 据 库 层 对 上 的 服 务 有 三 种 行 为 : 读 取 存 入 和 计 算, 比 如 页 面 显 示 主 要 是 查 询, 交 易 处 理 主 要 是 写 入, 而 报 表 汇 总 则 是 计 算 基 本 上 的 信 息 业 务 都 可 以 分 解 为 这 三 种 行 为 的 一 定 比 例 构 成, 对 任 何 一 种 行 为 来 讲, 都 需 要 考 虑 服 务 能 力 的 扩 展 (Capacity) 及 服 务 的 可 靠 性 (Availability), 比 如 在 京 东 淘 宝 支 付 宝 等 网 站 上 购 买 东 西 时, 可 能 需 要 先 登 录, 登 录 过 程 其 实 是 一 个 信 息 的 读 取 的 行 为, 考 虑 到 他 们 的 用 户 量, 一 定 会 要 求 做 到, 系 统 可 以 随 时 扩 容, 并 且 当 一 台 物 机 机 器 发 生 故 障 不 可 用 时, 要 求 服 务 能 不 受 影 响 对 于 以 读 取 为 主 的 信 息 服 务, 可 以 考 虑 将 数 据 复 制 多 份 出 来, 并 且 当 用 户 登 录 时, 可 以 从 任 何 一 份 复 制 出 来 的 数 据 里 进 行 检 索, 这 样 既 扩 展 了 系 统 的 信 息 读 取 能 力, 也 使 得 任 何 一 份 数 据 复 制 失 效 也 不 会 产 生 大 的 影 响 数 据 库 本 身 都 提 供 了 数 据 复 制 的 便 捷 手 段, 比 如 Oracle 的 Active Data Guard MySQL 的 Replication 等, 为 了 简 化 事 务 管 理, 通 常 数 据 库 的 复 制 节 点 是 只 读 的, 称 之 为 从 节 点 或 备 节 点, 而 用 于 写 入 的 那 个 原 始 节 点 称 为 主 节 点, 主 第 三 页
节 点 和 从 节 点 之 间 构 成 一 套 主 从 节 点 集 群 或 主 备 节 点 集 群 由 于 从 节 点 或 备 节 点 是 能 读 取 但 不 能 写 入 的, 所 以 要 扩 展 读 能 力, 先 要 做 读 写 分 离, 通 常 这 一 步 要 梳 理 和 修 改 应 用 代 码, 进 行 详 尽 的 线 下 测 试, 再 进 行 仔 细 的 应 用 发 布, 然 后 再 修 改 应 用 程 序 对 读 取 操 作 的 数 据 源 管 理 和 选 择 方 式, 可 能 是 一 个 非 常 复 杂 的 软 件 项 目 当 后 台 用 的 是 MySQL 数 据 库, 或 兼 容 MySQL 协 议 的 数 据 库 时, 就 可 以 不 用 修 改 应 用 程 序, 使 用 OneProxy 透 明 地 实 现 读 写 分 离 功 能, 因 为 OneProxy 可 以 识 别 MySQL 协 议, 可 以 清 晰 地 识 别 协 议 包 中 的 SQL 语 句, 对 不 同 类 型 的 语 句 进 行 透 明 的 转 发 处 理, 就 可 以 实 现 对 应 用 透 明 的 读 写 分 离 了, 完 全 不 需 要 启 动 前 面 所 说 的 复 杂 的 软 件 项 目 三 OneProxy 读 写 分 离 方 法 OneProxy 里 有 两 种 不 同 的 读 写 分 离 方 法 : 第 一 种 是 Master 节 点 不 参 与 读 流 量, 比 如 有 较 多 的 读 节 点 的 场 合 OneProxy 启 动 参 数 如 下 所 示 : /usr/local/oneproxy/oneproxy \ --proxy-address=:3307 \ --proxy-master-addresses=10.128.128.238:3306@default \ --proxy-slave-addresses=10.128.128.38:3306@default \ --proxy-slave-addresses=10.128.128.39:3306@default \ --proxy-slave-addresses=10.128.128.40:3306@default \ --proxy-user-list=test/1378f6cc3a8e8a43ca388193fbed5405982fbbd3@test \ --proxy-group-policy=default:read-slave \ 第 四 页
--event-threads=8 --proxy-charset=utf8_general_ci \ --log-file=/usr/local/oneproxy/log/oneproxy.log \ --pid-file=/usr/local/oneproxy/log/oneproxy.pid 第 二 种 是 Master 节 点 参 与 读 流 量, 比 如 一 主 一 备 的 场 景, 只 需 要 分 流 一 部 份 读 操 作 到 备 就 行 了 OneProxy 启 动 参 数 如 下 所 示 : /usr/local/oneproxy/oneproxy \ --proxy-address=:3307 \ --proxy-master-addresses=10.128.128.238:3306@default \ --proxy-slave-addresses=10.128.128.38:3306@default \ --proxy-user-list=test/1378f6cc3a8e8a43ca388193fbed5405982fbbd3@test \ --proxy-group-policy=default:read-balance \ --event-threads=8 --proxy-charset=utf8_general_ci \ --log-file=/usr/local/oneproxy/log/oneproxy.log \ --pid-file=/usr/local/oneproxy/log/oneproxy.pid 可 以 看 到, 只 是 策 略 ( 请 注 意 proxy-group-policy 选 项 的 值 变 化 ) 的 不 同 而 已, 并 且 可 以 在 运 行 时 动 态 调 整 在 OneProxy 中, 所 有 的 多 行 事 务 中 的 读 操 作 都 被 认 为 是 写 入 操 作, 会 从 Master 中 执 行, 就 算 是 只 读 事 务, 也 从 Master 中 执 行, 这 一 点 是 需 要 大 家 知 道 的 如 果 想 让 一 个 普 通 的 查 询 操 作 强 制 从 Master 第 五 页
读 取, 也 可 以 在 注 释 中 加 入 master 提 示, 只 要 在 注 释 中 有 一 个 完 整 的 master 单 词 ( 不 分 大 小 写 ) 就 会 被 路 由 到 Master 上 执 行 如 下 所 示 : select /* master */ * from user_info where user_id =... 如 果 是 已 有 的 应 用 切 到 OneProxy 实 现 读 写 分 离 时, 可 能 发 现 某 些 表 不 适 合 做 读 写 分 离, 应 用 暂 时 也 不 方 便 修 改, 则 可 以 用 proxy-force-master 选 项 来 指 定 某 些 表 永 远 从 Master 读 取 数 据, 比 如 余 额 库 存 存 量 这 样 的 表 如 下 所 示 : /usr/local/oneproxy/oneproxy \ --proxy-address=:3307 \ --proxy-master-addresses=10.128.128.238:3306@default \ --proxy-slave-addresses=10.128.128.38:3306@default \ --proxy-user-list=test/1378f6cc3a8e8a43ca388193fbed5405982fbbd3@test \ --proxy-group-policy=default:4 \ --proxy-force-master=t_balance \ --proxy-force-master=t_ammount \ --event-threads=8 --proxy-charset=utf8_general_ci \ --log-file=/usr/local/oneproxy/log/oneproxy.log \ --pid-file=/usr/local/oneproxy/log/oneproxy.pid 有 些 客 户 端 工 具 可 能 会 自 动 过 滤 SQL 语 句 中 的 注 释, 比 如 官 方 的 MySQL 客 户 端 ( 需 要 加 命 令 行 选 项 -c ) 这 是 在 测 试 时 需 要 注 意 的 另 外 一 个 点 第 六 页
四 OneProxy 读 写 分 离 功 能 实 现 OneProxy 的 读 写 分 离 功 能, 已 经 有 用 户 在 线 上 使 用 了, 已 经 在 Java 程 序 Discuz 论 坛 PHPWind 论 坛 Zabbix 监 控 程 序 上 得 到 过 验 证 了, 可 以 放 心 使 用 即 使 是 不 精 通 应 用 代 码 的 DBA 也 可 以 不 写 任 何 一 行 代 码 地 实 现 读 写 分 离 的 高 可 用 方 案 第 七 页
如 对 本 文 有 任 何 疑 问 请 联 系 : 杭 州 平 民 软 件 有 限 公 司 联 系 方 式 :0571-56832288 邮 箱 :flou@onexsoft.com 网 址 :www.onexsoft.com 地 址 : 杭 州 文 二 路 391 号 西 湖 国 际 大 厦 D 楼 中 区 6F,310012 第 八 页