32_分库分表概述 配置mycat

版本:5.7.28

1.搭建mycat 分片服务器
 
数据库主机 192.168.4.54 使用db1库存储数据
数据库主机 192.168.4.55 使用db2库存储数据
主机 192.168.4.56 运行mycat服务,逻辑库名称为test,连接用户名为admin,密码123456
主机 192.168.4.53 访问测试配置

1.1 在54(主机c1)和55(主机c2)上面分别创建db1和db2库
mysql> create database db1;   //c1上面创建db1库
mysql> create database db2;   //c2上面创建db2库
 
1.2 54 55 都授权
mysql> grant all on *.* to [email protected]"%" identified by "123456";
 
1.3 修改数据库的配置文件(54 55)
注意:1代表不区分表名的大小写,0为区分大小写
]# vim /etc/my.cnf
[mysqld]
lower_case_table_names=1      //表名忽略大小写
]# systemctl restart mysqld
 
1.4 在56主机上面安装JDK
]# rpm -qa | grep -i jdk //安装自带的即可
]# yum -y install java-1.8.0-openjdk
 
1.5 在56主机上面安装mycat
]# tar -xvf Mycat-server-1.6-RELEASE-20161028204710-linux.tar.gz
]# mv mycat /usr/local/
]# ls /usr/local/mycat/
bin  catlet  conf  lib  logs  version.txt
]# cd /usr/local/mycat/
]# ./bin/mycat --help
Usage: ./bin/mycat { console | start | stop | restart | status | dump }
 
1.6 修改配置文件
目录结构说明:
bin    mycat命令,如 启动 停止 等
catlet 扩展功能
conf   配置文件
lib    mycat使用的jar
log    mycat启动日志和运行日志
wrapper.log mycat服务启动日志
mycat.log 记录SQL脚本执行后的报错内容

重要配置文件说明:
server.xml 设置连mycat的账号信息
schema.xml 配置mycat的真实库表
rule.xml 定义mycat分片规则

配置标签说明
<user>.. ..</user> 定义连mycat用户信息
<datanode>.. ..</datanode> 指定数据节点
<datahost>.. ..</datahost> 指定数据库地址及用户信息

查看server.xml配置文件
]# cd conf/
conf]# vim server.xml
        </system>
        <user name="test">        //连接mycat服务时使用的用户名 test
                <property name="password">test</property>        
//使用test用户连接mycat用户时使用的密码
                <property name="schemas">TESTDB</property>    
//连接上mycat服务后,可以看到的库名多个时,使用逗号分隔 (是逻辑上的库名,服务器上没有这个库名,随便取,但要记住)
        </user>
        <user name="user">
                <property name="password">user</property>
                <property name="schemas">TESTDB</property>
                <property name="readOnly">true</property>        
//定义只读权限,使用定义的user用户连接mycat服务后只有读记录的权限,不写这一行则是可读可写
        </user>
 
修改schema.xml配置文件
conf]# vim schema.xml
<table name="travelrecord" dataNode="dn1,dn2" rule="auto-sharding-long" />
//travelrecord(逻辑上的,名字不能随便写,一般不动)表分片到数据节点dn1和dn2,dn1和dn2随便取的名字
<table name="company" primaryKey="ID" type="global" dataNode="dn1,dn2" />
<table name="hotnews" primaryKey="ID" dataNode="dn1,dn2" rule="mod-long" />

...
<dataNode name="dn1" dataHost="c1" database="db1" />
//数据节点对应的服务器 name="dn1"名称要与上面的对应 dataHost="c1"写本机主机名,database="db1"存在的数据库名,定义分片使用的库,所在的物理主机,真正存储数据的db1库在物理主机mysql54上
<dataNode name="dn2" dataHost="c2" database="db2" />
//定义分片使用的库,所在的物理主机,真正存储数据的db2库在物理主机mysql55上

指定c1名称主机对应的ip地址
<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="c1" url="192.168.4.54:3306" user="admin"        
                        password="123456">
//访问数据库时,mycat服务连接数据库服务器时使用的用户名和密码
                        <!-- can have multi read hosts -->
                </writeHost>
</dataHost>

指定c2名称主机对应的ip地址(完整复制一对datahost)
        <dataHost name="c2" 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="c2" url="192.168.4.55:3306" user="admin"        
                         password="123456">
