Mycat实现数据库读写分离

什么是读写分离

在数据库集群架构中,让主库负责处理事务性查询,而从库只负责处理select查询,让两者分工明确达到提高数据库整体读写性能。当然,主数据库另外一个功能就是负责将事务性查询导致的数据变更同步到从库中,也就是写操作。

读写分离的好处

1)分摊服务器压力,提高机器的系统处理效率

读写分离适用于读远比写的场景,如果有一台服务器,当select很多时,update和delete会被这些select访问中的数据堵塞,等待select结束,并发性能并不高,而主从只负责各自的写和读,极大程度的缓解X锁和S锁争用;

假如我们有1主3从,不考虑上述1中提到的从库单方面设置,假设现在1分钟内有10条写入,150条读取。那么,1主3从相当于共计40条写入,而读取总数没变,因此平均下来每台服务器承担了10条写入和50条读取(主库不承担读取操作)。因此,虽然写入没变,但是读取大大分摊了,提高了系统性能。另外,当读取被分摊后,又间接提高了写入的性能。所以,总体性能提高了,说白了就是拿机器和带宽换性能;

2)增加冗余,提高服务可用性,当一台数据库服务器宕机后可以调整另外一台从库以最快速度恢复服务

Mycat原理

Mycat是一个开源的分布式数据库系统,但是因为数据库一般都有自己的数据库引擎,而Mycat并没有属于自己的独有数据库引擎,所有严格意义上说并不能算是一个完整的数据库系统,只能说是一个在应用和数据库之间起桥梁作用的中间件。

在Mycat中间件出现之前,MySQL主从复制集群,如果要实现读写分离,一般是在程序段实现,这样就带来了一个问题,即数据段和程序的耦合度太高,如果数据库的地址发生了改变,那么我的程序也要进行相应的修改,如果数据库不小心挂掉了,则同时也意味着程序的不可用,而对于很多应用来说,并不能接受;

引入Mycat中间件能很好地对程序和数据库进行解耦,这样,程序只需关注数据库中间件的地址,而无需知晓底层数据库是如何提供服务的,大量的通用数据聚合、事务、数据源切换等工作都由中间件来处理;

Mycat中间件的原理是对数据进行分片处理,从原有的一个库,被切分为多个分片数据库,所有的分片数据库集群构成完成的数据库存储,有点类似磁盘阵列中的RAID0.

Mycat配置安装

环境准备:保证多实例/data/3306/和/data/3307已经实现简单异步主从复制

1)安装JDK

http://www.oracle.com/technetwork/java/javase/downloads/jdk7-downloads-1880260.html 
#注意版本必须JDK7或者更高版本
[[email protected] tools]# rpm -ivh jdk-8u91-linux-x64.rpm 
Preparing...                ########################################### [100%]
   1:jdk1.8.0_91            ########################################### [100%]
#我这里下载的rpm包,安装比较方便

2)下载Mycat

https://github.com/MyCATApache/Mycat-download#
# 这里测试用的是Mycat-server-1.4-release版本
解压拷贝到/application/mycat目录

3)创建用户

主库,web用户有增删改查权限

mysql> grant select,update,delete,insert on lilongzi.* to [email protected]‘172.16.2.%‘ identified
by‘123456‘;

从库由于只负责读数据,所有web只有select权限

mysql> grant select on lilongzi.* to [email protected]‘172.16.2.%‘ identified by ‘123456‘;

4)修改配置文件

[[email protected] conf]# vim /application/mycat/conf/server.xml #MyCAT对外的“虚拟数据库”配置文件
s">32</property> -->
        </system>
        <user name="web"> #web为主库和分库刚建立的用户
                <property name="password">123456</property> #用户密码
                <property name="schemas">lilongzi</property> #数据库名称
        </user>
        <user name="web_r"> #web_r表示只给读权限
                <property name="password">123456</property>
                <property name="schemas">lilongzi</property>
                <property name="readOnly">true</property>
        </user>
