您当前的位置:首页 > 电脑百科 > 数据库 > MYSQL

MySQL MyCAT 读写分离实战

时间:2021-10-11 09:53:20  来源:  作者:ITBB分享

1.MySQL读写分离概念:

MYSQL读写分离的原理其实就是让Master数据库处理事务性增、删除、修改、更新操作(CREATE、INSERT、UPDATE、DELETE),而让Slave数据库处理SELECT操作,MYSQL读写分离前提是基于MYSQL主从复制,这样可以保证在Master上修改数据,Slave同步之后,WEB应用可以读取到Slave端 的数据。

1.1读写分离实现方式:

实现MYSQL读写分离可以基于第三方插件,也可以通过开发修改代码实现,具体实现的读写分离的常见 方式有如下四种:

Amoeba 读 写 分 离 ; MySQL-Proxy读写分离;

Mycat读写分离;

基于程序读写分离(效率很高,实施难度大,开发改代码);

Amoeba 是阿里08年开源的以MySQL为底层数据存储,并对WEB、App应用提供MySQL协议接口的proxy。它集中地响应WEB应用的请求,依据用户事先设置的规则,将SQL请求发送到特定的数据库上 执行,基于此可以实现负载均衡、读写分离、高可用性等需求。

Mysql-Proxy是MySQL官方提供的mysql中间件服务,支持无数客户端连接,同时后端可连接若干台Mysql-Server服务器,MYSQL-Proxy自身基于MySQL协议,连接MYSQL-Proxy的客户端无需修改任何 设置, 跟正常连接MYSQL Server没有区别,无需修改程序代码。

Mycat是基于阿里12年开源的cobar开发的一个数据库中间件,在架构体系中是位于数据库和应用层之 间的一个组件,并且对于应用层是透明的,它可实现读写分离,分库分表。

2.基于mysql-proxy实现读写分离:

proxy: 192.168.75.133
master: 192.168.75.134
slave: 192.168.75.135

2.1工作原理图解:

MySQL MyCAT 读写分离实战

2.2配置proxy:

proxy可以选择和mysql部署在同一台服务器,也可以选择单独部署在另一台独立服务器。

# 下载mysql-proxy:
wget http://mirrors.163.com/mysql/Downloads/MySQL-Proxy/mysql-proxy-0.8.4-linux- el6-x86-64bit.tar.gz
# 解压:
tar xf mysql-proxy-0.8.4-linux-el6-x86-64bit.tar.gz
mv mysql-proxy-0.8.4-linux-el6-x86-64bit /usr/local/mysql-proxy
# 配置环境变量:
[root@node3 src]# echo "export PATH=/usr/local/mysql-proxy/bin:$PATH" >
/etc/profile.d/mysql-proxy.sh
[root@node3 src]# . /etc/profile.d/mysql-proxy.sh # 启动MYSQL-Proxy中间件:
[root@node3 src]# useradd    -r    mysql-proxy
[root@node3 src]# mysql-proxy --daemon --log-level=debug --user=mysql-proxy -- keepalive --log-file=/var/log/mysql-proxy.log --plugins="proxy" --proxy-backend- addresses="192.168.75.134:3306" --proxy-read-only-backend- addresses="192.168.75.135:3306" --proxy-lua-script="/usr/local/mysql- proxy/share/doc/mysql-proxy/rw-splitting.lua" --plugins=admin --admin- username="admin" --admin-password="admin" --admin-lua-script="/usr/local/mysql- proxy/lib/mysql-proxy/lua/admin.lua"

# 查看端口/日志:
[root@node3 src]# netstat -ntlp |grep 40
tcp    0    0 0.0.0.0:4040    0.0.0.0:*    LISTEN
1348/mysql-proxy
tcp    0    0 0.0.0.0:4041    0.0.0.0:*    LISTEN
1348/mysql-proxy

2.3启动的相关参数:

