1500字范文,内容丰富有趣,写作好帮手!
1500字范文 > Mycat原理详解 Mycat 实现 MySQL 的读写分离(Mysql主从复制)

Mycat原理详解 Mycat 实现 MySQL 的读写分离(Mysql主从复制)

时间:2019-07-17 08:31:58

相关推荐

Mycat原理详解 Mycat 实现 MySQL 的读写分离(Mysql主从复制)

文章目录

1 Mycat 介绍2 Mycat 安装2.1下载安装JDK2.2下载安装mycat2.3启动和连接3 Mycat 主要配置文件说明4 利用 Mycat 实现 MySQL 的读写分离4.1 创建 MySQL 主从数据库4.1.1 修改master和slave上的配置文件4.1.2 Master上创建复制用户4.1.3 Slave上执行4.2 在MySQL代理服务器10.0.0.8安装mycat并启动4.3 mycat 服务器上修改server.xml文件配置Mycat的连接信息4.4 修改schema.xml实现读写分离策略4.5 在后端主服务器创建用户并对mycat授权4.6 在Mycat服务器上连接并测试4.7 停止从节点,MyCAT自动调度读请求至主节点

1 Mycat 介绍

在整个IT系统架构中,数据库是非常重要,通常又是访问压力较大的一个服务,除了在程序开发的本身做优化,如:SQL语句优化、代码优化,数据库的处理本身优化也是非常重要的。主从、热备、分表分库等都是系统发展迟早会遇到的技术问题问题。Mycat是一个广受好评的数据库中间件,已经在很多产

品上进行使用了。

Mycat是一个开源的分布式数据库系统,是一个实现了MySQL协议的服务器,前端用户可以把它看作是一个数据库代理(类似于Mysql Proxy),用MySQL客户端工具和命令行访问,而其后端可以用MySQL原生协议与多个MySQL服务器通信,也可以用JDBC协议与大多数主流数据库服务器通信,其核心功能是分表分库,即将一个大表水平分割为N个小表,存储在后端MySQL服务器里或者其他数据库里。

Mycat发展到目前的版本,已经不是一个单纯的MySQL代理了,它的后端可以支持MySQL、SQL Server、Oracle、DB2、PostgreSQL等主流数据库,也支持MongoDB这种新型NoSQL方式的存储,未来还会支持更多类型的存储。而在最终用户看来,无论是那种存储方式,在MyCat里,都是一个传统的数据库表,支持标准的SQL语句进行数据的操作,这样一来,对前端业务系统来说,可以大幅降低开发

难度,提升开发速度

Mycat 可以简单概括为

一个彻底开源的,面向企业应用开发的大数据库集群支持事务、ACID、可以替代MySQL的加强版数据库一个可以视为MySQL集群的企业级数据库,用来替代昂贵的Oracle集群一个融合内存缓存技术、NoSQL技术、HDFS大数据的新型SQL Server结合传统数据库和新型分布式数据仓库的新一代企业级数据库产品一个新颖的数据库中间件产品

Mycat 官网链接:.cn/

Mycat 关键特性支持SQL92标准遵守MySQL 原生协议,跨语言,跨平台,跨数据库的通用中间件代理基于心跳的自动故障切换,支持读写分离,支持MySQL主从,以及galera cluster集群支持Galera for MySQL集群,Percona Cluster或者MariaDB cluster基于Nio实现,有效管理线程,高并发问题支持数据的多片自动路由与聚合,支持sum,count,max等常用的聚合函数,支持跨库分页支持单库内部任意join,支持跨库2表join,甚至基于caltlet的多表join支持通过全局表,ER关系的分片策略,实现了高效的多表join查询支持多租户方案支持分布式事务(弱xa)支持全局序列号,解决分布式下的主键生成问题分片规则丰富,插件化开发,易于扩展强大的web,命令行监控支持前端作为mysq通用代理,后端JDBC方式支持Oracle、DB2、SQL Server 、 mongodb 、巨杉支持密码加密支持服务降级支持IP白名单支持SQL黑名单、sql注入攻击拦截支持分表(1.6)集群基于ZooKeeper管理,在线升级,扩容,智能优化,大数据处理(2.0开发版)

