-
Notifications
You must be signed in to change notification settings - Fork 8
Docker BackEnd Deployment Doc
[TOC]
- macOS X 10.15.6
- JRE 8
后端现在部署在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/tomcatDockerfile
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
tomcat8.5管理员默认只能在安装tomcat的机器上访问,如果想在其他机器上访问,则需要进行配置修改
- 添加用户和权限(
{tomcat}\conf\tomcat-users.xml):
<role rolename="manager-gui"/>
<role rolename="admin-gui"/>
<user username="admin" password="admin" roles="admin-gui,manager-gui" />- 修改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>docker-neo4j镜像使用3.4.7版本,需要下载相应版本的semantics插件,进行配置安装,方便导入ttl文件。
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"); 。
-
共享文件夹权限设置问题
在neo4j中默认情况下无法使用tomcat中java程序生成的文件,需要在java代码中对文件授权。
-
semantics与neo4j版本对应问题
semantics应使用与neo4j相对应的版本,具体版本可参见官网。
-
neo4j版本问题
neo4j3.5以上版本镜像在使用时,需要配置权限。
此处的集群有三个分片集群节点rs_shard_server1、rs_shard_server2和rs_shard_server3,其中每个分片有两个副本shard_servern1和shard_servern2;对应两个服务器集群节点rs_config_server1和rs_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注:这里网络设置并不是必要的,在下文的继续配置中没有用到。
-
通过compose启动集群
docker-compose up -d
-
配置服务器设置(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()命令可显示当前状态。 -
配置分片节点(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。
-
配置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进行分片设置和验证。
-
数据库启用分片
sh.enableSharding("test")接上面操作,此时应该连接到mongos
-
分片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})}
-
验证分片
查看数据分布:
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服务器查看。
我们这里使用mongo自带的导入、导出命令做数据迁移。
导出数据命令: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 -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-compose)