Mycat2从2022-5-8在1.21和1.22上支持会话粘滞,实现上是数据源名字粘滞
会话粘滞特性会把上次写入的数据源记录下来,如果下一次是查询,就会使用上一个数据源查询
该功能默认开启,可以通过下面配置开启关闭
//server.json
{
"server":{
"stickySession": true,
"stickySessionTime":-1
}
}
客户端连接mycat会在内产生一个mycat前端会话(session)
这个session获取集群连接时,会传递要获取主数据源还是从数据源的参数A,mycat会把这个参数A记录下来.
参数A会影响下一次获取主数据源还是从数据源的判断
boolean lastMaster = false;
@Override
public String getDataSourceByTargetName(String targetName, boolean master, ReplicaBalanceType replicaBalanceType) {
String dataSourceByTargetName;
if (lastMaster){
dataSourceByTargetName = this.dataSourceNearness.getDataSourceByTargetName(targetName, true, replicaBalanceType);
}else {
dataSourceByTargetName = this.dataSourceNearness.getDataSourceByTargetName(targetName, master, replicaBalanceType);
}
lastMaster = master;
return dataSourceByTargetName;
}
一般情况下,master=true就是要对主数据源发送修改数据的SQL.
在实际生产中,业务应用是通过HAproxy连接到两个Mycat,所以业务应用连接Mycat的数据源中的连接会有两个Mycat的连接,一旦业务应用把连接归还到连接池,那么下一次获取连接的时候,可能会获取到另外一个mycat的连接,所以这个会话粘滞最好配好在写入操作或者事务后,不要归还连接,马上进行查询才可以有好效果.
另一方面,因为这个会话粘滞会根据上一次状态来影响下一次主从的负载均衡,所以整个负载均衡是偏向主数据源
stickySessionTime
默认值:-1
可选值:整数范围,单位毫秒
当-1的时候,每次指定主数据源的时候,下一次选择数据源一定会选择主数据源
当大于等于0的是,每次指定主数据源的时候,下一次选择数据源,在时间内,会选择主数据源,时间外负载均衡