您当前的位置:首页 > 网站建设 > 网站维护
| php | asp | css | H5 | javascript | Mysql | Dreamweaver | Delphi | 网站维护 | 帝国cms | React | 考试系统 | ajax | jQuery |

Docker安装部署neo4j的实战过程

51自学网 2023-06-16 18:52:35
  网站维护

前言

Neo4j是一个高性能的,NOSQL图形数据库,本身就支持集群部署,今天要搭建的就是neo4j的因果集群,其中分为:

核心节点:core-server,可以对数据进行读写的中心节点,通过选举确定leader,follower.

只读节点:read-replica,只提供数据访问的只读节点,需要连接核心节点,可以非常方便的进行扩展

一、Docker 安装部署neo4j

第一步,从镜像源中查找镜像

docker search neo4j

第二步,拉取镜像源

docker pull neo4j(:版本号) //缺省 “:版本号” 时默认安装latest版本的

第三步,查看本地镜像,检验是否拉取成功

docker images

启动容器

docker run -d --name container_name -p 27474:7474 -p 27687: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 --env NEO4J_AUTH=neo4j/password neo4j
-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.confvim neo4j.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 -O http://dist.neo4j.org/neo4j-community-3.4.5-unix.tar.gz// 解压安装tar -axvf neo4j-community-3.4.5-unix.tar.gz

安装目录下找到conf目录下的neo4j.conf文件,修改相应配置

# 修改第22行load csv时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来load csvdbms.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: neo4j   labels:     name: neo4j     ---apiVersion: apps/v1beta1kind: StatefulSetmetadata:  name: neo4j-core  namespace: neo4j  labels:    app: neo4j-corespec:  replicas: 2    # 部署2个core-server  selector:    matchLabels:      app: neo4j-core  serviceName: neo4j-core  template:    metadata:      labels:        app: neo4j-core    spec:      containers:      - name: neo4j-core        image: neo4j:3.5.5-enterprise   # 官方镜像,3.5.5企业版        imagePullPolicy: IfNotPresent        env:    # 这里通过env,配置镜像环境参数,这是因为此镜像是通过这样来进行配置参数的          - name: NEO4J_ACCEPT_LICENSE_AGREEMENT    # 接受证书协议,必须的            value: "yes"          - name: NEO4J_dbms_connectors_default__advertised__address  # 指定自身pod的ip地址,默认为localhost,在集群中必须注明自身地址,这里直接用ip            valueFrom:              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__formation            value: "2"          - name: NEO4J_causal__clustering_minimum__core__cluster__size__at__runtime            value: "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_transactionAdvertisedAddress            value: $(NEO4J_dbms_connectors_default__advertised__address):6000          - name: NEO4J_causalClustering_raftAdvertisedAddress            value: $(NEO4J_dbms_connectors_default__advertised__address):7000        volumeMounts:        - name: neo4j-core    # 挂载数据目录/data          mountPath: /data  volumeClaimTemplates:  - metadata:      name: neo4j-core  # 这里name要和上面volumeMounts的name一致,才能绑定到对应的pod      annotations:        volume.beta.kubernetes.io/storage-class: "managed-nfs-storage"  # 这里是上一步创建的nfs动态卷name    spec:      accessModes: [ "ReadWriteOnce" ]      resources:        requests:          storage: 2Gi   # 大小自定义          ---apiVersion: v1kind: Servicemetadata:  name: neo4j-core  namespace: neo4jspec:  selector:    app: neo4j-core  type: NodePort     # 这里用nodeport来开启外网访问,没用traefik是因为7687的连接端口不是http访问,需要4层负载,但是traefik不支持,所以只能通过nodeport来实现外网访问,才能正常访问7474端口的web管理界面。  ports:    - protocol: TCP      name: http      port: 7474      nodePort: 27474      targetPort: 7474    - protocol: TCP      name: blot      port: 7687      nodePort: 27687      targetPort: 7687

执行 yaml文件

