网 站 集 群 架 构 利 用 开 源 软 件 构 建 高 可 用 高 性 能 可 扩 展 的 集 群 系 统 兰 锋 bluedata@gmail.com
摘 要 1. GSLB: 全 局 负 载 均 衡 2. SLB: 服 务 器 负 载 均 衡 四 层 交 换 LVS 七 层 交 换 Nginx 3. Heartbeat 实 现 HA 4. MySQL 数 据 库 集 群 5. 集 群 环 境 下 的 存 储 备 份 6. 集 群 的 监 控 及 管 理
GSLB - Global Server Load Balance GSLB 是 Global Server Load Balance 的 缩 写, 意 思 是 全 局 负 载 均 衡 实 现 在 广 域 网 ( 包 括 互 联 网 ) 上 不 同 地 域 的 服 务 器 间 的 流 量 调 配 使 用 最 佳 的 服 务 器 ( 组 ) 为 最 近 的 访 问 者 提 供 服 务, 从 而 确 保 访 问 质 量
GSLB 架 构 图
多 IDC 与 单 IDC 的 对 比 好 处 可 用 : 不 会 因 某 一 IDC 机 房 由 于 不 可 抗 力 造 成 的 网 络 中 断 而 影 响 访 问, 可 用 性 高 容 灾 : 可 避 免 灾 难 性 事 件 ( 比 如 地 震 ) 造 成 无 可 挽 回 的 数 据 丢 失 速 度 : 机 房 离 访 问 者 更 近, 访 问 质 量 更 高 坏 处 实 现 复 杂 : 流 量 分 配 问 题, 数 据 同 步 问 题 管 理 复 杂 : 跨 地 区 距 离 远, 维 护 麻 烦 成 本 较 高 : 要 在 多 个 IDC 租 用 机 柜 或 机 位
利 用 Bind9 的 视 图 功 能 实 现 GSLB 1 cat named.conf... include "acl_chinanet.conf"; view "chinanet" { match-clients { "chinanet"; };... include "acl_cnc.conf"; view "cnc" { match-clients { "cnc"; };... view "other" { match-clients { "any"; };...
利 用 Bind9 的 视 图 功 能 实 现 GSLB 2 cat acl_chinanet.conf acl "chinanet" { 58.32.0.0/13; 58.40.0.0/15;... 222.222.0.0/15; 222.240.0.0/13; }; acl_cnc.conf 则 为 网 通 的 IP 段 然 后 分 别 定 义 各 视 图 zone 文 件 中 域 名 所 对 应 的 IP 地 址 详 细 原 理 可 参 考 GSLB using xbaydns: http://you.video.sina.com.cn/b/9144571-1435882772.html
SLB - Server Load Balancing SLB 是 Server Load Balancing 的 缩 写, 意 思 是 服 务 器 负 载 均 衡 可 实 现 多 个 服 务 器 之 间 的 负 载 均 衡 当 客 户 端 向 虚 拟 服 务 器 ( 虚 拟 服 务 器 是 多 个 真 实 服 务 器 的 群 集 ) 发 起 连 接 时, 通 过 均 衡 算 法 转 发 到 真 实 服 务 器
LVS - Linux Virtual Server LVS 是 在 Linux 内 核 中 做 四 层 交 换 LVS 只 用 128 个 字 节 记 录 一 个 连 接 信 息,512M 可 用 内 存 即 可 支 持 四 百 万 条 连 接 数, 性 能 很 高 Linux 2.6 内 核 已 经 包 含 了 ipvs 模 块, 只 需 安 装 ipvsadm 真 实 服 务 器 需 要 解 决 ARP 问 题 ( ARP 缓 存 造 成 的 ARP 欺 骗 ) arp_ignore = 1 ## 只 要 这 台 机 器 上 面 任 何 一 个 设 备 有 这 个 IP, 就 响 应 ARP 请 求, 并 发 送 MAC 地 址 应 答 arp_announce = 2 ## 发 送 ARP 请 求 时 只 使 用 本 设 备 的 IP 地 址 和 MAC 地 址, 避 免 造 成 ARP 欺 骗 LVS 的 有 关 中 文 文 档 : http://www.linuxvirtualserver.org/zh/index.html
LVS 架 构 图
Nginx Nginx ("engine x") 是 一 个 高 性 能 的 HTTP 和 反 向 代 理 服 务 器 七 层 交 换, 大 约 能 支 持 五 万 个 并 发 连 接 可 以 通 过 定 义 upstream 实 现 后 端 应 用 服 务 器 ( 如 运 行 php-cgi 的 机 器 ) 的 负 载 均 衡 upstream php-fcgi { server 192.168.0.101:9000 weight=5; server 192.168.0.102:9000 weight=4; server 192.168.0.103:9000 weight=3; } location ~.*\.php?$ { fastcgi_pass php-fcgi; include fastcgi_params; }
ngx_http_upstream_hash_module url hash 是 用 于 提 高 squid 群 集 命 中 率 的 一 种 算 法 通 过 DNS 或 LVS 可 以 把 流 量 分 配 到 多 个 squid 节 点, 但 每 台 squid 的 缓 存 数 据 是 重 复 的 对 $request_uri 进 行 hash, 并 把 所 有 访 问 都 转 发 到 后 端 的 squid: upstream squid { server squid1:3128; server squid2:3128; hash $request_uri; } location / { proxy_pass http://squid; include proxy.conf; }
Nginx url hash 的 高 可 用 性 当 有 squid 主 机 失 效 时, 访 问 相 应 的 页 面 会 出 现 502 错 误 可 以 定 义 hash_again 及 proxy_next_upstream, 在 有 缓 存 节 点 失 效 时, 可 以 重 新 hash 但 这 会 对 整 个 缓 存 池 造 成 冲 击 利 用 error_page 来 实 现 故 障 的 转 移 : error_page 502 = @fetch; location @fetch { proxy_pass http://backup; include proxy.conf; } upstream backup { server squid_backup_1:3128; server squid_backup_2:3128; } Nginx 的 中 文 维 基 : http://wiki.nginx.org/nginxchs
Heartbeat Heartbeat 最 核 心 的 两 个 部 分 : 心 跳 监 测 部 分 和 资 源 接 管 部 分 心 跳 监 测 可 以 通 过 网 络 或 串 口 进 行, 而 且 支 持 冗 余 链 路, 节 点 之 间 相 互 发 送 报 文 来 告 诉 对 方 自 己 当 前 的 状 态 如 果 一 个 节 点 在 指 定 的 时 间 内 未 收 到 对 方 发 送 的 报 文, 那 么 就 认 为 对 方 失 效 这 时 需 要 启 动 资 源 接 管 模 块 来 接 管 运 行 在 对 方 主 机 上 的 资 源 或 服 务 直 接 安 装 heartbeat 包 即 可, 还 可 安 装 ldirectord (for Debian) 监 测 和 管 理 LVS 集 群 中 的 真 实 服 务 器 ( CentOS 下 是 heartbeatldirectord ) 使 用 网 络 监 测 要 注 意 同 一 网 络 中 存 在 多 个 HA 应 用 时 的 广 播 (bcast) 造 成 的 干 扰, 这 种 情 况 下 应 该 使 用 单 播 (ucast) 危 险 的 脑 裂 (split-brain) Heartbeat 应 用 在 操 作 存 储 设 备 的 情 况 下 是 有 一 定 的 风 险 的
Heartbeat + LVS + Nginx + Squid + PHP
MySQL 数 据 库 集 群 1. MySQL Cluster 2. MySQL 复 制 之 一 主 多 从 模 式 3. MySQL 复 制 之 多 主 模 式 4. MySQL 复 制 之 级 联 复 制
MySQL Cluster 架 构 图 不 用 考 虑 读 写 分 离 问 题 SQL 节 点 需 要 使 用 LVS 做 流 量 的 分 配 NDB 的 性 能 较 低 ( 新 发 布 的 MySQL Cluster 7.0 有 所 改 善 ) 稳 定 性 尚 有 待 提 高 生 产 环 境 下 的 应 用 实 例 太 少
MySQL 一 主 多 从 模 式 架 构 图
MySQL 一 主 多 从 模 式 的 要 点 读 写 分 离 会 使 应 用 层 变 的 更 复 杂 可 以 用 MySQL-Proxy 实 现 读 写 分 离, 而 多 个 slave 可 以 由 LVS 调 度 MySQL-Proxy 同 样 存 在 稳 定 性 问 题, 多 了 一 层 结 构 当 然 也 就 多 了 一 个 故 障 点 修 改 应 用 程 序 的 数 据 库 连 接 类 实 现 读 写 分 离 是 较 为 常 见 的 做 法 不 能 在 slave 上 做 实 时 查 询, 需 要 实 时 查 询 的 应 用 只 能 走 master, 这 需 要 在 应 用 层 做 区 分
MySQL 一 主 多 从 模 式 的 集 群 方 案 Heartbeat + DRBD + LVS
MySQL + Heartbeat + DRBD + LVS MySQL + DRBD 是 MySQL 官 方 网 站 上 推 荐 的 一 个 方 案 解 决 了 master 的 单 点 问 题 用 ldirectord 管 理 slave 可 以 有 效 的 将 失 效 节 点 移 出 集 群 由 于 MySQL 文 件 系 统 和 磁 盘 均 有 缓 存 功 能, 在 master 掉 电 的 情 况 下, binlog 文 件 最 后 的 Position 要 落 后 slave 已 经 复 制 的 Position 很 多 这 样 就 算 备 份 节 点 接 管 了 资 源, 仍 然 会 造 成 复 制 的 中 断 需 要 手 动 恢 复 复 制 进 程 因 split-brain 造 成 资 源 争 抢 进 而 因 错 误 写 入 造 成 存 储 的 失 效 恢 复 时 间 较 长
MySQL 多 主 模 式 架 构 图
MySQL 多 主 模 式 的 要 点 不 存 在 读 写 分 离 问 题 可 扩 展 性 较 差, 扩 展 较 为 麻 烦 自 增 ID 的 重 复 问 题 可 以 通 过 设 定 auto_increment_increment 和 auto_increment_offset 来 解 决 例 如 把 auto_increment_increment 设 置 为 3, 而 把 master1, master2, master3 的 auto_increment_offset 分 别 设 置 为 1, 2, 3, 自 增 ID 就 分 别 为 : 1 4 7 10 13... 2 5 8 11 14... 3 6 9 12 15...
MySQL 级 联 复 制 解 决 多 IDC 的 数 据 库 同 步 问 题 多 个 IDC 之 间 由 master-slave 模 式 同 步 数 据 可 以 用 多 线 机 房 的 MySQL Server 做 master, 而 用 电 信 / 网 通 机 房 的 MySQL Server 做 slave 在 同 一 IDC, 直 接 从 顶 级 master 同 步 的 slave 就 成 为 了 其 它 MySQL Server 的 master 确 保 次 级 master 的 binlog 一 致, 需 要 用 到 google-mysql-tools 中 的 MirroredBinlogs MirroredBinlogs 可 以 在 slave 保 存 一 份 和 master 完 全 相 同 的 binlog 当 一 个 master 对 应 的 slave 过 多, 出 现 性 能 问 题 时, 也 可 以 用 级 联 的 方 式 进 一 步 扩 展
集 群 环 境 下 的 存 储 备 份 NAS - Network Attached Storage ( 网 络 附 属 存 储 ) NAS 通 过 NFS/Samba/WebDAV/FTP 等 方 式 实 现 共 享 存 储, 基 本 上 可 以 直 接 叫 做 Storage Server NFS 是 Linux 集 群 中 最 常 见 的 共 享 存 储 方 式, 特 点 是 简 单 易 用, 但 性 能 有 限 SAN - Storage Area Network ( 存 储 区 域 网 络 ) 价 格 昂 贵, 在 中 小 型 网 站 中 应 用 较 少 大 型 网 站 使 用 Oracle 数 据 库 做 RAC 的 话 就 需 要 使 用 SAN 了 iscsi 价 格 相 对 较 低 作 为 iscsi Initiator, Debian 下 需 要 安 装 openiscsi, 而 CentOS 下 需 要 安 装 iscsi-initiator-utils Linux 下 SAN 的 共 享 存 储, 较 为 常 见 的 方 案 是 RHCS + GFS + CLVM 分 布 式 文 件 系 统
网 站 应 用 存 储 文 件 的 分 类 及 特 点 1. 程 序 文 件 : 更 新 少, 数 量 少, 频 繁 读 2. 数 据 库 文 件 : 文 件 大, 读 写 操 作 极 为 频 繁, 连 续 写 3. 用 户 文 件 : 数 量 巨 大, 读 写 较 多, 读 取 分 散 4. 零 时 文 件 : 小 文 件, 数 量 多, 不 需 要 永 久 存 储 如 session 文 件
程 序 文 件 存 储 的 解 决 方 案 NFS 是 一 个 还 算 不 错 的 选 择, 但 有 如 下 弱 点 : 1. 严 重 的 单 点 故 障 隐 患 2. 扩 展 性 较 差, 支 持 的 节 点 数 量 有 限 3. 大 量 不 必 要 的 网 络 传 输 根 据 程 序 文 件 读 写 的 特 点, 可 以 考 虑 把 文 件 放 在 本 机 在 文 件 更 改 时 同 步 到 各 个 节 点 rsync: 多 节 点 的 同 步 不 方 便 ; 扫 描 目 录 树 的 改 变 比 较 慢 可 用 以 下 两 个 工 具 解 决 上 述 两 个 问 题 : csync2(http://oss.linbit.com/csync2/): 集 群 同 步 工 具 inotify-tools(http://inotify-tools.sourceforge.net/): 是 为 Linux 下 inotify 文 件 监 控 工 具 提 供 的 一 套 C 的 开 发 接 口 库 函 数, 同 时 还 提 供 了 一 系 列 的 命 令 行 工 具, 这 些 工 具 可 以 用 来 监 控 文 件 系 统 的 事 件
csync2 + inotify 实 现 集 群 文 件 即 时 同 步 1 Debian 下 csync2 的 安 装 : apt-get install openbsd-inetd csync2 cat /etc/csync2.cfg nossl * *; group cluster1 { host web1 web2 web3 web4; key /etc/csync2_ssl_cert.key; include /home; exclude /home/tmp; exclude *~.*; auto younger; } 如 果 进 行 远 程 同 步, 为 了 安 全, 应 该 使 用 ssl 连 接, 这 需 要 安 装 openssl
csync2 + inotify 实 现 集 群 文 件 即 时 同 步 2 Debian 下 inotify-tools 的 安 装 : apt-get install inotify-tools 可 以 在 需 要 同 步 的 节 点 上 运 行 下 面 这 个 脚 本 进 行 同 步 了 : cat /usr/local/sbin/csync2.sh #!/bin/sh src=/home inotifywait -mrq --timefmt '%d/%m/%y %H:%M' --format '%T %w%f' \ --exclude "\.swp$" \ -e modify,attrib,create,delete,move \ ${src} \ while read file do csync2 -x > /dev/null 2>&1 done 用 作 即 时 备 份 也 是 个 不 错 的 选 择
数 据 库 的 存 储 备 份 对 于 数 据 库 应 用 存 储 的 特 点, 一 般 使 用 RAID5 或 RAID1+0 而 在 线 扩 容 一 般 是 通 过 LVM 实 现 DRBD 是 基 于 网 络 的 RAID1, 可 实 现 MySQL 单 master 方 案 的 热 备 其 实 每 个 slave 也 都 是 一 个 备 份 利 用 LVM 的 快 照 功 能 实 现 对 MySQL 数 据 库 文 件 的 全 备 份, 再 通 过 binlog 实 现 增 量 备 份 是 一 个 很 好 的 备 份 方 案 LVM 在 存 储 管 理 中 是 非 常 重 要 的 可 参 考 逻 辑 卷 管 理 : http://www.ibm.com/developerworks/cn/linux/l-lvm2/
用 户 文 件 的 存 储 分 布 在 多 个 节 点, 避 免 单 点 故 障 容 量 可 动 态 扩 充 可 方 便 的 通 过 HTTP 访 问 对 于 大 量 小 文 件 的 存 储, NAS 和 SAN 都 不 合 适 分 布 式 存 储 是 这 种 应 用 较 好 的 解 决 方 案 MogileFS 由 存 储 节 点 跟 踪 器 跟 踪 用 的 数 据 库 三 个 组 件 构 成 FastDFS 有 两 个 角 色 : 跟 踪 器 (Tracker) 和 存 储 节 点 (Storage) MogileFS 和 FastDFS 都 需 要 通 过 API 访 问 文 件, 增 加 了 应 用 层 的 复 杂 程 度, 但 就 存 储 而 言 是 简 单 高 效 且 易 于 维 护 的
FastDFS 架 构 图
FastDFS 的 要 点 1. 每 个 组 中 存 储 节 点 的 数 据 都 是 相 同 的, 这 可 以 实 现 备 份 和 负 载 均 衡 2. 通 过 增 加 新 的 存 储 组, 可 以 方 便 的 实 现 在 线 扩 容 3. 可 以 把 存 储 节 点 的 存 储 目 录 通 过 Nginx 发 布 出 来 直 接 对 外 提 供 访 问 4. 对 于 相 同 的 文 件, 可 以 只 创 建 链 接, 从 而 节 约 存 储 空 间, 但 这 需 要 创 建 索 引 文 件 5. 可 定 义 多 个 Tracker, 避 免 单 点 故 障, 分 散 压 力
Moose File System (MFS) MFS 的 特 点 : 1. 通 过 FUSE 实 现 的 通 用 文 件 系 统, 简 化 了 对 文 件 的 操 作, 应 用 层 基 本 不 用 改 动 2. 添 加 新 的 服 务 器 或 者 硬 盘 就 可 以 动 态 的 扩 展 容 量 3. 可 以 在 不 同 的 服 务 器 上 保 存 多 份 拷 贝 提 高 可 用 性 4. 可 以 指 定 被 删 除 文 件 的 保 留 时 间 实 现 回 收 站 的 功 能 MFS 的 结 构 : Managing server (master) Data servers (chunkservers) Clients (mfsmount)
MFS 架 构 图
缓 存 系 统 Memcached Memcached 是 非 常 热 门 的 一 个 缓 存 工 具 利 用 Memcached 缓 存 数 据 库 查 询 结 果 是 网 站 提 升 性 能 的 重 要 手 段 在 集 群 环 境 中, 可 以 用 其 保 存 session, 实 现 session 的 共 享 Memcachedb 实 现 永 久 存 储 可 以 减 轻 数 据 库 的 压 力, 比 如 把 需 要 反 复 读 写 的 点 击 量 存 入 Memcachedb
集 群 的 监 控 及 管 理 监 控 : Nagios 用 来 即 时 监 控 集 群 中 主 机 及 服 务 的 状 态, 并 给 管 理 者 发 送 报 警 信 息 Cacti 记 录 集 群 运 作 中 的 各 种 数 据, 并 绘 制 出 图 形, 为 管 理 者 提 供 有 效 的 数 据 支 持 管 理 : 如 果 节 点 较 少, 可 以 基 于 ssh + key 编 写 脚 本 进 行 管 理 csync2 也 可 实 现 配 置 文 件 更 改 时 触 发 指 定 脚 本 的 执 行 较 多 的 节 点 可 以 考 虑 使 用 pssh (parallel ssh) 进 行 管 理 FUNC (Fedora Unified Network Controller) 实 现 对 大 量 节 点 的 复 杂 管 理
完