传统的关系型数据库
已经无法满足快速查询与插入数据的需求。
暂时解决了这一危机
它通过降低数据的安全性,减少对事务的支持,减少对复杂查询的支持,来获取性能上的提升。
但是,在有些场合NoSQL一些折衷是无法满足使用场景的,就比如 有些使用场景是绝对要有事务与安全指标的
这个时候NoSQL肯定是无法满足的,所以还是需要使用关系性数据库
什么是数据库分片
业务维度来拆分数据库
运行于一个项目开发
从数据维度 进行数据的拆分
根据某种规则, 分发到 多个
相同结构的数据表中!
注意! 拆分的数据库/表,结构必须一样,不然还怎么分发…垂直模式 水平模式
两种模块的混合就是 混合模式切分Mycat
Cobar
Cobar 的核心功能和优势是 MySQL 数据库分片,此产品曾经广为流传。总结:
Mycat
概念说明:逻辑表上记录着
多个数据节点分片!
通过向逻辑表读写操作, 而操作多个数据节点分片!
就是
数据主机数据库地址!
Mysql / Oracle 具体数据库的地址…本人Windows 为主!
mycat.bat start
8066
mycat.bat stop
在windows上安装mycat执行命令时
运行cmd时以管理员身份运行即可
搭建java环境
wrapper.java.command=G:\java_jdk\jdk\bin\java.exe
提示你需要安装运行环境:
mycat.bat install
本人这里截取本人的一些片段了解…
<!--tableRule 配置一个表分片规则!
name 分片规则名!
-->
<tableRule name="mod-long">
<!-- 根据id列进行规则分配! -->
<rule>
<columns>id</columns>
<algorithm>mod-long</algorithm> <!-- 引用下面Mycat提供的分配规则...官方提供的很多不一一列举了! -->
</rule>
</tableRule>
<!-- Mycat分片规则算法! -->
<function name="murmur"
class="org.opencloudb.route.function.PartitionByMurmurHash">
<property name="seed">0</property><!-- 默认是0 -->
<property name="count">2</property><!-- 要分片的数据库节点数量,必须指定,否则没法分片 -->
<property name="virtualBucketTimes">160</property><!-- 一个实际的数据库节点被映射为这么多虚拟节点,默认是160倍,也就是虚拟节点数是物理节点数的160倍 -->
<!-- <property name="weightMapFile">weightMapFile</property> 节点的权重,没有指定权重的节点默认是1。以properties文件的格式填写,以从0开始到count-1的整数值也就是节点索引为key,以节点权重值为值。所有权重值必须是正整数,否则以1代替 -->
<!-- <property name="bucketMapPath">/etc/mycat/bucketMapPath</property>
用于测试时观察各物理节点与虚拟节点的分布情况,如果指定了这个属性,会把虚拟节点的murmur hash值与物理节点的映射按行输出到这个文件,没有默认值,如果不指定,就不会输出任何东西 -->
</function>
<!-- 本人采用的取模,轮询算法;
根据id 值取模 3;
id 取模值 结果
1 % 3 1 第二个库
2 % 3 2 第三各库
3 % 3 0 第一个库
...........
-->
<function name="mod-long" class="org.opencloudb.route.function.PartitionByMod">
<!-- how many data nodes -->
<property name="count">3</property>
</function>
<!--
schema 声明一个逻辑库
name 逻辑库名称
checkSQLschema 检查sql中有没有schema存在。true(schema.表)
sqlMaxLimit
查询逻辑表中的sql中是否使用limit关键字
如果使用的sql没有指定limit指定会加一条limit,避免海量数据的查询。
如果物理表没有切分库的话,上面的参数就不会起作用。
-->
<schema name="TESTDB" checkSQLschema="false" sqlMaxLimit="100">
<!--
table 声明一个逻辑库: 用于声明数据分片...是 schema的子元素,可以存在多个table
name 逻辑表名称:对应要查询的物理库上的表!
dataNode 指定一个/n个数据节点
rule 分片规则,引用 rule.xml 中定义的分片规则,具体根据那个类,进行什么样的规则进行分片处理!
-->
<table name="WSM" dataNode="dn1,dn2,dn3" rule="mod-long" />
</schema>
<!--
dataNode 配置数据节点
name 节点名
dataHose 指定节点主机,下面声明的!
database 数据库中的库!
-->
<dataNode name="dn1" dataHost="localhost1" database="wsm-mycat1" />
<dataNode name="dn2" dataHost="localhost1" database="wsm-mycat2" />
<dataNode name="dn3" dataHost="localhost1" database="wsm-mycat3" />
<!--
dataHost
一个datahost是一组服务器,构建一个集群环境,对于集群环境会涉及到主/从关系。
对于mysql服务上有1个写入服务器,和多台读取服务器。
主从关系,和读写分离:
主写,从读: 因为读取是经常发生的事情,而写入的操作相对来说并不是很多! 大部分时候是查询的操作要多!
一般主服务器为writeHost,从服务器为readHost
balance 指的负载均衡类型,目前的取值有4种:
balance=“0” 不开启读写分离机制,所有读操作都发送到当前可用的writeHost上
balance=“1” 全部的readHost与闲置 writeHost参与select语句的负载均衡...
balance=“2” 所有读操作都随机的在writeHost、readhost上分发。
balance=“3” 所有读请求随机的分发到wiriterHost对应的readhost执行,writerHost不负担读压力
switchType 指的是切换的模式,目前的取值也有3种
switchType=‘-1’ 表示不自动切换
switchType=‘1’ 表示自动切换
switchType=‘2’ 基于MySQL主从同步的状态决定是否切换,心跳语句为 show slave status
writeType (写服务器可以有多台)指定执行哪一台写服务器
slaveThreshold
主从备份,数据同步的时间间隔
当有两台服务器,都进行读操作, 程序会根据它们上一次读取的时间,分析性能,时间短的性能高, 优先进行读操作!
-->
<dataHost name="localhost1" maxCon="1000" minCon="10" balance="0"
writeType="0" dbType="mysql" dbDriver="native" switchType="1" slaveThreshold="100">
<heartbeat>select user()</heartbeat>
<!--
host 主机名
url 主机地址
user 用户名
password 密码
-->
<writeHost host="hostM1" url="127.0.0.1:3306" user="root" password="ok">
<!-- 集群环境的配置... -->
<!-- <readHost host="hostS1" url="127.0.0.1:3306" user="root" password="ok"> -->
</writeHost>
</dataHost>
<!--
name 登录的用户名
property name="password" 密码!
property name="schemas" 操作的逻辑库!对应schema.xml文件!
-->
<user name="test">
<property name="password">test</property>
<property name="schemas">TESTDB</property>
</user>
三个表结构都要一样!
schema.xml文件进行管理:
schema.xml文件
映射查询到Mysql 对应库上的 表!
mod-long
分片规则进行了,轮询有序的 取模拆分到三个数据库中去!