1 前言

H2 Database是一个优秀的数据库,又小又方便,支持内存和文件形式,经常会在测试、POC(proof of concept)或开发环境用到它。在Springboot的许多应用中,也是内置了H2数据库,很常用。接下来我们来一步步把它推上k8s,让它坐上一个不一样的位置。

建议阅读下面文章以帮助理解:

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

jdbc:h2:[file:][]jdbc:h2:~/test jdbc:h2:file:/data/sample jdbc:h2:file:C:/data/sample (Windows only)

jdbc:h2:mem:jdbc:h2:mem:test_mem

jdbc:h2:tcp://[:]/[]jdbc:h2:tcp://localhost/~/test jdbc:h2:tcp://dbserv:8084/~/sample jdbc:h2:tcp://localhost/mem:test

jdbc:h2:ssl://[:]/[]jdbc:h2:ssl://localhost:8085/~/sample;

jdbc:h2:;CIPHER=AES jdbc:h2:ssl://localhost/~/test;CIPHER=AES jdbc:h2:file:~/secure;CIPHER=AES

jdbc:h2:;FILE_LOCK={FILE|SOCKET|NO} jdbc:h2:file:~/private;CIPHER=AES;FILE_LOCK=SOCKET

jdbc:h2:;IFEXISTS=TRUE jdbc:h2:file:~/sample;IFEXISTS=TRUE

jdbc:h2:;INIT=RUNSCRIPT FROM '~/create.sql' jdbc:h2:file:~/sample;INIT=RUNSCRIPT FROM '~/create.sql';RUNSCRIPT FROM '~/populate.sql'

jdbc:h2:[;USER=][;PASSWORD=] jdbc:h2:file:~/sample;USER=sa;PASSWORD=123

jdbc:h2:;TRACE_LEVEL_FILE= jdbc:h2:file:~/sample;TRACE_LEVEL_FILE=3

jdbc:h2:;IGNORE_UNKNOWN_SETTINGS=TRUE

jdbc:h2:;ACCESS_MODE_DATA=rws

jdbc:h2:zip:!/jdbc:h2:zip:~/db.zip!/test

jdbc:h2:;MODE=jdbc:h2:~/test;MODE=MYSQL;DATABASE_TO_LOWER=TRUE

jdbc:h2:;AUTO_RECONNECT=TRUE jdbc:h2:tcp://localhost/~/test;AUTO_RECONNECT=TRUE

jdbc:h2:;AUTO_SERVER=TRUE jdbc:h2:~/test;AUTO_SERVER=TRUE

jdbc:h2:;PAGE_SIZE=512