//访问数据库时,mycat服务连接数据库服务器时使用的用户名和密码
                        <!-- can have multi read hosts -->
                </writeHost>
        </dataHost>

注意:
rang-long 算法默认需要 3个 dotanode,测试拓扑只有两个dotanode,所以需要修改 autopartition-long.txt文件
#查看 rule.xml 中配置,找到 rang-long 算法的函数对应配置 autopartition-long.txt
<function name="rang-long"
        class="io.mycat.route.function.AutoPartitionByLong">
        <property name="mapFile">autopartition-long.txt</property>
</function>

编辑配置 注释掉最后一个 datanode
conf]# vim conf/autopartition-long.txt
#默认是三个,我们需要删除最后一个,不然就会报错,说节点少了
#K=1000条记录,M=10000条记录,那么下面三个配置就是0~500万的记录会存在数据库节点1的表中,500万~1000万会存在节点2的表中
0-500M=0
500M-1000M=1
#1000M-1500M=2

mod-long 算法默认需要 3个 dotanode,测试拓扑只有两个dotanode,需要修改 rule.xml 文件,修改count数为2即可
conf]# vim rule.xml
<function name="mod-long" class="io.mycat.route.function.PartitionByMod">
                <!-- how many data nodes -->
                <property name="count">2</property>
        </function>

添加PATH路径
conf]# export PATH=/usr/local/mycat/bin:$PATH
conf]# echo "PATH=/usr/local/mycat/bin:$PATH" >> /etc/profile
conf]# source /etc/profile
conf]# echo $PATH
conf]# which mycat
/usr/local/mycat/bin/mycat
 
启动服务并查看端口
conf]# mycat start
conf]# netstat -antup | grep :8066
tcp6   0   0 :::8066    :::*  LISTEN  29998/java           
conf]# ps -C java
  PID TTY          TIME CMD
29998 ?        00:00:01 java
 
53登陆:
]# mysql -h192.168.4.54 -uadmin -p123456
mysql> show processlist;
+----+-------+---------------+------+---------+------+----------+------------------+
| Id | User  | Host          | db   | Command | Time | State    | Info             |
+----+-------+---------------+------+---------+------+----------+------------------+
|  4 | root  | localhost     | NULL | Sleep   | 3935 |          | NULL             |
|  5 | admin | mysql56:59206 | db1  | Sleep   |   61 |          | NULL             |
|  6 | admin | mysql56:59218 | db1  | Sleep   |    1 |          | NULL             |
|  7 | admin | mysql56:59220 | db1  | Sleep   |   71 |          | NULL             |
|  8 | admin | mysql56:59210 | db1  | Sleep   |   11 |          | NULL             |
|  9 | admin | mysql56:59212 | db1  | Sleep   |   71 |          | NULL             |
| 10 | admin | mysql56:59214 | db1  | Sleep   |   31 |          | NULL             |
| 11 | admin | mysql56:59222 | db1  | Sleep   |   71 |          | NULL             |
| 12 | admin | mysql56:59224 | db1  | Sleep   |   41 |          | NULL             |
| 13 | admin | mysql56:59216 | db1  | Sleep   |   51 |          | NULL             |
| 14 | admin | mysql56:59208 | db1  | Sleep   |   21 |          | NULL             |
| 15 | admin | mysql53:50960 | NULL | Query   |    0 | starting | show processlist |
+----+-------+---------------+------+---------+------+----------+------------------+
 
]# mysql -h192.168.4.55 -uadmin -p123456
mysql> show processlist;
+----+-------+---------------+------+---------+------+----------+------------------+
| Id | User  | Host          | db   | Command | Time | State    | Info             |
+----+-------+---------------+------+---------+------+----------+------------------+
|  4 | root  | localhost     | NULL | Sleep   | 4016 |          | NULL             |
|  5 | admin | mysql56:41962 | db2  | Sleep   |   67 |          | NULL             |
|  6 | admin | mysql56:41964 | db2  | Sleep   |   17 |          | NULL             |
|  7 | admin | mysql56:41954 | db2  | Sleep   |   37 |          | NULL             |
|  8 | admin | mysql56:41956 | db2  | Sleep   |   27 |          | NULL             |
|  9 | admin | mysql56:41958 | db2  | Sleep   |   87 |          | NULL             |
| 10 | admin | mysql56:41966 | db2  | Sleep   |   47 |          | NULL             |
| 11 | admin | mysql56:41968 | db2  | Sleep   |    7 |          | NULL             |
| 12 | admin | mysql56:41950 | db2  | Sleep   |   57 |          | NULL             |
| 13 | admin | mysql56:41960 | db2  | Sleep   |   97 |          | NULL             |
| 14 | admin | mysql56:41952 | db2  | Sleep   |   77 |          | NULL             |
| 15 | admin | mysql53:32892 | NULL | Query   |    0 | starting | show processlist |
+----+-------+---------------+------+---------+------+----------+------------------+
 
