*论非关系性数据库的应用2018
试题四论NoSQL数据库技术及其应用
随着互联网web2.0网站的兴起,传统关系数据库在应对web2.0网站,特别是超大规模和高并发的Web2.0纯动态SNS网站上已经显得力不从心,暴露了很多难以克服的问题,而非关系型的数据库则由于其本身的特点得到了非常迅速的发展。
NoSQL(Not only SQL)的产生就是为了解决大规模数据集合及多种数据类型带来的挑战,尤其是大数据应用难题。目前NoSQL数据库并没有一个统一的架构,根据其所采用的数据模型可以分为四类:键值(Key-Value)存储数据库、列存储数据库、文档型数据库和图(Graph)数据库。
请围绕“论NoSQL数据库技术及其应用”论题,依次从以下三个方面进行论述。
1.概要叙述你参与管理和开发的软件项目以及你在其中所担任的主要工作。
2.详细论述常见的NoSQL数据库技术及其所包含的主要内容,并说明NoSQL数据库的主要适用场景。
3.结合你具体参与管理和开发的实际项目,说明具体采用哪种NoSQL数据库技术,并说明架构设计过程及其应用效果。
摘要:
2022年3月,我负责了某公司基于云原生理念的“自动化运维系统”的建设项目,由我担任系统架构设计师,负责系统架构设计工作,在该系统架构设计中,针对不同的应用场景,使用了不同的数据库进行数据的存储,使用的数据库主要有关系型数据库Mysql,非关系型数据库主要用到了缓存数据库Redis、搜索引擎数据库Elasticsearch、列存储数据Clickhouse,本文将详细介改非关系型数据库的应用实践。该项目总投入近450万,历时15个月,于2023年6月交付至今,不仅帮助运维人员高效、安全的管理云上应用和后端服务器资源,同时帮助开发和测试人员实现应用的快速迭代和测试,大大提升了团队之间的协作效率,消除了运维和开发之间的壁垒,得到了用户的一致好评。
正文:
随着云原生技术的发展,企业也逐渐引入相关技术,在基础设施层,越来越多的企业开始购买云上服务器,如应用服务器企业可选择阿里云的ECS服务器,数据库服务器企业可选择阿里云的RDS,DNS服务企业可选择阿里云的域名解析,云上资源购买十分方便,在页面中点击几下即可购买成功,但在实际工作中,不能随意购买,需要结合企业成本和服务器资源使用情况来综合考量,避免资源浪费,所以对云上资源的成本、资源使用情况的可视化管理就很重要。同时,随着容器技术和微服务架构的发展,企业应用也都选择微服务架构,采用容器的方式部署在kubernets集群中,在这种情况下,应用的快速发布、容器资源管理、监控告警就显得尤为重要。
为了实现云上资源的可视化管理和基于云原生应用的快速发布,我所在的公司决定开发一个“自动化运维”系统,我们称之为云平台,并在2022年3月正式启动该项目的建设工作,我被任命为系统架构设计师,负责系统架构设计工作。该项目总投入450万元人民币,建设周期从2022年3月至2023年6月截止,历时15个月。该系统主要包括应用中心、发布中心、监控中心、成本中心、容器中心、权限管理和变更管理七大模块,应用中心是整个系统的数据中心,其他模块的功能都围绕“应用”来进行资源的展示和操作;发布中心以“应用”为单位,向用户提供应用的快速发布功能;监控中心以“应用”为单位,向用户提供应用的监控告警功能;成本中心以“应用”为单位,向用户展示每个应用的成本;容器中心以“应用”为单位,展示应用的相关容器资源;权限管理是对用户分类,使得不同的用户可看到不同的模块;变更管理主要对云上资源的变更进行管控,避免对云上资源的误操作导致系统故障。
常见的非关系型数据库有如下几类:
缓存数据库有Redis、Memche等,当应用的某些数据不经常变化,为了提升用户的查询效率,可以将这些不经常变化的数据存储到缓存数据库中,当用户请求数据时,缓存数据库中有数据,就直接从缓存数据库中获取,减轻关系型数据库的查询压力;
搜索引擎数据库常用的是Elasticsearch,当系统中存在数据结构复杂,涉及到对多个表中多个字段的检索功能时,我们可以选择搜索引擎数据库提高数据查询效率;
文档数据库主要有Mongodb,当系统涉及到结构化和非结构化数据的增删改查时,可以选择文档数据库进行存储;
图数据库主要有Neo4j,当系统中数据结构复杂,数据结构成网状结构,同时该网状结构还会不断的扩展,就可以使用图数据库进行存储,扩展性好,同时还能以友好的方式展示数据之间的关系。
非关系型数据库种类很多,我们需要仔细分析系统的业务场景和业务需求,选择合适的数据库很重要,下面将详细介绍本系统使用到的非关系型数据库。
在应用中心,应用的名称、负责人、环境信息存储在Redis缓存中,主要是因为应用的名称、负责人、环境信息很少变化,同时这些信息在发布中心、成本中心、容器中心、监控中心多个模块进行多次调用,所以将这些信息存储在缓存中。在进行缓存数据库选择时,可选择的数据库有Redis和Memcache,选择Redis的主要原因有Redis支持多种数据结构,包含List、Set、Zset、Hash,能很好的根据业务需求的变化选择不同的数据结构,具有很好的扩展性;Redis 支持分布式架构,支持的分布式架构有主从模式、哨兵模式、集群模式,由于哨兵模式当主节点宕机时,能自动切换到从节点,哨兵模式也足够支持我们的缓存数据量,所以选择了哨兵模式;Redis支持数据备份功能,数据备份有两种方式,AOF和RDB,AOF能够定时进行全量数据的备份,AOF是实时备份Redis命令,为了确保数据不丢失,我们选择了AOF方式进行数据备份。
在应用中心的应用检索模块,我们选择Elasticsearch存储应用的相关信息,支持用户的多维度搜索。在应用检索功能分析时我们发现,应用的相关信息包含应用名、容器实例名、容器实例IP、容器实例的创建时间、环境、负责人、部门、所在集群、所在集群节点IP、集群节点名称等众多信息,不通的用户关注的信息不同,搜索的关键字可能是所有字段的信息,在关系型数据库中,这些信息存储在多个表中,使用mysql的sql查询很难满足用户的多维度信息检索功能,由于Elasticsearch能支持多维度的快速检索,使用elasticsearch提供的sdk,将用户的搜索关键字作为输入,可以很方便的进行精确检索和模糊检索,功能实现简单,性能也很好。
在成本中心,我们选择列数据库Clickhouse存储成本信息,主要是由于列数据库根据列进行数据的聚合计算效率高,同时当数据量很大时,列数据库的数据压缩程度打,占用存储空间小,所以我们选择了列数据库进行存储。有在成本中心,存储的数据主要是各个云厂商各个产品的每日费用,以阿里云为例,多个产品每日的费用数据就有上万条,那么一个月的数据有进30万条,一年的数据就有180万余条,还要存储近五年的数据,然后分别统计,数据量很大,同时还要根据列进行数据统计,如统计每个部门、每月成本,每个应用、每月成本,每个集群每月成本等,都是基于列的聚合运算,由于Clickhouse的高性能,高存储,基于Clickhouse很好的实现了成本数据的统计工作。
经过近15个月的项目开发,“自动化运维系统”顺利投入使用,开发人员和测试人员可通过该系统实现应用发布的自动化,无需运维人员的协助,消除了运维和开发的固有壁垒;运维人员可通过该系统高效管理云上资源,实时查看云上资源的使用率和成本,减少资源浪费,提高资源使用率。当然,在本项目中还有一些不足之处,在进行云上资源成本统计时,最初我们通过阿里云的费用接口来拉取各个产品的成本,由于产品很多,写了很多逻辑,后来通过和阿里云的技术人员沟通,可以在阿里云平台上将所有产品的费用一键转储到oss中,直接通过oss的sdk即可快速查询所有产品的费用,后来我们开发人员快速修改下成本获取的逻辑,并没有对项目产生什么影响。由于架构合理且考虑周全,进展顺利,得到了公司技术人员的认可,大大提高了技术团队的协作效率。