为什么要用MyCat ?

这里要先搞清楚Mycat和MySQL的区别(Mycat的核心作用)。我们可以把上层看作是对下层的抽象,例如操作系统是对各类计算机硬件的抽象。那么我们什么时候需要抽象?假如只有一种硬件的时候,我们需要开发一个操作系统吗?再比如一个项目只需要一个人完成的时候不需要leader,但是当需要几十人完成时,就应该有一个管理者,发挥沟通协调等作用,而这个管理者对于他的上层来说就是对项目组

的抽象同样的,当我们的应用只需要一台数据库服务器的时候我们并不需要Mycat,而如果你需要分库甚至分表,这时候应用要面对很多个数据库的时候,这个时候就需要对数据库层做一个抽象,来管理这些数据库,而最上面的应用只需要面对一个数据库层的抽象或者说数据库中间件就好了,这就是Mycat的核心

作用。所以可以这样理解:数据库是对底层存储文件的抽象,而Mycat是对数据库的抽象

Mycat工作原理

Mycat的原理中最重要的一个动词是"拦截",它拦截了用户发送过来的SQL语句,首先对SQL语句做了一些特定的分析:如分片分析、路由分析、读写分离分析、缓存分析等,然后将此SQL发往后端的真实数据库,并将返回的结果做适当的处理,最终再返回给用户

Mycat应用场景

Mycat适用的场景很丰富,以下是几个典型的应用场景单纯的读写分离,此时配置最为简单,支持读写分离,主从切换分表分库,对于超过1000万的表进行分片,最大支持1000亿的单表分片多租户应用,每个应用一个库,但应用程序只连接Mycat,从而不改造程序本身,实现多租户化报表系统,借助于Mycat的分表能力,处理大规模报表的统计替代Hbase,分析大数据作为海量数据实时查询的一种简单有效方案,比如100亿条频繁查询的记录需要在3秒内查询出来结果,除了基于主键的查询,还可能存在范围查询或其他属性查询,此时Mycat可能是最简单有效的选择Mycat长期路线图强化分布式数据库中间件的方面的功能,使之具备丰富的插件、强大的数据库智能优化功能、全面的系统监控能力、以及方便的数据运维工具,实现在线数据扩容、迁移等高级功能进一步挺进大数据计算领域,深度结合Spark Stream和Storm等分布式实时流引擎,能够完成快速的巨表关联、排序、分组聚合等 OLAP方向的能力,并集成一些热门常用的实时分析算法,让工程师以及DBA们更容易用Mycat实现一些高级数据分析处理功能不断强化Mycat开源社区的技术水平,吸引更多的IT技术专家,使得Mycat社区成为中国的Apache,并将Mycat推到Apache基金会,成为国内顶尖开源项目,最终能够让一部分志愿者成为专职的Mycat开发者,荣耀跟实力一起提升

Mycat不适合的应用场景设计使用Mycat时有非分片字段查询,请慎重使用Mycat,可以考虑放弃!设计使用Mycat时有分页排序,请慎重使用Mycat,可以考虑放弃!设计使用Mycat时如果要进行表JOIN操作,要确保两个表的关联字段具有相同的数据分布,否则请慎重使用Mycat,可以考虑放弃!设计使用Mycat时如果有分布式事务,得先看是否得保证事务得强一致性,否则请慎重使用Mycat,可以考虑放弃!

2 Mycat 安装

2.1下载安装JDK

yum -y install java

#确认安装成功

java -version

2.2下载安装mycat

wget .cn/1.6.7.4/Mycat-server-1.6.7.4-release/Mycat-server-1.6.7.4-release-0105164103-linux.tar.gz

mkdir /apps

tar xvf Mycat-server-1.6.7.4-release-0105164103-linux.tar.gz -C /apps

mycat安装目录结构:

bin mycat命令,启动、重启、停止等catlet catlet为Mycat的一个扩展功能conf Mycat 配置信息,重点关注lib Mycat引用的jar包,Mycat是java开发的logs 日志文件,包括Mycat启动的日志和运行的日志version.txt mycat版本说明

logs目录:wrapper.log mycat启动日志mycat.log mycat详细工作日志