# Mysql-Proxy的相关参数详解如下:
--help-all    :获取全部帮助信息;
--proxy-address=host:port    :代理服务监听的地址和端口,默认为4040;
--admin-address=host:port    :管理模块监听的地址和端口,默认为4041;
--proxy-backend-addresses=host:port    :后端mysql服务器的地址和端口;
--proxy-read-only-backend-addresses=host:port :后端只读mysql服务器的地址和端口;
--proxy-lua-script=file_name    :完成mysql代理功能的Lua脚本;
--daemon    :以守护进程模式启动mysql-proxy;
--keepalive    :在mysql-proxy崩溃时尝试重启之;
--log-file=/path/to/log_file_name    :日志文件名称;
--log-level=level    :日志级别;
--log-use-syslog    :基于syslog记录日志;
--plugins=plugin    :在mysql-proxy启动时加载的插件;
--user=user_name    :运行mysql-proxy进程的用户;
--defaults-file=/path/to/conf_file_name :默认使用的配置文件路径,其配置段使用[mysql-
proxy]标识;
--proxy-skip-profiling    :禁用profile;
--pid-file=/path/to/pid_file_name    :进程文件名;

2.4启动master/slave

systemctl start mariadb

2.5查看读写分离状态:

基于4041端口MySQL-Proxy查看读写分离状态,登录4041管理端口

MySQL MyCAT 读写分离实战

2.5授权proxy:

grant all on *.* to "mysql-proxy"@"192.168.75.133" identified by "123456";

2.6通过代理创建数据:

通过4040代理端口插入数据,该sql语句会走master,于是可以激活master状态:

mysql -h192.168.75.133 -umysql-proxy -p123456 -P4040 -e "create database lutixia charset utf8;"

在4041管理端口,再次查看:MySQL MyCAT 读写分离实战

2.7通过代理查询数据:

#  先在从库选择lutixia数据库(因为主从关系,在主库创建的lutixia会同步至从库),创建表格,并插入数据:
MariaDB [(none)]> use lutixia Database changed
MariaDB [lutixia]> create table t1( id int, name varchar(20) ); Query OK, 0 rows affected (0.00 sec)

MariaDB [lutixia]> insert t1 values(1,"xiaoming"); Query OK, 1 row affected (0.00 sec)

通过4040代理端口查询数据,该sql语句会走slave,于是可以激活slave状态:

# 多执行几次!
[root@node4 ~]# mysql -h192.168.75.133 -umysql-proxy -p123456 -P4040 -e "select
* from lutixia.t1;"
+------+----------+
| id    | name    |
+------+----------+
|    1 | xiaoming |
+------+----------+

在4041管理端口,再次查看:

mysql> select * from backends;
+-------------+---------------------+-------+------+------+-------------------+
| backend_ndx | address    | state | type | uuid | connected_clients |
+-------------+---------------------+-------+------+------+-------------------+
|    1 | 192.168.75.134:3306 | up    | rw    | NULL |    0 |
|    2 | 192.168.75.135:3306 | up    | ro    | NULL |    0 |
+-------------+---------------------+-------+------+------+-------------------+
2 rows in set (0.00 sec)

3.基于Mycat实现读写分离:

Mycat基于阿里开源的Cobar产品而研发 , 一个彻底开源的,面向企业应用开发的大数据库集群 , 一个可以视为MySQL集群的企业级数据库,用来替代昂贵的Oracle集群 ,MYCAT并不依托于任何一个商业公司, 永不收费,永不闭源 !

MySQL MyCAT 读写分离实战

mycat:192.168.75.133
master:192.168.75.134
slave:192.168.75.135

3.1安装mycat:

# 下载mycat:
wget http://dl.mycat.io/1.6.7.1/Mycat-server-1.6.7.1-release-20190627191042- linux.tar.gz
# 解压:
tar xf Mycat-server-1.6.7.1-release-20190627191042-linux.tar.gz    -C /usr/local/
# 安装JAVA-jdk:
yum install java-1.8.0-openjdk -y
# 配置mycat环境变量:
echo "export PATH=/usr/local/mycat/bin:$PATH" > /etc/profile.d/mycat.sh
. /etc/profile.d/mycat.sh

3.2授权mycat:

# 在主库执行授权信息,从库会自动同步:
grant all on *.* to "mycat-proxy"@"192.168.75.133" identified by "123456";

3.3配置mycat:

# 配置server.xml

# 默认管理用户,可读可写:
<user name="mycat" defaultAccount="true">
<property name="password">123456</property>
<property name="schemas">lutixiadb</property>
...
</user>
# 只读用户:
<user name="user">
<property name="password">user</property>
<property name="schemas">lutixiadb</property>
<property name="readOnly">true</property>
</user>

# 配置schema.xml

