永久链接: http://gaojingsong.iteye.com/blog/2373935
一、三大配置文件介绍
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
原创不易,欢迎打赏,请认准正确地址,谨防假冒