Mycat的配置文件都在conf目录里面,这里介绍几个常用的文件:server.xml Mycat软件本身相关的配置文件,设置账号、参数等schema.xml Mycat对应的物理数据库和数据库表的配置,读写分离、高可用、分布式策略定制、节点控制rule.xml Mycat分片(分库分表)规则配置文件,记录分片规则列表、使用方法等

2.3启动和连接

#配置环境变量

vim /etc/profile.d/mycat.sh

PATH=/apps/mycat/bin:$PATH

source /etc/profile.d/mycat.sh

#启动

mycat start

#查看日志,确定成功

cat /app/mycat/logs/wrapper.log

…省略… INFO | jvm 1 | /11/06 21:41:02 | MyCAT Server startup

successfully. see logs in logs/mycat.log

#连接mycat:

mysql -uroot -p123456 -h 127.0.0.1 -P8066

3 Mycat 主要配置文件说明

server.xml

存放Mycat软件本身相关的配置文件,比如:连接Mycat的用户,密码,数据库名称等

server.xml文件中配置的参数解释说明:

注意:

server.xml文件里登录mycat的用户名和密码可以任意定义,这个账号和密码是为客户机登录mycat时使用的账号信息逻辑库名(如上面的TESTDB,也就是登录mycat后显示的库名,切换这个库之后,显示的就是代理的真实mysql数据库的表)要在schema.xml里面也定义,否则会导致mycat服务启动失败!这里只定义了一个标签,所以把多余的都注释了。如果定义多个标签,即设置多个连接mycat的用户名和密码,那么就需要在schema.xml文件中定义多个对应的库!

schema.xml

是最主要的配置项,此文件关联mysql读写分离策略,读写分离、分库分表策略、分片节点都是在此文

件中配置的.MyCat作为中间件,它只是一个代理,本身并不进行数据存储,需要连接后端的MySQL物理

服务器,此文件就是用来连接MySQL服务器的

schema.xml文件中配置的参数解释说明:

配置说明

name属性唯一标识dataHost标签,供上层的标签使用。maxCon属性指定每个读写实例连接池的最大连接。也就是说,标签内嵌套的writeHost、readHost标签都会使用这个属性的值来实例化出连接池的最大连接数minCon属性指定每个读写实例连接池的最小连接,初始化连接池的大小

每个节点的属性逐一说明

schema:

table:

dataNode:

dataHost:

schema.xml文件中有三点需要注意:balance=“1”,writeType=“0” ,switchType=“1”

schema.xml中的balance的取值决定了负载均衡对非事务内的读操作的处理。balance 属性负载均衡类型,目前的取值有 4 种:

balance=“0”:不开启读写分离机制,所有读操作都发送到当前可用的writeHost上,即读请求仅发送到writeHost上balance=“1”:一般用此模式,读请求随机分发到当前writeHost对应的readHost和standby的writeHost上。即全部的readHost与stand by writeHost 参与 select 语句的负载均衡,简单的说,当双主双从模式(M1 ->S1 , M2->S2,并且 M1 与 M2 互为主备),正常情况下, M2,S1, S2 都参与 select 语句的负载均衡balance=“2”:读请求随机分发到当前dataHost内所有的writeHost和readHost上。即所有读操作都随

机的在writeHost、 readhost 上分发balance=“3”:读请求随机分发到当前writeHost对应的readHost上。即所有读请求随机的分发到wiriterHost 对应的 readhost 执行, writerHost 不负担读压力,注意 balance=3 只在 1.4 及其以后版本有,1.3 没有

writeHost和readHost 标签

这两个标签都指定后端数据库的相关配置给mycat,用于实例化后端连接池。

**唯一不同的是:**writeHost指定写实例、readHost指定读实例,组着这些读写实例来满足系统的要求。在一个dataHost内可以定义多个writeHost和readHost。但是,如果writeHost指定的后端数据库宕机,那么这个writeHost绑定的所有readHost都将不可用。另一方面,由于这个writeHost宕机系统会自动的检测到,并切换到备用的writeHost上去

注意:

Mycat主从分离只是在读的时候做了处理,写入数据的时候,只会写入到writehost,需要通过mycat的主从复制将数据复制到readhost

4 利用 Mycat 实现 MySQL 的读写分离

