首页 > 技术文章 > MyCat读写分离

cxyyh 2019-05-05 18:18 原文

第一、MyCat简介

Mycat 背后是阿里曾经开源的知名产品——Cobar。Cobar 的核心功能和优势是 MySQL 数据库分片,此产品曾经广为流传,据说最早的发起者对 Mysql 很精通,后来从阿里跳槽了,阿里随后开源的 Cobar,

并维持到 2013 年年初,然后,就没有然后了。Cobar 的思路和实现路径的确不错。基于 Java 开发的,实现了 MySQL 公开的二进制传输协议,巧妙地将自己伪装成一个 MySQL Server,

目前市面上绝大多数 MySQL 客户端工具和应用都能兼容。比自己实现一个新的数据库协议要明智的多,因为生态环境在哪里摆着。Mycat 是基于 cobar 演变而来,对 cobar 的代码进行了彻底的重构,

使用 NIO 重构了网络模块,并且优化了 Buffer 内核,增强了聚合,Join 等基本特性,同时兼容绝大多数数据库成为通用的数据库中间件。

简单的说,MyCAT就是:一个新颖的数据库中间件产品支持mysql集群,或者mariadb cluster,提供高可用性数据分片集群。你可以像使用mysql一样使用mycat。对于开发人员来说根本感觉不到mycat的存在。

MyCAT原理MyCAT主要是通过对SQL的拦截,然后经过一定规则的分片解析、路由分析、读写分离分析、缓存分析等,然后将SQL发给后端真实的数据块,并将返回的结果做适当处理返回给客户端。

MyCat支持的数据库

 

 第二、基于MyCat实现读写分离

 读写分离,简单地说是把对数据库的读和写操作分开,以对应不同的数据库服务器。主数据库提供写操作,从数据库提供读操作,这样能有效地减轻单台数据库的压力。主数据库进行写操作后,

数据及时同步到所读的数据库,尽可能保证读、写数据库的数据一致,比如MySQL的主从复制、Oracle的data guard、SQL Server的复制订阅等。

分析图如下:

 (来自网上找)

 

 (自己理解画)

 第三、MyCat的下载与安装

    1、MySql的离线安装安装与启动

         JDK:要求jdk必须是1.7及以上版本

        MySQL:推荐mysql是5.5以上版本

         MySQL安装与启动步骤如下:( 步骤1-5省略 )

(1)将MySQL的服务端和客户端安装包(RPM)上传到服务器

(2)查询之前是否安装过MySQL

        rpm -qa|grep -i mysql

(3)卸载旧版本MySQL

       rpm -e --nodeps  软件名称

(4)安装服务端

     rpm -ivh MySQL-server-5.5.49-1.linux2.6.i386.rpm

(5)安装客户端

     rpm -ivh MySQL-client-5.5.49-1.linux2.6.i386.rpm

(6)启动MySQL服务

    service mysql start

(7)登录MySQL 

     mysql -u root

(8)设置远程登录权限

       GRANT ALL PRIVILEGES ON *.* TO 'root'@'%'IDENTIFIED BY '123456'  WITH GRANT OPTION;

  在本地SQLyog 连接远程MySQL进行测试  

2、Mysql的在线安装与启动

  1. 先检查系统是否装有mysql

rpm -qa | grep mysql

         2.下载mysql的repo源

wget http://repo.mysql.com/mysql-community-release-el7-5.noarch.rpm

 报错: -bash: wget: 未找到命令

 安装插件  yum -y install wget

        3.安装mysql-community-release-el7-5.noarch.rpm包

sudo rpm -ivh mysql-community-release-el7-5.noarch.rpm

          4.安装MySQL

sudo yum install mysql-server

         5.重置MySQL密码

          6.  mysql -u root

   报错:

      ERROR 2002 (HY000): Can't connect to local MySQL server through socket '/var/lib/mysql/mysql.sock' (2)

