MySQL 读写分离

一、概述

将对数据库的读写操作,分发到不同的服务器。操作分发到Master分发到Slave

作用:减轻主服务器压力,提高MySQL性能

读写分离实在MySQL主从复制的基础上实现的。

实现方式

①业务代码实现读写分离

判断是操作还是操作,操作连接slave服务器,操作连接master数据库

中间件代理方式实现读写分离

Example :MycatMySQL RoutercobarAtlaskingshard...

二、Mycat

开源数据库中间件,国内最活跃、性能最好一个。

官网: http://www.mycat.io/

Github : https://github.com/MyCATApache/Mycat-Server

官方文档: http://www.mycat.io/document/mycat-definitive-guide.pdf

1.环境安装

(1) jdk 安装

因为mycat是有java语言开发的所以需要java环境

jdk( Java Development Kit 开发工具包);jre(Java Runtime Environment 运行时环境)

JDK下载: https://www.oracle.com/technetwork/java/javase/downloads/jdk8-downloads-2133151.html

安装:

tar -xvf jdk-8u192-linux-x64.tar.gz
mkdir /usr/local/java
mv jdk1.8.0_192 /usr/local/java/
#配置环境变量
echo 'export PATH=$PATH:/usr/local/java/jdk1.8.0_192/bin' >> /etc/profile
source /etc/profile
#测试
java -version

(2) mycat 安装

安装及启动

tar -xvf Mycat-server-1.6.5-release-20180122220033-linux.tar.gz
mv mycat /usr/local/
#前台运行
bin/mycat console
#启动
bin/mycat start
#查看是否启动成功
ss -naltp |grep -E "8066|9066"
#8066:Mycat 客户端
#9066:Mycat 管理端

2. Mycat 架构图

三、Mycat 配置

请参考官方文档: http://www.mycat.io/document/mycat-definitive-guide.pdf**

配置文件路径 :/usr/local/mycat/conf

server.xml

用户授权配置文件:

vim /usr/local/mycat/conf/server.xml

schema.xml

后台数据库相关信息:

编辑配置文件:

#先做个备份
cp schema.xml schema.xml.bak
#编辑配置文件
vim schema.xml

删除暂时用不到的配置:

#1.删除注释行
#2.删除空行
#3.删除schema标签中的所有table标签(全部删除)
#4.dataNode节点只保留一个dn1
#5.writeHost节点只保留一个

需要修改的地方:

#1. 开启读写分离
<dataHost ... balance="1" ... />
#2. schema 中添加dataNode节点
<schema name="TESTDB" checkSQLschema="false" sqlMaxLimit="100" dataNode="dn1">
#3. dataNode 中指定要操作的数据库
<dataNode name="dn1" dataHost="localhost1" database="db_shop" />
#4. 设置writeHost与readHost
<writeHost host="hostM1" url="10.1.1.33:3306" user="dsshop" password="123">
   <readHost host="hostS2" url="10.1.1.34:3306" user="dsshop" password="123" />
</writeHost>

修改好后:

<?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="db_shop" />
        <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="hostM1" url="10.1.1.33:3306" user="dsshop" password="123">
                        <readHost host="hostS2" url="10.1.1.34:3306" user="dsshop" password="123" />
                </writeHost>
        </dataHost>
</mycat:schema>

四、Mycat使用

1.启动 Mycat

#1.启动
/usr/local/mycat/bin/mycat start 
#2.查看是否启动成功

#8066:Mycat 客户端
#9066:Mycat 管理端
#3.启动未成功时,一般都是 schema.xml 配置有误,查看错误日志
# tail /usr/local/mycat/logs/wrapper.log

2.安装mysql

用于连接客户端、管理端。不用mysql也可以用mariadb

yum install mysql

3.数据端口 8066

mysql -h10.1.1.35 -P 8066 -uroot -p
mysql> use TESTDB;
mysql> show tables;

