mycat安装配置工作原理_数据分片服务_2018_lcf


软件介绍

• Mycat 是基于 Java 的分布式数据库系统中间层,为
高并发下的分布式提供解决方案

– 支持 JDBC 形式连接
– 支持 MySQL 、 Oracle 、 Sqlserver 、 Mongodb 等
– 提供数据读写分离服务
– 可以实现数据库服务器的高可用
– 提供数据分片服务
– 基于阿里巴巴 Cobar 进行研发的开源软件
– 适合数据大量写入数据的存储需求


分库分表
• 什么是分库分表
– 通过某种特定条件,将存放在一个数据库 ( 主机 ) 中的数据,分散存放到多个数据库 ( 主机 ) 中。
– 已达到分散单台设备负载的效果,即分库分表
– 数据的切分根据其切分规则的类型,分为 2 种切分模式: 垂直分割 ( 纵向 ) 和 水平分割 ( 横向 )

分片切分模式

• 纵向切分

– 把单一的表,拆分成多个表,并分散到不同的数据库( 主机 ) 上。
– 一个数据库由多个表构成,每个表对应不同的业务,
   可以按照业务对表进行分类,将其分布到不同的数据
   库 ( 主机 ) 上,实现专库专用,让不同的库 ( 主机 ) 分
   担不同的业务
   
• 横向切分
– 按照表中某个字段的某种规则,把向表中写入的记录分散到多个库 ( 主机 ) 中。
– 简单来说,就是按照数据行切分,将表中的某些行存储到指定的数据库 ( 主机 ) 中。

分片规则
• mycat 服务提供 10 种分片规则。

– 1 枚举法 sharding-by-intfile
– 2 固定分片 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


工作过程 

• 当 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 端的二次处理。

安装配置

– 装包

• 安装 JDK  Java 语言的软件开发工具包
[root@mycatserver ~]# rpm -qa | grep -i jdk # //查看是否安装有
java-1.8.0-openjdk-1.8.0.65-3.b17.el7.x86_64
java-1.8.0-openjdk-headless-1.8.0.65-3.b17.el7.x86_64
[root@mycatserver ~]# yum -y install java-1.8.0-openjdk java-1.8.0-openjdk-headless //安装这两个程序

• 安装 mycat 服务软件包
[root@mycatserver ~]# tar -zxf Mycat-server-1.4-beta-
20150604171601-linux.tar.gz # 免安装,解压后即可使用
[ root@mycatserver ~]# mv mycat/ /usr/local/
[root@mycatserver ~]# ls /usr/local/mycat/
bin catlet conf lib logs version.txt

• 目录结构说明

– bin   mycat 命令 如 启动 停止 等
– catlet 扩展功能
– conf  配置文件
– lib  mycat 使用的 jar 包 mycat 是 java 开发的
– log   mycat 启动日志和运行日志
– wrapper.log  服务启动日志 ,启动有问题可以看这个日志的内容
– mycat.log  记录sql脚本执行后的具体报错内容

– 配置 

• 重要配置文件说明
[root@mycatserver ~]# cd /usr/local/mycat/conf
//进入到mycat的配置目录下,根据实际情况和需求分别修改下面三个配置文件

– server.xml 设置连接 mycat 服务的账号 、密码等

        <user name="ald">   //ald为客户机登陆mycatserver使用的账号
                <property name="password">123123</property>  //对应的登陆mycatserver服务器的密码
                <property name="schemas">ALD</property>    
                //ALD指向schema.xml里的对应配置项名称,同时也指一个数据库的库名
                <property name="readOnly">true</property>   //指定是否可读,不加这行默认可读写
        </user>

– schema.xml 配置 mycat 使用的真实数据库和表

 <schema name="ALD" checkSQLschema="false" sqlMaxLimit="100">
 <table name="travelrecord" dataNode="dn1,dn2,dn3" rule="auto-sharding-long" />
//travelrecord是ADL库里的表名,show时只显表名,需要创建了才能实体化,dataNode指数据分发的数据服务器节点.rule指定使用的分片规则
 <table name="company" primaryKey="ID" type="global" dataNode="dn1,dn2,dn3" />
//name指定显示可创建的表名,type="global"指定此表为全局表,也就是在dataNode指定的服务节点上都会创建执行显示
<table name="employee" primaryKey="ID" dataNode="dn1,dn2" rule="sharding-by-intfile" />
//primaryKey="ID"建立这个表时要有这个主键,不同的规则有些会要求创建相应的字段,具休查看规则手册
 </schema>

<dataNode name="dn1" dataHost="c1" database="db1" />

