【Mycat1.6之三大配置文件加载源码阅读】

一、三大配置文件介绍

1)rule.xml 片键规则函数映射

2)schema.xml 数据库节点主机映射

3)server.xml  全局参数配置(用户/防火墙/内存/端口等配置)

 

二、三大配置文件加载过程

1)启动类MycatStartup部分代码
MycatStartup {
    private static final String dateFormat = "yyyy-MM-dd HH:mm:ss";
    private static final Logger LOGGER = LoggerFactory.getLogger(MycatStartup.class);
    public static void main(String[] args) {
        //use zk ?
    	//使用单例模式加静态代码块加载/myid.properties配置文件
    	//如果配置文件中loadZk取值为true则会调用ZktoXmlMain类的loadZktoFile方法,
    	// 否则不使用ZK,这段代码小刘的注释写的很漂亮,值得学习和表扬
        ZkConfig.getInstance().initZk();
        
		//检查是否设置SystemConfig中的SYS_HOME = "MYCAT_HOME"变量值
		String home = SystemConfig.getHomePath();
		if (home == null) {
			System.out.println(SystemConfig.SYS_HOME + "  is not set.");
			System.exit(-1);
		}
		// init
		//使用单例模式初始化配置文件为启动做准备:读取配置文件和启用scheduler调度器,
		//	其中配置文件的加载使用的是java中的w3c的DocumentBuilderFactory-->DocumentBuilder,
		//这种代码比较底层。 dom  sax  dom4j的区别呢?此处没有用dom4j,估计是考虑到dtd验证问题
		MycatServer server = MycatServer.getInstance();

}

2)MycatServer类
private MycatServer() {	
	//读取文件配置,配置文件加载入口
	this.config = new MycatConfig();
}

3)MycatConfig类
public MycatConfig() {
	//读取schema.xml,rule.xml和server.xml
	ConfigInitializer confInit = new ConfigInitializer(true);
	this.system = confInit.getSystem();
	this.users = confInit.getUsers();
	this.schemas = confInit.getSchemas();
	this.dataHosts = confInit.getDataHosts();

	this.dataNodes = confInit.getDataNodes();
	for (PhysicalDBPool dbPool : dataHosts.values()) {
		dbPool.setSchemas(getDataNodeSchemasOfDataHost(dbPool.getHostName()));
	}
	
	this.firewall = confInit.getFirewall();
	this.cluster = confInit.getCluster();
		
		 
}

4)ConfigInitializer类
public ConfigInitializer(boolean loadDataHost) {
		//读取rule.xml和schema.xml
		SchemaLoader schemaLoader = new XMLSchemaLoader();
		
		//读取server.xml
		XMLConfigLoader configLoader = new XMLConfigLoader(schemaLoader);
		
		schemaLoader = null;
		
		//加载配置
		this.system = configLoader.getSystemConfig();
		this.users = configLoader.getUserConfigs();
		this.schemas = configLoader.getSchemaConfigs();
		
		//是否重新加载DataHost和对应的DataNode
		if (loadDataHost) {
			this.dataHosts = initDataHosts(configLoader);
			this.dataNodes = initDataNodes(configLoader);
		}
		
		//权限管理
		this.firewall = configLoader.getFirewallConfig();
		this.cluster = initCobarCluster(configLoader);
		
		//不同类型的全局序列处理器的配置加载
		if (system.getSequnceHandlerType() == SystemConfig.SEQUENCEHANDLER_MYSQLDB) {
			IncrSequenceMySQLHandler.getInstance().load();
		}
		
		if (system.getSequnceHandlerType() == SystemConfig.SEQUENCEHANDLER_LOCAL_TIME) {
			IncrSequenceTimeHandler.getInstance().load();
		}
		
		if (system.getSequnceHandlerType() == SystemConfig.SEQUENCEHANDLER_ZK_DISTRIBUTED) {
			DistributedSequenceHandler.getInstance(system).load();
		}
		
		if (system.getSequnceHandlerType() == SystemConfig.SEQUENCEHANDLER_ZK_GLOBAL_INCREMENT) {
			IncrSequenceZKHandler.getInstance().load();
		}
		
		/**
		 * 配置文件初始化, 自检
		 */
		this.selfChecking0();
	}
5)XMLSchemaLoader类	
     public XMLSchemaLoader() {
	this(null, null);
      }
	
	
      public XMLSchemaLoader(String schemaFile, String ruleFile) {
		//先读取rule.xml
		XMLRuleLoader ruleLoader = new XMLRuleLoader(ruleFile);
		//将tableRules拿出,用于这里加载Schema做rule有效判断,以及之后的分片路由计算
		this.tableRules = ruleLoader.getTableRules();
		//释放ruleLoader
		ruleLoader = null;
		this.dataHosts = new HashMap<String, DataHostConfig>();
		this.dataNodes = new HashMap<String, DataNodeConfig>();
		this.schemas = new HashMap<String, SchemaConfig>();
		//读取加载schema配置
	this.load(DEFAULT_DTD, schemaFile == null ? DEFAULT_XML : schemaFile);
	}

	
	//读取schema配置,加载【dataHosts/dataNodes/schemas】
	private void load(String dtdFile, String xmlFile) {
		InputStream dtd = null;
		InputStream xml = null;
		dtd = XMLSchemaLoader.class.getResourceAsStream(dtdFile);
		xml = XMLSchemaLoader.class.getResourceAsStream(xmlFile);
		Element root = ConfigUtil.getDocument(dtd, xml).getDocumentElement();
		//先加载所有的DataHost
		loadDataHosts(root);
		//再加载所有的DataNode
		loadDataNodes(root);
		//最后加载所有的Schema
		loadSchemas(root);
	} 
