欢迎光临散文网 会员登陆 & 注册

学习日志 211222 部署自用mysql 并使用java程序连接

2021-12-22 17:44 作者:mayoiwill  | 我要投稿

# 211222

# zookeeper示例

- 同一个集群(此处是sts)可以映射给多个服务

  - 一般是不同端口

  - k8s描述文件中也可以使用command指令指定启动命令

    - 和dockerfile的CMD的优先级?

- 后半部分 略


# 部署自己的mysql集群

- 2个mysql实例 都是主 没有备

- 每个实例给10G硬盘, 500m cpu, 内存?

- 配一个headless 的service (即类型是clusterIP: None)

- 用secret做密码 密码就用 Mysql123

- 用kustomization.yaml技术 目录是 mycluster


## 步骤

- 建目录

- 复制 kustomization.yaml 进目录

- 修改secret, 密码设成Mysql123

- 删除wordpress行

- 复制mysql-deployment.yaml 进目录

- 修改app的label, 改为 mycluster

- mysql的服务名 mycluster-mysql

- pod controller的部分, 把kind改为 StatefulSet

- replicas: 2

- 原strategy部分替换为

  ```

  updateStrategy:

    type: RollingUpdate

  ``` 

- password部分不动

- pvc template

  - 复制一个mysql-persistent-storage段落过来

  - 修改name

  - 删除原pvc的资源申请

- 给statefulset增加serviceName 字段

  - 对应报错

    ```

    error: error validating ".\\mycluster\\": error validating data: ValidationError(StatefulSet.spec): missing required field "serviceName" in io.k8s.api.apps.v1.Stateful

    SetSpec; if you choose to ignore these errors, turn validation off with --validate=false

    ```

  - 理由 hostname依赖于serviceName(和无状态集群不同)

  - 无状态集群的名字是 deployment名字 + rs名字(版本) + podId

- 限制cpu使用 每个mysql实例使用半个cpu

  - 在containers下面增加如下语句

    ```

        resources:

          limits:

            cpu: "0.5"

          requests:

            cpu: "0.5"

    ```

- 重新apply -k


## 校检

- 检查pods

  - mycluster-mysql-0 mycluster-mysql-1

  - 都是Running状态了

- 尝试连接上去

  - 我们的service是headless service 无法从外部访问

  - 也没必要从外部访问 内部pod间使用hostname访问

  - 现在只能 exec -- bash

  - `kubectl exec -ti mycluster-mysql-0 -- bash`

  - 上去执行 mysql -u root -p

  - 密码输入Mysql123

  - 登录成功 mysql正常运行

- 检查用其它pod访问hostname的方式

  - mycluster-mysql-0

  - 尝试用java程序?


## 用Java程序连接上述数据库

- 在两个mysql实例上都使用create database语句建testdb库

  - 使用 -- bash

  - 细节 略

- 给springbootdemo工程增加mysql连接能力

- 直接引入mybatis starter 和 mysql驱动

  ```

        <dependency>

            <groupId>org.mybatis.spring.boot</groupId>

            <artifactId>mybatis-spring-boot-starter</artifactId>

            <version>2.2.0</version>

        </dependency>

        <dependency>

            <groupId>mysql</groupId>

            <artifactId>mysql-connector-java</artifactId>

            <version>8.0.25</version>

        </dependency>

  ``` 

- 编写applications.properties

  ```

  spring.datasource.url=jdbc:mysql://mycluster-mysql-0.mycluster-mysql:3306/testdb?useSSL=false&serverTimezone=UTC

  spring.datasource.username=root

  spring.datasource.password=Mysql123

  management.endpoint.health.show-details=always

  management.health.db.enabled=true

  endpoints.health.enabled=true

  endpoints.health.sensitive=false

  ```

  - spring.datasource相关的三项

  - 注意连接使用的hostname是 mycluster-mysql-0.mycluster-mysql

  - 即hostname.servicename 的格式

  - mybatis starter会自动启动该默认datasource

  - 后4项是要求之前引入过的actuator去输出datasource的健康状态

- 打包更新docker image

- 修改k8s描述文件

  - 使用latest版本的镜像

  - 增加 imagePullPolicy: Always 在container 层

- 访问 actuator 检查 datasource 启动情况 

  - http://192.168.2.15:31000/actuator/health

  - 有 `"db":{"status":"UP" ...`


### Q&A

- Q: mvn package 报错 缺少mysql驱动类

- A: 引入 mysql-connector-java

  - 注意版本 用最新的就完了

- Q: k8s没有更新image版本

- A: 加 imagePullPolicy: Always

- Q: actuator报db启动失败 连接不上

- A: StatefulSet 的内部域名是 `<podname>.<servicename>` 的格式

  - 在本例中为 `mycluster-mysql-0.mycluster-mysql`

  - 不是 `mycluster-mysql-0`

- Q: 如何检查内部DNS解析纪录

- A: `kubectl run -i --tty --image busybox:1.28 dns-test --restart=Never --rm`

  - `nslookup mycluster-mysql-0.mycluster-mysql`

  - exit退出时, 该临时pod会被删除 这种方式很适合用来搞些一次性的事情


学习日志 211222 部署自用mysql 并使用java程序连接的评论 (共 条)

分享到微博请遵守国家法律