//name指定数据服务器节点名,可以任意起,dataHost配置选项名,database指定这台服务器要建立的库名(要在这台节点机上手动创建出这个库)

       <dataHost name="c1" maxCon="1000" minCon="10" balance="0"
                writeType="0" dbType="mysql" dbDriver="native" switchType="1"  slaveThreshold="100">
                <heartbeat>select user()</heartbeat>
                <!-- can have multi write hosts -->
                <writeHost host="hostM55" url="192.168.4.55:3306" user="root" password="123123">
                      //可以设置多台mycatserver访问这个节点(高可用方面配置)
                 //hostM55标识名,可以任意起, url指定这个服务节点的IP和端口
                 //user,password是设置mycatserver访问这个节点时使用的账号和密码 ,要到这个节点上创建这个授权用户
                </writeHost>
                <!--writeHost host="hostS1" url="localhost:3316" user="root" password="123123" /-->
          //支持多用户多账户和不同端口的访问
        </dataHost>
        <dataHost ....>  ........... </dataHost>  //有多少个使用节点,就创建多少个dataHost配置项
        
– rule.xml   定义 mycat 分片规则
//这个是程序默认写好的规则,不是自建规则基本上这里无需更改


启服务

[root@mycatserver ~]# ln -s /usr/local/mycat/bin/mycat /sbin     //做个链接,方便操作,免去输完整路径
[root@mycatserver ~]# mycat --help                               //查看可操作的选项
Usage: /usr/sbin/mycat { console | start | stop | restart | status | dump }
[root@mycatserver ~]# mycat start                                //启动服务
Starting Mycat-server...
Mycat-server is already running.
[root@host56 bin]# mycat status                                  //查看服务状态
Mycat-server is running (2473).
[root@host56 bin]# lsof -i:8066                                  //查看端口是否开起,mycat默认使用端口8066
COMMAND  PID USER   FD   TYPE DEVICE SIZE/OFF NODE NAME
java    2475 root   49u  IPv6  30335      0t0  TCP *:8066 (LISTEN)

数据库服务节点
mysql> grant all on *.* to root@'%' identified by "123123";  //所有使用的节点上都要创建这个用户给mycatserver连接使用
mysql> create database db1;    //创建mycatserver 配置文件schema.xml中配置项指定的节点对应的数据库名.

客户端测试服务
说明:这里测试使用了sharding-by-intfile分片规则的表employee 

如果是使用sharding-by-intfile这种规则的表,有三台服务节点以上时,还要手动修改配置文件
[root@mycatserver conf]# cat partition-hash-int.txt 
10000=0
10010=1
10030=2
//上面是在mycatserver服务器上的操作,在这个文件后面添加了10030=2这项,测试两个数据库服务节点以上要手动添加

[root@client ~]# mysql -h192.168.0.66 -uald -p123123   
//在客户机上连接mycatserver服务器(IP:192.168.0.66),使用mycatserver服务器上配置好的相关账号密码

mysql> show databases;
+----------+
| DATABASE |
+----------+
| ALD      |
+----------+
1 row in set (0.00 sec)
//连接上后,查看数据库
mysql> use ALD
mysql> show tables;
+---------------+
| Tables in ALD |
+---------------+
| company       |
| customer      |
| customer_addr |
| employee      |
| goods         |
| hotnews       |
| orders        |
| order_items   |
| travelrecord  |
+---------------+
9 rows in set (0.00 sec)
//刚建好的服务器,上面显示的都只是表名,还没实休化,需创建后才能在数据库服务节点里存在
//创建的表名只能是上面显示出来的,也就是在mycat配置项中指定的好的表名.
mysql> create table employee( id int(2) primary key, sharding_id int not null, name char(10) not null);
Query OK, 0 rows affected (1.69 sec)
mysql> insert into employee(id,sharding_id,name,homedir) values(1,10000,"aaa","fef"),(2,10010,"eee","cc"),(3,10030,"uuu","sss");
Query OK, 3 rows affected (0.27 sec)

//创建是否指定主键什么的要参照配置项指定的规则来定.
//表创建成功后,数据服务器节点上就会有对应的表了

---然后在数据库服务器节点机上查看
mysql> show tables;
+---------------+
| Tables_in_db1 |
+---------------+
| employee      |
+---------------+
1 rows in set (0.00 sec)
mysql> select * from employee;
+----+-------------+------+---------+
| id | sharding_id | name | homedir |
+----+-------------+------+---------+
|  3 |       10030 | uuu  | sss     |
+----+-------------+------+---------+
1 row in set (0.00 sec)
//上面是在其中一他节点上查看的结果,这个分片规则就是以sharding_id这个字段10000,10010,10030作为分片存储位置的标识
//在别的节点上会有对应的数据表记录.

至此整个服务的分片服务搭建就完成了.

如果服务启动不了,基本上都是配置文件写错了,要确保增加的每个配置项的对应配置项存在并设置正确.(转载请注明出处)


猜你喜欢

转载自blog.csdn.net/cbuy888/article/details/80600315
今日推荐