56上
conf]# ls /usr/local/mycat/logs/
mycat.log  mycat.pid  wrapper.log    //wrapper.log为错误日志
conf]# ldconfig -v                              //更新加载的模块

1.7 客户端访(53)
命令: mysql -hmycat主机的IP -P端口号 -u用户 -p密码
]# mysql -h192.168.4.56 -P8066 -utest -ptest
mysql> show databases;
+----------+
| DATABASE |
+----------+
| TESTDB   |
+----------+
 
mysql> USE TESTDB;
mysql> show tables;
+------------------+
| Tables in TESTDB |
+------------------+
| company          |
| customer         |
| employee         |
| goods            |
| hotnews          |
| travelrecord     |
+------------------+
 
1.8 客户端测试:
mysql> create table employee(id int not null primary key,name varchar(100),sharding_id int not null);
mysql> DESC employee;
+-------------+--------------+------+-----+---------+-------+
| Field       | Type         | Null | Key | Default | Extra |
+-------------+--------------+------+-----+---------+-------+
| id          | int(11)      | NO   | PRI | NULL    |       |
| name        | varchar(100) | YES  |     | NULL    |       |
| sharding_id | int(11)      | NO   |     | NULL    |       |
+-------------+--------------+------+-----+---------+-------+

mysql> insert into employee(id,name,sharding_id) values(1,"bob",10000);
mysql> insert into employee(id,name,sharding_id) values(1,"lucy",10010);
mysql> select * from  employee;
+----+------+-------------+
| id | name | sharding_id |
+----+------+-------------+
|  1 | bob  |       10000 |
|  1 | lucy |       10010 |
+----+------+-------------+
 
在c1上面查看结果
mysql> use db1;
mysql> show tables;
+---------------+
| Tables_in_db1 |
+---------------+
| employee      |
+---------------+
 
mysql> select * from employee;   //查看结果
+----+------+-------------+
| id | name | sharding_id |
+----+------+-------------+
|  1 | bob  |       10000 |
+----+------+-------------+
 
在c2上面查看结果
mysql> use db2;
mysql> show tables;
+---------------+
| Tables_in_db2 |
+---------------+
| employee      |
+---------------+
 
mysql> select * from employee;   //查看结果
+----+------+-------------+
| id | name | sharding_id |
+----+------+-------------+
|  1 | lucy |       10010 |
+----+------+-------------+

即从53登陆56的数据库将数据写到了54和55.

MyCat支持的10种分片规则

原文地址:https://www.cnblogs.com/luwei0915/p/12258976.html

时间: 2024-09-30 03:31:30

32_分库分表概述 配置mycat的相关文章

数据库-数据库设计-分库分表

