mycat如何对mysql 实现分库分表

使用mycat 实现mysql 数据的分库分表

概念

  • 逻辑库(Schema)

    将分开的物理库合并的一个逻辑数据库,跨多个物理主机

  • 逻辑表(table)

    逻辑表就是物理表的总和

    只要进行了水平切分就是一个分片表,没有切分的就是非分片表

    通过冗余方式复制到所有分片表所在库的表就叫全局表

  • 分片节点(dataNode)

    数据表被分片到不同的分片数据库上,每个分片表所在的库就叫数据节点

  • 分片主机(dataHost)

    所有分片数据实际存放的物理数据库

  • 分片规则(rule)

    MyCat有很多分片规则,基本够用,自己本身是用Java开发的

  • 全局序列号

    • UUID
    • snow id

环境

搭建环境说明,两台服务器也可以,mycat 与其中一个节点搭在一起
在这里插入图片描述

安装

# 下载
wget http://dl.mycat.org.cn/1.6.7.3/20190927161129/Mycat-server-1.6.7.3-release-20190927161129-linux.tar.gz
# 解压
tar -xvf Mycat-server-1.6.7.3-release-20190927161129-linux.tar.gz

配置

  • 配置 server.xml
    vim /root/mycat/conf/server.xml
<!--用户名密码配置-->
<user name="guanzc" defaultAccount="true"> 
  <property name="password">123456</property>
	<!--配置逻辑表,多个表以 "," 分割-->
  <property name="schemas">mycat_user,mycat_order</property>
</user>
  • 配置 schema.xml
    vim /root/mycat/conf/schema.xml
<!--  dataNode 数据节点配置
name: 自定义名称
dataHost: 定义的dataHost 
dataBase: 物理的数据库名
-->
<dataNode name="dn1" dataHost="dataHost_01" database="ikang_db_01" />
<dataNode name="dn2" dataHost="dataHost_02" database="ikang_db_02" />

<!-- 表配置
name:逻辑标名与 server.xml 配置保持一致
checkSQLschema: 如果是true会自动去掉数据库前缀
sqlMaxLimit: 最大显示行数
table: 数据库表配置
	name: 对应物理数据表名
	dataNode: 配置的数据节点
	rule: 分片规则
-->
<schema name="mycat_user" checkSQLschema="true" sqlMaxLimit="100">
   <table name="user_info" dataNode="dn1,dn2" rule="auto-sharding-long" />
</schema>

<!-- 逻辑数据库
dataHost 配置
name: 主机名称
maxCon:最大连接
minCon:最小链接
balance:
	0: 不开启读写分离,所有的操作都在writeHost上操作
	1: 全部的readHost与stand by writeHost参与select数据的负载均衡(当双主双从模式(M1->S1,M2->S2,并且 M1 与 M2 互为主备),正常情况下,M2,S1,S2 都参与 select 语句的负载均衡)
	2:所有的读操作会随机writeHost和readHost
	3: 所有的读操作都会随机分发到readHost。 writeHost不参与读操作双主也需要我们自己进行replica,mycat平时只写入一个主机
writeType:
	0: 所有写操作都会发送到配置的第一个writeHost,如果第一个挂了就会自动切到第二个writeHost配置上
	1: 所有的写操作会随机到writeHost上,1.5版本后不推荐
switchType: 切换类型配套我们的writeType来进行操作的
	-1: 表示写操作不自动进行切换
	 1: 默认值,自动切换,从第一个到第二个writeHost
	 2: 基于MySQL的主从同步的状态决定是否切换
-->
<dataHost name="dataHost_01" maxCon="1000" minCon="10" balance="0"
          writeType="0" dbType="mysql" dbDriver="native" switchType="1"  slaveThreshold="100">
    <heartbeat>select user()</heartbeat>
    <writeHost host="M1" url="192.168.56.132:3306" user="guanzc"
               password="123456">
    </writeHost>