所有主机的系统环境:

cat /etc/centos-release

服务器共三台

mycat-server 10.0.0.8 #内存建议2G以上mysql-master 10.0.0.18 MySQL 8.0 或者Mariadb 10.3.17mysql-slave 10.0.0.28 MySQL 8.0 或者Mariadb 10.3.17

关闭SELinux和防火墙systemctl stop firewalldsetenforce 0时间同步

4.1 创建 MySQL 主从数据库

yum -y install mysql-server

4.1.1 修改master和slave上的配置文件

#master[root@centos8 ~]#vim /etc/f.d/mysql-f[mysqld]server-id = 1log-bin=/data/logbin/mysql-bin[root@centos8 ~]# mkdir /data/logbin[root@centos8 ~]#chown mysql.mysql /data/logbin/[root@centos8 ~]#systemctl start mysqld

#slave[mysqld]log-binserver-id = 2[root@centos8 ~]#systemctl start mysqld

4.1.2 Master上创建复制用户

查看主节点二进制日志

mysql > show master logs;

记下最后一条二进制日志:

mysql-bin.000003 以及 File_size:534

mysql -uroot -p

Mysql8.0上不支持

GRANT REPLICATION SLAVE ON *.* TO 'repluser'@'10.0.0.%' IDENTIFIED BY '123456'

Mysql8.0下应执行以下两条命令:

create user repluser@'10.0.0.%' identified by '123456'

grant replication slave on *.* to repluser@"10.0.0.%";

4.1.3 Slave上执行

[root@centos8 ~]#mysql -uroot -p

mysql> CHANGE MASTER TO->MASTER_HOST='10.0.0.%',->MASTER_USER='repluser',->MASTER_PASSWORD='123456',->MASTER_LOG_FILE='mysql-bin.000001',->MASTER_LOG_POS=354;mysql> start slave;Query OK, 0 rows affected (0.00 sec)

4.2 在MySQL代理服务器10.0.0.8安装mycat并启动

root@centos8 ~]#yum -y install java #确认安装成功[root@centos8 ~]#java -versionopenjdk version "1.8.0_201"OpenJDK Runtime Environment (build 1.8.0_201-b09)OpenJDK 64-Bit Server VM (build 25.201-b09, mixed mode)

#下载并安装[root@centos8 ~]#wget .cn/1.6.7.6/0303094759/Mycat-server-1.6.7.6-release-0303094759-linux.tar.gz[root@centos8 ~]#mkdir /apps[root@centos8 ~]#tar xvf Mycat-server-1.6.7.6-release-0303094759-linux.tar.gz -C /apps/#配置环境变量[root@centos8 ~]#echo 'PATH=/apps/mycat/bin:$PATH' > /etc/profile.d/mycat.sh[root@centos8 ~]#source /etc/profile.d/mycat.sh

#启动mycat

[root@centos8 ~]#mycat startStarting Mycat-server...

#可以看到打开多个端口,其中8066端口用于连接MyCAT

[root@centos8 ~]#ss -ntlpState Recv-Q Send-Q Local Address:Port Peer Address:Port LISTEN01280.0.0.0:220.0.0.0:*users:(("sshd",pid=791,fd=5)) LISTEN01127.0.0.1:32000 0.0.0.0:*users:(("java",pid=4640,fd=4)) LISTEN0128 [::]:22 [::]:*users:(("sshd",pid=791,fd=7)) LISTEN050 *:1984 *:*users:(("java",pid=4640,fd=57)) LISTEN0100*:8066 *:*users:(("java",pid=4640,fd=87)) LISTEN050 *:43465 *:*users:(("java",pid=4640,fd=58)) LISTEN0100*:9066 *:*users:(("java",pid=4640,fd=83)) LISTEN050 *:45259 *:*users:(("java",pid=4640,fd=56))

#用默认密码123456来连接mycat

[root@centos8 ~]#mysql -uroot -p123456 -h 10.0.0.8 -P8066Welcome to the MariaDB monitor. Commands end with ; or \g.Your MySQL connection id is 1Server version: 5.6.29-mycat-1.6-RELEASE-1028204710 MyCat Server (OpenCloundDB)Copyright (c) 2000, , Oracle, MariaDB Corporation Ab and others.Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.MySQL [(none)]> show databases;+----------+| DATABASE |+----------+| TESTDB |+----------+1 row in set (0.01 sec)

