前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >MySQL读写分离之MyCAT

MySQL读写分离之MyCAT

作者头像
刘銮奕
发布2020-04-27 09:37:35
1.7K0
发布2020-04-27 09:37:35
举报
文章被收录于专栏:奕知伴解奕知伴解

一、读写分离概述

1、什么是读写分离

读写分离:读写操作,分发不同的服务器,读分发到对应的服务器 (slave),写分发到对应的服务器(master)

2、读写分离目的

读写分离 将读写业务分配到不同的服务器上,让服务器做特定的操作,不 需要不断的切换工作模式,使工作效率提高 写主服务器,读从服务器

同时降低主服务器的压力,在正常业务下,也是读比较多的情况,写相对 读少一些。

大约比例在写3/7读

读写分离:

①M-S下,读写必须分离,如果不分离,业务不可用出问题

②M-M 在此架构中,虽然可以随意读写操作,特定的操作交由特定的服务 器操作,工作效率更高

3、读写分离的实现原理

mysql的读写分离的基本原理是:

SQL语句

让master(主数据库)来响应事务性操作(insert,update,delete, create,drop)

让slave(从数据库)来响应select非事务性操作

然后再采用主从复制来把master上的事务性操作同步到slave数据库中

没有主从复制,就无法实现业务上的读写分离

4、读写分离的实现方式

① 业务代码的读写分离

需要在业务代码中,判断数据操作是读还是写,读连接从数据服务器操 作,写连接主数据库服务器操作mysql01/mysql02

以当前LNMP为例,就需要使用PHP代码实现读写分离

在代码端对数据库的操作进行判断:

操作MySQL01 => MASTER主数据库

增加:

代码语言:javascript
复制
mysql> insert into 数据表 values ('字段值1','字段值2',...);

删除:

代码语言:javascript
复制
mysql> delete from 数据表 where 条件;
mysql> delete from 数据表 where 字段 in (字段值1,字段值2,...);
mysql> delete from 数据表;

更新:

代码语言:javascript
复制
mysql> update 数据表 set 字段1=字段值1,字段2=字段值2,... where 条件;

操作MySQL02 => SLAVE从数据库

查询:

代码语言:javascript
复制
mysql> select */字段列表 from 数据表 where条件 group by分组 having子句 order by排序 limit子句;

② 中间件代理方式的读写分离

在业务代码中,数据库的操作,不直接连接数据库,而是先请求到中间件 服务器(代理)

由代理服务器,判断是读操作去从数据服务器,写操作去主数据服务器

名称

描述

MySQL Proxy

MySQL官方 测试版 不再维护

DBProxy

美团点评

Amoeba

早期阿里巴巴

cobar

阿里巴巴

MyCat

基于阿里开源的Cobar

kingshard

go语言开发

二、数据库读写分离操作方式

1、MySQL主从配置

第一步:生成MySQL02数据库服务器(从)

编号

IP地址

主机名称

角色

1

10.1.1.12

mysql01.liuluanyi.cn

MASTER

2

10.1.1.14

mysql02.liuluanyi.cn

SLAVE

第二步:在MySQL02服务器中安装MySQL5.6.35 GLIBC版本与MySQL01 组建主从服务器

使用rsync传输文件到MySQL02

代码语言:javascript
复制
# tar -zxf mysql-5.6.35-linux-glibc2.5-x86_64.tar.gz
# mv mysql-5.6.35-linux-glibc2.5-x86_64 /usr/local/mysql
# useradd -r -s /sbin/nologin mysql
# chown -R mysql.mysql /usr/local/mysql
# cd /usr/local/mysql
# rm -rf data/*

第三步:在MySQL01服务器中,把/usr/local/mysql/data/目录下的所有 文件传输MySQL02中

代码语言:javascript
复制
# rsync -av /usr/local/mysql/data/*
root@10.1.1.14:/usr/local/mysql/data/

第四步:在MySQL02服务器中,删除/usr/local/mysql/data/auto.cnf文件

代码语言:javascript
复制
# rm /usr/local/mysql/data/auto.cnf

