公开/公告号CN107688611A
专利类型发明专利
公开/公告日2018-02-13
原文格式PDF
申请/专利权人 杭州铭师堂教育科技发展有限公司;
申请/专利号CN201710655955.4
申请日2017-08-03
分类号
代理机构杭州求是专利事务所有限公司;
代理人刘静
地址 310019 浙江省杭州市江干区九盛路9号A15幢5楼507室
入库时间 2023-06-19 04:31:42
法律状态公告日
法律状态信息
法律状态
2022-08-12
专利权的转移 IPC(主分类):G06F16/28 专利号:ZL2017106559554 登记生效日:20220729 变更事项:专利权人 变更前权利人:杭州铭师堂教育科技发展有限公司 变更后权利人:杭州铭师堂数字科技有限公司 变更事项:地址 变更前权利人:310019 浙江省杭州市江干区九盛路9号A15幢5楼507室 变更后权利人:310000 浙江省杭州市拱墅区祥园路108号1幢8层801室
专利申请权、专利权的转移
2020-02-28
授权
授权
2018-03-13
实质审查的生效 IPC(主分类):G06F17/30 申请日:20170803
实质审查的生效
2018-02-13
公开
公开
技术领域
本发明属于计算机技术领域,应用于Redis数据库的应用场景,主要针对单个或者多个键值的查看、备份、删除和恢复等管理,简化操作流程,大大提升操作效率。
背景技术
对于互联网公司而言,Redis数据库作为缓存和高性能存储方案,应用越来越广泛,由于业务不同,对Redis的操作需求也千差万别,对于单个或者多个键值的操作,也日渐增多,但是,现有Redis键值管理方案存在如下缺点:
1)一般是针对所有键值的操作,对单个或者多个键值的支持不够有好。
2)操作效率低下,需要较多的人力成本。
3)操作风险较大,并且无法做到恢复。
发明内容
本发明的目的在于针对现有技术的不足,提供一种基于saltstack的Redis键值管理系统及方法,基于saltstack可以方便地获取到Redis主从集群的元信息,以及管理备份文件,方便备份和恢复操作。
本发明的目的是通过以下技术方案来实现的:一种基于saltstack的Redis键值管理系统,该系统包括管理节点、数据库节点和存储节点;
数据库节点:运行Redis主从集群的节点,每个Redis主从集群包括一个Redis主库和一个或者多个Redis从库;不同的Redis主从集群端口不同,同一个Redis主从集群的主库和从库端口一致;Redis主库和Redis从库服务器需要部署saltstack客户端,用于接收saltstack管理端发送的指令和完成相应的操作;将数据库节点的主机名和IP记录到数据库节点元信息中;
存储节点:存储Redis键值数据,便于进行Redis键值恢复操作,存储节点需要部署saltstack客户端,用于接收saltstack管理端发送的指令和完成相应的操作;将存储节点的主机名、IP、存储路径记录到存储节点元信息中;
管理节点:存储所有元信息,包括Redis主从集群元信息、键值备份元信息、存储节点元信息和数据库节点元信息;同时,在管理节点上部署Web应用服务和saltstack管理端;通过saltstack管理端发送相应的指令到数据库节点的saltstack客户端,可以收集Redis主从集群元信息;通过saltstack管理端发送相应的指令到存储节点的saltstack客户端,可以实现传输键值备份文件,从而简化备份和恢复操作;Web应用服务可以实现平台化管理,简化Redis键值管理。
进一步地,所述管理节点包括平台化管理模块、元信息管理模块、键值查看模块、键值备份模块、键值删除模块、存储管理模块和键值恢复模块;
所述平台化管理模块,需要传入参数为:端口号、键值名和键值类型;键值类型表示键值名的类型,包括前缀和全称两种,如果是前缀,表示键值名是某些键值的打头部分,如果是全称,表示键值名是一个具体的键值,默认类型是前缀;在管理节点上,部署Web应用服务,提供一个Web界面,提供查看、备份、删除和恢复四个选项,分别调用键值查看模块、键值备份模块、键值删除模块和键值恢复模块;
所述元信息管理模块,需要传入参数为:数据库节点元信息、存储节点元信息;在管理节点上,通过saltstack接口,首先把所有的saltstack客户端注册到saltstack管理端,然后,获取到所有数据库节点上的Redis进程信息,得到每个Redis数据库端口号、密码,记录每个Redis数据库的端口号、IP、密码到Redis主从集群元信息中;在存储管理模块执行结束后,得到键值备份文件名,解析所述键值备份文件名得到Redis端口号、键值名和日期,记录所述端口号、键值名、键值备份文件名和日期到键值备份元信息;如果数据库节点或者存储节点发生变更,人工修改数据库节点元信息或者存储节点元信息;
所述键值备份模块,需要传入的参数:端口号、键值名、键值类型;在管理节点上,部署PHP环境以及Redis驱动;根据传入的端口号查询Redis主从集群元信息,随机选择一个所述端口号相关的Redis数据库IP以及对应的密码,根据所述Redis数据库IP、端口号和密码,建立PHP和Redis的连接;根据传入的键值名、键值类型,进行键值匹配操作,实现指定键值的备份;本模块执行成功后,返回键值备份文件名;
所述键值查看模块,需要传入的参数:端口号、键值名、键值类型;包括查看键值的个数以及部分键值,方便管理员了解键值名相关的信息;在管理节点上,根据所述端口号,查询所述Redis主从集群元信息,随机得到一个所述端口号对应的Redis数据库的IP和密码,建立PHP和Redis的连接,根据键值名、键值类型,执行如下操作:如果键值类型是全称,那么调用Redis自身接口SCAN,不需要设置模糊匹配参数*,返回执行结果即可,如果键值类型是前缀,调用Redis自身接口SCAN,需要设置模糊匹配参数*,同时调用系统函数COUNT(),计算所有匹配到的键值的数量,并且打印部分键值的名字;
所述键值删除模块,需要传入的参数:端口号、键值名、键值类型;本模块执行之前,会自动调用键值备份模块,用于备份指定的键值,方便后续执行恢复键值操作;如果键值备份模块执行失败,本模块无法执行;否则,根据传入的端口号,查询Redis主从集群元信息,随机得到一个对应的Redis数据库的IP和密码,建立PHP和Redis的连接,获取Redis的role信息,如果是slave,调用Redis接口,获取Redis主库的IP,如果是master,直接执行下面的操作:如果键值类型是全称,那么调用Redis自身接口SCAN,不需要传入匹配参数*,对于匹配到的键值,调用Redis自身接口DEL,即可删除所述键值;如果键值类型是前缀,那么调用Redis自身接口SCAN,需要传入匹配参数*,针对匹配到的键值,调用Redis自身接口DEL,采用循环方式,逐个删除匹配到的所有键值。
所述存储管理模块,需要传入的参数:存储节点元信息、键值备份文件名;根据存储节点元信息解析得到存储节点主机名和存储路径;在键值备份模块执行结束后,返回键值备份文件名,在管理节点上,调用saltstack接口,发送键值备份文件到存储节点上,根据键值备份文件名解析得到端口号、键值名和日期,然后把端口号、键值名、键值备份文件名和日期写入到键值备份元信息;
所述键值恢复模块,需要传入的参数为:端口号、键值备份文件名;在管理节点上,扫描所述键值备份文件名,如果不存在,返回失败,表示不存在指定的备份文件,无法执行恢复操作,否则,根据所述端口号,查询Redis主从集群元信息,随机得到一个对应的Redis数据库的IP和密码,建立PHP与Redis的连接,调用Redis接口,查询role,如果role是slave,根据Redis接口获取maser的IP,恢复键值数据。
一种基于saltstack的Redis键值管理方法,该方法包括以下步骤:
(1)调用元信息管理模块,在管理节点上保存存储节点元信息、数据库节点元信息、Redis主从集群元信息和键值备份元信息;
其中,存储节点元信息包括:存储节点的主机名、存储路径,如果存储节点发生变更,需要人工更新所述存储节点元信息;
数据库节点元信息包括数据库节点主机名、IP以及存储路径,如果所述数据库节点发生变更,需要人工变更所述数据库节点元信息;
Redis主从集群元信息包括所有Redis主从集群的端口号以及主从库的IP和密码;在管理节点上通过saltstack发送相应的指令到数据库节点的saltstack客户端,采集到所有的Redis主从集群元信息;
键值备份元信息包括端口号、键值名、键值备份文件名和日期,存储管理模块执行结束后,更新所述键值备份元信息;
在数据库节点上部署Redis主从集群,每个Redis主从集群的主库和从库端口号一致,并且采用端口号唯一标识一个Redis主从集群,每个Redis主从集群包括一个Redis主库,一个或者多个Redis从库;
(2)调用键值备份模块,对指定的键值名进行分析后,调用Redis自身接口备份所述键值,并返回键值备份文件名;所述键值备份文件名格式为:端口号_键值名_时间戳.sql,其中,端口号为Redis主从集群的端口号,键值名为传入的参数,时间戳表示备份执行开始的时间戳;采用上述命名方式,可以解析得到端口号的键值名以及时间戳,便于存储管理模块和键值恢复模块调用;
(3)调用键值查看模块,根据传入的参数,可以得到所述键值名相关的数量,以及部分键值的名字信息,便于管理员了解所述键值名相关的信息;
(4)调用键值删除模块,执行本模块之前,自动调用键值备份模块,备份相关键值,然后清理所述键值名对应的所有键值;
(5)调用存储管理模块,在键值备份模块执行结束后,返回键值备份文件名,本模块将键值备份文件上传到存储节点对应的存储路径,同时,定期清理过期的键值备份文件,以及统计所述键值备份元信息,便于平台化管理模块调用;
(6)调用键值恢复模块,在键值备份模块和键值删除模块执行结束后,如果需要恢复操作,执行本模块,可以恢复所需键值;
(7)调用平台化管理模块,在管理节点上启动Web应用服务,提供一个Web界面,提供查看、备份、删除和恢复四个选项,分别调用键值查看模块、键值备份模块、键值删除模块和键值恢复模块。本模块首先调用元信息管理模块,根据传入的端口号,获取到Redis主从集群元信息,从而可以根据操作需求,分别执行“查看”、“备份”、“删除”和“恢复”操作。本模块可以实现一键操作,降低了操作风险,而且提高了操作效率。
本发明的有益效果是:
(1)功能全面,支持单个或者多个键值的查看、备份、删除和恢复操作。
(2)操作简单,在平台界面填写少量信息,即可一键操作。
(3)操作安全可靠,大大降低操作风险。
(4)提升工作效率,降低人工维护成本。
附图说明
图1是本发明Redis键值管理系统架构图;
图2是本发明Redis键值管理系统的管理节点各个模块流程图。
具体实施方式
下面结合附图和具体实施例对本发明作进一步详细说明。
如图1所示,本发明提供的一种基于saltstack的Redis键值管理系统,该系统包括数据库节点、存储节点和管理节点三个单元。
(1)数据库节点:在数据库节点上部署Redis主从集群,每个Redis主从集群包括一个主库和一个或者多个从库,每个Redis主从集群中,主库和从库端口号一致,不同的Redis主从集群,端口号唯一;同时,在数据库节点上部署saltstack客户端,部署方式如下:
#yum install salt-minion–y
然后,修改/etc/salt/minion文件如下一行:
master:saltstack管理端IP
启动saltstack客户端方式:
#service salt-minion start
最后,把数据库节点的主机名和IP记录到管理节点的数据库节点元信息中。
(2)存储节点:在存储节点固话存储路径,为了防止磁盘故障,至少规划两个存储路径,用于存放键值备份文件。同时,按照如上方式部署和启动saltstack客户端。并且,把存储节点的主机名、IP、存储路径记录到管理节点的存储节点元信息中。
(3)管理节点:在管理节点上部署saltstack管理端,部署方式如下:
#yum install salt-master–y
启动saltstack管理端方式如下:
#service salt-master start
在管理节点上,分别记录数据库节点元信息和存储节点元信息,如果数据库节点或者存储节点发生变更,需要人工更新相应的元信息,由于变更很不频繁,所以,人工维护成本很低。在管理节点上,通过saltstack接口,获取到数据库节点上所有Redis主从集群的端口号、服务器主机名和Redis密码,记录到管理节点的Redis主从集群元信息中。存储管理模块执行结束后,在管理节点记录键值备份元信息。
如图2所示,管理节点各个模块的实现流程如下:
(1)平台化管理模块
在管理节点上,部署Web应用服务,提供一个Web界面,需要传入参数:端口号、键值名和键值类型,其中,键值类型表示键值名的类型,包括前缀和全称两种,如果是前缀,表示键值名是某些键值的打头部分;如果是全称,表示所述键值名是一个具体的键值,默认类型是前缀。界面提供“查看”、“备份”、“删除”和“恢复”四个按钮,分别调用键值查看模块、键值备份模块、键值删除模块和键值恢复模块。填写以上参数后,点击按钮,即可完成对应的操作,操作简单可靠。
(2)元信息管理模块
需要传入参数:数据库节点元信息、存储节点元信息
在管理节点上,通过saltstack接口,首先把所有的saltstack客户端注册到saltstack管理端,方式如下:
#salt-key–y–a服务器主机名
所述服务器主机名是运行了saltstack客户端的服务器主机名,这里是指数据库节点和存储节点的所有服务器。上述命令每次注册一个服务器到saltstack管理端。
然后,在管理节点上,调用saltstack接口,获取到所有数据库节点上的Redis进程信息,方式如下:
#salt‘数据库节点主机名’cmd.run‘ps–ef|egrep Redis-server|grep–vgrep-’>临时文件
对所述临时文件解析,得到每个Redis数据库端口号以及配置文件,解析配置文件,可以得到密码。记录每个Redis数据库的端口号、IP、密码到Redis主从集群元信息中。对以上操作进行封装,采用定时任务形式定期更新,可以得到Redis主从集群的最新信息。定时任务如下:
11 12,19***/bin/sh封装脚本
所述封装脚本是封装了以上操作的shell脚本。
在存储管理模块执行结束后,得到键值备份文件名,解析所述键值备份文件名,得到Redis端口号、键值名和日期,记录所述端口号、键值名、键值备份文件名和日期到键值备份元信息,便于平台化管理模块调用。
如果数据库节点或者存储节点发生变更,需要人工修改数据库节点元信息或者存储节点元信息。
(3)键值备份模块
需要传入参数:端口号、键值名、键值类型
为了方便实现键值备份模块,本发明采用了php语言编写相关代码,所以,在管理节点上,需要部署php环境以及Redis驱动。然后,根据传入的端口号,查询Redis主从集群元信息,随机选择一个所述端口号相关的Redis数据库IP以及对应的密码,根据所述Redis数据库IP、端口号和密码,建立PHP和Redis的连接,然后,根据传入的键值名、键值类型,进行如下操作:
(3.1)如果键值类型是“全称”,采用如下方式匹配键值:
首先调用Redis自身接口SCAN,需要传入的参数为迭代器和键值名,不要传入匹配参数*,返回键值的全称名字,接下来调用Redis资深接口TYPE,需要传入所述键值的全称名字,返回键值type类型。如果键值type类型是string,那么调用Redis资深接口GET,返回所述键值对应的值;如果键值type类型是set,那么调用Redis自身接口SMEMBERS,传入所述键值全称名字,返回对应的值;如果所述键值type类型是list,那么调用Redis自身接口LRANGE,传入所述键值全称名字,返回对应的值;如果键值type类型是zset,那么调用Redis资深接口ZRANGE,传入所述键值全称名字,返回对应的值;如果所述键值type类型是hash,那么调用Redis自身接口HGETALL,传入所述键值全称名字,返回对应的值。
(3.2)如果键值类型是“前缀”,采用如下方式匹配键值:
首先调用Redis自身接口SCAN,需要传入键值名、迭代器和匹配参数*,由于模糊匹配返回结果可能存在多个,所以采用循环方式处理匹配到的键值全称名字。针对每个匹配到的键值,进行如下操作:
调用Redis资深接口TYPE,需要传入所述键值的全称名字,返回键值type类型。如果键值type类型是string,那么调用Redis资深接口GET,返回所述键值对应的值;如果键值type类型是set,那么调用Redis自身接口SMEMBERS,传入所述键值全称名字,返回对应的值;如果所述键值type类型是list,那么调用Redis自身接口LRANGE,传入所述键值全称名字,返回对应的值;如果键值type类型是zset,那么调用Redis资深接口ZRANGE,传入所述键值全称名字,返回对应的值;如果所述键值type类型是hash,那么调用Redis自身接口HGETALL,传入所述键值全称名字,返回对应的值。
无论键值类型是“全称”还是“前缀”,得到键值全称名字后,执行如下操作:针对所述键值全称名字,调用Redis资深接口TTL,获取所述键值对应的过期时间以及当前的时间点,然后,记录如下信息到键值备份文件中:键值全称名字、键值type类型、键值过期时间、备份时间点、键值对应的值;
默认键值存储在Redis的数据库0中,通过以上方法,实现了指定键值的备份,便于键值恢复模块调用。
本模块执行结束后,返回键值备份文件名,如果执行失败,返回“本次备份失败”信息。
(4)键值查看模块
需要传入参数:端口号、键值名、键值类型
本模块主要包括查看键值的个数以及部分键值,方便管理员了解键值名相关的信息。在管理节点上,根据所述端口号,查询所述Redis主从集群元信息,随机得到一个所属端口号对应的Redis数据库的IP和密码,然后建立PHP和Redis的连接,然后根据键值名、键值类型,分别执行如下操作:
(4.1)键值类型是“全称”
调用Redis自身接口SCAN,传入迭代器和所述键值名,不要传入匹配参数*,返回结果包含键值名和个数;如果存在所述键值,那么键值数量为1,键值名就是键值全称名字;如果不存在所述键值,那么所述键值数量为0。
(4.2)键值类型是“前缀”
调用Redis自身接口SCAN,传入迭代器、键值名和匹配参数*,同时调用系统函数COUNT进行计数,得到所述键值名匹配到的键值数量。同时,打印键值全称名字,根据系统函数COUNT控制输出的数量。
(5)键值删除模块
需要传入参数:端口号、键值名、键值类型
本模块主要是删除指定的键值,本模块执行之前,会自动调用键值备份模块,用于备份指定的键值,方便后续执行恢复键值操作。如果键值备份模块执行失败,本模块无法执行;否则,可以执行本模块。根据传入的端口号,查询Redis主从集群元信息,随机得到一个对应的Redis数据库的IP和密码,然后建立PHP和Redis的连接,获取Redis的role信息,如果是slave,调用Redis接口,获取Redis主库的IP,如果role是master,那么继续执行下面的操作:
(5.1)键值类型是“全称”
$Redis->del($one_key);
(5.2)键值类型是“前缀”
while($arr_keys=$Redis->scan($it,$p['prekey'].'*')){
$Redis->del($arr_keys);}
(6)存储管理模块
需要传入参数:存储节点元信息、键值备份文件名
根据存储节点元信息,解析的到存储节点主机名和存储路径。在键值备份模块执行结束后,返回键值备份文件名,如果键值备份模块执行失败,本模块无法执行。在管理节点上,调用saltstack接口,发送键值备份文件到存储节点上,方式如下:
salt-cp'存储节点主机名'键值备份文件名存储路径
执行成功后,根据键值备份文件名解析得到端口号、键值名和日期,然后把端口号、键值名、键值备份文件名和日期写入到键值备份元信息;
在管理节点,定期扫描键值备份元信息,清理7天之前的键值备份文件,方式如下:
#salt‘存储节点主机名’‘cd存储路径&&rm–rf过期的键值备份文件’
(7)键值恢复模块
需要传入参数:端口号、键值备份文件名
在管理节点上,扫描所述键值备份文件名,如果不存在,返回失败,表示不存在指定的备份文件,无法执行恢复操作。否则,按照如下方式进行恢复键值数据:
根据所述端口号,查询Redis主从集群元信息,随机得到一一对应的Redis数据库的IP和密码,建立PHP与Redis的连接,调用Redis接口,查询role,如果role是slave,根据Redis接口,获取maser的IP,然后执行如下操作,恢复键值数据:
每次读取键值备份文件50MB内容,然后对其进行逐行扫描并解析得到如下内容:键值全称名字、键值type类型、备份时间点、过期时间以及键值对应的值,同时,调用系统函数time()得到当前的时间点,进行如下操作:
如果过期时间是-1,那么新过期时间等于-1,否则按照如下方式得到新过期时间:
新过期时间=过期时间–(当前时间点–备份时间点)
如果新过期时间小于或者等于0,表示该键值已经过期,那么跳过本次操作,继续下一行扫描和解析操作,如果新过期时间大于0,那么根据键值type类型不同,执行如下操作:
如果键值type类型是string,那么调用Redis自身接口SET,传入键值全称名字、键值对应的值以及新过期时间,写入到指定的Redis主库中;如果键值type类型是hash,那么调用Redis自身接口HMSET,传入键值全称名字、键值对应的值和新过期时间,写入到指定的Redis主库中;如果键值type类型是list,针对键值对应的值,采用循环方式,得到list每个元素,然后逐个调用Redis自身接口LPUSH,传入键值全称名字、元素和新过期时间,写入到指定的Redis主库中;如果键值type类型是set,那么调用Redis自身接口sAddArray,传入键值全称名字、键值对应的值以及新过期时间,写入到指定的Redis主库中;如果键值type类型是zset,那么调用Redis自身接口zAdd,传入键值全称名字、键值对应的值以及新过期时间,写入到指定的Redis主库中。
执行成功后,返回“恢复所述端口号指定的键值名成功“,否则返回“恢复数据失败”。
在平台化管理模块中,选择“恢复”功能,即可执行入行操作,简单可靠。
机译: 管理redis键值的方法和系统
机译: 管理redis键值的方法和系统
机译: 管理redis键值的方法和系统