[[email protected] conf]# vim /application/mycat/conf/server.xml #详细主库及读写分离模式配置文件
        <schema name="lilongzi" checkSQLschema="false" sqlMaxLimit="100" 
        dataNode="dn1">
        #name=你的数据库名 ,添加dataNode="dn1" 表示数据库只在dn1上,没有分库
        <table name="test" primaryKey="ID" type="global" dataNode="dn1,dn2,dn3" />
        #table修改为你的表名,如果有多张表,可以按照这个格式添加
       </schema>
        <!-- <dataNode name="dn1$0-743" dataHost="localhost1" database="db$0-743" 
                /> -->
        <dataNode name="dn1" dataHost="localhost1" database="lilongzi" />
        <dataNode name="dn2" dataHost="localhost1" database="lilongzi" />
        <dataNode name="dn3" dataHost="localhost1" database="lilongzi" />
        <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="172.16.2.10:3306" user="web"
                        password="123456">
                        <!-- can have multi read hosts -->
                <readHost host="hostS1" url="172.16.2.10:3307" user="web"
                        password="123456" />
                </writeHost>
                <!-- <writeHost host="hostM2" url="localhost:3316" user="root"
                password="123456"/> -->
        </dataHost>

这里面,有两个参数需要注意,balance和 switchType。

其中,balance指的负载均衡类型,目前的取值有4种:

1. balance="0", 不开启读写分离机制,所有读操作都发送到当前可用的writeHost上。

2. balance="1",全部的readHost与stand by writeHost参与select语句的负载均衡,简单的说,当双主双从模式(M1->S1,M2->S2,并且M1与 M2互为主备),正常情况下,M2,S1,S2都参与select语句的负载均衡。

3. balance="2",所有读操作都随机的在writeHost、readhost上分发。

4. balance="3",所有读请求随机的分发到wiriterHost对应的readhost执行,writerHost不负担读压力

writeType表示写模式

writeType="0",所有的操作发送到配置的第一个writehost

writeType="1",随机发送到配置的所有writehost

writeType="2",不执行写操作

switchType指的是切换的模式,目前的取值也有4种:

1. switchType=‘-1‘ 表示不自动切换

2. switchType=‘1‘ 默认值,表示自动切换

3. switchType=‘2‘ 基于MySQL主从同步的状态决定是否切换,心跳语句为 show slave status

4. switchType=‘3‘基于MySQL galary cluster的切换机制(适合集群)(1.4.1),心跳语句为 show status like ‘wsrep%‘。

5)启动Mycat

[[email protected] bin]# ./mycat console &
Running Mycat-server...
wrapper  | --> Wrapper Started as Console
wrapper  | Launching a JVM...
jvm 1    | Java HotSpot(TM) 64-Bit Server VM warning: ignoring option MaxPermSize=64M; support was removed in 8.0
jvm 1    | Wrapper (Version 3.2.3) http://wrapper.tanukisoftware.org
jvm 1    |   Copyright 1999-2006 Tanuki Software, Inc.  All Rights Reserved.
jvm 1    | 
jvm 1    | log4j 2016-07-09 06:04:28 [./conf/log4j.xml] load completed.
jvm 1    | MyCAT Server startup successfully. see logs in logs/mycat.log
[[email protected] bin]# lsof -i:{8066,9066}
COMMAND   PID USER   FD   TYPE DEVICE SIZE/OFF NODE NAME
java    87340 root   46u  IPv6 212352      0t0  TCP *:9066 (LISTEN) #虚拟schema管理端口
java    87340 root   50u  IPv6 212354      0t0  TCP *:8066 (LISTEN) #虚拟schema登陆端口
#能看到这个说明咱们的Mycat已经启动成功了

6)接下来我们就要验证一下否真的已经实现读写分离...

方法:

停掉从库的SQL线程,让从库虽然读取到了主库的binlog,但是不能发起SQL线程写入到自己的数据库中,这样我们模拟访问,插入一条数据,在主库中应该能看到新插入的数据,但是模拟访问的客户端却看不到,就说明读写分离成功。

