系统架构:
Cassandra 是 一 套 开 源 分 布 式 No -SQL 数据库系统, 基于一致性哈希算法的 P2P 环形结构。 这种结构 各节点功能完全相 同, 可灵活添加节点来完成系 统的扩充或删除节点, 且无需大规模转移数据, 同 时彻底避免系 统因 单点故障
导致的不稳定性; 每个节点通过 Gossip 机制进行消息同步; 每 个 数据 项 都 会 被 复 制 到 N 个节 点( N 是通过参数配置的副本因 子), 系 统利 用 数据
的复制机将存储在各节点上的数据复制到其他节点上, 实现了数据的高度可获得性与安全性。
数据模型:
Cassandra 使用 宽 列 存 储 模 型, 每 行 数 据 记录是以 Key - Value 形式进行存储, 其中 Key为 唯一标识。 每 个Key- Value 其 中 的 Value 也 称 为Column, 作 为 一 个 三 元 组, 包 含 有
Column Name 、 Column Value 与 timestamp ; 每 个 CF 由一个 Key及其对应的若干个 Column 标识组成。一个
keyspace 包含若干 个 CF , 类似关系 型数据库中一个
database 可有 多 个table 。
下 图 为 一 个Column 型数据模型。
CPA理论:
NoSQL 典 型 遵 循 由 Eric Brewer 提 出 的CAP 理论 , 依据此理论, 在一个大规模的分布式数据系统中, 有三个需求是彼此循环依赖的, 一致性( consistency ) 、 可 用 性 ( availability ) 、 分 区 耐受性( partition tolerance ) 。
一致性: 对所有数据库客户 端 使 用 同 样 查 询 都 可 得 到 相 同 的 数 据;
可用性: 所 有 数 据 库 客 户 端 都 可 读 写 数 据;
分区耐受性: 数 据 库 分 散 到 多 个 服 务 器 上, 即使发生 网 络 故 障, 仍 可 提 供 服 务。
CAP 理 论 可简单描述 为 :
一 个 分 布 式 系 统 不 能 同 时 满 足 以上三个 特 性, 最 多 只 能 同 时 满 足 两 个。
Cassandra 主要支持 可 用 性 和 分 区 耐 受 性。
在 Cassandra 中 , 数据 具 备 最 终 一 致 性, 集 群 整 体 的 完 全
可用 性。
存储机制
Cassandra 依赖本地的文件系统通过内存与磁盘的双重存储机制来保证数 据的持久性 。
Cassandra 有三 个重 要 的 数 据 结 构, 记录 于 内 存
的 Memtable , 保 存 在 磁 盘 中 的 Commit Log和
SSTable 。
Memtable 记 录 最 近 的 修 改, 而SSTable 记录着数据库 所承载的 绝大部分数据。通常 情 况 下, 一 个 Cassandra 表 会 对 应 着 一 个
Memtable 和多 个SSTable 。
Cassandra 接收到 客户端发送来的数据, 首先将写操作记录到 位于磁
盘的 CommitLog 中; 上述操作成功 后, 更新位于内存中 的 Memtable 数 据 结 构。 持 续 的 写 入 数据, 使得 Memtable 逐渐增长, 当 其数据量到 达某个阈 值时, Cassandra 的数据迁移被触发, 一 方面将
Memtable 刷 写 到 本 地 磁 盘 上 成 为 永 久 的SSTable , 另一方面将 CommitLog 中 的 写 入记录移除。 对于读操作, 客 户 端 先 查 询
Memtable 中的数据, 若无法获取所需信息, 则 检索本地磁盘。
Cassandra 会定期执行压紧compact 操作, 将同一条数据不同的版本进行合并, 过时数据也会在此过程中被删除; 分层数据压缩, 有效减少数据体积
及磁盘 I / O 。
系统设置(集群)
针对实时气象数据存储系统, 用户对该系统读取的性能需求远远高于写入数据。 通过对副本数进行合理设置, 可分散读取压力 。 对于5 节点集群, 将副本数设置为 3 ;
Row 分区 模式:
采用自动分区方式, 使不同的 Row Key 均匀分布在各节点上, 有利于数据读取压力的分散。
Cassandra 表设计
作为典型的非结构化数据,气象数据可以由多维索引 来确定一个唯一的数据。
业务用户常见的操作包括“最新数据”“左右翻页”“上下翻页”等。
数据表
根据不同数据类型建立相应数据表, 用于存储数据内容, 包括:
ECMWFHR(高分辨率数值预报产品 )、
SATELLITE ( 卫 星 资料)、
UPPERAIR (高空站点资料)、
SINGLERADAR (雷达资料) 等。
以“ T639 ”为 例 说明 数据表结构(表 1 )。
建表 语 句: CREATE TABLE "T639 "
( "dataPath " text , column1 text ,
value blob , PRIMARY KEY (" dataPath " ,
column1 ) ) ;
层次表
用于存储所有模式或实况的层次信息, 表名为level ; 用 户 在 客户 端进行上下翻页操作, 从level 表中获取当前层次的上一层或下一层信息; 利用层次表与数据表, 可检索到不同层次的数据(表2 )。
建表语 句: CREATE TABLE level (
"dataPath " text , column1 int , value int , PRIMARY KEY (" dataPath " , column1 )) ;
最新时刻表
用于存储各类数据的最新时刻信息, 表名 为latestdatatime 。 利 用 最新时刻表, 用户能通过客户端快速查找到最新数据文件名。 用户根据完整索引 (文件路径与最新数据文件名), 例: T639 / WIND / 500 / 17030108. 000 , 即可在“数据表”中获取到对应数据(表 3 )。
建表语句: CREATE TABLE latestdatatime
( " dataPath " text , column1 text , value text ,PRIMARY KEY (" dataPath " , column1 )) ;
存储系统性能测试
测试环境
选用5台相同配置的服务器用来搭建分布式存储系统。 服 务 器 操作 系 统 为 Red Hat Enter -prise Linux Server release 7. 1 , 处理器参数为Intel ( R ) Xeon ( R ) CPU E5 - 2620 v2 @ 2. 10GHz , 主频为2. 1 GHz ; 内 存大小为 256 GB ;6 块4TB SATA 硬盘; 服务器间通过万兆光纤连接。Cassandra 数据库版本为2. 2. 5 。
高可用性测试
由 5 个节点所组成分布式存储系统, 其结构上具有如下特点。
( 1 )服务器双网卡绑定, 即将两个物理网卡虚拟成一个逻辑网卡; 提升服务器之间的传输带宽,实现网卡冗余。
( 2 )用于集群内部数据交换的两台万兆光纤交换机, 采取级联方式, 可互为备份。
( 3 ) 6 块SATA 硬盘, 其中 2 块做 RAID1, 安装操作 系 统 及 软 件; 另 外 4 块 4TB 用 作 两 个RAID0 , 用于存储数据。
( 4 )服务器集群为环形结构, 没有 master 节点, 各节点功能完全一样。
按照表4中内容, 对系统的基础设施层(包括网络设备、存储设备等)、 软件层(数据库) 进行测试, 来验证系统的高可用 性; 从表中结论可知, 系统中用于内部数据交换的光纤或网卡、交换机及任一 Cassandra 服务器故障, 均不影响 MICAPS4客户端调取数据。
读取性能测试
通过读取数据的脚本文件(可获取数据字节数信息, 表5中 ECMWF _ HR / TMP / 100 目 录下数 据 字 节 数 为 132642 字 节, SATELLITE /
FY2E / L1 / IR3 / EQUAL 下数据字节数为554944字节,
T639 / WIND / 100 下数据字节数为1449052字节), 模拟单用户及50 用 户 、 100 用 户 客户 端对同一类型数据进行读取, 共分 3 组, 即对三种不同类型的数据进行测试, 测试性能见表5 , 注意测试结果包含网络传输时间。
从数据读取的测试结果可以看出 :
( 1 )50 用户并发和100 用 户 并发 客户 端 同 时 对 同 一 类 型数据进行 读 取 的 时 间 与 单 用 户 读 取 时 间 相 当 。以 T639 / WIND/100 为 例, 50 用 户 并 发 和 100用 户 并发与单用 户 读取相 关数据 所 花 费 的 平 均时间 均在20 ms 左右。
( 2 ) 在100 用 户 并发情况下, 从数据库 中 调 取数据 所消 耗 的 时 间 均 以 ms量级为 单 位 ( 包 含 网 络 传 输 时 间 ) , 时 间 远 远 小于在samba 服 务 器 上 读 取 数 据 的 时 间 。
( 3) 数据读取时 间 和 单 个 数 据 的 字 节 数 近 似 成 正 比,即单个数 据 文 件 字 节 数 越 大, 读 取 数 据 所 花 费的时间 则 越长。
结语
利用 Cassandra 分布式数据库搭建的存储环境, 提高了实时气象数据存储效率与检索速度, 通过统一的数据平台, 实现了运维人员对该系统“零”维护。 通过在实际业务环境中进行测试, 验证了该分布式数据环境的高可用性; 以毫秒级为单位的数据读取时间, 能很好地满足业务对数据时效性的需求。