Skip to content

Docker BackEnd Deployment Doc

sushaoci edited this page Dec 31, 2019 · 1 revision

Docker 后端部署报告

[TOC]

开发环境

  • macOS X 10.15.6
  • JRE 8

Tomcat部署

镜像制作及容器生成

后端现在部署在kg-backend容器中,端口为8188,api为:/kg/api/

  • Tomcat版本:8
  • jre版本:8

将dockerfile、打包好的war包、tomcat-users.xml放在同一文件夹下,在当前文件夹下,运行下列命令,生成镜像,并开启容器。

$ docker build -t kgtest/tomcat . #在当前war存放的目录下运行
$ docker run --name kgbackend -p 8189:8080 -v /home/serveradmin/neo4j/home:/home kgtest/tomcat
$ docker run --name kgbackend -p 8189:8080 --privileged=true -v /home/serveradmin/neo4j/home:/home --net mongodb-cluster_mongo kgtest/tomcat

Dockerfile

FROM tomcat:8-jre8
MAINTAINER rubick:wq
RUN mkdir -p /home/
RUN apt-get update && apt-get -y install vim
ADD tomcat-users.xml /usr/local/tomcat/conf/
ADD kg.war /usr/local/tomcat/webapps/
CMD ["catalina.sh","run"]

目录结构

|--kgbackend
|  |--Dockerfile
|  |--kg.war
|  |--tomcat-users.xml

后端容器结构

|--usr
|  |--local
|     |--tomcat
|        |--conf
|        |--webapps
|--home
|  |--system
|  |--type

Tomcat远程访问设置

tomcat8.5管理员默认只能在安装tomcat的机器上访问,如果想在其他机器上访问,则需要进行配置修改

  1. 添加用户和权限({tomcat}\conf\tomcat-users.xml):
<role rolename="manager-gui"/>
<role rolename="admin-gui"/>
<user username="admin" password="admin" roles="admin-gui,manager-gui" />
  1. 修改tomcat管理功能配置文件({tomcat}/webapps/manager/META-INF/context.xml),注释掉地址限制:
<Context antiResourceLocking="false" privileged="true" >
  <!--
  <Valve className="org.apache.catalina.valves.RemoteAddrValve"
     allow="127.\d+.\d+.\d+|::1|0:0:0:0:0:0:0:1" />
  -->
</Context>

Neo4j部署

docker-neo4j镜像使用3.4.7版本,需要下载相应版本的semantics插件,进行配置安装,方便导入ttl文件。

Neo4j部署具体步骤

neo4j部署在neo4j容器中,端口为7687/7474

$ docker run -detach --name neo4j --publish=7474:7474 --publish=7687:7687 --volume=$HOME/neo4j/home:/home --privileged=true --net mongodb-cluster_mongo neo4j:3.4.7
#进入容器内部
$ docker exec -it kgneo4j /bin/sh
#修改配置文件
#增加插件
dbms.unmanaged_extension_classes=semantics.extension=/rdf
#增加远程访问(非必须)
dbms.connectors.default_advertised_address=localhost
dbms.connectors.default_listen_address=0.0.0.0
dbms.connector.http.listen_address=0.0.0.0:7474
#下载插件 https://github.com/neo4j-labs/neosemantics/releases/download/3.4.0.2/neosemantics-3.4.0.2.jar
$ wget https://github.com/neo4j-labs/neosemantics/releases/download/3.4.0.2/neosemantics-3.4.0.2.jar
$ neo4j restart
#在neo4j中运行
:GET /rdf/ping
CREATE INDEX ON :Resource(uri)

Neo4j目录结构

|--var
|  |--lib
|     |--neo4j
|        |--data
|        |--conf
|           |--neo4j.conf
|        |--plugins
|--home
|  |--system
|  |--type

在tomcat和neo4j的共享文件夹中运行命令chmod -R 777 *将文件夹设为任何人都可以读写,否则会出现权限问题。需要在Java程序中修改新建文件的权限Runtime.getRuntime().exec("chmod 777 /home/test3.txt");

Docker network

neo4j远程访问

Neo4j部署注意事项

  • 共享文件夹权限设置问题

    在neo4j中默认情况下无法使用tomcat中java程序生成的文件,需要在java代码中对文件授权。

  • semantics与neo4j版本对应问题

    semantics应使用与neo4j相对应的版本,具体版本可参见官网。

  • neo4j版本问题

    neo4j3.5以上版本镜像在使用时,需要配置权限。

MongoDB集群部署

mongo集群生成

