JAVA程序实现mysql读写分离并在kubernetes中演示

1 概述

对数据进行读写分离,可以将读流量从主数据库中剥离出来,进一步降低读操作对写操作的影响。读写分离的实现可以有多种方式,例如通过proxySQL、mycat等中间件来实现,也可以在应用进程内实现。本文介绍JAVA程序通过spring框架和mybatis框架对mysql主从集群进行读写分离。

2 程序思路

1)配置文件写入两个或以上的数据源。

2)javax.sql.DataSource是一个接口,实现类org.springframework.jdbc.datasource.lookup.AbstractRoutingDataSource具备一个按照一个字符串key选择一个具体数据源的能力。mybatis框架会自动使用该实现类,只需要在该类增加@Primary。

考虑到取出key是并发的,需要使用到ThreadLocal类。

3)对mapper的方法新增一个切面

4)mapper保持不变即可

3 完整程序git地址

复制代码
https://gitee.com/handsomeboylj/read-write-apart-demo.git

4 部署

4.1 准备一个kubernetes集群

在华为云购买一个集群即可。

4.2 安装helm

复制代码
cd /tmp
wget https://get.helm.sh/helm-v3.16.2-linux-amd64.tar.gz
tar xf helm-v3.16.2-linux-amd64.tar.gz
cd linux-amd64
/bin/cp -f helm /usr/bin/
helm env

helm repo add bitnami https://charts.bitnami.com/bitnami
helm repo update

4.3 通过helm部署mysql 8.0主从集群

由于用于测试,数据库不需要持久化。

数据库root密码是:password,并自动创建名称叫demo的数据库。

复制代码
helm install mysql-ha-demo bitnami/mysql \
--set auth.rootPassword=my-secret-pw \
--set auth.database=demo \
--set auth.replicationUser=repuser \
--set auth.replicationPassword=reppassword \
--set primary.persistence.enabled=false \
--set secondary.persistence.enabled=false \
--set auth.rootPassword=password \
--set architecture=replication

4.4 部署JAVA程序

复制代码
git clone https://gitee.com/handsomeboylj/read-write-apart-demo.git
cd read-write-apart-demo
kubectl apply -f k8s-demo.yaml

JAVA程序的deployment有一个init容器,会对数据库进行初始化,有数据直接可用。

程序的接口如下:

读接口:

复制代码
GET /api/users/1

RESPONSE:
{
  "id": 1,
  "name": "Alice",
  "age": 25
}

写接口:

复制代码
POST /api/users
{"name":"test","age":30}

4.5 Ingress暴露JAVA程序

路由如下:

5 测试

5.1 读接口测试

在浏览器访问ELB的公网地址和接口路径:

JAVA程序中会打印日志:

复制代码
数据库切换成: slave

5.2 写接口测试

复制代码
curl -X POST -H "Content-Type: application/json" -d '{"name":"test","age":20}' http://公网EIP/api/users && echo

可见JAVA程序中会打印日志:

复制代码
数据库切换成: master

6 小结

本文介绍JAVA程序对mysql数据库进行读写分离的思路、代码实现,并且通过部署一套mysql集群和JAVA程序容器来进行实际测试,让人达到直观的效果。

相关推荐
Code_Solitude16 分钟前
c语言:指针(3)+冒泡排序
java·c语言·算法
要开心吖ZSH22 分钟前
《通过SeaTunnel 把 MySQL 的数据搬进 Doris》番外篇:容量、切分与速度——Doris 能扛多少,比 MySQL 快多少
mysql·性能优化·doris·分区·分表·分桶
乌暮27 分钟前
从 `println` 到生产级日志:Spring Boot 日志体系完全指南
java·开发语言·jvm·spring boot·后端·学习·面试
脉动数据行情38 分钟前
Java OkHttp 对接国际期货批量行情 SpringBoot 定时落库实践
java·spring boot·okhttp
Wang's Blog1 小时前
Java 项目实战: 交友项目 - 百度人脸识别:介绍
java·开发语言·交友
一枕槐安4871 小时前
大模型应用后端设计:上下文管理、缓存、降级策略的工程方案总结
java·spring·缓存
T_Apollo1 小时前
2.9 Java 25 版本新增特性和类
java
曦夜日长1 小时前
MySQL系统篇,数据库基础(二):数据库概念、SQL 分类与存储引擎
数据库·sql·mysql
步行cgn1 小时前
@RequestMapping 注解详解
java·后端·spring
鶴哥只手遮天1 小时前
Spring Boot 4.1.1 深度源码解析-第 15 章 · 条件注解体系:全部 `@ConditionalOnXxx` 的实现原理
java·后端·开源