第五步:后续配置

代码语言:javascript
复制
# cp support-files/mysql.server /etc/init.d/mysql
# service mysql start
# echo 'export PATH=$PATH:/usr/local/mysql/bin' >>
/etc/profile
# source /etc/profile

第六步:配置MySQL01与MySQL02的my.cnf文件(关键)

代码语言:javascript
复制
[root@master ~]# cat /etc/my.cnf
[mysqld]
basedir=/usr/local/mysql
datadir=/usr/local/mysql/data
port=3306
socket=/tmp/mysql.sock
log-error=/usr/local/mysql/data/mysql.err
character_set_server=utf8mb4
server_id = 10
log-bin=/usr/local/mysql/data/binlog


[root@slave ~]# cat /etc/my.cnf
[mysqld]
basedir=/usr/local/mysql
datadir=/usr/local/mysql/data
port=3306
socket=/tmp/mysql.sock
log-error=/usr/local/mysql/data/mysql.err
character_set_server=utf8mb4
server_id=20
relay-log=/usr/local/mysql/data/relaylog

设置完成后,重启MySQL数据库

代码语言:javascript
复制
# service mysql restart

第七步:在MASTER(MySQL01)中创建一个账号slave,专门用于实现数 据同步

代码语言:javascript
复制
mysql> grant replication slave on *.* to
'slave'@'10.1.1.%' identified by '123';
mysql> flush privileges;

第八步:锁表,查看二进制文件名称与位置,然后在从服务器实现change master to

MySQL01:

代码语言:javascript
复制
mysql> show master status\G

MySQL02:

代码语言:javascript
复制
mysql> help change master to;
CHANGE MASTER TO
MASTER_HOST='10.1.1.12',
MASTER_USER='slave',
MASTER_PASSWORD='123',
MASTER_PORT=3306,
MASTER_LOG_FILE='binlog.000001',
MASTER_LOG_POS=405,
MASTER_CONNECT_RETRY=10;
mysql> start slave;
mysql> show slave status\G

2、使用MyCAT中间件实现读写分离

MyCAT工作原理:

3、准备一台MyCAT服务器

编号

IP地址

主机名称

角色

1

10.1.1.15

mycat.liuluanyi.cn

MyCAT中间件

4、JDK软件的安装与配置

MyCAT是基于Java语言开发的程序,其操作系统中必须拥有Java的运行环 境,否则MyCAT无法运行。

JDK包含了JRE,目前JDK公用的版本一共有两个:OpenJDK、Oracle JDK oracle jdk(sun公司=>oracle公司收购)

open jdk(完全免费的jdk环境、Linux操作系统默认的JDK就是openjdk)

第一步:上传JDK与MyCAT到MyCAT服务器端

第二步:安装JDK软件

代码语言:javascript
复制
shell > tar xvf jdk-8u192-linux-x64.tar.gz
shell > mkdir /usr/local/java
shell > mv jdk1.8.0_192 /usr/local/java/


结构:
/usr/local/java
|----- jdk1.8.0_192
|----- jdk1.11.******

配置环境变量:非常重要,MyCAT => 环境变量 (JDK)

代码语言:javascript
复制
shell > vim /etc/profile
export PATH=$PATH:/usr/local/java/jdk1.8.0_192/bin
----------------------------华丽的分割线 -------------------
-------
shell > source /etc/profile
shell > java -version

5、MyCAT软件的安装与测试启动

MyCAT目录介绍

bin :mycat二进制文件目录

conf:配置文件目录

logs:目录可以查看到错误日志

代码语言:javascript
复制
# tar xvf Mycat-server-1.6.5-release-20180122220033-
linux.tar.gz -C /usr/local

6、测试启动MyCAT

默认不进行任何配置,mycat也是可以启动的:

代码语言:javascript
复制
shell > /usr/local/mycat/bin/mycat console
#确认mycat是否真的启动,查看它的端口 9066 8066
shell > ss -naltp |grep 8066
8066:MyCAT客户端
9066:MyCAT管理端

7、MyCAT核心配置(重点)

