`
gaojingsong
  • 浏览: 1182593 次
  • 性别: Icon_minigender_1
  • 来自: 深圳
文章分类
社区版块
存档分类
最新评论

【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
3
分享到:
评论

相关推荐

    Mycat1.6源码

    《深入剖析Mycat 1.6源码》 Mycat是一款开源的分布式数据库中间件,它在Java平台上运行,旨在解决大数据分布式存储和处理的问题。Mycat 1.6版本是其一个重要的里程碑,它在前一版本的基础上进行了一系列的优化和...

    【Mycat1.6之操作SQLServer案例】

    【Mycat1.6与SQLServer操作案例详解】 Mycat是一款开源的分布式数据库中间件,它在大型分布式系统中扮演着数据库分片的角色,能够有效地解决单个数据库性能瓶颈的问题。Mycat 1.6是其一个重要版本,提供了更稳定、...

    mycat1.6windows+linux.zip

    mycat1.6windows+linux.zip, 我就很不理解,为什么好多人上传的资料,下载都需要积分。0积分能咋地?官网能访问但是下载不了,后再巧合下在另外一个网站上下载的,我在这里给大家分享下。不需要积分也不需要花钱,...

    Mycat 1.6 稳定版-linux环境 gz包.7z

    在本文中,我们将深入探讨Mycat 1.6稳定版在Linux环境下的安装、配置以及使用方法。 一、Mycat简介 Mycat的核心功能包括数据分片、读写分离和数据库集群管理。数据分片是将大表的数据分散到多个数据库中,以减轻...

    mycat1.6jar包反编译的源码

    《深入解析mycat1.6源码:一次技术探索之旅》 Mycat,作为一款开源的分布式数据库中间件,广泛应用于大型分布式系统中,它实现了数据分片、读写分离、故障切换等功能,为高并发、大数据量的场景提供了优秀的解决...

    mycat1.6.7.5.zip

    在本压缩包"mycat1.6.7.5.zip"中,包含了在Linux环境下安装Mycat 1.6.7.5所需的所有关键组件,尤其是Java Development Kit (JDK) 1.8的安装文件,因为Mycat运行在Java平台上,所以JDK是其运行的前提。 首先,让我们...

    Mycat1.6 安装步骤

    #### 三、Mycat 1.6 的安装步骤 根据文档提供的信息,我们可以按照以下步骤在RHEL服务器上安装Mycat 1.6。 ##### 1. 下载Mycat 首先,访问Mycat官网提供的下载链接:`http://dl.mycat.io/1.6-RELEASE/`,下载最新...

    mycat1.6.7.1.rar

    - 下载:首先从官方渠道或第三方网站获取mycat1.6.7.1的Linux版本压缩包。 - 解压:使用`tar -zxvf MyCat-server-1.6.7.1-release-20190627191042-linux.tar.gz`命令进行解压。 - 配置:进入解压后的目录,编辑...

    Mycat-1.6.7.3.zip

    启动过程中,Mycat会加载`conf`目录下的配置,并监听指定的端口,等待客户端的连接请求。了解如何启动和停止Mycat服务是日常运维的基础技能。 Mycat的核心功能包括: 1. **数据分片**:Mycat支持水平分片和垂直分...

    mycat-1.6.7.6_BYMONTH.zip

    基于MyCat1.6.7.6正式版的源码修改的,支持subTables的按月分表正则配置 subTables=“ tableName_$202101-?” subTableWay="BYMONTH" rule="sharding-by-month" 表示从202101月份开始进行分表处理,?表示当前日期的...

    mycat-server 1.6 源码包 可直接运行

    《深入解析mycat-server 1.6:源码探索与实战指南》 Mycat-Server 1.6 是一个开源的分布式数据库中间件,它主要用于解决大数据环境下高并发、高性能的问题,尤其在分库分表场景下表现卓越。这款源码包的特点是可...

    mycat1.6.7.4

    总的来说,Mycat1.6.7.4是一款强大的数据库中间件,它通过分布式技术解决了大数据量下的存储和处理难题,为企业级应用提供了高效、稳定的数据库解决方案。无论是在电商、社交还是数据分析等领域,Mycat都能发挥其...

    Mycat 1.6权威指南.pdf和1.5的word版

    总的来说,《Mycat 1.6权威指南》和《Mycat 1.5权威指南》是深入了解和掌握Mycat数据库中间件的重要资源,它们详细讲解了Mycat的架构、配置、管理和优化技巧,对于开发、运维人员来说,是必备的学习资料。...

    Mycat-Server-1.6(源码)

    3. **Config模块**:配置管理模块,用于加载和管理Mycat的配置文件,如schema.xml、server.xml等。这些配置文件定义了数据库连接信息、分片规则、服务器设置等。 4. **Heartbeat模块**:心跳检测模块,定期检测...

    linux的Mycat安装包1.6.7.4版本

    3. **配置Mycat**:解压后,你会看到一个名为`mycat`的目录,里面包含了Mycat的配置文件和可执行程序。你需要编辑`conf`目录下的`server.xml`和`schema.xml`文件,配置数据源、分片规则、端口号等信息。这些配置需要...

    MySql 中间件 Mycat 1.6.7.5 - release- win.tar windows 程序

    **安装与配置Mycat 1.6.7.5**: 1. 解压`Mycat-server-1.6.7.5-release-20210616151418-win.tar.gz`,获取Mycat的服务器端程序。 2. 修改`conf/server.xml`配置文件,配置数据库连接信息、分片规则等。 3. 初始化...

    解决mycatJDBC8驱动连接Mycat1.6报错 Unknown system variable 'query_cache_size'

    标题中的问题涉及到的是在使用Mycat数据中间件时,尝试使用JDBC 8驱动连接到Mycat 1.6版本时遇到的一个错误:`Unknown system variable 'query_cache_size'`。这个问题出现的原因在于MySQL 8.0版本中移除了`query_...

    【Mycat1.6之操作Oracle案例】

    【Mycat1.6与Oracle操作案例详解】 在IT行业中,数据库管理是核心部分,尤其是在大型企业级应用中。Mycat是一个开源的分布式数据库中间件,它提供了数据库分片、读写分离、故障切换等功能,适用于高并发、大数据量...

    mycat_linux_1.6_64bit.rar

    【描述】"linux64位mycat1.6二进制包" 提示这个压缩包包含的是为64位Linux操作系统设计的MyCat服务器的可执行文件和其他相关配置文件。在Linux环境下,64位版本的软件能够利用更多的内存,提高性能,适用于处理大...

    mycat1.6jar包

    当mycat的jar包的版本过低时,替换这个可解决问题.

Global site tag (gtag.js) - Google Analytics