共计 6525 个字符,预计需要花费 17 分钟才能阅读完成。
1 前言
欢送拜访南瓜慢说 www.pkslow.com 获取更多精彩文章!
H2 Database
是一个优良的数据库,又小又不便,反对内存和文件模式,常常会在 测试
、POC(proof of concept)
或开发环境
用到它。在 Springboot
的许多利用中,也是内置了H2 数据库
,很罕用。接下来咱们来一步步把它推上k8s
,让它坐上一个不一样的地位。
倡议浏览上面文章以帮忙了解:
Kubernetes 用 Helm 装置 Ingress 并踩一下应用的坑
容器技术相干文章
2 本地 jar 包运行
2.1 下载和启动
下载官网 jar
包如下:
$ curl http://www.h2database.com/h2-2019-03-13.zip -o h2-2019-03-13.zip
解压:
$ unzip h2-2019-03-13.zip
启动H2 数据库
:
$ java -cp h2/bin/h2*.jar org.h2.tools.Server -ifNotExists
TCP server running at tcp://localhost:9092 (only local connections)
PG server running at pg://localhost:5435 (only local connections)
Web Console server running at http://localhost:8082 (others can connect)
如果须要批改配置,如端口号、数据存储目录,能够在启动时增加参数:
java -cp h2/bin/h2*.jar org.h2.tools.Server -ifNotExists \
-web -webAllowOthers -webPort 8082 \
-tcp -tcpAllowOthers -tcpPort 9092 \
-baseDir ${DATA_DIR} ${H2_OPTIONS}
2.2 配置连贯
胜利启动后拜访 http://localhost:8082
就能登陆控制台了。如下:
Driver Class
:org.h2.Driver
,驱动类;
JDBC URL
:jdbc:h2:mem:pkslow
,应用内存数据库,数据库名为pkslow
;
账号密码设置为admin/123456
。
设置实现后,点击连贯即可创立数据库。
如果咱们把 JDBC URL
改为 jdbc:h2:file:~/pkslow
,就是以文件模式存在,这样能把数据长久化,所以咱们采取这种形式。这里就会在~
目录,即 ${HOME}
目录生成文件 pkslow.mv.db
以保留数据。还有文件 ~/.h2.server.properties
。
更多 URL
的配置办法如下表:
Topic | URL Format and Examples | ||
---|---|---|---|
Embedded (local) connection | jdbc:h2:[file:][]<databaseName> jdbc:h2:~/test jdbc:h2:file:/data/sample jdbc:h2:file:C:/data/sample (Windows only) | ||
In-memory (private) | jdbc:h2:mem: | ||
In-memory (named) | jdbc:h2:mem:<databaseName> jdbc:h2:mem:test_mem | ||
Server mode (remote connections) using TCP/IP | jdbc:h2:tcp://<server>[:<port>]/[<path>]<databaseName> jdbc:h2:tcp://localhost/~/test jdbc:h2:tcp://dbserv:8084/~/sample jdbc:h2:tcp://localhost/mem:test | ||
Server mode (remote connections) using TLS | jdbc:h2:ssl://<server>[:<port>]/[<path>]<databaseName> jdbc:h2:ssl://localhost:8085/~/sample; | ||
Using encrypted files | jdbc:h2:<url>;CIPHER=AES jdbc:h2:ssl://localhost/~/test;CIPHER=AES jdbc:h2:file:~/secure;CIPHER=AES | ||
File locking methods | jdbc:h2:<url>;FILE_LOCK={FILE\ | SOCKET\ | NO} jdbc:h2:file:~/private;CIPHER=AES;FILE_LOCK=SOCKET |
Only open if it already exists | jdbc:h2:<url>;IFEXISTS=TRUE jdbc:h2:file:~/sample;IFEXISTS=TRUE | ||
Don’t close the database when the VM exits | jdbc:h2:<url>;DB_CLOSE_ON_EXIT=FALSE | ||
Execute SQL on connection | jdbc:h2:<url>;INIT=RUNSCRIPT FROM ‘~/create.sql’ jdbc:h2:file:~/sample;INIT=RUNSCRIPT FROM ‘~/create.sql’;RUNSCRIPT FROM ‘~/populate.sql’ | ||
User name and/or password | jdbc:h2:<url>;USER=<username> jdbc:h2:file:~/sample;USER=sa;PASSWORD=123 | ||
Debug trace settings | jdbc:h2:<url>;TRACE_LEVEL_FILE=<level 0..3> jdbc:h2:file:~/sample;TRACE_LEVEL_FILE=3 | ||
Ignore unknown settings | jdbc:h2:<url>;IGNORE_UNKNOWN_SETTINGS=TRUE | ||
Custom file access mode | jdbc:h2:<url>;ACCESS_MODE_DATA=rws | ||
Database in a zip file | jdbc:h2:zip:<zipFileName>!/<databaseName> jdbc:h2:zip:~/db.zip!/test | ||
Compatibility mode | jdbc:h2:<url>;MODE=<databaseType> jdbc:h2:~/test;MODE=MYSQL;DATABASE_TO_LOWER=TRUE | ||
Auto-reconnect | jdbc:h2:<url>;AUTO_RECONNECT=TRUE jdbc:h2:tcp://localhost/~/test;AUTO_RECONNECT=TRUE | ||
Automatic mixed mode | jdbc:h2:<url>;AUTO_SERVER=TRUE jdbc:h2:~/test;AUTO_SERVER=TRUE | ||
Page size | jdbc:h2:<url>;PAGE_SIZE=512 | ||
Changing other settings | jdbc:h2:<url>;<setting>=<value>[;<setting>=<value>…] jdbc:h2:file:~/sample;TRACE_LEVEL_SYSTEM_OUT=3 |
3 在 Docker 运行
3.1 创立镜像并启动
编写 Dockerfile
文件:
FROM adoptopenjdk/openjdk8-openj9:latest
COPY h2/ h2/
ENV DATA_DIR /opt/h2-data
RUN mkdir -p ${DATA_DIR}
EXPOSE 8082 9092
ENTRYPOINT java -cp h2/bin/h2-1.4.199.jar org.h2.tools.Server -ifNotExists \
-web -webAllowOthers \
-tcp -tcpAllowOthers \
-baseDir ${DATA_DIR} ${H2_OPTIONS}
这里把数据存储文件放在 /opt/h2-data
目录上,应用默认端口,所以只对外裸露 8082/9092
端口。
通过 Dockerfile
创立镜像:
$ docker build -t h2:1.4.199 .
启动 Docker
容器:
$ docker run -itd --name h2 -p 8082:8082 -p 9092:9092 h2:1.4.199
3.2 通过 Web 和 TCP 形式连贯
3.2.1 Web 界面连贯
胜利启动后,拜访 http://localhost:8082
配置连贯如下:
进入容器,查看在 /opt/h2-data
目录生成了存储文件:
$ docker exec -it h2 /bin/bash
root@0121e369b933:/opt/h2-data# l
test.mv.db
3.2.2 TCP 形式连贯
通过 IDEA
配置连贯 H2
时要留神门路,通过 TCP
形式,不必加baseDir
,配置为jdbc:h2:tcp://localhost:9092/test
。如果要加,应该配置为jdbc:h2:tcp://localhost:9092//opt/h2-data/test
。
4 部署在 Kubernetes 上运行
4.1 部署上 Kubernetes 看看
4.1.1 创立 PersistentVolumeClaim
PersistentVolumeClaim
,简称 PVC
,是Kubernetes
用于存储的单元,为了能够使 H2
的数据长久化,在 Pod
死掉后重启数据不失落,咱们来创立对应的PVC
:
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
name: h2-db
labels:
app: h2-db
annotations:
volume.alpha.kubernetes.io/storage-class: default
spec:
accessModes:
- ReadWriteOnce
resources:
requests:
storage: 0.05Gi
这里空间只给0.05G
,反正试验为主,不作其它用处。
4.1.2 创立 Deployment
这里最要害的是要留神 PVC
的配置:
apiVersion: apps/v1
kind: Deployment
metadata:
name: h2-db
labels:
app: h2-db
spec:
replicas: 1
selector:
matchLabels:
app: h2-db
template:
metadata:
labels:
app: h2-db
spec:
containers:
- image: h2:1.4.199
name: h2-db
ports:
- containerPort: 8082
name: h2-web
- containerPort: 9092
name: h2-tcp
volumeMounts:
- name: data
mountPath: /opt/h2-data
volumes:
- name: data
persistentVolumeClaim:
claimName: h2-db
mountPath
对应的是之前在制作 Docker
镜像时指定的门路。
4.1.3 创立 Service 和 Ingress
Service
和 Ingress
对应的 yaml
文件如下:
apiVersion: v1
kind: Service
metadata:
name: h2-db
labels:
app: h2-db
spec:
ports:
- port: 8082
name: web
- port: 9092
name: tcp
selector:
app: h2-db
---
apiVersion: extensions/v1beta1
kind: Ingress
metadata:
name: h2-ingress
annotations:
kubernetes.io/ingress.class: nginx
spec:
rules:
- http:
paths:
- path: /
backend:
serviceName: h2-db
servicePort: 8082
host: h2-web.localhost
- http:
paths:
- path: /
backend:
serviceName: h2-db
servicePort: 9092
host: h2-tcp.localhost
4.1.4 拜访
Web
形式简略,通过拜访 http://h2-web.localhost/
配置连贯即可。
TCP
形式就麻烦了,无论如何配置,死活连不上。具体起因接下来持续探讨。
4.2 让 Ingress 反对 TCP
之前 TCP
连不上的起因是 Ingress
是不反对 TCP
路由转发的,尽管 Ingress
是基于 Nginx
,而Nginx
又能够转发代理TCP/UDP
。那就来摸索一番吧。
4.2.1 批改 nginx-ingress-controller
为了让它反对TCP/UDP
,咱们要批改Ingress-Controller
,在它的配置文件减少参数:
- --tcp-services-configmap=$(POD_NAMESPACE)/tcp-services
- --udp-services-configmap=$(POD_NAMESPACE)/udp-services
在上面内容中插入:
containers:
- args:
- /nginx-ingress-controller
- --default-backend-service=default/pki-nginx-ingress-default-backend
- --election-id=ingress-controller-leader
- --ingress-class=nginx
- --configmap=default/pki-nginx-ingress-controller
- --tcp-services-configmap=$(POD_NAMESPACE)/tcp-services
- --udp-services-configmap=$(POD_NAMESPACE)/udp-services
4.2.2 增加 tcp-services config
下面的 Controller
指定了 tcp-services
的ConfigMap
,那咱们就增加上:
kind: ConfigMap
apiVersion: v1
metadata:
name: tcp-services
namespace: default
data:
"9092": default/h2-db:9092
其中,"9092": default/h2-db:9092
示意:<Nginx port>: <namespace/service name>:<service port>:[PROXY]:[PROXY]
,咱们这样配置相当于把 Nginx
的9092
端口,指向 H2
的9092
端口。
4.2.3 批改 Ingress Service 的端口
在只有 http/https
的根底上,减少 H2
配置:
spec:
externalTrafficPolicy: Cluster
ports:
- name: http
nodePort: 32231
port: 80
protocol: TCP
targetPort: http
- name: https
nodePort: 30370
port: 443
protocol: TCP
targetPort: https
- name: h2-tcp
nodePort: 30371
port: 9092
protocol: TCP
targetPort: 9092
4.2.4 连贯应用
实现以上步骤后,就能够连贯了,如下:
配置后连贯胜利。
5 总结
至此,咱们一步步从 jar
包到部署 H2 Database
上Kubernetes
,心愿大家能从整个过程学到一些常识吧。咱们解决了之前装置 Ingress
不反对 TCP
的问题,但始终不是一个太好的计划。如果咱们把连贯数据库的利用都部署在 Kubernetes
上,那就没有必要把 H2 TCP
裸露进来了。
欢送关注微信公众号 <南瓜慢说>,将继续为你更新 …
多读书,多分享;多写作,多整顿。