注意:如果连接速度非常慢,或者说打不开,请检查schema.xml

可能原因:①数据库名称写错 ②IP或者端口写错 ③用户名或者密码写错 ④用户没有远程连接权限

4.管理端口 9066

#连接管理端
mysql -h10.1.1.35 -P9066 -uroot -p
#查看帮助
MySQL [(none)]> show @@help;
#监控
MySQL [(none)]> show @@heartbeat;

RS_CODE 状态:

OK_STATUS = 1;正常状态
ERROR_STATUS = -1; 连接出错
TIMEOUT_STATUS = -2;连接超时
INIT_STATUS = 0; 初始化状态

五、Mycat 读写分离测试

1.创建测试表

mysql01创建测试表

use ds_shop;
create table ds_mycat(
    id int not null auto_increment primary key,
    test varchar(50)
)engine=innodb default charset=utf8;

2.开启调试模式

mycat开启调试模式

 vim /usr/local/mycat/conf/log4j2.xml

重启mycat

mycat restart

3.开启读写分离

#vim /usr/local/mycat/conf/schema.xml
<dataHost ... balance="1" ... />

4.测试读写操作

新开一个终端查看日志:

查看读写操作对应的IP是否正确

tail -f /usr/local/mycat/logs/mycat.log

测试:

mysql -h10.1.1.35 -P 8066 -uroot -p
mysql> use TESTDB;
mysql> insert ds_mycat values(null,"b");
mysql> select * from ds_mycat;

六、Mycat 属性

1. balance

负载均衡类型,目前的取值有 3 种:

  1. balance="0", 不开启读写分离机制,所有读操作都发送到当前可用的 writeHost 上。
  2. balance="1",全部的 readHoststand by writeHost 参与 select 语句的负载均衡,简单的说,当双
    主双从模式(M1->S1M2->S2,并且 M1M2 互为主备),正常情况下, M2,S1,S2 都参与 select 语句的负载均衡。
  3. balance="2",所有读操作都随机的在 writeHostreadhost 上分发。
  4. balance="3",所有读请求随机的分发到 wiriterHost 对应的 readhost 执行, writerHost 不负担读压力,注意 balance=3 只在 1.4 及其以后版本有, 1.3 没有。

2. writeType

writeType="0", 所有写操作发送到配置的第一个 writeHost,第一个挂了切到还生存的第二个 writeHost
重新启动后已切换后的为准

writeType="1",所有写操作都随机的发送到配置的 writeHost, 1.5 以后废弃不推荐。

3. switchType

高可用,当第一个writeHost宕掉后,切换换第二个writeHost

-1 表示不自动切换。
1 默认值,自动切换。
2 基于 MySQL 主从同步的状态决定是否切换。

七、其他

1.代码层读写分离(了解)

基于ThinkPHP5架构设计开发的项目,进行读写分离

# vim /www/shop/application/database.php
return [
    // 启用分布式数据库
    'deploy'    =>  1,
    // 数据库类型
    'type'        => 'mysql',
    // 服务器地址
    'hostname'    => '主IP,从IP',        
    // 启用读写分离
    'rw_separate' => true,
]

2. DSShop 连接mycat错误

错误信息:

错误原因:DSShop项目并未开启数据的预读功能

解决:

# vim /home/www/application/database.php
'params'    => [
    \PDO::ATTR_EMULATE_PREPARES => true
],

3.高可用

注意:仅为模拟,MySQL环境为AB复制

#vim /usr/local/mycat/conf/schema.xml
<writeHost host="hostM1" url="10.1.1.33:3306" user="dsshop" password="123">
    <readHost host="hostS2" url="10.1.1.34:3306" user="dsshop" password="123" />
</writeHost>
<writeHost host="hostM2" url="10.1.1.34:3306" user="dsshop" password="123"/>

关闭master进行测试

Last modification:December 12th, 2019 at 11:02 pm