要进行MyCAT软件的配置,只需要了解两个文件:

conf/server.xml:对外提供的用户等的设置

conf/schema.xml:配置后端数据库服务器相关信息

server.xml文件(不需要修改)

默认情况下,MyCAT中server.xml已经配置完毕。无需任何修改,我们需 要做的就是了解其对外提供的信息有哪些?

IP地址:10.1.1.15

端口:8066

数据库名称?用户名和密码?

由以上图解运行可知,Web01与Web02 => MyCAT

conf/server.xml:对外提供的用户等的设置

conf/schema.xml:配置后端数据库服务器相关信息

代码语言:javascript
复制
# vim conf/server.xml

由以上图解运行可知,Web01与Web02 => MyCAT

代码语言:javascript
复制
IP地址:10.1.1.15
端口:8066
数据库名称:TESTDB
用户名:root
密码:123456

扩展:xml文件格式

代码语言:javascript
复制
<?xml version="1.0" encoding="UTF-8"?>
<mycat:server>
  ...
  <user>
    <property>...</property>
  </user>
  ...
</mycat:server>

schema.xml文件(需要修改)

schema.xml文件面向的是后端真实的数据库(MySQL01与MySQL02), 所以需要进行配置。

第一步:删除这个文件中的所有注释

第二步:删除schema标签中的所有table标签(全部删除)

第三步:dataNode节点只保留一个dn1

第四步:writeHost节点只保留一个

分析schema.xml文件的大致结构:

代码语言:javascript
复制
<mycat:schema>
  <schema></schema>
  <dataNode />
  <dataHost>
    <heartbeat>...</heartbeat>
    <writeHost>
      <readHost />
    </writeHost>
  </dataHost>
</mycat:schema>

writeHost:写服务器=>MySQL01
readHost:读服务器=>MySQL02

第五步:在标签中添加dataNode节点

代码语言:javascript
复制
4 <schema name="TESTDB" checkSQLschema="false"
sqlMaxLimit="100" dataNode="dn1">

第六步:在dataNode节点中,指定database真实的数据库(重要)

代码语言:javascript
复制
6 <dataNode name="dn1" dataHost="localhost1"
database="ds_shop" />

第七步:设置writeHost与readHost(读写两台服务器信息) 到

代码语言:javascript
复制
<writeHost host="hostM1" url="10.1.1.12:3306"
user="dsshop" password="123">
  <readHost host="hostS2" url="10.1.1.14:3306"
user="dsshop" password="123" />
</writeHost>

到此读写数据库的信息配置完毕了!

第八步:开启读写分离,balance="1"

代码语言:javascript
复制
<dataHost name="localhost1" maxCon="1000" minCon="10"
balance="1" ...>

到此读写分离就全部配置完毕了!

8、启动MyCAT软件

代码语言:javascript
复制
shell > /usr/local/mycat/bin/mycat start
shell > ss -naltp |grep 8066
shell > ss -naltp |grep 9066

如果没有正常启动,只能有一个原因:就是schema.xml文件编写错误。(主要是语法)

本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2020-04-18,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 奕知伴解 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 1、什么是读写分离
  • 2、读写分离目的
  • 3、读写分离的实现原理
  • 4、读写分离的实现方式
  • 二、数据库读写分离操作方式
    • 2、使用MyCAT中间件实现读写分离
      • 3、准备一台MyCAT服务器
        • 4、JDK软件的安装与配置
          • 5、MyCAT软件的安装与测试启动
            • 6、测试启动MyCAT
              • 7、MyCAT核心配置(重点)
                • 8、启动MyCAT软件
                相关产品与服务
                云数据库 SQL Server
                腾讯云数据库 SQL Server (TencentDB for SQL Server)是业界最常用的商用数据库之一,对基于 Windows 架构的应用程序具有完美的支持。TencentDB for SQL Server 拥有微软正版授权,可持续为用户提供最新的功能,避免未授权使用软件的风险。具有即开即用、稳定可靠、安全运行、弹性扩缩等特点。
                领券
                问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档