为什么要分库分表 分库分表的设计 带来的问题 扩容 分布式事务 多个路由字段怎么设置 关于分库分表最全的一篇文章 这里介绍设计分库分表框架时应该考虑的设计要点,并给出相应的解决方案. 一.整体的切分方式 简单来说,数据的切分就是通过某种特定的条件,将我们存放在同一个数据库中的数据分散存放到多个数据库(主机)中,以达到分散单台设备负载的效果,即分库分表. 数据的切分根据其切分规则的类型,可以分为如下两种切分模式. 垂直(纵向)切分:把单一的表拆分成多个表,并分散到不同的数据库(主机)上. 水平(横

利用ShardingSphere-JDBC实现分库分表

利用ShardingSphere-JDBC实现分库分表 1. ShardingSphere概述 1.1 概述 业务发展到一定程度,分库分表是一种必然的要求,分库可以实现资源隔离,分表则可以降低单表数据量,提高访问效率. 分库分表的技术方案,很久以来都有两种理念: 集中式的Proxy,实现MySQL客户端协议,使用户无感知 分布式的Proxy,在代码层面进行增强,实现一个路由程序 这两种方式是各有利弊的,集中式Proxy的好处是业务没有感知,一切交给DBA把控,分布式的Proxy其支持的语言有限,

sharding-jdbc结合mybatis实现分库分表功能

最近忙于项目已经好久几天没写博客了,前2篇文章我给大家介绍了搭建基础springMvc+mybatis的maven工程,这个简单框架已经可以对付一般的小型项目.但是我们实际项目中会碰到很多复杂的场景,比如数据量很大的情况下如何保证性能.今天我就给大家介绍数据库分库分表的优化,本文介绍mybatis结合当当网的sharding-jdbc分库分表技术(原理这里不做介绍) 首先在pom文件中引入需要的依赖 <dependency> <groupId>com.dangdang</gr

OneProxy分库分表演示--楼方鑫

OneProxy分库分表演示 (杭州平民软件有限公司) OneProxy是为MySQL精心设计的数据访问层,可以为任何开发语言提供对MySQL数据库的智能数据路由功能,比如单点切换.读写分离.分库分表等高级功能.并且允许你在公有云和私有云环境下自由布署,打造属于自己的数据架构. 如果在测试中发现问题,请联系我(微博:平民架构,微信:anysql)! 分库分表 Oracle从8.0.x版本开始在数据库内部支持分区表,可以将数据按某一个字段的某一规律来进行分片存贮,以降低数据库索引的层级,提高访问效

Sharding-Sphere 3.X 与spring与mybatis集成(分库分表)demo

最近在弄这个sharding-sphere,公司内部分库分表是在此业务代码上进行逻辑分库分表,但是这种总是不好,也调研了几款分库分表中间件.mycat.网易cetus.阿里DRDS.这几种就是背景强大,大公司经过大量的实战,成熟度很高,而框架sharding-sphere比较轻量级,最近比较火,它是以jar包形式提供服务,可以无缝连接ORM框架,并不需要额外的部署,不需要依赖,运维可以不需要改动,很多人都把sharding-sphere当成增强版的jdbc驱动,迁移代码其实没那么复杂.对于巨头公

一文让你精通数据库优化方案之分库分表

分库分表概述 读写分离分散数据库读写操作压力,分库分表分散存储压力 适用场景 类似读写分离,分库分表也是确定没有其他优化空间之后才采取的优化方案.那如果业务真的发展很快岂不是很快要进行分库分表了?那为何不一开始就设计好呢? 按照架构设计的"三原则"(简单原则,合适原则,演化原则),简单分析一下: 首先,这里的"如果"事实上发生的概率比较低,做10个业务有一个业务能活下去就很不错了,更何况快速发展,和中彩票的概率差不多.如果我们每个业务上来就按照淘宝.微信的规模去做架

SpringBoot+Mybatis+Sharding-JDBC实现分库分表

项目里面一直用Sharding-JDBC,今天整理一下,就当温故而知新了,也是稳固而知新了. 一.整体介绍 项目采用的框架是SpringBoot+Mybatis+Sharding-JDBC,采用的是properties的形式: 分为两个数据库sharding_0,sharding_1.每个库三个表,t_user_00,t_user_01,t_user_02: 分库策略:age % 2 = 0的数据存储到sharding_0 ,为1的数据存储到sharding_1: 分表策略:user_id %

Mycat读写分离和分库分表配置

Mycat是一个开源的分布式数据库系统,不同于oracle和mysql,Mycat并没有存储引擎,但是Mycat实现了mysql协议,前段用户可以把它当做一个Proxy.其核心功能是分表分库,即将一个大表水平分割为N个小表,存储在后端mysql存储引擎里面.最新版本的Mycat不仅支持mysql,还可以支持MS SqlServer,Oracle,DB2等关系型数据库,而且还支持MongoDB这种NoSQL.Mycat对调用者屏蔽了后端存储具体实现. Mycat的原理是先拦截用户的SQL语句并做分

MySQL 高可用:mysql+mycat实现数据库分片(分库分表)

本文引用于http://blog.csdn.net/kk185800961/article/details/51147029 MySQL 高可用:mysql+mycat实现数据库分片(分库分表) 什么是MYCAT: 一个彻底开源的,面向企业应用开发的大数据库集群 支持事务.ACID.可以替代MySQL的加强版数据库 一个可以视为MySQL集群的企业级数据库,用来替代昂贵的Oracle集群 一个融合内存缓存技术.NoSQL技术.HDFS大数据的新型SQL Server 结合传统数据库和新型分布式数