MyCat配置MySQL读写分离

前言:
Mycat读写分离和自动切换机制,需要mysql的主从复制机制配合,即读从从机(slave)中读取,写向主机(master)中写入!
所以我们需要先完成mysql的主从备份

一 mysql主从备份

因为我之前以及写过一篇文章了,大家可以看完写的博客,或者,在网上找一些其它配置资料
点击跳转

二 安装mycat

第一步:mycat需要jdk环境,请安装jdk

第一步: 我这里在master中安装mycat,即直接下载mycat安装包,解压即可
mycat-1.6下载

tar -zxvf mycat-1.6

其一级目录如下

  • mycat
    • bin
      mycay的执行文件目录
    • catlet
    • conf
      mycat的配置文件其中(server.xml,rule.xml以及schema.xml最为重要)
    • lib
      mycat自身需要的依赖
    • logs
      mycat的日子文件。发生错误,可以到这里查看
    • version.txt
      mycat的版本信息

三 conf配置文件

使用mycat只需要配置相关文件即可,其中以server.xml,rule.xml以及schema.xml最为重要、

  • server.xml
    配置使用逻辑库和逻辑表的用户情况
  • rule.xml
    配置分库分表的规则
  • schema.xml
    配置逻辑库与逻辑表,以及实际库和实际表

这里说到了逻辑库和逻辑表是说,mycat对外提供一个数据库和一个表,你可以向操作MySQL一样操作它,不用关心其中真实的数据在那个分库那个分表。如下

分库

分表

3.1 在schema.xml中配置逻辑库与逻辑表

schema.xml中

  • 定义逻辑库
定义逻辑库,名字为TESTDB,不检查输入的sql语句的规范,每条sql语句默认加上limit 100,如果你加入limit则该sqlMaxLimit失效
<schema name="TESTDB" checkSQLschema="false" sqlMaxLimit="100">
  • 定义逻辑表
#定义逻辑库中的逻辑表travelrecord,其真实数据在dn1,dn2,dn3的MySQL中(后面定义的),其mycat的数据分布规则为auto-sharding-long(默认)改为crc32slot这样会根据算法将写入的数据也会分布到不同的数据库中,这个规则需要在rule.xml中配置
<table name="travelrecord" dataNode="dn1,dn2,dn3" rule="crc32slot" />

#定义dataNode,即真实的MySQL数据的地址name为代表,其真实地址为localhost1(后面有定义),数据库为db1
 <dataNode name="dn1" dataHost="localhost1" database="db1" />
 <dataNode name="dn2" dataHost="localhost1" database="db2" />
 <dataNode name="dn3" dataHost="localhost1" database="db3" />

#定义dataHost,即真实的MySQL数据的IP主机地址dbType(数据库类型mysql),dbDriver驱动(mysql,因为mycat本身就是为MySQL做的,所以你写native就是MySQL,其它数据库则需要你写完整的dbDriver),balance为平衡策略,一般用3(balance="3":表示写请求只发给节点,读请求只发给读节点这里要改,否则后面读写无效)
 <dataHost name="localhost1" maxCon="1000" minCon="10" balance="0"
              writeType="0" dbType="mysql" dbDriver="native" switchType="1"  slaveThreshold="100">
          <heartbeat>select user()</heartbeat>
          <!-- 写入数据向那个真实的数据库写入,一般是MySQL的主-->
          <writeHost host="hostM1" url="localhost:3306" user="root"
                     password="123456">
              <!--读数据向那个真实的数据库读,一般是MySQL的从-->
             <readHost host="hostS2" url="192.168.1.200:3306" user="root" password="xxx" />
          </writeHost>
 </dataHost>

使用crc32slot只会将数据分配到两个数据库中,再配置文件rule.xml中有,但是我们分配到了3个数据库(db1,db2,db3后面会配置),所以我们需要修改配置,改为3

crc32slot默认分片


如果你这里忘记配置,并且以及开始mycat,那么你再修改为3时,必须将conf/ruledata目录(这个目录会在你使用mycat插入数据的时候生成)删除,再重新启动mycat,否则没有效果,因为分片规则以及生成,只有将其删除运行再生成!
下面这张图就是我后面使用mycat插入数据后,ruledata/crc32slot_MYCATTEST.properties 的内容
一共分三片,如果你没有该为3,这里就只有0 和1

  • 0 = 0- 34132
    表示_slot为0-34132的在数据库0中
  • 1 = 34133 - 68266
    表示_slot为34133 - 68266的在数据库1中
  • 2 = 68266 - 102399
    表示_slot为 68266 - 102399的在数据库2中