6)XMLSchemaLoader类
	public XMLRuleLoader(String ruleFile) {
		// this.rules = new HashSet();
		//rule名 -> rule
		this.tableRules = new HashMap<String, TableRuleConfig>();
		//function名 -> 具体分片算法
		this.functions = new HashMap<String, AbstractPartitionAlgorithm>();
		load(DEFAULT_DTD, ruleFile == null ? DEFAULT_XML : ruleFile);
	}
	
7)XMLConfigLoader
	public XMLConfigLoader(SchemaLoader schemaLoader) {
            XMLServerLoader serverLoader = new XMLServerLoader();
            //下面四个个属性【system/users/firewall/cluster】来自Server.xml文件
	    this.system = serverLoader.getSystem();
            this.users = serverLoader.getUsers();
            this.firewall = serverLoader.getFirewall();
            this.cluster = serverLoader.getCluster();
	    //下面三个属性【dataHosts/dataNodes/schemas】来自schema文件
            this.dataHosts = schemaLoader.getDataHosts();
            this.dataNodes = schemaLoader.getDataNodes();
            this.schemas = schemaLoader.getSchemas();
        schemaLoader = null;
    }
8)XMLServerLoader
    public XMLServerLoader() {
        this.system = new SystemConfig();
        this.users = new HashMap<String, UserConfig>();
        this.firewall = new FirewallConfig();
	//加载函数
        this.load();
    }
	
	//读取server.xml配置,加载【system/users/cluster/firewall】
	private void load() {
               InputStream dtd = null;
               InputStream xml = null;
		dtd = XMLServerLoader.class.getResourceAsStream("/server.dtd");
		xml = XMLServerLoader.class.getResourceAsStream("/server.xml");
		Element root = ConfigUtil.getDocument(dtd, xml).getDocumentElement();
		
		//加载System标签
		loadSystem(root);
		
		//加载User标签
		loadUsers(root);
		
		//加载集群配置
		this.cluster = new ClusterConfig(root, system.getServerPort());
		
		//加载全局SQL防火墙
		loadFirewall(root);
        
	}

三、总结概括

1)先读取rule.xml

     XMLRuleLoader ruleLoader = new XMLRuleLoader(ruleFile);

    //将tableRules拿出,用于这里加载Schema做rule有效判断,以及之后的分片路由计算 

 

2)读取加载schema配置

     //先加载所有的DataHost

      loadDataHosts(root);

     //再加载所有的DataNode

     loadDataNodes(root);

     //最后加载所有的Schema

     loadSchemas(root);

 

3)读取server.xml

        //加载System标签

        loadSystem(root);

        //加载User标签

        loadUsers(root);

        //加载集群配置

       this.cluster = new ClusterConfig(root, system.getServerPort());

       //加载全局SQL防火墙

       loadFirewall(root);

 

概括起来一句话:134(一个规则/三大schema产出:DataHost/DataNode/Schema和四大Server:System/User/cluster/loadFirewall)即7+1

 

 

原创不易,欢迎打赏,请认准正确地址,谨防假冒



 

 

 


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Mycat关键特性 关键特性 支持SQL92标准 支持MySQL、Oracle、DB2、SQL Server、PostgreSQL等DB的常见SQL语法 遵守Mysql原生协议,跨语言,跨平台,跨数据库的通用中间件代理。 基于心跳的自动故障切换,支持读写分离,支持MySQL主从,以及galera cluster集群。 支持Galera for MySQL集群,Percona Cluster或者MariaDB cluster 基于Nio实现,有效管理线程,解决高并发问题。 支持数据的多片自动路由与聚合,支持sum,count,max等常用的聚合函数,支持跨库分页。 支持单库内部任意join,支持跨库2表join,甚至基于caltlet的多表join。 支持通过全局表,ER关系的分片策略,实现了高效的多表join查询。 支持多租户方案。 支持分布式事务(弱xa)。 支持XA分布式事务(1.6.5)。 支持全局序列号,解决分布式下的主键生成问题。 分片规则丰富,插件化开发,易于扩展。 强大的web,命令行监控。 支持前端作为MySQL通用代理,后端JDBC方式支持Oracle、DB2、SQL Server 、 mongodb 、巨杉。 支持密码加密 支持服务降级 支持IP白名单 支持SQL黑名单、sql注入攻击拦截 支持prepare预编译指令(1.6) 支持非堆内存(Direct Memory)聚合计算(1.6) 支持PostgreSQL的native协议(1.6) 支持mysql和oracle存储过程,out参数、多结果集返回(1.6) 支持zookeeper协调主从切换、zk序列、配置zk化(1.6) 支持库内分表(1.6) 集群基于ZooKeeper管理,在线升级,扩容,智能优化,大数据处理(2.0开发版)。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值