一、Mycat1.6之加载Schema的DataNode源码解读
//<dataNode name="dn1" dataHost="localhost1_gaojingsong1" database="scott" /> 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); } //<dataNode name="dn1" dataHost="localhost1_gaojingsong1" database="scott" /> private void loadDataNodes(Element root) { //读取DataNode分支 NodeList list = root.getElementsByTagName("dataNode"); for (int i = 0, n = list.getLength(); i < n; i++) { Element element = (Element) list.item(i); String dnNamePre = element.getAttribute("name"); String databaseStr = element.getAttribute("database"); String host = element.getAttribute("dataHost"); //字符串不为空 if (empty(dnNamePre) || empty(databaseStr) || empty(host)) { throw new ConfigException("dataNode " + dnNamePre + " define error ,attribute can't be empty"); } //dnNames(name),databases(database),hostStrings(dataHost)都可以配置多 个,以',', '$', '-'区分, //但是需要保证database的个数*dataHost的个数=name的个数 //多个dataHost与多个database如果写在一个标签,则每个dataHost拥有所有database //例如: //则为:localhost1拥有dn1$0-75,localhost2也拥有dn1$0-75(对应db$76-151) String[] dnNames = io.mycat.util.SplitUtil.split(dnNamePre, ',', '$', '-'); String[] databases = io.mycat.util.SplitUtil.split(databaseStr, ',', '$', '-'); String[] hostStrings = io.mycat.util.SplitUtil.split(host, ',', '$', '-'); //此处复杂的配置关系请看步骤二实验结果,进行理解 if (dnNames.length > 1 && dnNames.length != databases.length * hostStrings.length) { throw new ConfigException("dataNode " + dnNamePre + " define error ,dnNames.length must be=databases.length*hostStrings.length"); } if (dnNames.length > 1) { List<String[]> mhdList = mergerHostDatabase(hostStrings, databases); for (int k = 0; k < dnNames.length; k++) { String[] hd = mhdList.get(k); String dnName = dnNames[k]; String databaseName = hd[1]; String hostName = hd[0]; createDataNode(dnName, databaseName, hostName); } } else { createDataNode(dnNamePre, databaseStr, host); } } } /** * 匹配DataHost和Database,每个DataHost拥有每个Database名字 * @param hostStrings * @param databases * @return */ private List<String[]> mergerHostDatabase(String[] hostStrings, String[] databases) { List<String[]> mhdList = new ArrayList<>(); for (int i = 0; i < hostStrings.length; i++) { String hostString = hostStrings[i]; for (int i1 = 0; i1 < databases.length; i1++) { String database = databases[i1]; String[] hd = new String[2]; hd[0] = hostString; hd[1] = database; mhdList.add(hd); } } return mhdList; } private void createDataNode(String dnName, String database, String host) { DataNodeConfig conf = new DataNodeConfig(dnName, database, host); if (dataNodes.containsKey(conf.getName())) { throw new ConfigException("dataNode " + conf.getName() + " duplicated!"); } if (!dataHosts.containsKey(host)) { throw new ConfigException("dataNode " + dnName + " reference dataHost:" + host + " not exists!"); } dataHosts.get(host).addDataNode(conf.getName()); dataNodes.put(conf.getName(), conf); } public final class DataNodeConfig { private final String name; private final String database; private final String dataHost; }
二、实验结果验证
结论:
<dataNode name="dn1$0-75" dataHost="localhost$1-10" database="db$0-759" />
name.length must be=databases.length*dataHost.length"
//从A到C地没有直达路径,需要经过B中转,已知从A到B有三条databases路,从B到C有2条dataHost路
//,试问从A到C有几种方案
相关推荐
【Mycat1.6与SQLServer操作案例详解】 Mycat是一款开源的分布式数据库中间件,它在大型分布式系统中扮演着数据库分片的角色,能够有效地解决单个数据库性能瓶颈的问题。Mycat 1.6是其一个重要版本,提供了更稳定、...
【Mycat1.6与Oracle操作案例详解】 在IT行业中,数据库管理是核心部分,尤其是在大型企业级应用中。Mycat是一个开源的分布式数据库中间件,它提供了数据库分片、读写分离、故障切换等功能,适用于高并发、大数据量...
《深入剖析Mycat-Server源码:Eclipse调试与Maven实践》 Mycat,作为一款开源的分布式数据库中间件,广泛应用于大数据环境下的高并发、高性能场景。其核心在于提供数据分片、读写分离以及负载均衡等功能,为大型...
《Mycat从入门到精通之原理与入门、基本功能、配置》教程是针对数据库分片中间件Mycat的一款详尽学习资料。Mycat作为一款开源的分布式数据库系统,广泛应用于大型互联网企业的高并发场景,能有效解决单机数据库无法...
【Mycat操作之分库分表入门】 Mycat是一款开源的分布式数据库中间件,主要功能是实现数据库的水平扩展,通过分库分表来处理大数据量的问题,减轻单机数据库的压力。它支持MySQL协议,可以透明地将一个数据库集群...
安装Mycat通常涉及下载源码、编译、启动服务等步骤。配置文件主要包括server.xml(全局配置)、schema.xml(数据分片规则)、dataNode.xml(DataNode配置)和user.xml(用户权限配置),需要根据实际情况进行详细...
1. **server.xml**:这是Mycat的核心配置文件,定义了Mycat服务器的启动参数、全局配置、数据节点(DataNode)、schema(逻辑库)等信息。例如,`serverPort` 设置Mycat服务端口,`dataNode` 配置数据节点的数据库...
- 修改配置文件:包括server.xml、schema.xml、dataNode.xml等,设定数据分片策略、服务器节点、端口号等。 - 启动Mycat:通过命令行启动Mycat服务。 2. "mycat使用经验分享.docx":这份文档可能包含用户在实际...
Mycat主要由Server模块、Schema模块、DataNode模块和Client模块组成: 1. Server模块:负责接收客户端的请求,处理网络通信,并转发给相应的Schema模块。 2. Schema模块:包含一组DataNode,定义了数据的分片规则和...
8. **配置文件**:MyCat的配置文件(如server.xml、schema.xml、dataNode.xml等)是实现其功能的关键,需要根据实际数据库和业务进行详细配置。 9. **安装与部署**:MyCat的部署涉及到下载、解压、启动等多个步骤,...
3. 编译工具:如GCC,用于编译Mycat源码(如果选择源码安装)。 **三、安装步骤** 1. **下载Mycat**:你可以从Mycat官网或者GitHub仓库下载预编译的二进制包,或者选择源码安装。这里我们假设已经下载了二进制包。...
1. **安装MyCat**: 下载MyCat的安装包,解压后配置相应的配置文件,如`server.xml`、`schema.xml`、`dataNode.xml`等。 2. **数据分片**: 在`schema.xml`中定义数据节点(DataNode)和表切片规则,例如按主键取模...
在Mycat的配置文件`server.xml`中,你需要定义数据节点(DataNode),每个数据节点对应一个实际的数据库实例。此外,还需要配置数据源(DataSource)和规则(Schema)来指导数据的分片策略,比如哈希分片、范围分片...
在这个例子中,源码被上传到了`/usr/local/mycat`目录下,然后通过`ll`命令查看了目录内容。这显示了几个子目录,如`bin`, `catlet`, `conf`, `lib`, `logs`, 以及一个`version.txt`文件。这些目录和文件分别包含...
在描述中提到的是“linux mycat下载资料”,这通常指的是从Mycat的官方网站或者GitHub仓库获取最新的源码或预编译版本。下载完成后,可以通过解压命令(如`tar -zxvf mycat-x.x.x.tar.gz`)解压到指定目录,并进行...