其中_slot为你创建表以后,mycat会自动在每张表加一个_slot字段

crc32slot分片规则

根据自身的MySQL的主从的信息配置如下(删掉了注释以及不需要的部分)

  1 <?xml version="1.0"?>
  2 <!DOCTYPE mycat:schema SYSTEM "schema.dtd">
  3 <mycat:schema xmlns:mycat="http://io.mycat/">
  4 
  5     <schema name="TESTDB" checkSQLschema="false" sqlMaxLimit="100">
  6         <!-- auto sharding by id (long) -->
  7         <table name="mycattest" dataNode="dn1,dn2,dn3" rule="crc32slot" />
  9     </schema>
 10 
 11     <!-- <dataNode name="dn1$0-743" dataHost="localhost1" database="db$0-743"
 12         /> -->
 13     <dataNode name="dn1" dataHost="localhost1" database="db1" />
 14     <dataNode name="dn2" dataHost="localhost1" database="db2" />
 15     <dataNode name="dn3" dataHost="localhost1" database="db3" />
 16 
 17     <dataHost name="localhost1" maxCon="1000" minCon="10" balance="3"
 18               writeType="0" dbType="mysql" dbDriver="native" switchType="1"  slaveThreshold="100">
 19         <heartbeat>select user()</heartbeat>
 20         <!-- can have multi write hosts -->
 21         <writeHost host="hostM1" url="192.168.25.5:3306" user="root"
 22                    password="123456">
 23             <!-- can have multi read hosts -->
 24             <readHost host="hostS2" url="192.168.25.6:3306" user="root" password="123456" />
 25         </writeHost>
 26     </dataHost>
 27 </mycat:schema>```

3.2 在server.xml中配置用户登陆mycat的信息

主要查看server.xml中的用户配置信息

  # 登陆mycat的用户配置
 <user name="root">
           用户是root,密码是123456,该用户只能操作TESTDB逻辑库
          <property name="password">123456</property>
          <property name="schemas">TESTDB</property>
  
         这里你可以设置该用户对逻辑库TESTDB的DML的权限设置
         <!-- 表级 DML 权限设置 -->
         <!--        
         <privileges check="false">
             <schema name="TESTDB" dml="0110" >
                  <table name="tb01" dml="0000"></table>
                  <table name="tb02" dml="1111"></table>
              </schema>
          </privileges>       
           -->
     </user>
  
    # 用户名为user密码为user,可以操作的逻辑库是TESTDB,但是是只读的
      <user name="user">
          <property name="password">user</property>
          <property name="schemas">TESTDB</property>
          <property name="readOnly">true</property>
      </user> 

四 测试

4.1 根据之前的配置,我们需要修改MySQL主从中的用户登陆权限,让mycat可以登陆进去

  • mysql_master 192.168.25.5

grant all privileges on . to root@’%’ identified by “123456”; #on 后面是* 点 *
再刷新权限
FLUSH PRIVILEGES;

授权

  • mysql_slave 192.168.25.6

grant all privileges on . to root@’%’ identified by “123456”; #on 后面是* 点 *
再刷新权限
FLUSH PRIVILEGES;

结果同上

4.2 测试读写分离

  • 进入mycat安装目录的bin,启动
cd /root/mycat/bin

mycat启动

  • 登陆mycat

mysql -h192.168.25.5 -uroot -p123456 -P8066

-u为你在mycat中的server.xml中配置的用户名,-p(小写)为该用户密码,-h为mycat的安装主机
-P (大写) 为mycat的端口

9066为管理端口管理端口用于执行管理命令:
8066命令端口用户执行增删改查等 SQL 语句:
如果出现 Unsupported statement 说明你使用的是9066端口操作(改为8066登陆),或者登陆的用户在mycat中的server.xml中权限受到了限制

  • 查看逻辑数据库

    mycat数据库

  • 查看逻辑表

    mycat的逻辑表

  • 为mysql_master配置数据库
    因为在前面的schena.xml中配置了真实数据库的名字,但是我们还有没有创建,所以需要先创建出来,直接在master中写sql,语句即可,因为以及配置了主从,slave也会执行
create database db1;
create database db2;
create database db3;

master

  • 测试
    为已存在的逻辑表跟新你需要的完整信息
mysql> use TESTDB;
mysql> CREATE TABLE `mycattest` (
  `id` int(255) NOT NULL,
  `username` varchar(255) DEFAULT NULL,
  `password` varchar(255) DEFAULT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=2 DEFAULT CHARSET=utf8;
mysql>desc mycattest

这里我需要说明一下,为什么这里创建表结构,因为,表必须现在mycat中声明配置其相关属性(但是没有结构),后面mycat会自动为你生成一个逻辑表(mycattest),并会在你配置的主从数据库(db1,db2,db3)中加入该表(mycattest),此时该表是没有数据结构的,但是其分片分库的规则都以完成,所以你只需要完善其你需要的表结构即可!逻辑表必须先在schema.xml中声明配置规则

  • 查看MySQL的主从数据结构
    随意选择一个数据库(db1,db2,db3),注意mycat会自动增加一个字段_slot,根据该字段,mycat会把数据分散到你定义的片中(db1,db2,db3)

    master与slave

  • 测试写
    使用mycat写入5条数据
INSERT INTO mycattest(id,username,password)  VALUES('2','gxm','123456');
INSERT INTO mycattest(id,username,password)  VALUES('3','gxm','123456');
INSERT INTO mycattest(id,username,password)  VALUES('4','gxm','123456');
INSERT INTO mycattest(id,username,password)  VALUES('5','gxm','123456');
INSERT INTO mycattest(id,username,password)  VALUES('6','gxm','123456');

查看master与slave是否都已插入数据,如果主从都已有数据,说明写是分离的,因为只有mycat向master中写入数据,slave才会只有相同的一份数据,因为如果同时向master与slave写入

  • 第一种报错主键重复(如果不是,我这里就应该报错,id为主键)
  • 第二种,数据会重复,master与slave每个都会会有10条数据(如果没有主键的话)

但是现在这里上述2中情况没有出现说明,是单独向master写入,由slave同步master的结果

数据分布

因为我们配置是rule是crc32slot配置了分片所以数据会根据_slot大致均匀的分到到db1,db2,db3中

  • 测试读
    向slave中写入一条记录
INSERT INTO db1.mycattest(id,username,password)  VALUES('999','slave','99999');

master不会同步slave,所以slave的数据会比master多一条’999’,‘slave’,‘99999’

slave


此时我再使用mycat查询数据如果没有999号数据说明从master中读取,有999号数据说明从slave中读取

读写分离

或者你可以使用9066端口登陆,查看sql语句的执行状况
show @@datasource;

读写分离

关于使用9066或者8066端口的使用的一些常用命令,查看mycat状态等等,这片博客感觉写的挺好的!
点击跳转

原文地址:https://blog.csdn.net/qq_38263083/article/details/90755328

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


Mycat是什么?MyCat是一个开源的分布式数据库系统,是一个实现了MySQL协议的服务器,前端用户可以把它看作是一个数据库代理,用MySQL客户端工具和命令行访问,而其后端可以用MySQL原生协议与多个MySQL服务器通信,也可以用JDBC协议与大多数主流数据库服务器通信,其核心功能是分表分库,即将一
转自:https://www.cnblogs.com/ivictor/p/5111495.html参考:https://www.cnblogs.com/damumu/p/7320258.htmlMyCAT是mysql中间件,前身是阿里大名鼎鼎的Cobar,Cobar在开源了一段时间后,不了了之。于是MyCAT扛起了这面大旗,在大数据时代,其重要性愈发彰显。这篇文章主要是MyCAT的入门部署
1.在数据库做好主从同步的情况下搭建mycat。下载mycat,解压。修改server.xml文件,修改schema.xml待完善启动mycat。参考文章:https://blog.csdn.net/yelllowcong/article/details/79063546https://www.cnblogs.com/NingKangMing/p/6143834.html
集群的服务器列表在10.11.0.210和10.11.0.216中部署mycat和haproxy(因为实验机器性能有限,实际生产环境中需要单独用服务做haproxy反向代理) 两台机器的Mycat配置和haproxy保持一致即haproxyàmycatàpxc集群àmysql分片 Mycat的相关配置Server.xml[root@node6
Mycat是什么?·一个彻底开源的,面向企业应用开发的大数据库集群·支持事务、ACID、可以替代MySQL的加强版数据库·一个可以视为MySQL集群的企业级数据库,用来替代昂贵的Oracle集群·一个融合内存缓存技术、NoSQL技术、HDFS大数据的新型SQLServer·结合传统数据库和新型分布式数
<system>配置Mycat系统参数 <system>  <propertyname="serverPort">3306</property><!--mycat服务端口-->  <propertyname="managerPort">9066</property><!--mycat管理端口-->  <propertyname=&q
数据库中间件:mycat逻辑库:即mycat服务上的数据库,并非实际mysql服务上的数据库。逻辑表:与逻辑库同理。数据节点:是mycat逻辑表与mysql物理表的对应关系,mycat服务上某个库中的某个表的数据可能是由不同mysql服务器上数据库中表的数据组成。具体哪个逻辑表对应mysql的哪个实际
MyCat的官方网站:http://www.mycat.org.cn/下载地址:https://github.com/MyCATApache/Mycat-download第一步:下载wget http://dl.mycat.io/1.6-RELEASE/Mycat-server-1.6-RELEASE-20161028204710-linux.tar.gz 并解压Mycat-server-1.6-RELEASE-20161028204710-linux.tar.gz
show@@sql;Emptyset(0.01sec)一直查不出数据查看在Mycat中执行过的SQL语句,需要确认server.xml配置文件中的<propertyname="useSqlStat">1</property>刚开始一直出不来数据,最后发现是没开启的原因。。。。。。1. 连接mycat9066管理端口   mysql-h127.0.0.1-
Mysql分布式集群部署mycat分库分表系列(共三套)系列一:《分布式集群+分库分表实战教程》本套课程将通过分布式集群和分库分表两部分内容进行讲解1、主要解决针对大型网站架构中持久化部分中,大量数据存储以及高并发访问所带来是数据读写问题。分布式是将一个业务拆分为多个子业务
1、下载系统安装包选择相应的版本进行下载,地址:http://dl.mycat.io/ 。Mycat数据库分库分表中间件介绍 http://www.mycat.io/2、安装安装mycat前需要保证系统已安装过jdk和mysql,将下载好的mycat安装包解压到某个目录下,然后进入mycat解压目录下的bin目录(打开cmd控制台确保是以管
原文:学会数据库读写分离、分表分库https://www.cnblogs.com/joylee/p/7513038.html系统开发中,数据库是非常重要的一个点。除了程序的本身的优化,如:SQL语句优化、代码优化,数据库的处理本身优化也是非常重要的。主从、热备、分表分库等都是系统发展迟早会遇到的技术问题问题。Mycat
MyCAT是mysql中间件,前身是阿里大名鼎鼎的Cobar,Cobar在开源了一段时间后,不了了之。于是MyCAT扛起了这面大旗,在大数据时代,其重要性愈发彰显。这篇文章主要是MyCAT的入门部署。  随着互联网应用的广泛普及,海量数据的存储和访问成为了系统设计的瓶颈问题。对于一个大型的互联网应
MyCat安装配置学习1.下载安装tar解压(不多说)2.MyCat命令./mycatstart启动./mycatstop停止./mycatrestart重启配置server.xml添加用户设置配置schema.xml
1.Mycat入门官网http://www.mycat.io/1.1.什么是Mycat一个彻底开源的,面向企业应用开发的大数据库集群支持事务、ACID、可以替代MySQL的加强版数据库一个可以视为MySQL集群的企业级数据库,用来替代昂贵的Oracle集群一个融合内存缓存技术、NoSQL技术、HDFS大数据的新型SQL
因为51博客写作格式问题,以后文档都以有道文档连接为主,已整理到有道云笔记,目前笔记有云计算运维大数据运维,应用运维,DBA,测试,小白想学的可以加我qq:936172842,,请注明51学友,无备注一律不加,http:/ote.youdao.comoteshare?id=935db6cec339054c82d8b3f6ac343fa0⊂=DBB78851CCCF486EB26B
MyCat简介前面文章我们提到,如果数据量比较大的话,我们需要对数据进行分库分表,分完之后,原本存在一个数据库中的数据,现在就存在多个数据库中了,就像下面这样:  那么此时MyCat所扮演的角色就是分布式数据库中间件!MyCat是一个开源的分布式数据库中间件,它实现了MySQL协议,在开发
一、自定义类加载器在复杂类情况下的运行分析1、使用之前创建的类加载器publicclassMyTest16extendsClassLoader{privateStringclassName;//目录privateStringpath;privatefinalStringfileExtension=".class";publicMyTest16(Stringclass
mycat是一个中间层mycat不存储任何数据,所有数据存储在mysql中mycat对于开发人员来说就是mysql,但mycat不能支持所有mysql语句mycat可以实现对后端数据库的分库分表和读写分离、负载均衡mycat对前端应用隐藏了后端数据库的存储逻辑(比如对后端数据读写分离,如果在程序中实现,则每一个使
下载:https://github.com/MyCATApache/Mycat-download安装:直接解压运行命令:linux:   ./mycatstart启动   ./mycatstop停止   ./mycatconsole前台运行   ./mycatrestart重启服务   ./mycatpause暂停   ./mycatstatus查看启动状态windows: