==写在开始
MySQL 集群+读写分离方案有多种选择,可参考 浅谈MySQL集群高可用架构 ,
这里选择的是使用MySQL官方的MySQL Cluster方案==
一、MySQL Cluster 集群配置简介
服务器
Cluster角色
系统角色
192.168.2.150
管理节点
无
192.168.2.151
数据节点(NDBD) & SQL节点(mysqld api)
写服务
192.168.2.152
数据节点(NDBD) & SQL节点(mysqld api)
读服务
为了测试需要,因此在2.151 & 2.152上分别搭建了cluster中的数据节点(ndbd节点服务)和SQL节点(mysqld服务),如果条件允许可以做出以下类似配置
集群中角色 系统中角色
服务器 | Cluster角色 | 系统角色
---|--- | ---
192.168.2.150 | 管理节点 | 无
192.168.2.151 | SQL节点(mysqld api) | 写服务
192.168.2.152 | SQL节点(mysqld api) | 读服务
192.168.2.153 | 数据节点(NDBD) | 无
192.168.2.154 | 数据节点(NDBD) | 无
二、项目使用的持久层
在SpringBoot项目上持久层使用的是Spring-Data-JPA,连接的数据库是一个MySQL Cluster搭建的集群环境;
其中
jdbc:mysql://192.168.2.151:3306/fake-store?useSSL=false&useUnicode=yes&characterEncoding=utf-8
连接的SQL节点用作写服务,
jdbc:mysql://192.168.2.152:3306/fake-store?useSSL=false&useUnicode=yes&characterEncoding=utf-8
连接的SQL节点用作读服务。
三、相关关键字
AOP拦截动态切换数据源、AbstractRoutingDataSource、
Spring支持的数据源路由,JPA 作为持久化框架相关的EntityManager、EntityManagerFactory、JpaTransactionManager
四、定义一个数据源类型和数据源上下文工具类
数据源类型用于标示数据源类型及作用
public enum DataSourceType {
WRITE("write", "写库"), READ("read", "读库");
String type;
String name;
DataSourceType(String type, String name) {
this.type = type;
this.name = name;
}
public String getName() {
return name;
}
public String getType() {
return type;
}
}
数据源上下文工具用于将数据源类型绑定到线程并指示AbstractRoutingDataSource进行数据源切换;
public class DataSourceContextHolder {