数据库集群常见概念
故障转移
master宕机,自动将备份数据的slave顶替为新的master
读写分离
读和写分离开来
在主节点中可以进行读和写
在从节点中只进行读的逻辑
备份机制
单机备份
单方向的主从复制,只能提供一次性的主从替换
双机热备
双方向的主从复制,可以无限进行主从替换
mycat介绍
中国第一开源数据库中间件
特点
支持超大表的水平扩展,底层进行并行计算(百亿条)
支持高性能的读写分离逻辑
mycat支持多种数据源的整合
oracle,sqlserver,mysql
同类产品
amoeba
早期一个性能较高的数据中间件(停更)
cobar
没有解决后端连接的假死现象
mycat
利用==NIO==实现了后端的非阻塞技术使用,解决了假死
数据库中间件的原理
1.客户端将sql发送到mycat
2.mycat接收到sql
3.计算分片和读写分离的逻辑
4.从计算结果中,指定获取后端一个数据库连接
5.将计算结果过滤清洗,最终发送给后端数据库执行
假死
阻塞线程
从线程接收到任务到任务执行结果中所有过程和进度中,线程都处在繁忙状态
非阻塞
在线程处理任务时,任务不是时刻都繁忙的,所以线程可以利用这种空隙空闲出来处理其他问题--高并发中使用非阻塞的逻辑
非阻塞引入后端连接数据库的技术,极大的提升mycat整体访问的并发效率
安装测试mycat
mycat的运行环境需要2点支持
基于jdk环境运行
基于mysql的命令环境(登录需要mysql命令)
解压tar包
1.
[root@10-9-100-26 software]#
cp /home/resources/Mycat-server-1.5.1-RELEASE-20161130213509-linux.tar.gz ./
2.
[root@10-9-100-26 software]#
tar -xf Mycat-server-1.5.1-RELEASE-20161130213509-linux.tar.gz
文件夹结构
bin
:运行mycat脚本 mycat文件
catlet
:模板插件资源 空
conf
:配置文件目录 server.xml schema.xml rule.xml等
lib
:jar包
logs
:wrapper.log是运行日志
运行mycat
启动mycat
bin文件夹中执行mycat运行命令
#mycat start
:后台运行
#mycat console
:占用控制台运行
登录mycat
[root@10-9-100-26 conf]#
mysql -utest -ptest -h10.9.100.26 -P8066
mycat的测试案例
server.xml
server.xml配置的是mycat的用户信息,配置mycat启动时的各种资源属性配置逻辑,例如端口号,例如缓存大小,例如占用的线程资源等等
举例
<?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE mycat:server SYSTEM "server.dtd"> <mycat:server xmlns:mycat="http://org.opencloudb/"> <system> <property name="defaultSqlParser">druidparser</property> </system> <user name="root"> <property name="password">root</property> <property name="schemas">mstest</property> </user> </mycat:server>
system
所有内容就是mycat软件的属性配置
defaultSqlParser
:默认的sql解析器(实现拦截计算逻辑
<system> <property name="defaultSqlParser">druidparser</property> </system>
user
定义了mycat的登录用户内容
下例的含义:
可以使用user/user登录mycat,只能看到一个数据库TESTDB,并且只读
<user name="user"> <property name="password">user</property> <property name="schemas">TESTDB</property> <property name="readOnly">true</property> </user>
qurantine
定义了mycat使用的防火墙逻辑
ip白名单
sql黑名单
下例含义
IP白名单,定义了127.0.0.1/127.0.0.2,
只有ip满足白名单要求才能登陆mycat
sql黑名单
true:缺省,表示开启可以执行
false:自定义,表示关闭,定义的sql不能执行
将
select *
的所有sql语句定义在黑名单中
<qurantine> <whitehost> <host host="127.0.0.1" user="mycat"/> <host host="127.0.0.2" user="mycat"/> </whitehost> <blackList check="false">selectAllColumnAllow</blackList> ? </qurantine>
schema.xml
定义了当前mycat管理维护的逻辑库,逻辑表,数据分片,计算分片逻辑,后端数据库连接信息等
mycat管理数据的结构
逻辑库
表示一个表格集合的虚拟数据库
用户可见
逻辑表
数据的细粒度体现
一张虚拟库表格可以来自于不同分片的表
也可以是来自于同一分片的表格
举例
<?xml version="1.0"?> <!DOCTYPE mycat:schema SYSTEM "schema.dtd"> <mycat:schema xmlns:mycat="http://org.opencloudb/" > ? <schema name="mstest" checkSQLschema="true" sqlMaxLimit="100"> <!--teacher table--> <table name="teacher" primaryKey="ID" dataNode="dn1"/> </schema> <dataNode name="dn1" dataHost="localhost1" database="mstest" /> <dataHost name="localhost1" maxCon="1000" minCon="10" balance="0" writeType="0" dbType="mysql" dbDriver="native" switchType="1" slaveThreshold="100"> <heartbeat>select user()</heartbeat> <writeHost host="hostM1" url="10.9.100.26:3306" user="root" password="root"/> </dataHost> </mycat:schema>
schema
表示逻辑库,可以配置多个schema标签,每一个schema表示一个逻辑库
属性
name
:逻辑库名称
checkSQLschema
:客户端调用sql语句是否对表名自动匹配
sqlMaxLimit
:分页查询,防止一次性查询大量数据
<schema name="mstest" checkSQLschema="true" sqlMaxLimit="100"> </schema>
table
逻辑表名称,表示当前逻辑库的一张逻辑表
属性
name
: 逻辑表名称
primaryKey
:定义逻辑表中的主键,默认为Id
dataNode
:定义的是dataNode的名称,用来计算分片,不分片只需要配置一个dataNode
rule
:调用rule.xml中一个计算分片的具体方法,默认hash一致性
<schema name="mstest" checkSQLschema="true" sqlMaxLimit="100"> <table name="teacher" primaryKey="ID" dataNode="dn1"/> </schema>
dataNode
mycat中实现连接后端数据库,计算分片逻辑的中间标签
属性
name
:分片名称
dataHost
:关联一个dataHost标签使用
database
:当前分片使用的后端数据库==真实名称==
<dataNode name="dn1" dataHost="localhost1" database="mstest" />
dataHost
一个dataHost管理一个数据库的集群(高可用的主从集群)
属性
name
:定义一个名称
maxCon/minCon
:连接当前标签中所有的后端数据库的连接池属性
balance/writeType/switcheType
:与读写分离高可用故障转移逻辑有关
dbType/dbDriver
:提供后端数据库类型和驱动类 native就是mysql的驱动类,如果使用其他类型,定义Driver的全路径名称
slaveThreashold
:读写分离中是否读取从节点的判断逻辑有关(从节点有可能同步数据是会延迟) 配合heartbeat的sql语句 show slave status
heartbeat
自定义语句,返回当前登录客户端的用户名使用和ip地址
配置一个可以进行写操作的数据库节点信息
<dataHost name="localhost1" maxCon="1000" minCon="10" balance="0" writeType="0" dbType="mysql" dbDriver="native" switchType="1" slaveThreshold="100"> <heartbeat>select user()</heartbeat> <writeHost host="hostM1" url="10.9.100.26:3306" user="root" password="root"/> </dataHost>