</dataHost>
<dataHost name="dataHost_02" maxCon="1000" minCon="10" balance="0"
          writeType="0" dbType="mysql" dbDriver="native" switchType="1"  slaveThreshold="100">
    <heartbeat>select user()</heartbeat>
    <writeHost host="M1" url="192.168.56.133:3306" user="guanzc"
               password="123456">
    </writeHost>
</dataHost>

安装数据库

参考另一篇博客:rpm 安装数据库

建库、建表

#建库
create database ikang_db_01;

# 建表
DROP TABLE IF EXISTS `user_info`;

CREATE TABLE `user_info` (
  `id` int(11) DEFAULT NULL,
  `username` varchar(255) DEFAULT NULL,
  `password` varchar(255) DEFAULT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

创建用户授权

# 创建用户
CREATE USER 'guanzc'@'%' IDENTIFIED BY '123456';
# 授权
grant all privileges on *.* to 'guanzc'@'%' identified by '123456';
flush privileges;

启动

cd /root/mycat/bin
./mycat 

注意:mycat 默认分片时3个,只有两个节点,会报错,修改配置:autopartition-long.txt 配置,与集群dataNode 节点保持一直,从0开始
在这里插入图片描述

连接mycat

mycat 可以当作一个数据库,建立的逻辑数据库、表可通过登录 mycat 查看
mycat 提供了两种端口

  • 管理端口:9066, 查看配置
  • 数据端口:8066 和sql 操作一样
  • 觉得端口不爽,就修改
    vim server.xml
<system>
	<property name="serverPort">8067</property>
	<property name="managerPort">9066</property>
</system>
  • 登录数据接口
mysql -uguanzc -p -h192.168.56.130 -P8066

可以愉快的写sql 了

  • 登录管理接口
mysql -uguanzc -p -h192.168.56.130 -P9066
# 查看命令

mysql> show @@help;
+--------------------------------------------------------------+--------------------------------------------+
| STATEMENT                                                    | DESCRIPTION                                |
+--------------------------------------------------------------+--------------------------------------------+
| show @@time.current                                          | Report current timestamp                   |
| show @@time.startup                                          | Report startup timestamp                   |
| show @@version                                               | Report Mycat Server version                |
| show @@server                                                | Report server status                       |
| show @@threadpool                                            | Report threadPool status                   |
| show @@database                                              | Report databases                           |
| show @@datanode                                              | Report dataNodes                           |
| show @@datanode where schema = ?                             | Report dataNodes                           |
| show @@datasource                                            | Report dataSources                         |
| show @@datasource where dataNode = ?                         | Report dataSources                         |
| show @@datasource.synstatus                                  | Report datasource data synchronous         |
| show @@datasource.syndetail where name=?                     | Report datasource data synchronous detail  |
| show @@datasource.cluster                                    | Report datasource galary cluster variables |
| show @@processor                                             | Report processor status                    |
| show @@command                                               | Report commands status                     |
| show @@connection                                            | Report connection status                   |
| show @@cache                                                 | Report system cache usage                  |
| show @@backend                                               | Report backend connection status           |
| show @@session                                               | Report front session details               |
| show @@connection.sql                                        | Report connection sql                      |
| show @@sql.execute                                           | Report execute status                      |
| show @@sql.detail where id = ?                               | Report execute detail status               |
| show @@sql                                                   | Report SQL list                            |
| show @@sql.high                                              | Report Hight Frequency SQL                 |
| show @@sql.slow                                              | Report slow SQL                            |
| show @@sql.resultset                                         | Report BIG RESULTSET SQL                   |
| show @@sql.sum                                               | Report  User RW Stat                       |
| show @@sql.sum.user                                          | Report  User RW Stat                       |
| show @@sql.sum.table                                         | Report  Table RW Stat                      |
| show @@parser                                                | Report parser status                       |
| show @@router                                                | Report router status                       |
| show @@heartbeat                                             | Report heartbeat status                    |
| show @@heartbeat.detail where name=?                         | Report heartbeat current detail            |
| show @@slow where schema = ?                                 | Report schema slow sql                     |
| show @@slow where datanode = ?                               | Report datanode slow sql                   |
| show @@sysparam                                              | Report system param                        |
| show @@syslog limit=?                                        | Report system mycat.log                    |
| show @@white                                                 | show mycat white host                      |
| show @@white.set=?,?                                         | set mycat white host,[ip,user]             |
| show @@directmemory=1 or 2                                   | show mycat direct memory usage             |
| show @@check_global -SCHEMA= ? -TABLE=? -retry=? -interval=? | check mycat global table consistency       |
| switch @@datasource name:index                               | Switch dataSource                          |
| kill @@connection id1,id2,...                                | Kill the specified connections             |
| stop @@heartbeat name:time                                   | Pause dataNode heartbeat                   |
| reload @@config                                              | Reload basic config from file              |
| reload @@config_all                                          | Reload all config from file                |
| reload @@route                                               | Reload route config from file              |
| reload @@user                                                | Reload user config from file               |
| reload @@sqlslow=                                            | Set Slow SQL Time(ms)                      |
| reload @@user_stat                                           | Reset show @@sql  @@sql.sum @@sql.slow     |
| rollback @@config                                            | Rollback all config from memory            |
| rollback @@route                                             | Rollback route config from memory          |
| rollback @@user                                              | Rollback user config from memory           |
| reload @@sqlstat=open                                        | Open real-time sql stat analyzer           |
| reload @@sqlstat=close                                       | Close real-time sql stat analyzer          |
| offline                                                      | Change MyCat status to OFF                 |
| online                                                       | Change MyCat status to ON                  |
| clear @@slow where schema = ?                                | Clear slow sql by schema                   |
| clear @@slow where datanode = ?                              | Clear slow sql by datanode                 |
+--------------------------------------------------------------+--------------------------------------------+
59 rows in set (0.01 sec)

两个重要命令:reload @@config 、 reload @@config_all 修改完配置后,不用重启 mycat 服务,执行下命令就会生效,用哪个,自己去看。

验证

在这里插入图片描述

  1. 文件 autopartition-long.txt 定义了分片规则,0-5M 存储在第一个分片(db_01), 5M-10M存储在第二个分片(db_02)
  2. mycat 插入两条数据,分别存储到db_01、db_02

读写分离

在这里插入图片描述

在192.168.56.130 搭建一个数据库,db_01 作为192.168.56.132 的从库。主库只负责写从操作,读操由从库负载。为了演示效果,主从没做同步。

  • 主从配置
    scheml.xml
<dataHost name="dataHost_01" maxCon="1000" minCon="10" balance="1"
          writeType="0" dbType="mysql" dbDriver="native" switchType="1"  slaveThreshold="100">
	<heartbeat>select user()</heartbeat>
	<writeHost host="hostM1" url="192.168.56.132:3306" user="guanzc"
	                   password="123456">
	 	<readHost host="S1" url="192.168.56.130:3306" user="guanzc" password="123456"/>
	</writeHost>
</dataHost>
  1. readHost: 作为writeHost 从库,父子关系
  2. balance=1
  • 加载配置
mysql>reload @@config_all;
  • 测试
  1. 主从初始数据保持一直,尤其是id
  2. mycat逻辑库中加入一条记录成功后,查不到,因为数据写入了主库,查询的是从库(主从没有做同步),因此查不到。验证了主从读写分离。

双主

schema.xml

<dataHost name="DB213" maxCon="1000" minCon="10" balance="1"
                   writeType="0" dbType="mysql" dbDriver="native" switchType="1"  slaveThreshold="100">
   <heartbeat>select user()</heartbeat>
   <writeHost host="hostM1" url="192.168.56.132:3306" user="guanzc"
               password="123456">
   <writeHost host="hostM1" url="192.168.56.130:3306" user="guanzc"
	                   password="123456">password="123456"/> 
 </dataHost>
  1. 配置两个同级的writeHost
  • 测试
  1. 关闭192.168.56.132
  2. 从逻辑库中插入新的数据,能正常写入(关闭数据后,有延时)
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值