MySQL读写分离一主多从实现
一主多从
实际项目中
一般都是采用一主多从的架构
修改数据源,动态切换数据源
DynamicDataSource
定义动态数据源
import java.lang.reflect.Field;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;
import java.util.concurrent.atomic.AtomicInteger;import javax.sql.DataSource;import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.jdbc.datasource.lookup.AbstractRoutingDataSource;
import org.springframework.util.ReflectionUtils;/*** 定义动态数据源,实现通过集成Spring提供的AbstractRoutingDataSource,只需要实现determineCurrentLookupKey方法即可* * 由于DynamicDataSource是单例的,线程不安全的,所以采用ThreadLocal保证线程安全,由DynamicDataSourceHolder完成。**/
public class DynamicDataSource extends AbstractRoutingDataSource {private static final Logger LOGGER = LoggerFactory.getLogger(DynamicDataSource.class);private Integer slaveCount;// 轮询计数,初始为-1,AtomicInteger是线程安全的private AtomicInteger counter = new AtomicInteger(-1);// 记录读库的keyprivate List<Object> slaveDataSources = new ArrayList<Object>(0);@Overrideprotected Object determineCurrentLookupKey() {// 使用DynamicDataSourceHolder保证线程安全,并且得到当前线程中的数据源keyif (DynamicDataSourceHolder.isMaster()) {Object key = DynamicDataSourceHolder.getDataSourceKey(); if (LOGGER.isDebugEnabled()) {LOGGER.debug("当前DataSource的key为: " + key);}return key;}Object key = getSlaveKey();if (LOGGER.isDebugEnabled()) {LOGGER.debug("当前DataSource的key为: " + key);}return key;}@SuppressWarnings("unchecked")@Overridepublic void afterPropertiesSet() {super.afterPropertiesSet();// 由于父类的resolvedDataSources属性是私有的子类获取不到,需要使用反射获取Field field = ReflectionUtils.findField(AbstractRoutingDataSource.class, "resolvedDataSources");field.setAccessible(true); // 设置可访问try {Map<Object, DataSource> resolvedDataSources = (Map<Object, DataSource>) field.get(this);// 读库的数据量等于数据源总数减去写库的数量this.slaveCount = resolvedDataSources.size() - 1;for (Map.Entry<Object, DataSource> entry : resolvedDataSources.entrySet()) {if (DynamicDataSourceHolder.MASTER.equals(entry.getKey())) {continue;}slaveDataSources.add(entry.getKey());}} catch (Exception e) {LOGGER.error("afterPropertiesSet error! ", e);}}/*** 轮询算法实现* * @return*/public Object getSlaveKey() {// 得到的下标为:0、1、2、3……Integer index = counter.incrementAndGet() % slaveCount;if (counter.get() > 9999) { // 以免超出Integer范围counter.set(-1); // 还原}return slaveDataSources.get(index);}
}
MySQL读写分离一主多从实现相关推荐
- 基于mycat的mysql_基于Mycat中间件的MySQL读写分离
基于Mycat中间件的MySQL读写分离 简述 mycat是国内开源的数据库中间件,可以实现mysql读写分离和主备热切换,容灾,数据分片等功能. 详情:http://www.mycat.io/ 架构 ...
- mysql读写分离 存储过程_MySQL读写分离 · wang-y/Technical-Information Wiki · GitHub
MySQL读写分离 1.主(master)从(slave)服务器上安装mysql; 2.配置步骤 主服务器master 配置: mysql 配置文件添加:(windows: my.ini;linux: ...
- mysql主主备份_MySQL主从备份和主主备份配置+Keepalived+MySQL读写分离
一.MySQL主从备份 为保证数据库的安全和效率,可以使用主从备份,当有写的操作可以在主服务器上操作,操作完之后备份到从服务器上,当有读操作时可以访问从服务器,这样在一定程度上保证了数据库的安全,当主 ...
- 高可用Mysql架构_Mysql主从复制、Mysql双主热备、Mysql双主双从、Mysql读写分离(Mycat中间件)、Mysql分库分表架构(Mycat中间件)的演变...
[Mysql主从复制] 解决的问题 数据分布:比如一共150台机器,分别往电信.网通.移动各放50台,这样无论在哪个网络访问都很快.其次按照地域,比如国内国外,北方南方,这样地域性访问解决了. 负载均 ...
- Mycat分布式数据库架构解决方案--搭建MySQL读写分离环境--一主多从
Mycat分布式数据库架构解决方案--搭建MySQL读写分离环境--一主多从 参考文章: (1)Mycat分布式数据库架构解决方案--搭建MySQL读写分离环境--一主多从 (2)https://ww ...
- mysql备份-a是什么_MySQL主从备份和主主备份配置+Keepalived+MySQL读写分离
一.MYSQL主从备份 为保证数据库的安全和效率,可以使用主从备份,当有写的操作可以在主服务器上操作,操作完之后备份到从服务器上,当有读操作时可以访问从服务器,这样在一定程度上保证了数据库的安全,当主 ...
- MyCat实现MySQL读写分离(双主双从多库)
在数据库集群架构中,主数据库负责处理事务性查询(写入操作),而从数据库只负责处理select查询(读操作),这样可以提高数据库整体读写性能.主数据库另外一个功能就是负责将数据变更同步到从数据库中. 读 ...
- MyCat实现MySQL读写分离(单主单从多库)
在数据库集群架构中,主数据库负责处理事务性查询(写入操作),而从数据库只负责处理select查询(读操作),这样可以提高数据库整体读写性能.主数据库另外一个功能就是负责将数据变更同步到从数据库中. 读 ...
- proxy实现 mysql 读写分离
实现 mysql 读写分离 图解: 环境: iptables 和 selinux 关闭 proxy:test2 172.25.1.2 Master: test3 172.25.1.3 Slave:te ...
最新文章
- “一切都是消息”--iMSF(即时消息服务框架)入门简介
- 大数据2 Hadoop伪分布模式配置部署
- hbase hmaster一会就没了_浅析HBase
- java方法区对象类型_浅谈Java内存区域与对象创建过程
- abap常用系统变量
- ubuntu 查找qt是否安装_Ubuntu Qt 安装教程--快速下载连接(网盘)
- vue中v-show指令的使用之Vue知识点归纳(五)
- 安卓应用安全指南 4.5.1 使用 SQLite 示例代码
- win10电脑一开机提示拒绝访问怎么办
- Flutter之路由系列之Route
- 金蝶K3 SQL报表系列-BOM成本明细表
- ipad上的电子阅读器们
- Duilib控件拖动改变大小
- Vscode tab键使用
- PacketTracer简单使用】
- [译]使用MVI打造响应式APP(三):状态折叠器
- 沐风:如何创造更多的睡后收入?
- [4G5G专题-97]:MAC层- 调度 - 上行调度的原理、过程与算法
- 关于数据治理的读书笔记 - 什么是数据治理?
- 温度测量基于c语言,基于PN结的温度测量系统设计论文(C语言)--189876772.doc