大家好,我是讯享网,很高兴认识大家。
背景介绍以及反思
在特殊的工程场景中,使用图形数据库具有独特的优势。于是经过一个多月的努力,项目终于上线了。这次用的图形数据库是neo4j社区版,因为数据量不到一亿,但是关系复杂,所以社区版基本“够用”。后续商品会陆续分享。我总结的二级社区版的高可用性(探索、告警监控、热备、控制台等。)
这一次,我会在一个项目之后,整理和总结一些二次元的基础知识。
有人曾经问为什么需要图形数据库。
我考虑了一下。没有必要使用图形数据库,但有以下两种方法可以实现它:
首先,用图形数据库的数据结构保存数据。减少保存图形数据的麻烦
实现图形计算主要有两种方式(图形数据库除外)。一种是迭代遍历计算,效率低,计算量大。二是使用专业的第三方工具jar。比如Jgraph/Gauva graph(都是内存级别,简单测试过。Jgraph占用内存少一点,但比Gauva graph慢,gau va graph更快但占用内存更多)
其次,借助图形数据库的算法,达到计算的目的。
Neo4j简介
Secondary是一个高性能的NOSQL图形数据库,它在网络上存储结构化数据,而不是表。它是一个嵌入式的、基于磁盘的Java持久性引擎,具有完整的事务性特征,但是它在网络上存储结构化数据(从数学的角度来看称为图形)而不是表。Neo4j也可以看作是一个高性能的图形引擎,拥有一个成熟数据库的所有特征。程序员在一个面向对象的、灵活的网络结构中工作,而不是严格的、静态的表格。但是他们可以享受具有完整事务特征的企业级数据库的所有好处。Neo4j以其嵌入式、高性能、重量轻等优势,越来越受到人们的关注。
现实中很多数据都是用图来表示的,比如社交网络中的人际关系,地图数据,基因信息等等。RDBMS不适合表达这类数据,而且由于海量数据的存在,显得捉襟见肘。NoSQL数据库的兴起很好地解决了海量数据的存储问题。图形数据库也是NoSQL的一个分支。与NoSQL的其他分支相比,它非常适合原生表达图结构数据。一般来说,存储在图数据库中的结构就像数据结构中的图,由顶点和边组成。
Secondary是主要代表的Neo4j图形数据库,开源,用Java实现(需要JDK)。经过几年的发展,已经可以在生产环境中使用。有两种运行模式,一种是服务模式,对外提供REST接口;另一种是嵌入式模式,数据以文件的形式存储在本地,本地文件可以直接操作。
Neo4j有三个版本:社区版、高级版和企业版。社区版是基础,本文主要介绍。它使用GPLv3协议,这意味着它需要开源来修改和使用它的代码,但它是基于软件分发的。如果你把Secondary作为服务而不是分发软件,就不需要开源。这其实是GPL协议本身的缺陷。高级版和企业版基于社区版,但具有一些高级功能。高级版包括一些高级监控功能,而企业版包括在线备份、高可用性集群和高级监控功能。注意,他们使用的是AGPLv3协议,也就是说,除非获得商业授权,否则无论如何修改或使用Secondary,都需要开源。
设计理念
secondary的设计动机是为了更好更高效地描述实体之间的关系。在现实生活中,每一个实体都与周围的其他实体有着无数的关系,这些关系中储存的信息甚至大于身体本身的属性。然后,传统的关系数据库更注重描述实体的内部属性,实体之间的关系通常通过使用外键来实现。所以在求解关系时通常需要join操作,join操作通常比较耗时。互联网尤其是移动互联网的爆炸式增长,已经让传统的关系数据库不堪重负。再加上社交网络等应用对关系的高需求,可以说关系型数据库毫无优势。图形数据库作为一种注重描述数据之间关系的数据库应运而生,并成为NoSQL中非常重要的一部分。Secondary是最好的图形数据库之一。
Neo4j特点
使用的语言:Java特性:关系图形数据库许可:GPL,其中部分特性使用AGPL/商业许可协议:HTTP/ REST(或嵌入Java)可以独立使用,也可以嵌入Java应用图形的节点和边缘。节点和边都可以有好的元数据。它有自己的网络管理功能。它使用各种算法来支持路径搜索。它使用键值和关系来索引和优化读取操作。它支持事务(使用Java api)。它使用Gremlin图形遍历语言支持Groovy脚本来支持在线备份。高级监控和高可靠性支持AGPL/商业许可。
Neo4j相关特性
5.1数据模型
二级称为属性图。除了Neo4j和edges(关系,其中包含一个类型),还有一个重要的部分——属性。无论是顶点还是边,它都可以有任意数量的属性。属性的存储类似于hashmap,键是字符串,值必须是Java基本类型或者基本类型的数组,比如String,int或者int[],这些都是合法的。
5.2索引
Secondary支持索引,其内部实际上是由Lucene实现的。
5.3事务
Secondary Neo4j完全支持事务,即满足ACID性质。
ACID是以下四个事务特征的缩写:
1.原子数
事务的所有工作要么(成功)执行,要么根本不执行。只有部分执行不会发生。
例如,如果一个事务开始更新100行记录,但在更新20行后失败(出于某种原因),那么数据库将回滚(撤消)对这20行记录的更改。
2.一致性
使事务数据库从一种一致性状态进入另一种一致性状态。
例如,在一个银行交易中(在描述关系数据库交易的特征时,基本以银行交易为描述对象),需要从存储账户中扣款,然后再向支付账户中加钱。
如果转账过程失败,一定不能让数据库只操作其中一个账户,因为这样会造成数据处于不一致的状态(这样的话银行的账户就会出现贷款不平衡)。
3.隔离
这个特性意味着在事务结束(提交/回滚)之前,其他事务(或会话)对这个事务操作的数据是不可见的(但并不意味着其他会话的读取会被阻塞)。
例如,如果用户正在修改hr.employees表,但该表尚未提交,则在提交之前,其他用户将无法看到该修改。
4.持久
提交的更改将永久保存在数据库中(不是说以后不能修改)。
事务提交后,数据库必须通过“恢复机制”确保事务更改的数据不会丢失。
5.4遍历和查询
遍历是图形数据库的主要查询方式,因此遍历是图形数据中的一个关键概念。遍历查询有两种方式:第一种是直接写Java代码,使用Secondary提供的遍历框架;第二种方式是使用Secondary提供的描述性查询语言Cypher。
5.5图形算法
Neo4j实现的图算法有三种:最短路径(关系数最少)、Dijkstra算法(解决有向图中任意两个顶点之间的最短路径问题)和A*算法(解决静态路网中最短路径的最有效方法)。
5.6嵌入式可扩展性
Neo4j是一个嵌入式的、基于磁盘的Java持久性引擎,支持完整的事务。它将数据存储在图像中而不是表格中。Neo4j提供了大规模的可扩展性。它可以在一台机器上处理数十亿个节点、关系和属性的图像,并且可以扩展到并行运行的多台机器。与关系数据库相比,图形数据库擅长处理大量复杂、互联、低结构化的数据,这些数据变化快,需要频繁查询。在关系数据库中,这些查询将导致大量的表连接,从而导致性能问题。Neo4j侧重于解决传统RDBMS在查询时大量连接的性能下降问题。通过围绕图的数据建模,Secondary会以相同的速度遍历节点和边,其遍历速度与构成图的数据量无关。
5.7辅助数据库和传统数据库的区别
最后,下面两个图显示了查询关系时两者之间的差异:
RDBMS关系型数据库管理系统
Neo4jNeo4j
5.8二级集群模式的工作原理
一个二级HA集群协同运行,协同行为由zookeeper完成。2.0以后,我开发了自己的基于Paxos协议的集群协调机制。
当一个Neo4j HA实体打开后,它会自己去找zookeeper注册,问“谁是主人?”。如果一台机器是主机器,新的实体将作为从机器打开并连接到主机器。如果机器在开机时第一次注册或应该通过主机选择算法成为主机,它将作为主机开机。
从从机执行写事务时,每个写操作将与主机同步(主机和从机将被锁定)。当事务被提交时,它首先存在于主机上。当主事务成功提交时,从事务也将被提交。为确保一致性,从机和主机之间的同步必须在写入前保持最新。这是为了建立主机和从机之间的通信协议,因此如果需要,更新将自动进行。
您可以在包含配置参数ha的配置文件中将数据库实体设置为从属实体。从属协调器更新模式=无。虽然当系统无法恢复时,该实体将不再是主实体,但是该从实体的行为与所有其他从实体的行为相同,并且它具有永久写入主实体的能力。
当从主机执行写操作时,它将与正常的嵌入式模式相同。此时,主设备不会向从设备推送更新消息。相反,从机可以配置拉取消息的时间间隔。没有选择,更新操作将只发生在从服务器上,对主服务器的写操作将随时同步。
通过从机执行所有写操作的优点是数据将被复制到两台机器上。建议这样做,以避免在选择新主机时回滚失败。
当辅助数据库服务不可用时,协调器将检测到它并将其从集群中删除。当主机崩溃时,将自动选择新的主机。通常,新主机会在几秒钟内选择并启动,在此期间不会执行任何写操作(写操作会引发异常)。当机器从故障中恢复时,它将自动重新连接到群集。当没有被任何其他机器备份的旧主机发生变化时,这是唯一的不确定性。如果选择了新主机,并且在恢复旧主机之前执行了更改,将会有两个不同的数据版本。旧主机将删除分支数据库,并从新主机下载完整版本的数据。
所有这些可以总结如下:
从机可以处理写事务。
更新相对从设备最终将是一致的。
辅助HA是容错的,可以从X台机器继续执行到单台机器(基于zookeeper设置)。
在写操作中,从机将自动与主机同步。
当主机出现故障时,将自动选择新的主机。
当导致操作中断的任何错误(网络、维护)得到解决后,本地计算机将自动重新连接到群集。
事务的原子性、持久性和一致性最终会广播到其他从设备。
主机出现故障,所有正在运行的写事务都将回滚,并且在主机选举期间无法执行任何写操作。
读取操作高度可用。
Neo4j优缺点
优势:
数据插入、查询操作非常直观,不再需要像以前那样考虑表之间的关系。
提供的图搜索和图遍历方法非常方便快捷。
更快的数据库操作。当然有一个前提,就是数据量大,如果存储在MySql中需要很多表,表与表之间有很多连接(也就是很多操作需要连接表)。
缺点:
当数据过大时,插入速度可能会越来越慢。。
超大节点。当存在一个边很多的节点时(常见于大V),这个节点的运行速度会大大降低。这个问题存在很久了,官方表示会处理。但是,还是不尽如人意。
提高数据库速度的常用方法是分配更多的内存。但看了官方的操作手册,似乎无法直接设置数据库内存占用,需要计算后为其“预留”内存…
注:鉴于其明显的优缺点,Neo4j适用于存储“少修改、多查询、无超大节点”的图形数据。
应用场景
它适用于图形等数据。这是辅助数据库和其他nosql数据库之间最显著的区别。
例如:社会关系、公共交通网络、地图和网络拓扑。
Neo4j二级适用于:
记录大量基于事件的数据(如日志条目或传感器数据)
处理大规模分布式数据,类似Hadoop
二进制数据存储
适合存储在关系数据库中的结构化数据
————————————————
下一个介绍:基础知识
我的原创链接:https://blog.csdn.net/Dream_bin/article/details/104470275
本文来自网络,若有侵权,请联系删除,如若转载,请注明出处:https://51itzy.com/14809.html