# 设置逻辑库以及数据库节点
<schema name="lutixiadb" checkSQLschema="false" sqlMaxLimit="100" dataNode="dn1">
</schema>
# 配置数据库节点对应的后端真实的数据库:
<dataNode name="dn1" dataHost="localhost1" database="students" />
# 配置读写库以及均衡:
<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="192.168.75.134:3306" user="mycat-
proxy" password="123456">
<!-- can have multi read hosts -->
<readHost host="hostS1" url="192.168.75.135:3306" user="mycat-proxy" password="123456" />
</writeHost>
</dataHost>

3.3启动mycat:

mycat    start

3.4连接测试:

mysql -umycat -p123456 -P8066 -h127.0.0.1 MySQL [(none)]> show databases;
+-----------+
| DATABASE    |
+-----------+
| lutixiadb |
+-----------+
1 row in set (0.00 sec)

# 可以在后端主库创建一个表,继续查询表测试:
MySQL [(none)]> use lutixiadb;
Reading table information for completion of table and column names You can turn off this feature to get a quicker startup with -A

Database changed
MySQL [lutixiadb]> show tables;
+--------------------+
| Tables_in_students |
+--------------------+
| t1    |
+--------------------+
1 row in set (0.01 sec)

# 在从库插入数据,继续查询:
MySQL [lutixiadb]> select * from t1;
+------+----------+
| id    | name    |
+------+----------+
|    1 | xiaowang |
+------+----------+
1 rows in set (0.00 sec)

在主库查不到数据,通过代理可以查到,即可验证读写分离成功。

3.5报错解决:

MySQL [lutixiadb]> show tables;
ERROR 1184 (HY000): Invalid DataSource:0

可能是后端节点出现了问题,也有可能是代理端无法连上后端节点导致: 可以先在代理端直接用授权用户名和密码登录后端数据库测试连接问题:
[root@node3 conf]# mysql -umycat-proxy -h192.168.75.134 -p123456
ERROR 1129 (HY000): Host 'node3' is blocked because of many connection errors; unblock with 'mysqladmin flush-hosts'
# 可以看到因为多次错误,代理端服务器被锁定了,所以也会出现上面的报错:
在后端主库执行如下命令: mysqladmin flush-hosts 再次测试,一般问题就能解决。


