https://blog.csdn.net/boonya/article/details/76039070
public PhysicalDatasource
getSource() {
switch (writeType) {
case WRITE_ONLYONE_NODE: { //不区分,返回当前的,当前挂了,返回下一个
return writeSources[activedIndex];
}
case WRITE_RANDOM_NODE: { // 写操作随机发送,
int index = Math.abs(wnrandom.nextInt()) % writeSources.length;
PhysicalDatasource result = writeSources[index];
if (!this.isAlive(result)) { //当前是死的,找所有活着的,在其中随机找个
// find all live nodes
ArrayList<Integer> alives = new ArrayList<Integer>(writeSources.length - 1);
for (int i = 0; i < writeSources.length; i++) {
if (i != index) {
if (this.isAlive(writeSources[i])) {
alives.add(i);
}
}
}
if (alives.isEmpty()) {
result = writeSources[0];
} else {
// random select one
index = Math.abs(wnrandom.nextInt()) % alives.size();
result = writeSources[alives.get(index)];
}
}
if (LOGGER.isDebugEnabled()) {
LOGGER.debug("select write source " + result.getName()
+ " for dataHost:" + this.getHostName());
}
return result;
}
default: {
throw new java.lang.IllegalArgumentException("writeType is "
+ writeType + " ,so can't return one write datasource ");
}
}
}
switch 属性:
1 表示不自动切换
2 基于mysql 主从状态决定是否切换
show slave status
3 基于mysql galary cluster 的切换机制(适合集群)
show status like 'wsrep%'
主要通过设置 activedIndex 来达到切换目的
/**
* 主从切换
*/
public boolean switchSource(int newIndex, boolean isAlarm, String reason) {
//如果write_type 不是0 ,直接返回
if (this.writeType != PhysicalDBPool.WRITE_ONLYONE_NODE || !checkIndex(newIndex)) {
return false;
}
final ReentrantLock lock = this.switchLock;
lock.lock();
try {
int current = activedIndex;
if (current != newIndex) {
// switch index
activedIndex = newIndex;
// init again 初始化数据库连接
this.init(activedIndex);
// clear all connections
this.getSources()[current].clearCons("switch datasource");
// write log
LOGGER.warn(switchMessage(current, newIndex, false, reason));
return true;
}
} finally {
lock.unlock();
}
return false;
}
/*
*
* 初始化当前的dataSource
*/
public void init(int index) {
//检查是否合法的index
if (!checkIndex(index)) {
index = 0;
}
int active = -1;
for (int i = 0; i < writeSources.length; i++) {
int j = loop(i + index);
//初始化数据库连接,由于是新切换的需要初始化 配置中的min个数据库连接
if (initSource(j, writeSources[j])) {
//不切换-1时,如果主写挂了 不允许切换过去
if(dataHostConfig.getSwitchType()==DataHostConfig.NOT_SWITCH_DS&&j>0)
{
break;
}
active = j;
activedIndex = active;
initSuccess = true;
LOGGER.info(getMessage(active, " init success"));
//保存记录到文件中
if (this.writeType == WRITE_ONLYONE_NODE) {
// only init one write datasource
MycatServer.getInstance().saveDataHostIndex(hostName, activedIndex);
break;
}
}
}
if (!checkIndex(active)) {
initSuccess = false;
StringBuilder s = new StringBuilder();
s.append(Alarms.DEFAULT).append(hostName).append(" init failure");
LOGGER.error(s.toString());
}
}
相关推荐
Mycat源码分析Mycat源码分析Mycat源码分析Mycat源码分析Mycat源码分析
MyCat支持双主多从,如果有N个主,那么就配置N个writeHost兄弟节点;如果有M个从节点,那么就配置M个readHost节点即可。 注: 需要注意mycat数据节点dataNode配置的database物理数据库名,要与mysql主从复制中master...
windows下mysql主备双向复制与mycat负载均衡windows下mysql主备双向复制与mycat负载均衡
第9课 Mycat案例分析 Mycat线上案例分析 第10课 MySQL 优化 MySQL通用调优 MySQL 主键问题 MySQL字段类型问题 MySQL Cache问题 MySQL常见误区 第11课 Mycat eye Mycat eye的规划方向 Mycat eye功能介绍 ...
mycat 资源mycat 资源mycat 资源mycat 资源mycat 资源mycat 资源mycat 资源mycat 资源mycat 资源mycat 资源mycat 资源mycat 资源mycat 资源mycat 资源mycat 资源mycat 资源mycat 资源mycat 资源mycat 资源mycat 资源...
第7课 Mycat高可用方案 读写分离机制 集群机制 高可靠性的几种生产方案 第8课 Mycat项目实施方案 Mycat较佳实践 Mycat项目改造路线 Mycat数据扩容与迁移 第9课 Mycat案例分析 Mycat线上案例分析 第10课 MySQL 优化 ...
测试数据如下: 第一组163264128MyCat 1台 QPS12625.512373.634076.246335.3MyCat 1台 TPS4591.094
MySQL DBA必备的mycat性能测试案例
MYCAT.zip MYCAT.zip MYCAT.zip
Mycat发展到目前版本,已经不在是一个单纯的MySQL代理了,它的后端可以支持MySQL、SQL Server、Oracle、DB2、PostgreSQL等主流数据库,也支持MongoDB这种新型NOSQL方式的存储...MYCAT-WEB是监控MYCAT和分析问题的工具。
MyCAT是一款由阿里Cobar演变而来...MyCAT原理MyCAT主要是通过对SQL的拦截,然后经过一定规则的分片解析、路由分析、读写分离分析、缓存分析等,然后将SQL发给后端真实的数据块,并将返回的结果做适当处理返回给客户端。
它是一个开源的分布式...将一些计算分析后的数据灌入到 Hadoop 中,并能用 Mycat+Storm/Spark Stream 引擎做大规模数据分析,看 到这里,你大概明白了,Mycat 是什么?Mycat 就是 BigSQL,Big Data On SQL Database。
Mycat资料
Mycat的原理中最重要的一个动词是“拦截”,它拦截了用户发送过来的SQL语句,首先对SQL语句做了一些特定的分析:如分 片分析、路由分析、读写分离分析、缓存分析等,然后将此SQL发往后端的真实数据库,并将返回的...
mycat mycat mycat mycat mycat中间件 mycat中间件 mycat中间件
mycat linux版的中间件,mysql分库分表、读写分离,
mycat的安装与测试,mycat在服务器上的安装方式等,还有分片的一些介绍
Mycat性能调优指南 各个部分的调优方式和经验参数 MyCAT 性能调优指南 JVM调优: 内存占用分两部分:java堆内存
mycat zk
分布式数据库架构及企业实践-基于Mycat中间件【高清版本】这是个压缩包,里面是个pdf文件,详细的介绍了mycat中间件的使用方法。...第 7 章 Mycat 核心技术分析 241 第 8 章 Mycat多数据库支持原理与实现 275