MySQL之中间件Mycat实现读写分离

目录

一、MySQL 读写分离的概述

1、读写分离工作原理

2、为什么要读写分离

3、实现读写分离的方式

4、常见的中间件程序

二、什么是MyCAT?

三、Mycat应用场景

四、Mycat 简单概括

五、Mycat实现mysql读写分离

1、环境准备

2、初始化环境

3、主从配置

3.1、主mysql服务器配置(192.168.58.33)

 3.2、从mysql服务器配置(192.168.59.112)

 4、安装mycat(192.168.58.20)

5、客户机上测试(192.168.58.35)

 6、修改 mycat 配置文件

7、主服务器上建立一个用户

8、修改 mycat 配置文件/apps/mycat/conf/schema.xml

9、客户端测试读写分离

 六、总结


一、MySQL 读写分离的概述

Mysql 作为目前世界上使用最广泛的免费数据库,相信所有从事系统运维的工程师都一定接触过。但在实际的生产环境中,由单台MySQL    作为独立的数据库是完全不能满足实际需求的,无论是在安全性, 高可用性以及高并发等各个方面。

因此,一般来说都是通过主从复制(Master-Slave)的方式来同步数据,再通过读写分离(MySQL-Proxy/Amoeba)来提升数据库的并发负载能力,这样的方案来进行部署与实施的。

1、读写分离工作原理

基本的原理是让主数据库处理事务性增、改、删操作(INSERT、UPDATE、DELETE),而从数据库    处理SELECT 查询操作。数据库复制被用来把事务性操作导致的变更同步到集群中的从数据库

2、为什么要读写分离

① 面对越来越大的访问压力,单台的服务器的性能成为瓶颈,需要分担负载
② 主从只负责各自的写和读,极大程度的缓解 X 锁和S 锁争用
③ 从库可配置myisam     引擎,提升查询性能以及节约系统开销
④ 增加冗余,提高可用性

3、实现读写分离的方式

一般有两种方式实现

应用程序层实现,网站的程序实现
应用程序层实现指的是在应用程序内部及连接器中实现读写分离

优点:

① 应用程序内部实现读写分离,安装既可以使用;
② 减少一定部署难度;
③ 访问压力在一定级别以下,性能很好。

缺点:

① 架构一旦调整,代码要跟着变;
② 难以实现高级应用,如自动分库,分表;
③ 无法适用大型应用场景。

4、常见的中间件程序

Cobar

阿里巴巴B2B 开发的关系型分布式系统,管理将近 3000 个MySQL 实例。 在阿里经受住了考验, 后面由于作者的走开的原因 cobar 没有人维护 了,阿里也开发了 tddl 替代cobar。

MyCAT

社区爱好者在阿里 cobar 基础上进行二次开发,解决了 cobar 当时存 在的一些问题,并且加入了许多新的功能在其中。目前 MyCAT 社区活   跃度很高,目前已经有一些公司在使用 MyCAT。总体来说支持度比 较高,也会一直维护下去,

OneProxy

数据库界大牛,前支付宝数据库团队领导楼总开发,基于 mysql 官方 的proxy 思想利用c 进行开发的,OneProxy   是一款商业收费的中间件,舍去了一些功能点,专注在性能和稳定性上。有朋友测试过说在 高并发下很稳定。

Vitess

这个中间件是Youtube 生产在使用的,但是架构很复杂。   与以往中间件不同,使用 Vitess 应用改动比较大要 使用他提供语言的API 接口,我们可以借鉴他其中的一些设计思想。

Kingshard

Kingshard 是前 360Atlas 中间件开发团队的陈菲利用业务时间 用go 语言开发的,目前参与开发的人员有 3 个左右, 目前来看还不是成熟可以使用的产品,需要在不断完善。

Atlas

