UPGW Redis 数据模块方案设计文档
现存的问题
route.db 单机文件数据库不能满足 NES HA 集群部署需求。
route.db 文件数据库的增删查改是通过 “遍历+匹配” 的方式来实现的,不能满足高效率数据库存取需求。
解决思路
考虑引入集中式的数据库支撑 NES 集群可扩展性的需求。
考虑引入高性能 HASH 数据库来改进数据库读写效率,并支撑后续的 NES 功能增强,例如:数据统计、UE 感知映射。
Redis 的可行性分析
Redis 具有丰富的数据类型,如:String、List、Set、Sorted Set、HASH。
Redis 支持可选、可调的数据持久化,如:RDB mode、AOF mode。
Redis 支持丰富的数据库特性,如:publish/subscribe(发布/订阅)、通知、Key 过期。
Redis 具有 C 语言客户端,如:hiredis、hiredis-vip、hiredispool。
Redis 具有 HA 方案,如:Keepalived + Master-Slave 模式的数据备份、哨兵模式、Redis Cluster。
Redis 作为 Key/Value 存储系统适合 NES 这种非结构化事务应用程序。
Redis 具有很高的读写性能,读 110000/s、写 81000/s。
Redis 具有原子性操作,以及多语句的原子性。
hiredis
Redis 支持多种编程语言的客户端,详见:https://redis.io/clients。
其中,hiredis、hiredis-vip 是官方推荐的两个 C 语言客户端。
NOTE:考虑线程安全问题!
Redis 的 HA 主从备份高可用方案
使用 Keepalived + M/S Redis 的高可用方案。
脚本配置参考 https://github.com/Glf9832/keepalived_redis_nginx 项目。
数据库字段设计
Traffic Rule
原来:
[Traffic Rules]
d6e4d210-3d92-422b-83d7-11a0de50fe43,52:54:00:62:ae:3b=prio:99,encap_proto:gtpu,srv_ip:10.0.200.20
fce5d210-2a92-422b-83d7-11a0de50feae,52:54:00:62:ae:3b=prio:99,encap_proto:noencap,srv_ip:10.0.200.20
修改:
<uuid> = <mac_addr>, <prio>, <proto>, <ue_ip>, <srv_ip>
d6e4d210-3d92-422b-83d7-11a0de50fe43=52:54:00:62:ae:3b,prio:99,encap_proto:gtpu,srv_ip:10.0.200.20
fce5d210-2a92-422b-83d7-11a0de50feae,52:54:00:62:ae:3b,prio:99,encap_proto:noencap,srv_ip:10.0.200.20
使用 Redis HASH 来存储 Traffic Rule:
# 查询 traffic_rules 所有的 uuids,也可以用于判断是否存在 traffic_rules HASH
HKEYS traffic_rules
# 查询 traffic_rules 所有的 values
HVALS traffic_rules
# 查询 traffic_rules 的条目的数量
HLEN traffic_rules
# 查询 uuid 是否存在于 traffic_rules 中
HEXISTS traffic_rules <uuid>
# 查询 traffic_rules 中所有的 keys/values
HGETALL traffic_rules
# 查询指定单个 uuid 在 traffic_rules 中的 value
HGET traffic_rules <uuid>
# 查询指定多个 uuids 在 traffic_rules 中的 values
HMGET traffic_rules <uuid1> [uuid2]
# 添加/更新一条 traffic_rules 记录
HSET traffic_rules <uuid> <values>
# 添加/更新多条 traffic_rules 记录
HMSET traffic_rule <uuid1> <value1> [<uuid2> <value2>]
# 删除指定 uuid 的 traffic_rule
HDEL traffic_rules <uuid1> [<uuid2>]
DNS Rule
原来:
[DNS Rules]
a8098c1a-f86f-11da-bd1a-00112444be1e=id:a8098c1a-f86f-11da-bd1a-00112444be1e,domain_name:www.testtest6.com,ip:10.0.30.1
修改:
<uuid> = <domain>, <ip_addr>
使用 Redis HASH 来存储 DNS Rule:
# 查询 dns_rules 所有的 uuids,也可以用于判断是否存在 dns_rules HASH
HKEYS dns_rules
# 查询 dns_rules 所有的 values
HVALS dns_rules
# 查询 dns_rules 的条目的数量
HLEN dns_rules
# 查询 uuid 是否存在于 dns_rules 中
HEXISTS dns_rules <uuid>
# 查询 dns_rules 中所有的 keys/values
HGETALL dns_rules
# 查询指定单个 uuid 在 dns_rules 中的 value
HGET dns_rules <uuid>
# 查询指定多个 uuids 在 dns_rules 中的 values
HMGET dns_rules <uuid1> [uuid2]
# 添加/更新一条 dns_rules 记录
HSET dns_rules <uuid> <values>
# 添加/更新多条 dns_rules 记录
HMSET dns_rules <uuid1> <value1> [<uuid2> <value2>]
# 删除指定 uuid 的 dns_rules
HDEL dns_rules <uuid1> [<uuid2>]