此处的集群有三个分片集群节点rs_shard_server1rs_shard_server2rs_shard_server3,其中每个分片有两个副本shard_servern1shard_servern2;对应两个服务器集群节点rs_config_server1rs_config_server2;以及一个路由节点mongos

docker-compose.yml

version: '3'
services:
    # 分片集群,3节点,2副本
    shard_server11:
        container_name: shard_server11
        image: mongo
        networks:
            mongo:
                ipv4_address: 173.21.0.11
        ports:
            - 27018:27018
        command: --shardsvr --replSet "rs_shard_server1" --bind_ip_all
        restart: always
        depends_on:
            - rs_config_server1
            - rs_config_server2

    shard_server12:
        container_name: shard_server12
        image: mongo
        networks:
            mongo:
                ipv4_address: 173.21.0.21
        ports:
            - 27118:27018
        command: --shardsvr --replSet "rs_shard_server1" --bind_ip_all
        restart: always
        depends_on:
            - rs_config_server1
            - rs_config_server2

    shard_server21:
        container_name: shard_server21
        networks:
            mongo:
                ipv4_address: 173.21.0.12
        image: mongo
        ports:
            - 27028:27018
        command: --shardsvr --replSet "rs_shard_server2" --bind_ip_all
        restart: always
        depends_on:
            - rs_config_server1
            - rs_config_server2

    shard_server22:
        container_name: shard_server22
        networks:
            mongo:
                ipv4_address: 173.21.0.22
        image: mongo
        ports:
            - 27228:27018
        command: --shardsvr --replSet "rs_shard_server2" --bind_ip_all
        restart: always
        depends_on:
            - rs_config_server1
            - rs_config_server2

    shard_server31:
        container_name: shard_server31
        networks:
            mongo:
                ipv4_address: 173.21.0.23
        image: mongo
        ports:
            - 27038:27018
        command: --shardsvr --replSet "rs_shard_server3" --bind_ip_all
        restart: always
        depends_on:
            - rs_config_server1
            - rs_config_server2

    shard_server32:
        container_name: shard_server32
        networks:
            mongo:
                ipv4_address: 173.21.0.24
        image: mongo
        ports:
            - 27238:27018
        command: --shardsvr --replSet "rs_shard_server3" --bind_ip_all
        restart: always
        depends_on:
            - rs_config_server1
            - rs_config_server2

    # 配置服务器集群两个节点(mongodb3.4之后的版本需要两个config_server)
    rs_config_server1:
        container_name: rs_config_server1
        networks:
            mongo:
                ipv4_address: 173.21.0.13
        image: mongo
        command: --configsvr --replSet "rs_config_server" --bind_ip_all
        restart: always

    rs_config_server2:
        container_name: rs_config_server2
        networks:
            mongo:
                ipv4_address: 173.21.0.14
        image: mongo
        command: --configsvr --replSet "rs_config_server" --bind_ip_all
        restart: always

    

    # 路由节点mongos
    mongos:
        container_name: mongos
        networks:
            mongo:
                ipv4_address: 173.21.0.15
        image: mongo
        ports:
            - 27117:27017
        entrypoint: mongos
        command: --configdb rs_config_server/173.21.0.13:27019,173.21.0.14:27019 --bind_ip_all
        depends_on:
            - shard_server11
            - shard_server12
            - shard_server21
            - shard_server22
            - shard_server31
            - shard_server32

networks:
    mongo:
        driver: bridge
        ipam:
            config:
                - subnet: 173.21.0.10/24

注:这里网络设置并不是必要的,在下文的继续配置中没有用到。

  1. 通过compose启动集群

    docker-compose up -d
  2. 配置服务器设置(config_server)

    连接到任意一台配置服务器

    docker exec -it rs_config_server1 /bin/bash
    mongo --host localhost --port 27019

    执行以下命令进行设置

    rs.initiate({
    			_id: "rs_config_server",     
    			configsvr: true,     
    			members: [         
    					{ _id : 0, host : "rs_config_server1:27019" },
    					{ _id : 1, host : "rs_config_server2:27019" }    
    			] 
    });

    注:原链接文章中使用上述docker-compose.yml中配置的网络,但会报"errmsg" : "No host described in new configuration 1 for replica set rs_config_server maps to this node"的错误,将ip改为容器名字后成功。

    成功后显示:

    {
            "ok" : 1,
            "$gleStats" : {
                    "lastOpTime" : Timestamp(1573397485, 1),
                    "electionId" : ObjectId("000000000000000000000000")
            },
            "lastCommittedOpTime" : Timestamp(0, 0),
            "$clusterTime" : {
                    "clusterTime" : Timestamp(1573397485, 1),
                    "signature" : {
                            "hash" : BinData(0,"AAAAAAAAAAAAAAAAAAAAAAAAAAA="),
                            "keyId" : NumberLong(0)
                    }
            },
            "operationTime" : Timestamp(1573397485, 1)
    }
    

    使用rs.status()命令可显示当前状态。

  3. 配置分片节点(rs_shard_servern)

    rs_shard_server1为例。

    连接其中一个分片

   docker exec -it shard_server11 bash