360 团队基于mysql proxy 把 lua 用C 改写。原有版本是支持分表, 目前已经放出了分库分表版本。在网上看到一些朋友经常说在高并 发下会经常挂掉,如果大家要使用需要提前做好测试。

MaxScale 与MySQL Route

这两个中间件都算是官方的,MaxScale 是mariadb (MySQL   原作者维护的一个版本)研发的,目前版本不支持分库分表。MySQL Route 是现在MySQL 官方 Oracle 公司发布出来的一个中间件

二、什么是MyCAT?

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

三、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 简单概括

1、一个彻底开源的,面向企业应用开发的大数据库集群

2、支持事务、ACID、可以替代MySQL的加强版数据库

3、一个可以视为MySQL集群的企业级数据库,用来替代昂贵的Oracle集群

4、一个融合内存缓存技术、NoSQL技术、HDFS大数据的新型SQL Server

5、结合传统数据库和新型分布式数据仓库的新一代企业级数据库产品

6、一个新颖的数据库中间件产品

五、Mycat实现mysql读写分离

1、环境准备

master服务器192.168.58.33
slave1服务器192.168.58.19
mycat服务器192.168.58.20
客户机192.168.58.35

2、初始化环境

#每台服务器上都初始化,关闭防火墙
systemctl stop firewalld
systemctl disable firewalld
setenforce 0

3、主从配置

3.1、主mysql服务器配置(192.168.58.33)

#修改配置文件
vim /etc/my.cnf
server-id = 1
log-bin=master-bin
binlog_format=MIXED
log-slave-updates=true


#重启服务
systemctl restart mysqld
 
(3)#进入数据库授权,查看二进制文件及节点号
mysql -uroot -p123123
grant replication slave on *.* to 'myslave'@'192.168.58.%' identified by '123456';
flush privileges;
show master status;
 

 3.2、从mysql服务器配置(192.168.59.112)

(1)#修改配置文件
vim /etc/my.cnf
server-id = 2
relay-log=relay-log-bin
relay-log-index=slave-relay-bin.index
 
(2)#重启服务
systemctl restart mysqld
 
(3)#进入数据库授权,查看二进制文件及节点号
mysql -uroot -p123123
change master to master_host='192.168.59.113',master_user='myslave',master_password='123456',master_log_file='master-bin.0000012',master_log_pos=603;
 
start slave;
show slave status\G;
 
##一定要出现
#Slave_IO_Running: Yes
#Slave_SQL_Running: Yes

#一般 Slave_IO_Running: No 的可能性:
1、网络不通
2、my.cnf配置有问题
3、密码、file文件名、pos偏移量不对
4、防火墙没有关闭

验证主从复制效果

 4、安装mycat(192.168.58.20)

 MyCAT 目录说明

bin : mycat命令,启动、重启、停止等运行目录
catlet: catlet为Mycat的一个扩展功能
conf : mycat配置信息,重点关注
lib: mycat引用的jar包,,Mycat是java开发的
logs :日志文件,包括Mycat启动的日志和运行的日志version.txt : mycat版本说明
wrapper.log:mycat启动日志
mycat.log:mycat详细工作日志
切换至opt目录,下载mycat安装包
wget http://dl.mycat.org.cn/1.6.7.6/20210303094759/Mycat-server-1.6.7.6-release-20210303094759-linux.tar.gz

创建/usr/local/mycat文件夹,并解压mycat包至/mycat下

tar zxvf Mycat-server-1.6.7.6-release-20210303094759-linux.tar.gz -C /usr/local/mycat


设置变量环境
echo 'PATH=/usr/local/mycat/bin:$PATH' > /etc/profile.d/mycat.sh
source /etc/profile.d/mycat.sh

④ 启动mycat,查看日志文件,最后可以看到启动成功
mycat start
注:内存小于2G启动不了
Starting Mycat-server...

#tail -f /usr/local/mycat/logs/wrapper.log
#启动成功日志末尾会出现successfully

5、客户机上测试(192.168.58.35)