我们在其他主机A上模拟web用户访问登陆查看数据

[[email protected] ~]# mysql -uweb -p123456 -h172.16.2.10 -P8066 #注意这里使用虚拟schema的登陆端口8066
mysql> show databases;
+----------+
| DATABASE |
+----------+
| lilongzi |
+----------+
1 row in set (0.00 sec)
mysql> use lilongzi;
Database changed
mysql> show tables;
+--------------------+
| Tables in lilongzi |
+--------------------+
| customer           |
| customer_addr      |
| employee           |
| goods              |
| hotnews            |
| orders             |
| order_items        |
| test               | #test为我们改过的表
| travelrecord       |
+--------------------+
9 rows in set (0.00 sec)
mysql> select * from test;
+----+--------+
| id | name   |
+----+--------+
|  1 | 小明   |
+----+--------+
1 row in set (0.00 sec)

我们停掉从库3307的SQL线程

mysql> stop slave sql_thread;
Query OK, 0 rows affected (0.00 sec)

在主机A远程插入一条数据test

mysql> insert into test values(2,‘test2‘);
ERROR 1105 (HY000): Duplicate entry ‘2‘ for key ‘PRIMARY‘
mysql> select * from test;
+----+--------+
| id | name   |
+----+--------+
|  1 | 小明   | #立马查一下发现是看不到的
+----+--------+
1 row in set (0.01 sec)

但是在主库上面

mysql> select * from test;
+----+--------+
| id | name   |
+----+--------+
|  1 | 小明   |
|  2 | test2  | #显示已经写入成功
+----+--------+
2 rows in set (0.00 sec)

从库这边

mysql> select * from test;
+----+--------+
| id | name   |
+----+--------+
|  1 | 小明   | #同样看不到
+----+--------+
1 row in set (0.00 sec)

说明读写分离成功。

时间: 2024-07-31 13:38:36

Mycat实现数据库读写分离的相关文章

转:开源数据库中间件MyCat实现数据库读写分离、分表分库指南

系统开发中,数据库是非常重要的一个点.除了程序的本身的优化,如:SQL语句优化.代码优化,数据库的处理本身优化也是非常重要的.主从.热备.分表分库等都是系统发展迟早会遇到的技术问题问题.Mycat是一个广受好评的数据库中间件,已经在很多产品上进行使用了.希望通过这篇文章的介绍,能学会Mycat的使用. 安装 Mycat官网:http://www.mycat.io/可以了解下Mycat的背景和应用情况,这样使用起来比较有信心. Mycat下载地址:http://dl.mycat.io/官网有个文档

(转)学会数据库读写分离、分表分库——用Mycat,这一篇就够了!

原文:https://www.cnblogs.com/joylee/p/7513038.html 系统开发中,数据库是非常重要的一个点.除了程序的本身的优化,如:SQL语句优化.代码优化,数据库的处理本身优化也是非常重要的.主从.热备.分表分库等都是系统发展迟早会遇到的技术问题问题.Mycat是一个广受好评的数据库中间件,已经在很多产品上进行使用了.希望通过这篇文章的介绍,能学会Mycat的使用. 安装 Mycat官网:http://www.mycat.io/可以了解下Mycat的背景和应用情况

学会数据库读写分离、分表分库——用Mycat

系统开发中,数据库是非常重要的一个点.除了程序的本身的优化,如:SQL语句优化.代码优化,数据库的处理本身优化也是非常重要的.主从.热备.分表分库等都是系统发展迟早会遇到的技术问题问题.Mycat是一个广受好评的数据库中间件,已经在很多产品上进行使用了.希望通过这篇文章的介绍,能学会Mycat的使用. 安装 Mycat官网:http://www.mycat.io/可以了解下Mycat的背景和应用情况,这样使用起来比较有信心. Mycat下载地址:http://dl.mycat.io/官网有个文档

数据库读写分离、分表分库——用Mycat