mongo --host localhost --port 27018

初始化副本,执行以下设置

   rs.initiate(
{
   _id : "rs_shard_server1",
   members: [
   { _id : 0, host : "shard_server11:27018" },
   { _id : 1, host : "shard_server12:27018" }
   ]
   }
   );

成功后显示

{
        "ok" : 1,
        "operationTime" : Timestamp(1573961265, 1),
        "$clusterTime" : {
                "clusterTime" : Timestamp(1573961265, 1),
                "signature" : {
                        "hash" : BinData(0,"AAAAAAAAAAAAAAAAAAAAAAAAAAA="),
                        "keyId" : NumberLong(0)
                }
        }
}

重复上述步骤,分别设置rs_shard_server1、rs_shard_server2、rs_shard_server3。

  1. 配置mongos

    docker exec -it mongos /bin/bash
    mongo --host localhost --port 27017

    将分片集群添加到mongos中

    sh.addShard("rs_shard_server1/shard_server11:27018,shard_server12:27018")
    sh.addShard("rs_shard_server2/shard_server21:27018,shard_server22:27018")
    sh.addShard("rs_shard_server3/shard_server31:27018,shard_server32:27018")

    成功后显示:

    {
    	"shardAdded" : "shard0000",
    	"ok" : 1,
    	"operationTime" : Timestamp(1573397581, 5),
    	"$clusterTime" : {
    		"clusterTime" : Timestamp(1573397581, 5),
    		"signature" : {
    			"hash" : BinData(0,"AAAAAAAAAAAAAAAAAAAAAAAAAAA="),
    			"keyId" : NumberLong(0)
    		}
    	}
    }
    

到此集群配置完成,下面对具体的collection进行分片设置和验证。

  1. 数据库启用分片

    sh.enableSharding("test")

    接上面操作,此时应该连接到mongos

  2. 分片Collection

    test.order_id字段进行哈希分片:

    sh.shardCollection("test.order", {"_id": "hashed" })

    插入数据:

    use test
    for (i = 1; i <= 1000; i=i+1){db.order.insert({'price': 1})}
  3. 验证分片

    查看数据分布:

    mongos> db.order.find().count()
    
    rs_shard_server1:PRIMARY> db.order.find().count()
    
    rs_shard_server2:PRIMARY> db.order.find().count()
    
    rs_shard_server3:PRIMARY> db.order.find().count()
    

    注:此步骤需要连接到mongos和不同的shard服务器查看。

MongoDB数据迁移

我们这里使用mongo自带的导入、导出命令做数据迁移。

导出(mongoexport)

导出数据命令:mongoexport -h dbhost -d dbname -c collectionName -o output

-h :数据库地址,MongoDB 服务器所在的 IP 与 端口,如 localhost:27017

-d :指明使用的数据库实例,如 test

-c 指明要导出的集合,如 c1

-o 指明要导出的文件名,如 E:/wmx/mongoDump/c1.json,注意是文件而不是目录,目录不存在时会一同新建

导入(mongoimport)

导入数据命令:mongoimport -h dbhost -d dbname -c collectionname 文件的地址...

-h : 数据库地址,MongoDB 服务器所在的 IP 与 端口,如 localhost:27017

-d :指明使用的库,指明使用的数据库实例,如 test

-c :指明要导入的集合,如 c1、c2、可以和导出时不一致,自定义即可,不存在时会直接创建。

本地的文件地址:事先导出好的 mongoDB 集合文件

注意事项

  • mongo部署成功后,需要通过连接mongos进行连接

  • 更新时,集群操作与单机不同

    更新需要使用collection.updateMany(query,doc);而不能用findOneAndUpdate

参考书目

docker搭建mongo分片集群

docker搭建mongo分片集群(docker-compose)

Can't run rs.initiate() when do mongodb replication set

Java 连接MongoDB集群的几种方式

Clone this wiki locally