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是基于Java开发的,它可以将一个大型数据库逻辑上切割成多个数据库实例,实现数据的自动分片,提供读写分离、故障切换等功能。这对于处理大规模数据和高并发请求的Web应用来说非常有用。 2. **mycat性能测试...
- **故障切换**:Mycat 支持基于心跳检测的自动故障切换,能够及时检测到数据库实例的故障,并进行主备切换,保障服务的连续性。 #### 三、Mycat 实践案例 在实际部署中,Mycat 的使用场景非常广泛,下面以一个...
书中会阐述如何搭建MyCat集群,实现主备切换和负载均衡,确保服务的连续性和稳定性。此外,还会涉及故障检测和恢复机制,使系统在出现问题时能快速自我修复。 在管理和监控方面,《MyCat权威指南》会介绍MyCat的...
4. 高可用性:Mycat具有主备切换和故障恢复机制,确保服务的连续性。 5. SQL兼容:支持大部分MySQL的SQL语法,提供与MySQL一致的使用体验。 三、Mycat服务器安装与配置 1. 解压:使用tar命令解压Mycat-server-1.6....
2.3. **架构分析**:Mycat采用主备结构,包含Server节点和管理节点。Server节点负责处理SQL路由和数据分发,管理节点用于监控和配置管理。此外,Mycat支持多租户,能为不同业务提供隔离的运行环境。 ### 3. 基本...
5. 高可用:提供主备切换、故障自动恢复等功能,保证服务连续性。 二、Mycat配置 1. schema.xml:这是Mycat的核心配置文件,定义了数据库逻辑结构,包括数据节点(DataNode)、表的分片规则等。 2. server.xml:...
Mycat集群中的Server节点可以设置为主备模式,当主节点故障时,备节点能够自动接管服务,实现平滑的故障切换。同时,Mycat还具备心跳检测和自动恢复机制,保证系统的稳定运行。 七、扩展性 Mycat的设计使其易于...
Mycat 是一个开源的分布式数据库系统,是基于 MySQL 协议的中间件,支持数据库的读写分离、分库分表、主备切换等功能。Mycat 作为数据库中间件,能够无缝连接 MySQL,实现对分布式数据库的管理和操作,为大规模的...
MyCat - 集群 - keepalived启动及haproxy的高可用测试.avi`将带你理解keepalived的作用,它是实现高可用的关键组件,可以监控和切换MyCat的主备节点。 7. **keepalived作用及流程**:`07. MyCat - 集群 - ...
在故障转移和高可用性方面,Mycat提供了集群部署方案,当某个节点出现故障时,系统能够自动切换到其他节点,保证服务不中断。这部分内容将帮助你理解Mycat的集群部署策略和故障恢复机制。 安全性也是Mycat关注的...
同时,Keepalived和HAProxy的配置也很关键,它们能保证主备切换的平滑进行,以及负载的均衡分配。Keepalived会监控Mycat的服务状态,一旦主节点失效,会自动切换到备用节点。而HAProxy则负责接收客户端请求,根据...
在Keepalived的配置文件中,需要指定主备服务器及心跳检测机制。 4. **测试与监控**:搭建完成后,需要进行充分的测试,确保在单个组件故障时能正常切换。同时,建立监控系统,监控各个组件的运行状态,以便及时...
同时,通过配置备库,实现故障切换,确保服务高可用。 3. 配置文件详解:熟悉`mycat.conf`和`schema.xml`等配置文件,能够帮助我们定制化Mycat的行为,满足特定业务需求。 4. 性能优化:理解SQL执行原理,优化SQL...
首先,将单一MySQL数据库扩展为一主一备,通过原生的复制机制实现双向复制,再利用Mycat作为代理,实现读写负载均衡。当主库发生故障时,Mycat能自动切换到备用数据库,确保业务连续性。在代码层面,只需修改数据库...
例如,使用主备模式或分布式复制保持数据安全,利用健康检查和监控系统及时发现并处理故障。 7. **CDN内容分发网络**:为了提高用户访问速度,大型网站通常会使用CDN服务,将静态资源分发到全球各地的边缘节点,...
- **数据库主备及高可用**:实现数据库的主备切换和高可用架构。 **7.10 性能调优专题-JVM调优** - **JVM原理剖析**:深入了解JVM的内部工作原理。 - **jvm内存模型及垃圾回收器的分析**:掌握JVM的内存管理和垃圾...
2. **MyCAT**: MyCAT(前身是Maatkit)是一个开源的数据库中间件,具有数据库分片、读写分离、主备切换等功能。MyCAT在Java环境下运行,支持多种数据库协议,适用于大数据和高并发场景。 3. **Apache Helix**: 虽然...
跨数据中心级灾备双活功能验证方法论则是为了确保在灾难发生时,数据库能迅速切换到备份中心,保持业务连续性。这对于金融、电信等对数据安全要求极高的行业至关重要。文件提供了不同类型的容灾双活方案,分析了其...
例如,使用主备模式、集群模式,以及健康检查和自动恢复机制。 10. **优化数据库查询**:SQL优化、索引设计、数据库连接池等都是提高数据库性能的关键。如使用explain分析SQL执行计划,避免全表扫描,合理设置索引...