1.切分
逻辑上的切分,在物理层面使用多库(database)、多表(table)实现切分。
1.1 纵向切分/垂直切分
就是把原来存储在一个库的数据存储在多个库上
由于数据库的读写都是对同一个库进行操作,所以单库并不能解决大规模并发写入的问题。
例如:我们会建立定义数据库 workDB、商品数据库 payDB、用户数据库 userDB、日志数据库 logDB 等。
优点:
减少增量数据写入时的锁对查询的影响。
由于单表数量下降,常见的查询操作由于减少了需要扫描的记录,使得单表单次查询所需检索的行数变少,减少了磁盘IO、时延变短。
缺点:
无法解决单表数据量太大的问题。
1.2 横向切分/水平切分
把原本存储于一个表的数据分块存储到多个表上
当一个表中的数据量过大时,我们可以把该表的数据按照某种规则,进行划分,然后存储到多个结构相同的表上。
例如:我们 userDB 中的 userTable 中数据量很大,那么可以把 userDB 切分为结构相同的多个 userDB:part0DB、part1DB 等,再将 userDB 上的 userTable,切分为很多 userTable:userTable0、userTable1 等,然后将这些表按照一定的规则存储到多个 userDB 上。
优点:
单表的并发能力提高了,磁盘的I/O性能也提高了
如果出现高并发的话,总表可以根据不同的查询,将并发压力发到不同的小表里。
缺点:
无法实现表连接查询
2.逻辑库-Schema
MyCat中定义的database是逻辑上存在的,但物理上是不存在的。
主要是针对纵向切分提供的概念。
3.逻辑表-Table
MyCat中定义的table,是逻辑上存在,物理上不存在的
主要是针对横向切分提供的概念
4.默认端口
MySql:3306
MyCat:8066
Tomcat:8080
Oracle:1521
nginx:80
http:协议默认端口80
redis:6379
5.数据主机-DataHost
物理MySql存放的主机地址,可以使用主机名,IP,域名定义。
6.数据节点-DataNode
配置物理的database。数据保存的物理节点就是database
7.分片规则
当控制数据的时候,如何访问物理database和table?
就是访问dataHost和dataNode的算法
在Mysql处理CRUD时,如何访问datahost和datanode的算法?如:哈希算法,crc32算法等。
github太慢直接网盘下就行,版本是1.6
链接: https://pan.baidu.com/s/1QQyIUj_Y03Ctpo22yIuNxA 密码: 3arv
解压
tar -zxvf Mycat-server-1.6.7.1-linux.tar.gz
移动到/usr/local目录下
mv mycat /usr/local
进入/usr/local/mycat 目录
cd /usr/local/mycat
ll
查看目录内容
bin:命令文件
catlet:空的,扩展
conf:配置文件(server.xml,schema.xml,rule.xml等)
schema.xml:定义逻辑库,表、分片节点等内容
rule.xml:定义分片规则
server.xml:定义用户以及系统相关变量,如端口等
lib:依赖的jar包
cd /usr/local/mycat/conf
<mycat:schema xmlns:mycat="http://io.mycat/">
<schema name="mydatabase" checkSQLschema="true" sqlMaxLimit="100">
<table name="t_user" dataNode="dn1,dn2,dn3" primaryKey="id" rule="auto-sharding-long">
<childTable name="t_loginlog" primaryKey="id" joinKey="user_id" parentKey="id">childTable>
table>
<table name="t_student" dataNode="dn1,dn3" primaryKey="id" rule="student_id" />
<table name="t_dictionaries" dataNode="dn1,dn2,dn3" type="global" />
<table name="t_teacher" dataNode="dn1" />
schema>
<dataNode name="dn1" dataHost="dtHost1" database="db1" />
<dataNode name="dn2" dataHost="dtHost1" database="db2" />
<dataNode name="dn3" dataHost="dtHost2" database="db3" />
<dataHost name="dtHost1" maxCon="1000" minCon="10" balance="1"
writeType="0" dbType="mysql" dbDriver="native" switchType="1" slaveThreshold="100">
<heartbeat>select user()heartbeat>
<writeHost host="127.0.0.1" url="192.168.199.11:3306" user="root" password="123456">
<readHost host="127.0.0.1" url="192.168.199.12:3306" user="root" password="123456" />
writeHost>
dataHost>
<dataHost name="dtHost2" maxCon="1000" minCon="10" balance="1"
writeType="0" dbType="mysql" dbDriver="native" switchType="1" slaveThreshold="100">
<heartbeat>select user()heartbeat>
<writeHost host="127.0.0.1" url="192.168.199.13:3306" user="root" password="123456">
<readHost host="127.0.0.1" url="192.168.199.13:3306" user="root" password="123456" />
writeHost>
dataHost>
mycat:schema>
<mycat:server xmlns:mycat="http://io.mycat/">
<system>
<property name="serverPort">8066property>
<property name="nonePasswordLogin">0property>
<property name="useHandshakeV10">1property>
<property name="useSqlStat">0property>
<property name="useGlobleTableCheck">0property>
<property name="sequnceHandlerType">2property>
<property name="subqueryRelationshipCheck">falseproperty>
<property name="processorBufferPoolType">0property>
<property name="handleDistributedTransactions">0property>
<property name="useOffHeapForMerge">1property>
<property name="memoryPageSize">64kproperty>
<property name="spillsFileBufferSize">1kproperty>
<property name="useStreamOutput">0property>
<property name="systemReserveMemorySize">384mproperty>
<property name="useZKSwitch">falseproperty>
<property name="strictTxIsolation">falseproperty>
<property name="useZKSwitch">trueproperty>
system>
<firewall>
<whitehost>
<host host="192.*" user="mycat"/>
<host host="127.*" user="mycat"/>
whitehost>
<blacklist check="false">
blacklist>
firewall>
<user name="mycat" defaultAccount="true">
<property name="password">123456property>
<property name="schemas">mydatabaseproperty>
user>
mycat:server>
安装java-jdk:https://blog.csdn.net/qq_42094345/article/details/106954139
成功会有提示【successfully】
MyCAT Server startup successfully. see logs in logs/mycat.log
mysql -umycat -p123456 -h 192.168.0.103 -P 8066