附录 B. 常见问题
neo4j数据库支持的最复杂的连接是什么?(比如每个节点都与其他任何一个节点相连)
可以从上面的数字得出理论的极限:它基本上就产生了262144节点和34359607296的关系图。我们从来没有见过这种使用情况。
在数据库中,读/写性能跟节点/边的数量有关吗?
这个问题意味着两个不同的问题。单次读/写操作不依赖数据库的大小。不管数据库是有10个节点还是有1千万个都一样。 — 然而,有一个事实是如果数据库太大,你的内存可能无法完全缓存住它,因此,你需要频繁的读写磁盘。虽然很多用户没有这样大尺寸的数据库,但有的人却有。如果不巧你的数据库达到了这个尺寸,你可以扩展到多台机器上以减轻缓存压力。
neo4j数据库支持的读/写并发请求最大数量是多少呢?
在并发请求上面没有任何限制。服务器的并发量更多的是依赖于操作本身的性能(高压写操作,简单读,复杂的遍历等等),以及使用的硬件性能。据粗略估计,在遍历最简单路径时每毫秒可以达到1000次请求。在讨论了指定的用户案例后,我们能得到更好的性能优化方案。
在数据库集群环境中数据一致性如何保证的呢?
主从复制。从服务器从主服务器拉取数据变化。拉取间隔可以在每个从服务器上进行配置,从毫秒到分钟,根据你自己的需要来定。HA也可以通过从服务器来进行写操作。当发生时,从服务器通过追上主服务器来被写入,然后写入在主从之间完成。其他从服务器做一般处理。
当在一个数据库中发生更新操作时如何快速更新其他所有服务器呢?
拉取间隔在每个从服务器上面进行配置,从几秒到几分钟不等,根据需求而定。当通过一个从服务器写操作时,从服务器立即在写之前与主服务器进行同步。一般情况下,读写加载不并影响从服务器的同步工作。一个复杂的写操作会给从服务器的文件系统巨大压力,与此同时,从服务器也要求拉取同步数据。实际上,我们不系统这成为一个关注的问题。
在集群环境中,在不同服务器会出现按比例延迟新增吗?
在集群中从服务器超过10台的规模时,我们能预料到来自从服务器的大量的拉取请求会降低从服务器的性能。在集群中的写操作才会受影响,而读操作依然保持线性缩放。
支持在线扩展吗?换句话说,如果我们想新加入一台服务器到集群中需要关闭所有服务器吗?
新的从服务器在不用停止或者启动整个集群的情况下可以被加入到一个已经存在的集群中。我们的HA协议会新增入加入的服务器。从服务器也可以简单的通过关闭他们自己来从集群中移除。
是否支持跨区集群?跨区集群是否比同区集群性能更低呢?
我们有用户在AWS上面测试了多区域部署的情况。跨地区部署在集群管理的效率和协议同步上有一定影响。集群管理大量的延迟会触发主服务器的频繁重选,拖慢整个集群的速度。在跨区部署支持上面以后还需大量提升。
如何锁定服务?
悲观锁。在读数据时并不要求锁。写操作并不会阻塞读操作。不用任何明确的锁定操作就可以完成读取数据操作是非常重要的。当一个节点或者属性修改或者新增时,写锁定会自动完成,或者也可以通过明确的锁设置。它常被用来提供读取语义和保证必须的数据一致性。
数据存储占用空间如何?
Neo4j当前并不适合存储 BLOBs/CLOBs。节点,关系和属性并不是保存在磁盘的同一个地方。这个特性将来会进一步介绍。数据库索引怎么样? Neo4j支持复杂的属性索引。额外的索引功能超过了图本身的索引。Lucene引擎管理独立分页的索引并要求一些空间来存储一个自动索引以及管理私有索引(通过API搜索)。
我如何进行数据库查询?
核心 API, Traversal API, REST API, Cypher, Gremlin Neo4j使用日志(在数据丢失时可以修复丢失的数据)功能吗? 在HA集群环境中基于主从服务器之间的写增量来完成。
我如何提示Neo4j的性能?
采用内存映射存储Neo4j文件,Neo4j缓存策略解释如下: 软索引缓存: 软索引在GC认为需要时会被随时清理。如果应用加载并不高时使用。 弱索引缓存: 不管GC是否找到,都会清理弱索引。如果在读取大量数据或者遍历操作时使用。 强索引缓存: 所有的节点和关系都会保存在内存中,JVM会阻止高加载的操作。比如半分钟的暂停间隔。 更大的堆大小是好的,然而12G或者更大的内存对于GC是不切实际的。如果用从磁盘获取数据做比较,用内存映射文件缓存会提供100倍性能,而用Java堆则会是1000倍。 在主从服务器直接的ACID事务。 在初始从服务器到主服务器的事务同步中,最终从主服务器到其他从服务器。用死锁探测来完成多个从服务器事务并发支持。从一个数据完整性的角度看是完全一致的,但是必须得重多个点考虑。
独立服务器怎么样?
REST API是完全无状态的,但他也可以通过批量提交来实现大量事务支持。线程池和每个socket的线程:对于独立服务器和HA模式来说,Neo4j采用Jetty来连接线程池。(比如在HA集群中25/每节点)。