kubectl create -f neo4j-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-replica  namespace: neo4j  labels:    app: neorj-read-replicaspec:  replicas: 3  selector:    matchLabels:      app: neorj-read-replica  template:    metadata:      labels:        app: neorj-read-replica    spec:      containers:      - name: neorj-read-replica        image: neo4j:3.5.5-enterprise        imagePullPolicy: IfNotPresent        env:          - name: NEO4J_ACCEPT_LICENSE_AGREEMENT            value: "yes"          - name: NEO4J_dbms_connectors_default__advertised__address            valueFrom:              fieldRef:                fieldPath: status.podIP          - name: NEO4J_dbms_mode   # 指定模式为只读节点模式            value: "READ_REPLICA"          - name: NEO4J_AUTH            value: "neo4j/your-password"   # 统一设置用户密码          - name: NEO4J_causal__clustering_discovery__type            value: "LIST"          - name: NEO4J_causal__clustering_initial__discovery__members            value: "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-replica  namespace: neo4jspec:  selector:    app: neorj-read-replica  ports:  - protocol: TCP    port: 7687    targetPort: 7687

执行此yaml文件,创建只读节点

kubectl create -f neo4j-read-replica.yaml

【注】

部署3个只读节点,无状态服务,不需要进行数据持久化,只需要将core节点的集群列表写出就行了,会自动去找到核心节点的集群,然后从中复制数据,提供访问即可。

因为只读节点只能访问数据,所以没必要提供k8s的外部访问,所以直接在service中负载一下bolt的访问端口就行了,以提供给k8s内部应用访问即可。

查看日志如下为正常启动

访问WEB界面

部署完成后,设置域名,设置nginx,访问web界面

默认用户密码为: neo4j / neo4j

登录修改密码,然后查看状态,可以看到集群的状态

neo4j 3个成员组成的集群

为每个成员创建一个PersistentVolume

volume.sh

for i in $(seq 0 2); do  cat <<EOF | kubectl create -f -kind: PersistentVolumeapiVersion: v1metadata:  name: pv${i}  labels:    type: local    app: neo4jspec:  capacity:    storage: 1Gi  accessModes:    - ReadWriteOnce  hostPath:    path: "/tmp/${i}"EOF  cat <<EOF | kubectl create -f -kind: PersistentVolumeClaimapiVersion: v1metadata:  name: datadir-neo4j-${i}  labels:    app: neo4jspec:  accessModes:    - ReadWriteOnce  resources:    requests:      storage: 1GiEOFdone

运行此脚本,它将创建3个卷

$ kubectl get pvNAME      CAPACITY   ACCESSMODES   STATUS    CLAIM                     REASON    AGEpv0       1Gi        RWO           Bound     default/datadir-neo4j-0             7spv1       1Gi        RWO           Bound     default/datadir-neo4j-1             7spv2       1Gi        RWO           Bound     default/datadir-neo4j-2             7s
$ kubectl get pvcNAME              STATUS    VOLUME    CAPACITY   ACCESSMODES   AGEdatadir-neo4j-0   Bound     pv0       1Gi        RWO           26sdatadir-neo4j-1   Bound     pv1       1Gi        RWO           26sdatadir-neo4j-2   Bound     pv2       1Gi        RWO           25s

我们需要创建一个PetSet模板