客户端连接数据库
#这里密码初始为123456   需要加端口
mysql -uroot -p123456 -h 192.168.10.13 -P8066

 6、修改 mycat 配置文件

修改 mycat 配置文件 /usr/local/mycat/conf/server.xml
#去掉44行行注释,对应的在51行行末注释,删除50行行末注释,5 * 60 * 1000L; //连接空> 闲检查

#修改45行端口号为3306
45 <property name="serverPort">3306</property>
#配置Mycat的连接信息(账号密码),在110 和111行, 可以修改,这边不修改了


####参数解释说明####
110         <user name="root" defaultAccount="true">
111                 <property name="password">123456</property>
112                 <property name="schemas">TESTDB</property>
113                 <property name="defaultSchema">TESTDB</property>

116                 <!-- 表级 DML 权限设置 -->
117                 <!-- 
118                 <privileges check="false">
119                         <schema name="TESTDB" dml="0110" >
120                                 <table name="tb01" dml="0000"></table>
121                                 <table name="tb02" dml="1111"></table>
122                         </schema>
123                 </privileges>   
124                  -->

127         <user name="user">
128                 <property name="password">user</property>
129                 <property name="schemas">TESTDB</property>
130                 <property name="readOnly">true</property>
131                 <property name="defaultSchema">TESTDB</property>

user             用户配置节点
name             逻辑用户名,客户端登录MyCAT的用户名,也就是客户端用来连接Mycat的用户名。
password         客户端登录MyCAT的密码
schemas          数据库名,这里会和schema.xml中的配置关联,可配置多个,多个用逗号分开,例如:db1,db2
privileges       配置用户针对表的增删改查的权限
readOnly mycat   逻辑库所具有的权限。true为只读,false为读写都有,默认为false

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

 改动前 

#去掉44行注释,50行末注释,51行末注释

修改后

 #第45行,修改端口号

 #密码用户 在110 和111 可以修改,这边不修改了

7、主服务器上建立一个用户

mysql -uroot -p123123
GRANT ALL ON *.* TO 'root'@'192.168.59.%' IDENTIFIED BY '123456';
 
#查看创建成功
use mysql;
select user,host from user;

8、修改 mycat 配置文件/apps/mycat/conf/schema.xml

schema.xml是最主要的配置项,此文件关联mysql读写分离策略,
读写分离、分库分表策略、分片节点都是在此文件中配置的.MyCat作为中间件,
它只是一个代理,本身并不进行数据存储,需要连接后端的MySQL物理服务器,此文件就是用来连接MySQL服务器的。


#vim  /usr/local/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" dataNode="dn1"></schema>
        <dataNode name="dn1" dataHost="localhost1" database="hellodb" />
        <dataHost name="localhost1" maxCon="1000" minCon="10" balance="1"
                  writeType="0" dbType="mysql" dbDriver="native" switchType="1"  slaveThreshold="100">
                <heartbeat>select user()</heartbeat>
                <writeHost host="host1" url="192.168.58.33:3306" user="root" password="123456">
                 <readHost host="host2" url="192.168.58.19:3306" user="root" password="123456"/>

                </writeHost>
        </dataHost>
</mycat:schema>


解释
<?xml version="1.0"?>
<!DOCTYPE mycat:schema SYSTEM "schema.dtd">
<mycat:schema xmlns:mycat="http://io.mycat/">
        <schema name="TESTDB" checkSQLschema="false" sqlMaxLimit="100" dataNode="dn1">
        #schema标签:数据库设置,此数据库为逻辑数据库,name与server.xml中schema对应。
        #name:逻辑数据库名,与server.xml中的schema对应;
        #checkSQLschema: 数据库前缀相关设置,这里为false;
        #sqlMaxLimit:  select时默认的limit,避免查询全表,否则可能会遇到查询量特别大的情况造成卡 死;
        #dataNode:表存储到哪些节点,多个节点用逗号分隔。节点为下文dataNode设置的name