Tags:MyCAT   点击:()  评论:()
声明:本站部分内容及图片来自互联网,转载是出于传递更多信息之目的,内容观点仅代表作者本人,如有任何标注错误或版权侵犯请与我们联系(Email:2595517585@qq.com),我们将及时更正、删除,谢谢。
▌相关推荐
1.MySQL读写分离概念:MYSQL读写分离的原理其实就是让Master数据库处理事务性增、删除、修改、更新操作(CREATE、INSERT、UPDATE、DELETE),而让Slave数据库处理SELECT操作,MYSQL读...【详细内容】
2021-10-11  Tags: MyCAT  点击:(32)  评论:(0)  加入收藏
0x01: Mycat下载wget http://dl.mycat.io/1.6.7.3/20190927161129/Mycat-server-1.6.7.3-release-20190927161129-linux.tar.gz配置server.xml,Mycat服务器配置,默认端口8066<?...【详细内容】
2021-08-11  Tags: MyCAT  点击:(86)  评论:(0)  加入收藏
原文:https://dwz.cn/55KN8AA0作者:波波烤鸭一、读写分离配置前面我们已经介绍过了mysql的主从同步和mycat的安装及相关配置文件的介绍,现在我们来配置下具体的读写分离操作...【详细内容】
2021-04-14  Tags: MyCAT  点击:(186)  评论:(0)  加入收藏
背景TiDB 是一个分布式关系型数据库,可以无缝对接 MySQL。考虑到产品数据量大的情况下,单机 MySQL 可能无法支撑,而无缝切换到 TiDB 集群也比较方便,所以领导让我调研了一天迁移...【详细内容】
2021-03-05  Tags: MyCAT  点击:(274)  评论:(0)  加入收藏
作者:拥之则安出处:https://segmentfault.com/a/11900000375454581.非分片字段查询Mycat中的路由结果是通过 分片字段 和 分片方法 来确定的。例如下图中的一个Mycat分库方...【详细内容】
2020-10-22  Tags: MyCAT  点击:(119)  评论:(0)  加入收藏
在之前写过一篇关于mysql分库分表的文章,那篇文章只是给大家提供了一个思路,但是回复下面有很多说是细节问题没有提到。所以咔咔就在出了这篇文章。...【详细内容】
2020-08-18  Tags: MyCAT  点击:(70)  评论:(0)  加入收藏
1、MyCAT基础架构准备MyCAT基础架构图 摘自oldguo1.1 MyCAT基础架构准备1.1.1 环境准备:两台虚拟机 db01(10.0.0.51) db02(10.0.0.52) 每台创建四个mysql实例:3307 3308 3309 33...【详细内容】
2019-11-26  Tags: MyCAT  点击:(99)  评论:(0)  加入收藏
▌简易百科推荐
作者:雷文霆 爱可生华东交付服务部 DBA 成员,主要负责Mysql故障处理及相关技术支持。爱好看书,电影。座右铭,每一个不曾起舞的日子,都是对生命的辜负。 本文来源:原创投稿 *爱可生...【详细内容】
2021-12-24  爱可生    Tags:MySQL   点击:(6)  评论:(0)  加入收藏
生成间隙(gap)锁、临键(next-key)锁的前提条件 是在 RR 隔离级别下。有关Mysql记录锁、间隙(gap)锁、临键锁(next-key)锁的一些理论知识之前有写过,详细内容可以看这篇文章...【详细内容】
2021-12-14  python数据分析    Tags:MySQL记录锁   点击:(17)  评论:(0)  加入收藏
binlog 基本认识 MySQL的二进制日志可以说是MySQL最重要的日志了,它记录了所有的DDL和DML(除了数据查询语句)语句,以事件形式记录,还包含语句所执行的消耗的时间,MySQL的二...【详细内容】
2021-12-14  linux上的码农    Tags:mysql   点击:(13)  评论:(0)  加入收藏
为查询优化你的查询 大多数的MySQL服务器都开启了查询缓存。这是提高性最有效的方法之一,而且这是被MySQL的数据库引擎处理的。当有很多相同的查询被执行了多次的时候,这些查...【详细内容】
2021-12-09  元宇宙iwemeta    Tags:mysql   点击:(15)  评论:(0)  加入收藏
测试的目的和原因,公司有很多程序员,每个程序员对数据库和表结构都有自己的理解。而且每个程序员的理解往往是以效率考虑。既然都是为了效率考虑,那么我就来测试一下究竟哪种使...【详细内容】
2021-12-08  吴彬的分享    Tags:Mysql数据库   点击:(14)  评论:(0)  加入收藏
当你们考虑项目并发的时候,我在部署环境,当你们在纠结使用ArrayList还是LinkedArrayList的时候,我还是在部署环境。所以啊,技术不止境,我在部环境。今天这篇文章缕一下在同一台服...【详细内容】
2021-12-08  秃头码哥    Tags:MySQL数据库   点击:(16)  评论:(0)  加入收藏
对于数据分析来说,MySQL使用最多的是查询,比如对数据进行排序、分组、去重、汇总及字符串匹配等,如果查询的数据涉及多个表,还需要要对表进行连接,本文就来说说MySQL中常用的查询...【详细内容】
2021-12-06  笨鸟学数据分析    Tags:MySQL   点击:(19)  评论:(0)  加入收藏
在学习SQL语句之前,首先需要区分几个概念,我们常说的数据库是指数据库软件,例如MySQL、Oracle、SQL Server等,而本文提到的数据库是指数据库软件中的一个个用于存储数据的容器。...【详细内容】
2021-11-24  笨鸟学数据分析    Tags:SQL语句   点击:(23)  评论:(0)  加入收藏
概述以前参加过一个库存系统,由于其业务复杂性,搞了很多个应用来支撑。这样的话一份库存数据就有可能同时有多个应用来修改库存数据。比如说,有定时任务域xx.cron,和SystemA域...【详细内容】
2021-11-05  Java云海    Tags:分布式锁   点击:(31)  评论:(0)  加入收藏
MySQL的进阶查询 一、 按关键字排序 使用ORDERBY语句来实现排序排序可针对一个或多个字段ASC:升序,默认排序方式 【升序是从小到大】DESC:降序 【降序是从大到小】ORDER BY的...【详细内容】
2021-11-05  Java热点    Tags:SQL语句   点击:(27)  评论:(0)  加入收藏
最新更新
栏目热门
栏目头条