原因:原因是/var/lib/mysql的访问权限问题。

           chown root /var/lib/mysql/

         7.重启MySQL服务

                  service mysqld restart

         8.接着登陆设置密码

              mysql -u root

             use mysql;

             update user set password=password('123456') where user='root';

            exit;

        9.接着继续重启MySQL服务

                service mysqld restart

       10.接着设置Root账户远程连接密码

                 mysql -u root -p

            GRANT ALL PRIVILEGES ON *.* TO root@"%" IDENTIFIED BY "root"; 

      重启服务器 service mysqld restart

       12.使用外网工具连接MySQL

        13.关闭防火墙

             systemctl stop firewalld.service

             https://www.jianshu.com/p/1223f65ac52e

 3、MyCat的下载与启动

MyCat:

MyCat的官方网站:

http://www.mycat.org.cn/

下载地址:

https://github.com/MyCATApache/Mycat-download

第一步:将Mycat-server-1.4-release-20151019230038-linux.tar.gz上传至服务器

第二步:将压缩包解压缩。建议将mycat放到/usr/local/mycat目录下。

 

tar -xzvf Mycat-server-1.4-release-20151019230038-linux.tar.gz

mv mycat /usr/local

第三步:进入mycat目录的bin目录,启动mycat

./mycat start

停止:

./mycat stop

mycat 支持的命令{ console | start | stop | restart | status | dump }

Mycat的默认端口号为:8066

第四步:查看/usr/local/mycat/logs wrapper.log日志 如果是为successfully 则启动成功

查看实时日志 tail  -f  /usr/local/mycat/logs mycat.log

配置文件介绍

4、MyCat的配置详解

查看网站:https://blog.csdn.net/tornadojava/article/details/54948662

5、MyCat实现读写分离

数据库读写分离对于大型系统或者访问量很高的互联网应用来说,是必不可少的一个重要功能。对于MySQL来说,

标准的读写分离是主从模式,一个写节点Master后面跟着多个读节点,读节点的数量取决于系统的压力,通常是1-3个读节点的配置

Mycat读写分离和自动切换机制,需要mysql的主从复制机制配合。

SpringBoot项目整合动态数据源(读写分离) 1.配置多个数据源,根据业务需求访问不同的数据,指定对应的策略:增加,删除,修改操作访问对应数据,查询访问对应数据,

不同数据库做好的数据一致性的处理。由于此方法相对易懂,简单,不做过多介绍。 2. 动态切换数据源,根据配置的文件,业务动态切换访问的数据库:此方案通过Spring的AOP,AspactJ来实现动态织入,通过编程继承实现Spring中的AbstractRoutingDataSource,来实现数据库访问的动态切换,不仅可以方便扩展,不影响现有程序,而且对于此功能的增删也比较容易。 3. 通过mycat来实现读写分离:使用mycat提供的读写分离功能,mycat连接多个数据库,数据源只需要连接mycat,对于开发人员而言他还是连接了一个数据库(实际是mysql的mycat中间件),而且也不需要根据不同 业务来选择不同的库,这样就不会有多余的代码产生。 详细参考配置

动态数据源核心配置 在Spring 2.0.1中引入了AbstractRoutingDataSource, 该类充当了DataSource的路由中介, 能有在运行时, 根据某种key值来动态切换到真正的DataSource上。

1.项目中需要集成多个数据源分别为读和写的数据源,绑定不同的key。

2.采用AOP技术进行拦截业务逻辑层方法,判断方法的前缀是否需要写或者读的操作

3.如果方法的前缀是写的操作的时候,直接切换为写的数据源,反之切换为读的数据源 也可以自己定义注解进行封装

 案例看githup源码:https://github.com/yhcxy/sourceCode

 第三、MyCat分片

1、概念

简单来说,就是指通过某种特定的条件,将我们存放在同一个数据库中的数据分散存放到多个数据库(主机)上面,以达到分散单台设备负载的效果。

数据的切分(Sharding)根据其切分规则的类型,可以分为两种切分模式。

   (1)一种是按照不同的表(或者Schema)来切分到不同的数据库(主机)之上,这种切分可以称之为数据的垂直(纵向)切分

(2)另外一种则是根据表中的数据的逻辑关系,将同一个表中的数据按照某种条件拆分到多台数据库(主机)上面,这种切分称之为数据的水平(横向)切分。

MyCat分片策略:

 

   

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

推荐阅读