</schema>
        <dataNode name="dn1" dataHost="localhost1" database="hellodb" />
        #dataNode标签: 定义mycat中的数据节点,也是通常说的数据分片,也就是分库相关配置
        #name: 定义数据节点的名字,与table中dataNode对应
        #datahost: 物理数据库名,与datahost中name对应,该属性用于定义该分片属于哪个数据库实例
        #database: 物理数据库中数据库名,该属性用于定义该分片属性哪个具体数据库实例上的具体库
        <dataHost name="localhost1" maxCon="1000" minCon="10" balance="1"
        #dataHost标签: 物理数据库,真正存储数据的数据库
        #name: 物理数据库名,与dataNode中dataHost对应
        #maxCon属性指定每个读写实例连接池的最大连接。也就是说,标签内嵌套的writeHost、readHost标  签都会使用这个属性的值来实例化出连接池的最大连接数
        #minCon属性指定每个读写实例连接池的最小连接,初始化连接池的大小
        #balance: 均衡负载的方式
       
                  writeType="0" dbType="mysql" dbDriver="native" switchType="1"  slaveThreshold="100">
                  #writeType: 写入方式
                  #dbType: 数据库类型
                  #dbDriver指定连接后端数据库使用的 Driver,目前可选的值有 native 和 JDBC。用 native 的话,因为这个值执行的是二进制的 mysql 协议,所以可以使用 mysql 和maridb。其他类型的数据库则需要使用 JDBC 驱动来支持。
                  #switchType:  “-1” 表示不自动切换; “1” 默认值,自动切换; “2” 基于 MySQL主从同步的状态决定是否切换心跳语句为 show slave status; “3” 基于 MySQL galary cluster 的切换机制(适合集群)(1.4.1)心跳语句为 show status like ‘wsrep%’.
                <heartbeat>select user()</heartbeat>
                #heartbeat: 心跳检测语句,注意语句结尾的分号要加
                <writeHost host="host1" url="192.168.59.113:3306" user="root" password="123456">
                #host:用于标识不同实例,一般 writeHost 我们使用*M1,readHost 我们用*S1。
                #url:后端实例连接地址。Native:地址:端口 JDBC:jdbc的url
                #user:后端存储实例需要的用户名字
                #password:后端存储实例需要的密码
                 <readHost host="host2" url="192.168.59.112:3306" user="root" password="123456"/>

                </writeHost>
        </dataHost>
</mycat:schema>


#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和eadHost。但是,如果writeHost指定的后端数据库宕机,那么这个writeHost绑定的所有readHost都将不可用。另一方面,由于这个writeHost宕机系统会自动的检测到,并切换到备用的writeHost上去   
               
#PS:Mycat主从分离只是在读的时候做了处理,写入数据的时候,只会写入到writehost,需要通过mycat的主从复制将数据复制到readhost




 如果本地mycat服务器上安装了mysql需要关掉,否则端口会冲突

 #重启mycat,并查看3306端口

#如果本地mycat服务器上安装了mysql需要关掉,否则端口会冲突
systemctl stop mysqld.service
 
(3)#重启mycat,并查看3306端口
 mycat restart    
 netstat -antp|grep 3306

9、客户端测试读写分离

#在主、从服务器打开日志
set global general_log=1; 
 
#在客户机查看是否开启成功
show variables like 'general%';
 
#在主从服务器实时查看日志
tail -f /usr/local/mysql/data/localhost.log
 
#在客户机上汪表里插入数据,并查看主从服务器实时日志
insert into teachers values(5,'Xiao Ming',46,'F');
 
#在客户机查看表信息,并查看主从服务器实时日志
select * from teachers;

#打开通用日志 

 #在主从服务器实时查看日志

#在客户机上,表里插入数据

在客户机上写数据信息,在master上

 六、总结

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值