Neo4j是一个高性能的,NOSQL图形数据库,本身就支持集群部署,今天要搭建的就是neo4j的因果集群,其中分为:
核心节点:core-server,可以对数据进行读写的中心节点,通过选举确定leader,follower.
只读节点:read-replica,只提供数据访问的只读节点,需要连接核心节点,可以非常方便的进行扩展
一、Docker 安装部署neo4j
第一步,从镜像源中查找镜像
dockersearchneo4j
第二步,拉取镜像源
dockerpullneo4j(:版本号)//缺省“:版本号”时默认安装latest版本的
第三步,查看本地镜像,检验是否拉取成功
dockerimages
启动容器
dockerrun-d--namecontainer_name-p27474:7474-p27687:7687-v/home/neo4j/data:/data-v/home/neo4j/logs:/logs-v/home/neo4j/conf:/var/lib/neo4j/conf-v/home/neo4j/import:/var/lib/neo4j/import--envNEO4J_AUTH=neo4j/passwordneo4j
-d --name container_name //-d表示容器后台运行 --name指定容器名字
-p 27474:7474 -p 27687:7687 //映射容器的端口号到宿主机的端口号;27474 为宿主机端口
-v /home/neo4j/data:/data //把容器内的数据目录挂载到宿主机的对应目录下
-v /home/neo4j/logs:/logs //挂载日志目录
-v /home/neo4j/conf:/var/lib/neo4j/conf //挂载配置目录
-v /home/neo4j/import:/var/lib/neo4j/import //挂载数据导入目录
--env NEO4J_AUTH=neo4j/password //设定数据库的名字的访问密码
neo4j //指定使用的镜像
修改配置文件
//进入容器配置目录挂载在宿主机的对应目录,我这里是/home/neo4j/confcd/home/neo4j/conf//vim编辑器打开neo4j.confvimneo4j.conf//进行以下更改//在文件配置末尾添加这一行dbms.connectors.default_listen_address=0.0.0.0//指定连接器的默认监听ip为0.0.0.0,即允许任何ip连接到数据库//修改dbms.connector.bolt.listen_address=0.0.0.0:7687//取消注释并把对bolt请求的监听“地址:端口”改为“0.0.0.0:7687”dbms.connector.http.listen_address=0.0.0.0:7474//取消注释并把对http请求的监听“地址:端口”改为“0.0.0.0:7474”
重启neo4j容器
二、源码包安装 neo4j
//命令下载curl-Ohttp://dist.neo4j.org/neo4j-community-3.4.5-unix.tar.gz//解压安装tar-axvfneo4j-community-3.4.5-unix.tar.gz
安装目录下找到conf目录下的neo4j.conf文件,修改相应配置
#修改第22行loadcsv时l路径,在前面加个#,可从任意路径读取文件#dbms.directories.import=import#修改35行和36行,设置JVM初始堆内存和JVM最大堆内存#生产环境给的JVM最大堆内存越大越好,但是要小于机器的物理内存dbms.memory.heap.initial_size=5gdbms.memory.heap.max_size=10g#修改46行,可以认为这个是缓存,如果机器配置高,这个越大越好dbms.memory.pagecache.size=10g#修改54行,去掉改行的#,可以远程通过ip访问neo4j数据库dbms.connectors.default_listen_address=0.0.0.0#默认bolt端口是7687,http端口是7474,https关口是7473,不修改下面3项也可以#修改71行,去掉#,设置http端口为7687,端口可以自定义,只要不和其他端口冲突就行dbms.connector.bolt.listen_address=:7687#修改75行,去掉#,设置http端口为7474,端口可以自定义,只要不和其他端口冲突就行dbms.connector.http.listen_address=:7474#修改79行,去掉#,设置http端口为7473,端口可以自定义,只要不和其他端口冲突就行dbms.connector.https.listen_address=:7473#修改227行,去掉#,允许从远程url来loadcsvdbms.security.allow_csv_import_from_file_urls=true#修改246行,允许使用neo4j-shell,类似于mysql命令行之类的dbms.shell.enabled=true#修改248行,去掉#,设置连接neo4j-shell的端口,一般都是localhost或者127.0.0.1,这样安全,其他地址的话,一般使用https就行dbms.shell.host=127.0.0.1#修改250行,去掉#,设置neo4j-shell端口,端口可以自定义,只要不和其他端口冲突就行dbms.shell.port=1337#修改254行,设置neo4j可读可写dbms.read_only=false#设置JDK,若系统默认是jdk1.8及以上可以不需要设置JAVA_HOME=/usr/java/jdk1.8.0_144JRE_HOME=/usr/java/jdk1.8.0_144/jre
APOC下载
Neo4j插件APOC
将下载好的.jar文件直接放到neo4j安装目录下的plugins文件夹目录下就可以了。不要解压!!!
配置
neo4j安装目录下conf文件夹里的neo4j.conf
将dbms.security.auth_enabled=false注释掉
文件末尾加上:
dbms.sercurity.procedures.unrestricted=apoc.*dbms.memory.pagecache.size=10gdbms.memory.heap.initial_size=1gdbms.memory.heap.max_size=4g
三、k8s搭建NEO4J因果集
此集群是有状态的服务,所以使用k8s的StatefulSet进行部署,创建neo4j-core-server.yaml文件
部署NEO4J-CORE-SERVER集群
#先创建neo4j的命名空间namespace---apiVersion:v1kind:Namespacemetadata:name:neo4jlabels:name:neo4j---apiVersion:apps/v1beta1kind:StatefulSetmetadata:name:neo4j-corenamespace:neo4jlabels:app:neo4j-corespec:replicas:2#部署2个core-serverselector:matchLabels:app:neo4j-coreserviceName:neo4j-coretemplate:metadata:labels:app:neo4j-corespec:containers:-name:neo4j-coreimage:neo4j:3.5.5-enterprise#官方镜像,3.5.5企业版imagePullPolicy:IfNotPresentenv:#这里通过env,配置镜像环境参数,这是因为此镜像是通过这样来进行配置参数的-name:NEO4J_ACCEPT_LICENSE_AGREEMENT#接受证书协议,必须的value:"yes"-name:NEO4J_dbms_connectors_default__advertised__address#指定自身pod的ip地址,默认为localhost,在集群中必须注明自身地址,这里直接用ipvalueFrom:fieldRef:fieldPath:status.podIP-name:NEO4J_dbms_mode#节点的模式,选择CORE,就是核心节点value:"CORE"-name:NEO4J_AUTH#一定要自定义初始验证的用户名/密码value:"neo4j/your-password"-name:NEO4J_causal__clustering_minimum__core__cluster__size__at__formationvalue:"2"-name:NEO4J_causal__clustering_minimum__core__cluster__size__at__runtimevalue:"2"-name:NEO4J_causal__clustering_discovery__type#默认集群发现方式为LIST,这里写不写都行value:"LIST"-name:NEO4J_causal__clustering_initial__discovery__members#手动写明集群中所有成员的ip:port,5000端口为集群发现端口value:"neo4j-core-0.neo4j-core.neo4j.svc.cluster.local:5000,neo4j-core-1.neo4j-core.neo4j.svc.cluster.local:5000"-name:NEO4J_causal__clustering_discovery__advertised__address#下面这三个必须定义,为节点自身的ip:port,相当于节点自身的名称,因为默认是会用自身hostname,但是在k8s中,无法单单通过hostname解析到ip地址,这样定义的自身地址会无法识别value:$(NEO4J_dbms_connectors_default__advertised__address):5000-name:NEO4J_causalClustering_transactionAdvertisedAddressvalue:$(NEO4J_dbms_connectors_default__advertised__address):6000-name:NEO4J_causalClustering_raftAdvertisedAddressvalue:$(NEO4J_dbms_connectors_default__advertised__address):7000volumeMounts:-name:neo4j-core#挂载数据目录/datamountPath:/datavolumeClaimTemplates:-metadata:name:neo4j-core#这里name要和上面volumeMounts的name一致,才能绑定到对应的podannotations:volume.beta.kubernetes.io/storage-class:"managed-nfs-storage"#这里是上一步创建的nfs动态卷namespec:accessModes:["ReadWriteOnce"]resources:requests:storage:2Gi#大小自定义---apiVersion:v1kind:Servicemetadata:name:neo4j-corenamespace:neo4jspec:selector:app:neo4j-coretype:NodePort#这里用nodeport来开启外网访问,没用traefik是因为7687的连接端口不是http访问,需要4层负载,但是traefik不支持,所以只能通过nodeport来实现外网访问,才能正常访问7474端口的web管理界面。ports:-protocol:TCPname:httpport:7474nodePort:27474targetPort:7474-protocol:TCPname:blotport:7687nodePort:27687targetPort:7687
执行 yaml文件
kubectlcreate-fneo4j-core-server.yaml
【注】
1. 以上yaml文件中的注释要看清楚,因为 因果集群的核心节点是采用的选举方式来确定主节点的,所以最好是单数节点,我这里只部署了2个节点,只是因为资源不太够,测试而已,生产使用的话,最少3节点。
2. 在这里,我用的默认的list的集群发现方式,有一点不好,就是如果增加节点,需要自己手动写上所有集群节点到列表中,且增加核心节点的时候,会比较麻烦。
官方有三种发现方式,分别为LIST,DNS,K8S。
DNS的发现方式,可以通过在Service中,使用clusterIP:None 来取消负载的ip,然后在`NEO4J_causal__clustering_initial__discovery__members` 中设置为 `neo4j-core-0.neo4j-core.neo4j.svc.cluster.local:5000`,然后通过k8s集群中的dns服务,来解析到此Service中所有的ip。
这样配置非常方便,还不需要修改,没用是因为Service中,如果用了clusterIP:None 则没发使用nodeport来暴露7687的tcp端口给k8s外部网络使用,除非traefik可以实现tcp的4层负载,或者不是使用的traefik,二是nginx的Ingress,实现4层负载即可。
K8S的发现方式呢,由于文档没有示例的配置参考,不管怎么样设置,都还是无法正常启动,所以就没法用。
3. 数据持久化存储,我这里用的nfs动态卷。
4. 其中一定要自定义初始化的用户密码,因为neo4j的每个节点的用户验证系统是独立的!
也就是说,你在leader节点上新增用户或修改密码,是不会同步到follower节点上的。
所以,为了不至于当leader节点挂掉后,新的leader节点密码不同导致出错,部署时最好统一用户密码,当然只读节点也是。
执行后,查看pod的日志,如下则为正常启动
部署只读节点READ-REPLICA
core核心节点部署完成后,则可以进行只读节点的部署,只读节点比核心节点则简单很多,创建neo4j-read-replica.yaml 文件
---apiVersion:apps/v1kind:Deploymentmetadata:name:neorj-read-replicanamespace:neo4jlabels:app:neorj-read-replicaspec:replicas:3selector:matchLabels:app:neorj-read-replicatemplate:metadata:labels:app:neorj-read-replicaspec:containers:-name:neorj-read-replicaimage:neo4j:3.5.5-enterpriseimagePullPolicy:IfNotPresentenv:-name:NEO4J_ACCEPT_LICENSE_AGREEMENTvalue:"yes"-name:NEO4J_dbms_connectors_default__advertised__addressvalueFrom:fieldRef:fieldPath:status.podIP-name:NEO4J_dbms_mode#指定模式为只读节点模式value:"READ_REPLICA"-name:NEO4J_AUTHvalue:"neo4j/your-password"#统一设置用户密码-name:NEO4J_causal__clustering_discovery__typevalue:"LIST"-name:NEO4J_causal__clustering_initial__discovery__membersvalue:"neo4j-core-0.neo4j-core.neo4j.svc.cluster.local:5000,neo4j-core-1.neo4j-core.neo4j.svc.cluster.local:5000"---apiVersion:v1kind:Servicemetadata:name:neorj-read-replicanamespace:neo4jspec:selector:app:neorj-read-replicaports:-protocol:TCPport:7687targetPort:7687
执行此yaml文件,创建只读节点
kubectlcreate-fneo4j-read-replica.yaml
【注】
部署3个只读节点,无状态服务,不需要进行数据持久化,只需要将core节点的集群列表写出就行了,会自动去找到核心节点的集群,然后从中复制数据,提供访问即可。
因为只读节点只能访问数据,所以没必要提供k8s的外部访问,所以直接在service中负载一下bolt的访问端口就行了,以提供给k8s内部应用访问即可。
查看日志如下为正常启动
访问WEB界面
部署完成后,设置域名,设置nginx,访问web界面
默认用户密码为: neo4j / neo4j
登录修改密码,然后查看状态,可以看到集群的状态
neo4j 3个成员组成的集群
为每个成员创建一个PersistentVolume
volume.sh
foriin$(seq02);docat<<EOF|kubectlcreate-f-kind:PersistentVolumeapiVersion:v1metadata:name:pv${i}labels:type:localapp:neo4jspec:capacity:storage:1GiaccessModes:-ReadWriteOncehostPath:path:"/tmp/${i}"EOFcat<<EOF|kubectlcreate-f-kind:PersistentVolumeClaimapiVersion:v1metadata:name:datadir-neo4j-${i}labels:app:neo4jspec:accessModes:-ReadWriteOnceresources:requests:storage:1GiEOFdone
运行此脚本,它将创建3个卷
$ kubectl get pv
NAME CAPACITY ACCESSMODES STATUS CLAIM REASON AGE
pv0 1Gi RWO Bound default/datadir-neo4j-0 7s
pv1 1Gi RWO Bound default/datadir-neo4j-1 7s
pv2 1Gi RWO Bound default/datadir-neo4j-2 7s
$ kubectl get pvc
NAME STATUS VOLUME CAPACITY ACCESSMODES AGE
datadir-neo4j-0 Bound pv0 1Gi RWO 26s
datadir-neo4j-1 Bound pv1 1Gi RWO 26s
datadir-neo4j-2 Bound pv2 1Gi RWO 25s
我们需要创建一个PetSet模板
#HeadlessservicetoprovideDNSlookupapiVersion:v1kind:Servicemetadata:labels:app:neo4jname:neo4jspec:clusterIP:Noneports:-port:7474selector:app:neo4j----#newAPInameapiVersion:"apps/v1alpha1"kind:PetSetmetadata:name:neo4jspec:serviceName:neo4jreplicas:3template:metadata:annotations:pod.alpha.kubernetes.io/initialized:"true"pod.beta.kubernetes.io/init-containers:'[{"name":"install","image":"gcr.io/google_containers/busybox:1.24","command":["/bin/sh","-c","echo\"unsupported.dbms.edition=enterprise\ndbms.mode=CORE\ndbms.connectors.default_advertised_address=$HOSTNAME.neo4j.default.svc.cluster.local\ndbms.connectors.default_listen_address=0.0.0.0\ndbms.connector.bolt.type=BOLT\ndbms.connector.bolt.enabled=true\ndbms.connector.bolt.listen_address=0.0.0.0:7687\ndbms.connector.http.type=HTTP\ndbms.connector.http.enabled=true\ndbms.connector.http.listen_address=0.0.0.0:7474\ncausal_clustering.raft_messages_log_enable=true\ncausal_clustering.initial_discovery_members=neo4j-0.neo4j.default.svc.cluster.local:5000,neo4j-1.neo4j.default.svc.cluster.local:5000,neo4j-2.neo4j.default.svc.cluster.local:5000\ncausal_clustering.leader_election_timeout=2s\n\" > /work-dir/neo4j.conf"],"volumeMounts":[{"name":"confdir","mountPath":"/work-dir"}]}]'labels:app:neo4jspec:containers:-name:neo4jimage:"neo4j/neo4j-experimental:3.1.0-M13-beta3-enterprise"imagePullPolicy:Alwaysports:-containerPort:5000name:discovery-containerPort:6000name:tx-containerPort:7000name:raft-containerPort:7474name:browser-containerPort:7687name:boltsecurityContext:privileged:truevolumeMounts:-name:datadirmountPath:/data-name:confdirmountPath:/confvolumes:-name:confdirvolumeClaimTemplates:-metadata:name:datadirannotations:volume.alpha.kubernetes.io/storage-class:anythingspec:accessModes:["ReadWriteOnce"]resources:requests:storage:2Gi
创建PetSet
$kubectlcreate-fneo4j.yamlservice"neo4j"createdpetset"neo4j"created
检查Pod是否已启动并正在运行
$kubectlgetpodsNAMEREADYSTATUSRESTARTSAGEneo4j-01/1Running02mneo4j-11/1Running014sneo4j-21/1Running010s
neo4j的日志文件
$kubectllogsneo4j-0StartingNeo4j.2016-11-2516:39:50.333+0000INFOStarting...2016-11-2516:39:51.723+0000INFOBoltenabledon0.0.0.0:7687.2016-11-2516:39:51.733+0000INFOInitiatingmetrics...2016-11-2516:39:51.911+0000INFOWaitingforothermemberstojoinclusterbeforecontinuing...2016-11-2516:40:12.074+0000INFOStarted.2016-11-2516:40:12.428+0000INFOMountedRESTAPIat:/db/manage2016-11-2516:40:13.350+0000INFORemoteinterfaceavailableathttp://neo4j-0.neo4j.default.svc.cluster.local:7474/
$kubectllogsneo4j-1StartingNeo4j.2016-11-2516:39:53.846+0000INFOStarting...2016-11-2516:39:56.212+0000INFOBoltenabledon0.0.0.0:7687.2016-11-2516:39:56.225+0000INFOInitiatingmetrics...2016-11-2516:39:56.341+0000INFOWaitingforothermemberstojoinclusterbeforecontinuing...2016-11-2516:40:16.623+0000INFOStarted.2016-11-2516:40:16.951+0000INFOMountedRESTAPIat:/db/manage2016-11-2516:40:17.607+0000INFORemoteinterfaceavailableathttp://neo4j-1.neo4j.default.svc.cluster.local:7474/
$kubectllogsneo4j-2StartingNeo4j.2016-11-2516:39:57.828+0000INFOStarting...2016-11-2516:39:59.166+0000INFOBoltenabledon0.0.0.0:7687.2016-11-2516:39:59.176+0000INFOInitiatingmetrics...2016-11-2516:39:59.329+0000INFOWaitingforothermemberstojoinclusterbeforecontinuing...2016-11-2516:40:19.216+0000INFOStarted.2016-11-2516:40:19.675+0000INFOMountedRESTAPIat:/db/manage2016-11-2516:40:21.029+0000INFORemoteinterfaceavailableathttp://neo4j-2.neo4j.default.svc.cluster.local:7474/
为每个服务器设置了端口转发
$kubectlport-forwardneo4j-027474:747427687:7687
运行以下过程来获得集群的概述
CALL dbms.cluster.overview()
╒════════════════════════════════════╤══════════════════════════════════════════════════════╤════════╕
│id │addresses │role │
╞════════════════════════════════════╪══════════════════════════════════════════════════════╪════════╡
│81d8e5e2-02db-4414-85de-a7025b346e84│[bolt://neo4j-0.neo4j.default.svc.cluster.local:27687,│LEADER │
│ │ http://neo4j-0.neo4j.default.svc.cluster.local:27474]│ │
├────────────────────────────────────┼──────────────────────────────────────────────────────┼────────┤
│347b7517-7ca0-4b92-b9f0-9249d46b2ad3│[bolt://neo4j-1.neo4j.default.svc.cluster.local:27687,│FOLLOWER│
│ │ http://neo4j-1.neo4j.default.svc.cluster.local:27474]│ │
├────────────────────────────────────┼──────────────────────────────────────────────────────┼────────┤
│a5ec1335-91ce-4358-910b-8af9086c2969│[bolt://neo4j-2.neo4j.default.svc.cluster.local:27687,│FOLLOWER│
│ │ http://neo4j-2.neo4j.default.svc.cluster.local:27474]│ │
└────────────────────────────────────┴──────────────────────────────────────────────────────┴────────┘
如果 希望集群中有5台服务器而不是3台,运行以下命令来增加副本的大小
$kubectlpatchpetsetneo4j-p'{"spec":{"replicas":5}}'"neo4j"patched
再次运行该过程
CALL dbms.cluster.overview()
╒════════════════════════════════════╤══════════════════════════════════════════════════════╤════════╕
│id │addresses │role │
╞════════════════════════════════════╪══════════════════════════════════════════════════════╪════════╡
│81d8e5e2-02db-4414-85de-a7025b346e84│[bolt://neo4j-0.neo4j.default.svc.cluster.local:27687,│LEADER │
│ │ http://neo4j-0.neo4j.default.svc.cluster.local:27474]│ │
├────────────────────────────────────┼──────────────────────────────────────────────────────┼────────┤
│347b7517-7ca0-4b92-b9f0-9249d46b2ad3│[bolt://neo4j-1.neo4j.default.svc.cluster.local:27687,│FOLLOWER│
│ │ http://neo4j-1.neo4j.default.svc.cluster.local:27474]│ │
├────────────────────────────────────┼──────────────────────────────────────────────────────┼────────┤
│a5ec1335-91ce-4358-910b-8af9086c2969│[bolt://neo4j-2.neo4j.default.svc.cluster.local:27687,│FOLLOWER│
│ │ http://neo4j-2.neo4j.default.svc.cluster.local:27474]│ │
├────────────────────────────────────┼──────────────────────────────────────────────────────┼────────┤
│28613d06-d4c5-461c-b277-ddb3f05e5647│[bolt://neo4j-3.neo4j.default.svc.cluster.local:27687,│FOLLOWER│
│ │ http://neo4j-3.neo4j.default.svc.cluster.local:27474]│ │
├────────────────────────────────────┼──────────────────────────────────────────────────────┼────────┤
│2eaa0058-a4f3-4f07-9f22-d310562ad1ec│[bolt://neo4j-4.neo4j.default.svc.cluster.local:27687,│FOLLOWER│
│ │ http://neo4j-4.neo4j.default.svc.cluster.local:27474]│ │
└────────────────────────────────────┴──────────────────────────────────────────────────────┴────────┘
再次回到3很简单
$kubectlpatchpetsetneo4j-p'{"spec":{"replicas":3}}'"neo4j"patched
CALL dbms.cluster.overview()
╒════════════════════════════════════╤══════════════════════════════════════════════════════╤════════╕
│id │addresses │role │
╞════════════════════════════════════╪══════════════════════════════════════════════════════╪════════╡
│81d8e5e2-02db-4414-85de-a7025b346e84│[bolt://neo4j-0.neo4j.default.svc.cluster.local:27687,│LEADER │
│ │ http://neo4j-0.neo4j.default.svc.cluster.local:27474]│ │
├────────────────────────────────────┼──────────────────────────────────────────────────────┼────────┤
│347b7517-7ca0-4b92-b9f0-9249d46b2ad3│[bolt://neo4j-1.neo4j.default.svc.cluster.local:27687,│FOLLOWER│
│ │ http://neo4j-1.neo4j.default.svc.cluster.local:27474]│ │
├────────────────────────────────────┼──────────────────────────────────────────────────────┼────────┤
│a5ec1335-91ce-4358-910b-8af9086c2969│[bolt://neo4j-2.neo4j.default.svc.cluster.local:27687,│FOLLOWER│
│ │ http://neo4j-2.neo4j.default.svc.cluster.local:27474]│ │
└────────────────────────────────────┴──────────────────────────────────────────────────────┴────────┘
托管Kubernetes上部署Neo4J单核
cd/tmp/gitclonehttps://github.com/sdaschner/neo4j-helm--branchsingle-instancecdneo4j-helm/helmtemplategraphdb\--setacceptLicenseAgreement=yes\--setneo4jPassword=mySecretPassword.\>/tmp/neo4j.yamlkubectlapply-f/tmp/neo4j.yaml
版权归原作者 满眼清香 所有, 如有侵权,请联系我们删除。