# Headless service to provide DNS lookupapiVersion: v1kind: Servicemetadata:  labels:    app: neo4j  name: neo4jspec:  clusterIP: None  ports:    - port: 7474  selector:    app: neo4j----# new API nameapiVersion: "apps/v1alpha1"kind: PetSetmetadata:  name: neo4jspec:  serviceName: neo4j  replicas: 3  template:    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/n                dbms.mode=CORE/n                dbms.connectors.default_advertised_address=$HOSTNAME.neo4j.default.svc.cluster.local/n                dbms.connectors.default_listen_address=0.0.0.0/n                dbms.connector.bolt.type=BOLT/n                dbms.connector.bolt.enabled=true/n                dbms.connector.bolt.listen_address=0.0.0.0:7687/n                dbms.connector.http.type=HTTP/n                dbms.connector.http.enabled=true/n                dbms.connector.http.listen_address=0.0.0.0:7474/n                causal_clustering.raft_messages_log_enable=true/n                causal_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/n                causal_clustering.leader_election_timeout=2s/n                  /" > /work-dir/neo4j.conf" ],                "volumeMounts": [                    {                        "name": "confdir",                        "mountPath": "/work-dir"                    }                ]            }        ]'      labels:        app: neo4j    spec:      containers:      - name: neo4j        image: "neo4j/neo4j-experimental:3.1.0-M13-beta3-enterprise"        imagePullPolicy: Always        ports:        - containerPort: 5000          name: discovery        - containerPort: 6000          name: tx        - containerPort: 7000          name: raft        - containerPort: 7474          name: browser        - containerPort: 7687          name: bolt        securityContext:          privileged: true        volumeMounts:        - name: datadir          mountPath: /data        - name: confdir          mountPath: /conf      volumes:      - name: confdir  volumeClaimTemplates:  - metadata:      name: datadir      annotations:        volume.alpha.kubernetes.io/storage-class: anything    spec:      accessModes: [ "ReadWriteOnce" ]      resources:        requests:          storage: 2Gi

创建PetSet

$ kubectl create -f neo4j.yaml service "neo4j" createdpetset "neo4j" created

检查Pod是否已启动并正在运行

$ kubectl get podsNAME      READY     STATUS    RESTARTS   AGEneo4j-0   1/1       Running   0          2mneo4j-1   1/1       Running   0          14sneo4j-2   1/1       Running   0          10s

neo4j的日志文件

$ kubectl logs neo4j-0Starting Neo4j.2016-11-25 16:39:50.333+0000 INFO  Starting...2016-11-25 16:39:51.723+0000 INFO  Bolt enabled on 0.0.0.0:7687.2016-11-25 16:39:51.733+0000 INFO  Initiating metrics...2016-11-25 16:39:51.911+0000 INFO  Waiting for other members to join cluster before continuing...2016-11-25 16:40:12.074+0000 INFO  Started.2016-11-25 16:40:12.428+0000 INFO  Mounted REST API at: /db/manage2016-11-25 16:40:13.350+0000 INFO  Remote interface available at http://neo4j-0.neo4j.default.svc.cluster.local:7474/
$ kubectl logs neo4j-1Starting Neo4j.2016-11-25 16:39:53.846+0000 INFO  Starting...2016-11-25 16:39:56.212+0000 INFO  Bolt enabled on 0.0.0.0:7687.2016-11-25 16:39:56.225+0000 INFO  Initiating metrics...2016-11-25 16:39:56.341+0000 INFO  Waiting for other members to join cluster before continuing...2016-11-25 16:40:16.623+0000 INFO  Started.2016-11-25 16:40:16.951+0000 INFO  Mounted REST API at: /db/manage2016-11-25 16:40:17.607+0000 INFO  Remote interface available at http://neo4j-1.neo4j.default.svc.cluster.local:7474/
$ kubectl logs neo4j-2Starting Neo4j.2016-11-25 16:39:57.828+0000 INFO  Starting...2016-11-25 16:39:59.166+0000 INFO  Bolt enabled on 0.0.0.0:7687.2016-11-25 16:39:59.176+0000 INFO  Initiating metrics...2016-11-25 16:39:59.329+0000 INFO  Waiting for other members to join cluster before continuing...2016-11-25 16:40:19.216+0000 INFO  Started.2016-11-25 16:40:19.675+0000 INFO  Mounted REST API at: /db/manage2016-11-25 16:40:21.029+0000 INFO  Remote interface available at http://neo4j-2.neo4j.default.svc.cluster.local:7474/

为每个服务器设置了端口转发

$ kubectl port-forward neo4j-0 27474:7474 27687:7687

运行以下过程来获得集群的概述

51自学网自学EXCEL、自学PS、自学CAD、自学C语言、自学css3实例,是一个通过网络自主学习工作技能的自学平台,网友喜欢的软件自学网站。
京ICP备13026421号-1