系统开发中,数据库是非常重要的一个点.除了程序的本身的优化,如:SQL语句优化.代码优化,数据库的处理本身优化也是非常重要的.主从.热备.分表分库等都是系统发展迟早会遇到的技术问题问题.Mycat是一个广受好评的数据库中间件,已经在很多产品上进行使用了.希望通过这篇文章的介绍,能学会Mycat的使用. 安装 Mycat官网:http://www.mycat.io/可以了解下Mycat的背景和应用情况,这样使用起来比较有信心. Mycat下载地址:http://dl.mycat.io/官网有个文档

jeesz分布式架构之 mycat实现mysql读写分离实践

版权声明:本文为博主原创文章,未经博主允许不得转载. 目录(?)[+] mycat是一个的数据库中间件,基于阿里开源的cobar产品而研发,由几个有志之士的牛人共同完成并开源.提供高可用性数据分片集群,自动故障切换,高可用性 ,支持读写分离,支持MySQL双主多从,以及一主多从的模式 ,支持全局表,数据自动分片到多个节点,用于高效表关联查询 ,支持独有的基于E-R 关系的分片策略,实现了高效的表关联查询多平台支持,部署和实施简单. 今天来实践下用mycat实现mysql的读写分离,1.配置mys

mycat实现MySQL读写分离

mycat实现MySQL读写分离 mycat是什么 Mycat是一个开源的分布式数据库系统,但是由于真正的数据库需要存储引擎,而Mycat并没有存储引擎,所以并不是完全意义的分布式数据库系统.Mycat是数据库中间件,就是介于数据库与应用之间,进行数据处理与交互的中间服务.对数据进行分片处理之后,从原有的一个库,被切分为多个分片数据库,所有的分片数据库集群构成了整个完整的数据库存储. Mycat的几个典型的应用场景: 单纯的读写分离,此时配置最为简单,支持读写分离,主从切换: 分表分库,对于超过

新春好跑步,以及数据库“读写分离”的点滴考虑

新春的好日子: 小风吹来: 花一样的味道: 满满的幸福滋味. 迈开步子在宽敞的马路上跑步,步伐轻盈,多么美好的事情. 跑步总是枯燥的,只有奔跑奔跑: 跑步是孤独的,每个人的都有自己的节奏: 跑步的时候总爱瞎想,昨天和一些同学聊到了数据库的"读写分离". 在我有限的认识中,我一直认为数据库"读写分离",是为了提升数据库的瓶颈,因为数据库写总是相对比较少,而读取可能总是比较多,甚至高几个数量级. 比如一个电子商务网站,把某一个产品上架,可能一个月才需要写一次,但是每天都

【转】mysql数据库读写分离数据同步

转载请注明来源:mysql数据库读写分离数据同步 mysql数据库读写分离数据同步 我是用了两个xp(一个主的,一个从的)的系统测试成功的,linux系统我也做测试了,没有成功,不过我想我所遇到的问题是同一个问题,xp下的可以成功,linux下的应该也可以成功,稍候会测试,然后更新结果! PS:刚测试了下linux 可以同步成功,主服务器是xp,从服务器是centos,可以成功. 例: A机器 192.168.0.2 B机器 192.168.0.3 两个机器可以ping通,互相访问 先配置主服务

spring+mybatis利用interceptor(plugin)兑现数据库读写分离

使用spring的动态路由实现数据库负载均衡 系统中存在的多台服务器是“地位相当”的,不过,同一时间他们都处于活动(Active)状态,处于负载均衡等因素考虑,数据访问请求需要在这几台数据库服务器之间进行合理分配, 这个时候,通过统一的一个DataSource来屏蔽这种请求分配的需求,从而屏蔽数据访问类与具体DataSource的耦合: 系统中存在的多台数据库服务器现在地位可能相当也可能不相当,但数据访问类在系统启动时间无法明确到底应该使用哪一个数据源进行数据访问,而必须在系统运行期间通过某种条