jdbc:h2:;=[;=...] 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表示:: ::[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暴露出去了。

欢迎关注微信公众号,将持续为你更新...

多读书,多分享;多写作,多整理。

通过ingress连自己MySQL_把H2数据库从jar包部署到Kubernetes,并解决Ingress不支持TCP的问题...相关推荐

  1. Java 技术篇-IntelliJ IDEA 导入数据库驱动jar包实例演示

    本文介绍通过 File 的 Project Structure 来导入驱动. Java 操作数据库可以查看: Java 技术篇-java连接并操作数据库实例演示,执行查询.插入.更新和删除操作 点击 ...

  2. Java web连接数据库实现登录功能 ; jsp连接MySQL或SQL server数据库的jar包也在这里哦!

    [深夜放毒,记录生活^_^]   学了HTML之后 , 一直想写一个能够实现登录功能的小网页 ,终于--现在开始学习数据库,经过查阅资料,创建了很简单的一个java web小项目来实现登陆操作,界面不 ...

  3. ds数据与mysql_比较CCDS数据库和R包内置数据集的差异

    因为昨天看到了TxDb.Hsapiens.UCSC.hg38.knownGene 包来获取基因的坐标及长度跟其它主流数据库有差异,所以今天彻底比较一下TxDb.Hsapiens.UCSC.hg38.k ...

  4. Java嵌入式数据库H2学习总结(二)——在Web应用程序中使用H2数据库

    一.搭建测试环境和项目 1.1.搭建JavaWeb测试项目 创建一个[H2DBTest]JavaWeb项目,找到H2数据库的jar文件,如下图所示: H2数据库就一个jar文件,这个Jar文件里面包含 ...

  5. Java嵌入式数据库H2学习总结(一)——H2数据库入门

    一.H2数据库介绍 常用的开源数据库有:H2,Derby,HSQLDB,MySQL,PostgreSQL.其中H2和HSQLDB类似,十分适合作为嵌入式数据库使用,而其它的数据库大部分都需要安装独立的 ...

  6. H2数据库入门,看这篇就对了

    H2数据库是一个开源的关系型数据库. H2是一个采用java语言编写的嵌入式数据库引擎,只是一个类库(即只有一个 jar 文件),可以直接嵌入到应用项目中,不受平台的限制 应用场景: 可以同应用程序打 ...

  7. H2数据库使用与管理入门

    转自: https://blog.csdn.net/fanpeizhong/article/details/73543260 说明 H2是一个用Java开发的嵌入式数据库,它本身只是一个类库,可以直接 ...

  8. Java单元测试实践-25.在本地使用H2数据库进行单元测试

    Java单元测试实践-00.目录(9万多字文档+700多测试示例) https://blog.csdn.net/a82514921/article/details/107969340 1. 前言 使用 ...

  9. H2 数据库使用简介

    一.前言 H2 是一个用 Java 开发的嵌入式数据库,它本身只是一个类库,即只有一个 jar 文件,可以直接嵌入到应用项目中.H2 主要有如下三个用途: 第一个用途,也是最常使用的用途就在于可以同应 ...

最新文章

  1. python 0o-377 -0o377_Python : 反射
  2. javascript之回调函数小知识
  3. 矢量切片_数据粒度均衡的二维矢量瓦片构建方法
  4. 1、docker容器技术基础入门
  5. Hadoop——分布式资源管理框架YARN总结
  6. docker搭建本地 Registry
  7. 开发环境各个版本的下载
  8. OpenCV : 投影变换
  9. python创建线程_Python 创建线程的方法
  10. (论文加代码)基于deap数据集的脑电情绪识别(二分类改为八分类)
  11. 提取swf素材_网页游戏素材提取工具及提取教程
  12. Avoid passing null as the view root (needed to resolve layout parameters on the inflated layout's ro
  13. Flink On Yarn HA 安装和配置
  14. tableau关于增长率、占比的表计算实践应用
  15. 杰里之AC695N/AC696N 蓝牙耳机PCB LAYOUT 说明【篇3】
  16. 合肥工业大学宣城java实验报告,(合肥工业大学宣城校区JAVA作业问答题.doc
  17. matlab进行动力吸振器设计,干摩擦动力吸振器的MATLAB仿真及其基于频谱分析的优化设计...
  18. Predictable Programming on a Precision Timed Architecture
  19. Android之动画全讲-刘志远-专题视频课程
  20. 重回童年的经典系列☀️|【炸弹人小游戏】制作过程+解析 | 收藏起来跟曾经的小伙伴一起梦回童年!

热门文章

  1. 学习软件测试前景如何?好就业吗?
  2. 数学建模专栏 | 第五篇:MATLAB优化模型求解方法(上):标准模型
  3. JVM(二)类装载子系统
  4. 习题 3.10 根据函数编写一程序,输入x,输出y值
  5. thinkphp整合paypal贝宝支付,及post回调代码
  6. 周易之二十一—噬嗑卦
  7. 【微信聊天记录制作词云】超详细保姆级教学!!!(详细步骤+代码)
  8. rdesktop基本命令
  9. CSDN系统升级公告
  10. 【高效运维篇】如何通过双因子认证保证堡垒机安全访问IT资源