4.3 mycat 服务器上修改server.xml文件配置Mycat的连接信息

[root@centos8 ~]#vim /apps/mycat/conf/server.xml...省略...#修改下面行的8066改为3306复制到到独立非注释行<property name="serverPort">3306</property><property name="handlelDistributedTransactions">0</property> #将上面行放在此行前面#或者删除注释,并修改下面行的8066改为3306<property name="serverPort">3306</property><property name="managerPort">9066</property><property name="idleTimeout">300000</property><property name="authTimeout">15000</property><property name="bindIp">0.0.0.0</property><property name="dataNodeIdleCheckPeriod">300000</property> #5 * 60 * 1000L; //连接空闲检查 删除#后面此部分<property name="frontWriteQueueSize">4096</property> <property name="processors">32</property> #--> 删除#后面此部分.....<user name="root"> #连接Mycat的用户名<property name="password">magedu</property>#连接Mycat的密码<property name="schemas">TESTDB</property> #数据库名要和schema.xml相对应</user></mycat:server>

4.4 修改schema.xml实现读写分离策略

[root@centos8 ~]#vim /apps/mycat/conf/schema.xml

<?xml version="1.0"?><!DOCTYPE mycat:schema SYSTEM "schema.dtd"><mycat:schema xmlns:mycat="http://io.mycat/"><schema name="TESTDB" checkSQLschema="false" sqlMaxLimit="100" randomDataNode="dn1"><!-- auto sharding by id (long) --><!--splitTableNames 启用<table name 属性使用逗号分割配置多个表,即多个表使用这个配置--><table name="t1,t2" dataNode="dn1,dn1,dn1" rule="auto-sharding-long" splitTableNames ="true"/><!-- <table name="oc_call" primaryKey="ID" dataNode="dn1$0-743" rule="latest-month-calldate"/> --></schema><!-- <dataNode name="dn1$0-743" dataHost="localhost1" database="db$0-743"/> --><dataNode name="dn1" dataHost="localhost1" database="mycat" /><!--<dataNode name="dn4" dataHost="sequoiadb1" database="SAMPLE" /><dataNode name="jdbc_dn1" dataHost="jdbchost" database="db1" /><dataNode name="jdbc_dn2" dataHost="jdbchost" database="db2" /><dataNode name="jdbc_dn3" dataHost="jdbchost" database="db3" /> --><dataHost name="localhost1" maxCon="1000" minCon="10" balance="1"writeType="0" dbType="mysql" dbDriver="native" switchType="1" slaveThreshold="100"><heartbeat>select user()</heartbeat><!-- can have multi write hosts --><writeHost host="hostM1" url="10.0.0.18:3306" user="root"password="123456"><readHost host="hostM2" url="10.0.0.28:3306" user="root"password="123456" /></writeHost><!-- <writeHost host="hostM2" url="localhost:3316" user="root" password="123456"/> --></dataHost></mycat:schema>

4.5 在后端主服务器创建用户并对mycat授权

[root@centos8 ~]#mysql -uroot -pmysql> create database mycat;mysql>GRANT ALL ON *.* TO 'root'@'10.0.0.%' IDENTIFIED BY '123456' ;mysql> flush privileges;

4.6 在Mycat服务器上连接并测试

[root@centos8 ~]#mysql -uroot -pmagedu -h127.0.0.1 TESTDBmysql> show databases;+----------+| DATABASE |+----------+| TESTDB | //只能看一个虚拟数据库+----------+mysql> use TESTDB;mysql> create table t1(id int);mysql> select @@server_id;+-------------+| @@server_id |+-------------+|2 |+-------------+1 row in set (0.00 sec)MySQL> select @@hostname;

4.7 停止从节点,MyCAT自动调度读请求至主节点

[root@slave ~]#systemctl stop mysql[root@client ~]#mysql -uroot -p123456 -h10.0.0.8 -P3306mysql> select @@server_id;+-------------+| @@server_id |+-------------+|1 |+-------------+1 row in set (0.00 sec)

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。