软件介绍
• Mycat 是基于 Java 的分布式数据库系统中间层,为高并发下的分布式提供解决方案
– 支持 JDBC 形式连接
– 支持 MySQL 、 Oracle 、 Sqlserver 、 Mongodb 等
– 提供数据读写分离服务
– 可以实现数据库服务器的高可用
– 提供数据分片服务
– 基于阿里巴巴 Cobar 进行研发的开源软件
– 适合数据大量写入数据的存储需求
- 配置mycat服务 步骤:
1 装包
]# rpm -qa | grep -i jdk
]# java -version
]# tar -zxvf Mycat-server-1.4-beta-20150604171601-linux.tar.gz
]# mv mycat /usr/local/
]# ls /usr/local/mycat/
bin catlet conf lib logs version.txt
2 修改配置文件
• 重要配置文件说明
– server.xml 设置连接 mycat 服务的账号 、密码等
– schema.xml 配置 mycat 使用的真实数据库和表
– rule.xml 定义 mycat 分片规则
• 配置标签说明
– <user>.......</user> 定义连接 mycat 服务时使用的用户和密码及逻辑库的名字
– <datanode>......</datanode> 指定数据节点(物理库的主机名和存储分片数据的数据库名)
– <datahost>......</datahost> 指定数据库服务器的 IP地址 及连接数据库时使用的授权用户名及密码
• 修改配置文件 /usr/local/mycat/conf/server.xml
<user name="user">
<property name="password">user</property>
<property name="schemas">TESTDB</property>
<property name="readOnly">true</property> # 定义只读权限,使用定义的 user 用户连接 mycat 服务后只有读记录的权限
</user>
• 修改配置文件 /usr/local/mycat/conf/schema.xml– 定义分片信息
2.1 定义客户连接mycat时使用的用户名及密码和访问权限、逻辑库的名称
]# vim /usr/local/mycat/conf/server.xml
34 <user name="admin">
35 <property name="password">123456</property>
36 <property name="schemas">TESTDB</property>
37 </user>
38
39 <user name="user">
40 <property name="password">user</property>
41 <property name="schemas">TESTDB</property>
42 <property name="readOnly">true</property>
43 </user>
:wq
3 根据配置文件的设置在数据库服务器上做对应的配置
mysql54]# vim /etc/my.cnf
[mysqld]
lower_case_table_names = 1
]# systemctl restart mysqld
mysql> create database db1;
mysql> grant all on *.* to root@"%" identified by "123qqq...A";
]# vim /etc/my.cnf
[mysqld]
lower_case_table_names = 1
]# systemctl restart mysqld
mysql> create database db2;
mysql> grant all on *.* to root@"%" identified by "123qqq...A";
4 启动服务
]#vim /usr/local/mycat/logs/wrapper.log
]#/usr/local/mycat/bin/mycat start
]#/usr/local/mycat/bin/mycat stop
5 查服务信息
]#netstat -utnlp | grep :8066
6 客户端测试配置
]# mysql -h192.168.4.56 -P8066 -uadmin -padmin
mysql> show databases;
mysql> use TESTDB;
mysql> show tables;
mysql> create table employee (
id int(2) primary key auto_increment,
name char(10),
age tinyint(2) default 18,
sex enum("boy","girl") default "boy",
sharding_id int(2)
);
mysql> desc employee;
mysql> insert into employee(name,sharding_id)
values("bob",10000),("tom",10010);
mysql> insert into employee(name,sharding_id)
values("jerry",10010);
select * from employee;
- MySQL性能优化
搭建监控服务器:监控服务的硬件使用率
CPU 内存 存储 网络流量
数据库服务运行参数:
mysql> set global 选项=值;
vim /etc/my.cnf
[mysqld]
选项=值
mysql> set global max_connections = 300;
mysql> show variables like “max_connections”;
分库分表
• 什么是分库分表
– 通过某种特定条件,将存放在一个数据库 ( 主机 ) 中的数据,分散存放到多个数据库 ( 主机 ) 中。
– 已达到分散单台设备负载的效果,即分库分表
– 数据的切分根据其切分规则的类型,分为 2 种切分模式
– 垂直分割 ( 纵向 ) 和 水平分割 ( 横向 )
• 纵向切分
– 把单一的表,拆分成多个表,并分散到不同的数据库( 主机 ) 上。
– 一个数据库由多个表构成,每个表对应不同的业务,可以按照业务对表进行分类,将其分布到不同的数据库 ( 主机 ) 上,实现专库专用,让不同的库 ( 主机 ) 分担不同的业务。
• 横向切分
– 按照表中某个字段的某种规则,把向表中写入的记录分散到多个库 ( 主机 ) 中。
– 简单来说,就是按照数据行切分,将表中的某些行存储到指定的数据库 ( 主机 ) 中。
工作过程
• 当 Mycat 收到一个 SQL 时 – 会先解析这个 SQL 查找涉及到的表,然后看此表的定 义
– 如果有分片规则,则获取到 SQL 里分片字段的值,并 匹配分片函数,得到该 QL 对应的分片列表 – 然后将 SQL发往这些分片去执行,最后收集和处理所 有分片返回的结果数据,并输出到客户端 以 select * from Orders where prov=? 语句为例,查到 prov=wuhan , 按照分片函数, wuhan 返回 dn1 ,于是 SQL 就发给了 MySQL1,去 取 DB1 上的查询结果,并返回给用户。 如果上述 SQL 改为 elect * from Orders where prov in (‘wuhan’,‘beijing’) ,那么, SQL 就会发给 ySQL1 与 MySQL2 去执行,然后结果集合并后输出给用户。但通常业务中我们的 SQL 会有 Order By 以及 Limit 翻页语法,此时就涉及到结果集在 Mycat 端的二次处 理。
分片规则
• mycat 服务提供 10 种分片规则。
– 1 枚举法 sharding-by-intfile
– 2 固定分片 hash 算法 rule1
– 3 范围约定 auto-sharding-long
– 4 求模法 mod-long
– 5 日期列分区法 sharding-by-date
– 6 通配取模 sharding-by-pattern
– 7ASCII 码求模通配 sharding-by-prefixpattern
– 8 编程指定 sharding-by-substring
– 9 字符串拆分 hash 解析 sharding-by-stringhash
– 10 一致性 hash sharding-by-murmur
分片算法
• 每种分片规则对应一种算法。
– 1 枚举法 sharding-by-intfile -> hash-int
– 2 固定分片 rule1 -> func1
– 3 范围约定 auto-sharding-long -> rang-long
– 4 求模法 mod-long -> mod-long
– 5 日期列分区法 sharding-by-date ->sharding-by-date
– 6 通配取模 sharding-by-pattern -> sharding-by-pattern
– 7ASCII 码求模通配 sharding-by-prefixpattern -> sharding-by-prefixpattern
– 8 编程指定 sharding-by-substring -> sharding-by-substring
– 9 字符串拆分 hash 解析 sharding-by-stringhash ->sharding-by-stringhash
– 10 一致性 hash sharding-by-murmur ->murmur