目录

一、MySQL 读写分离的概述

1、读写分离工作原理

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

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

9、客户端测试读写分离

六、总结


一、MySQL 读写分离的概述

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

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

1、读写分离工作原理

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

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 firewalldsystemctl disable firewalldsetenforce 0

 

3、主从配置

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

#修改配置文件vim /etc/my.cnfserver-id = 1log-bin=master-binbinlog_format=MIXEDlog-slave-updates=true#重启服务systemctl restart mysqld (3)#进入数据库授权,查看二进制文件及节点号mysql -uroot -p123123grant 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.cnfserver-id = 2relay-log=relay-log-binrelay-log-index=slave-relay-bin.index (2)#重启服务systemctl restart mysqld (3)#进入数据库授权,查看二进制文件及节点号mysql -uroot -p123123change 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.shsource /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行端口号为330645 3306#配置Mycat的连接信息(账号密码),在110 和111行, 可以修改,这边不修改了####参数解释说明####110 111 123456112 TESTDB113 TESTDB 116 117 <!-- 118 119 120 
121
122 123 124--> 127 128 user129 TESTDB130 true131 TESTDB user 用户配置节点name 逻辑用户名,客户端登录MyCAT的用户名,也就是客户端用来连接Mycat的用户名。password 客户端登录MyCAT的密码schemas数据库名,这里会和schema.xml中的配置关联,可配置多个,多个用逗号分开,例如:db1,db2privileges 配置用户针对表的增删改查的权限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 -p123123GRANT 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#删除所有内容,重新写入以下 select user()  解释#schema标签:数据库设置,此数据库为逻辑数据库,name与server.xml中schema对应。#name:逻辑数据库名,与server.xml中的schema对应;#checkSQLschema: 数据库前缀相关设置,这里为false;#sqlMaxLimit:select时默认的limit,避免查询全表,否则可能会遇到查询量特别大的情况造成卡 死;#dataNode:表存储到哪些节点,多个节点用逗号分隔。节点为下文dataNode设置的name#dataNode标签: 定义mycat中的数据节点,也是通常说的数据分片,也就是分库相关配置#name: 定义数据节点的名字,与table中dataNode对应#datahost: 物理数据库名,与datahost中name对应,该属性用于定义该分片属于哪个数据库实例#database: 物理数据库中数据库名,该属性用于定义该分片属性哪个具体数据库实例上的具体库#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%’.select user()#heartbeat: 心跳检测语句,注意语句结尾的分号要加#host:用于标识不同实例,一般 writeHost 我们使用*M1,readHost 我们用*S1。#url:后端实例连接地址。Native:地址:端口 JDBC:jdbc的url#user:后端存储实例需要的用户名字#password:后端存储实例需要的密码  #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

 

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

schema.xml是最主要的配置项,此文件关联mysql读写分离策略,读写分离、分库分表策略、分片节点都是在此文件中配置的.MyCat作为中间件,它只是一个代理,本身并不进行数据存储,需要连接后端的MySQL物理服务器,此文件就是用来连接MySQL服务器的。#vim/usr/local/mycat/conf/schema.xml#删除所有内容,重新写入以下 select user()  解释#schema标签:数据库设置,此数据库为逻辑数据库,name与server.xml中schema对应。#name:逻辑数据库名,与server.xml中的schema对应;#checkSQLschema: 数据库前缀相关设置,这里为false;#sqlMaxLimit:select时默认的limit,避免查询全表,否则可能会遇到查询量特别大的情况造成卡 死;#dataNode:表存储到哪些节点,多个节点用逗号分隔。节点为下文dataNode设置的name#dataNode标签: 定义mycat中的数据节点,也是通常说的数据分片,也就是分库相关配置#name: 定义数据节点的名字,与table中dataNode对应#datahost: 物理数据库名,与datahost中name对应,该属性用于定义该分片属于哪个数据库实例#database: 物理数据库中数据库名,该属性用于定义该分片属性哪个具体数据库实例上的具体库#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%’.select user()#heartbeat: 心跳检测语句,注意语句结尾的分号要加#host:用于标识不同实例,一般 writeHost 我们使用*M1,readHost 我们用*S1。#url:后端实例连接地址。Native:地址:端口 JDBC:jdbc的url#user:后端存储实例需要的用户名字#password:后端存储实例需要的密码  #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; 结合传统数据库和新型分布式数据仓库的新一代企业级数据库产品;一个新颖的数据库中间件产品。