# UPGW Redis 数据模块方案设计文档 ## 现存的问题 1. route.db 单机文件数据库**不能满足 NES HA 集群部署需求**。 2. route.db 文件数据库的增删查改是通过 “遍历+匹配” 的方式来实现的,**不能满足高效率数据库存取需求**。 ## 解决思路 1. 考虑引入集中式的数据库支撑 NES 集群可扩展性的需求。 2. 考虑引入高性能 HASH 数据库来改进数据库读写效率,并支撑后续的 NES 功能增强,例如:数据统计、UE 感知映射。 ## Redis 的可行性分析 1. Redis 具有丰富的数据类型,如:String、List、Set、Sorted Set、HASH。 2. Redis 支持可选、可调的数据持久化,如:RDB mode、AOF mode。 3. Redis 支持丰富的数据库特性,如:publish/subscribe(发布/订阅)、通知、Key 过期。 4. Redis 具有 C 语言客户端,如:hiredis、hiredis-vip、hiredispool。 5. Redis 具有 HA 方案,如:Keepalived + Master-Slave 模式的数据备份、哨兵模式、Redis Cluster。 6. Redis 作为 Key/Value 存储系统适合 NES 这种非结构化事务应用程序。 7. Redis 具有很高的读写性能,读 110000/s、写 81000/s。 8. 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 ``` 修改: ``` = , , , , 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 # 查询 traffic_rules 中所有的 keys/values HGETALL traffic_rules # 查询指定单个 uuid 在 traffic_rules 中的 value HGET traffic_rules # 查询指定多个 uuids 在 traffic_rules 中的 values HMGET traffic_rules [uuid2] # 添加/更新一条 traffic_rules 记录 HSET traffic_rules # 添加/更新多条 traffic_rules 记录 HMSET traffic_rule [ ] # 删除指定 uuid 的 traffic_rule HDEL traffic_rules [] ``` ### 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 ``` 修改: ``` = , ``` 使用 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 # 查询 dns_rules 中所有的 keys/values HGETALL dns_rules # 查询指定单个 uuid 在 dns_rules 中的 value HGET dns_rules # 查询指定多个 uuids 在 dns_rules 中的 values HMGET dns_rules [uuid2] # 添加/更新一条 dns_rules 记录 HSET dns_rules # 添加/更新多条 dns_rules 记录 HMSET dns_rules [ ] # 删除指定 uuid 的 dns_rules HDEL dns_rules [] ```