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