Mysql读写分离(2)-中间件mycat和实践方案

系统环境要求

|---------|---------|
| Mysql版本 | 5.5版本以上 |
| jdk | 1.7 |
| Mycat | 1.6 |

mycat使用Java开发,因为用到了JDK 7的部分功能,所以在使用前请确保安装了JDK 7.0,并设置了正确的Java环境变量(可在命令行窗口输入:"java --version"获知是否安装成功,以及获取JDK的版本)。

1.简介

配置好第一篇的主从复制后, 还没有做到真正的读和写分离

我们还需要一个中间件,把mysql的写操作和读操作分开。

事实上 读写分离的类型有两种,一种是 基于程序代码内部实现,另一种是 基于中间代理层实现

  • 基于程序代码内部实现

在代码中根据select,insert进行路由分类,这类方法也是目前生产环境应用最广泛的,优点是性能好,因为在程序代码中已经将读写的数据源拆分至两个,所以不需要额外的MySQL proxy解析SQL报文,在进行路由至不同数据库节点。缺点是通常该架构较复杂,运维成本相对较高。

  • 基于中间代理层实现

代理层一般位于客户端和服务器之间,代理服务器接到客户端请求后通过解析SQL文本再将SQL路由至可用的数据库节点中。优点是程序不需要改造可以实现无缝迁移,可移植性较好。缺点是性能相对前者略微逊色一些,并且并不是所有的读操作都能够被路由至从节点中。

选择第一种的话。可以修改mysql的操作类 。而第二种就是利用中间件分开啦,本篇就是叙述中间件的详细过程

今天我们要说的一款叫Mycat的中间件软件。能够把应用服务器发送过来的读操作和写操作分开。

2.详细步骤

MyCat有两个核心配置文件:schema.xml 和 server.xml

schema.xml 中定义逻辑库,表、分片节点等内容

server.xml 中定义用户以及系统相关变量,如端口等

2.1 安装jdk环境

由于Mycat有一部分是建立在jdk上的,所以要检查系统是否有安装jdk

bash 复制代码
rpm -qa |grep jdk

如果没有安装,就装上,此处安装过程略,最后用java -version检查一下

2.2 下载并安装

下载地址: https://github.com/MyCATApache/Mycat-download/blob/master/1.6-RELEASE/ ,下载完后放在/usr/local/src下面

bash 复制代码
cd /usr/local/src/
tar zxvf Mycat-server-1.6-RELEASE-20161028204710-linux.tar.gz -C /usr/local/  解压到/usr/local下面

2.3 新建用户和组

bash 复制代码
groupadd mycat
adduser -r -g mycat mycat
chown -R mycat.mycat /usr/local/mycat //修改mycat目录所属mycat用户

2.4 进入Mycat目录,修改server.xml

配置文件非常多,如果只是简单配置在不同的服务器上进行读写分离只需要配置两个文件 server.xml 和 schema.xml

bash 复制代码
cd /usr/local/mycat/conf
vi server.xml 

找到下面的这一段

开启实时统计,便于后期安装mycat-eye的监测

bash 复制代码
<!-- 1为开启实时统计、0为关闭 -->
<property name="useSqlStat">1</property>

这四项都去掉注释,使得生效

bash 复制代码
<!--默认是65535 64K 用于sql解析时最大文本长度 -->
<property name="maxStringLiteralLength">65535</property>
<property name="sequnceHandlerType">0</property>
<property name="backSocketNoDelay">1</property>
<property name="frontSocketNoDelay">1</property>

最主要的看下面的配置,这是连接mycat逻辑库的时候的用户名和密码

bash 复制代码
<user name="root">
    <property name="password">123456</property>
    <property name="schemas">TESTDB</property>
        
        <!-- 表级 DML 权限设置 -->
        <!--         
        <privileges check="false">
            <schema name="TESTDB" dml="0110" >
                <table name="tb01" dml="0000"></table>
                <table name="tb02" dml="1111"></table>
            </schema>
        </privileges>        
         -->
</user>

<user name="user">
    <property name="password">user</property>
    <property name="schemas">TESTDB</property>
    <property name="readOnly">true</property>
</user>

这里设置了 2个mycat的用户名和密码:root/123456、user/user

注意这里的TESTDB 不一定是你数据库上的真实库名.可以任意指定.只要和接下来的schema.xml的配置文件中的库名统一即可

2.5 修改 schema.xml

bash 复制代码
cd /usr/local/mycat/conf
vi schema.xml 

schema.xml 注:本次仅仅配置读写分离,所以多余的都删掉了

bash 复制代码
<?xml version="1.0"?>
<!DOCTYPE mycat:schema SYSTEM "schema.dtd">
<mycat:schema xmlns:mycat="http://io.mycat/">
    <!-- TESTDB1 是mycat的逻辑库名称,链接需要用的 -->
    <schema name="TESTDB" checkSQLschema="false" sqlMaxLimit="100" dataNode="dn1"></schema>
        <!-- database 是MySQL数据库的库名 -->
    <dataNode name="dn1" dataHost="localhost1" database="ms_test" />
    <dataHost name="localhost1" maxCon="1000" minCon="10" balance="3" writeType="0" dbType="mysql" dbDriver="native" switchType="1"  slaveThreshold="100">
        <heartbeat>select user()</heartbeat>
        <!-- 可以配置多个主从 -->
        <writeHost host="hostM1" url="主库IP:3306" user="root" password="mysql1234">
            <!-- 可以配置多个从库 -->
            <readHost host="hostS2" url="从库IP:3306" user="slaveuser" password="123" /><!--从库用户-->
        </writeHost>
    </dataHost>
</mycat:schema>

注意 <schema name="TESTDB" 此处的名字要和 server.xml里的schemas属性要一致 。

注意writeHost节点 和 readHost节点 ,正确填写ip和端口信息。

例如从库这里,请确定账号密码已经授权远程登录,能连上

==字段解析:==

dataNode节点中各属性说明:

name:指定逻辑数据节点名称;

dataHost:指定逻辑数据节点物理主机节点名称;

database:指定物理主机节点上。如果一个节点上有多个库,可使用表达式db$0-99, 表示指定0-99这100个数据库;


dataHost 节点中各属性说明:

name:物理主机节点名称;

maxCon:指定物理主机服务最大支持1000个连接;

minCon:指定物理主机服务最小保持10个连接;

writeType:指定写入类型;

0,只在writeHost节点写入;

1,在所有节点都写入。慎重开启,多节点写入顺序为默认写入根据配置顺序,第一个挂掉切换另一个;

dbType:指定数据库类型;

dbDriver:指定数据库驱动;

balance:指定物理主机服务的负载模式。

0,不开启读写分离机制;

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

2,所有的readHost与writeHost都参与select语句的负载均衡,也就是说,当系统的写操作压力不大的情况下,所有主机都可以承担负载均衡;

3 , 所有读请求随机的分发到readhost上执行 ,writehost不负担读压力 。

一般来说,如果只有2台机器就配置3

2.6 修改 wrapper.conf

同样在conf下面

bash 复制代码
vi wrapper.conf

找到这一行,然后修改

bash 复制代码
wrapper.java.command=/usr/local/jdk1.8/bin/java 

修改下面2个值

bash 复制代码
wrapper.java.additional.10=-Xmx1G
wrapper.java.additional.11=-Xms512M

最后一个改为

bash 复制代码
wrapper.java.additional.11=-Xms1G

这2行的值 固定跟,物理内存有关,如果你的服务器或虚拟机只有1G 后面那个数字就设置1G以内,否则会出错

2.7 启动之前最好将log的级别改为debug,这样方便查错

进入mycat/conf

bash 复制代码
vim log4j2.xml
 <asyncRoot level="info" includeLocation="true"> 
 改为   
 <asyncRoot level="trace" includeLocation="true">

2.8 从库这边要建一个可以远程连接的有权限的用户

为了mycat逻辑库能正常连接

bash 复制代码
GRANT ALL PRIVILEGES ON *.* TO 'slaveuser'@'192.168.75.129' IDENTIFIED BY '123' WITH GRANT OPTION;
FLUSH PRIVILEGES;

还要注意一下开通3306端口

bash 复制代码
iptables -A INPUT -p tcp --dport 3306 -j ACCEPT
service iptables save
service iptables restart

2.9 启动Mycat

启动有2种方式 ,一种是 后台启动 ./mycat start , 另一种控制台启动 ./mycat console ,大多使用后者

bash 复制代码
cd /usr/local/mycat/bin
./mycat start

查看一下启动没有 (默认数据端口为8066,管理端口为9066)

bash 复制代码
netstat -ant | grep '8066'
tcp        0      0 :::8066                    :::*                        LISTEN 

看到这个信息 证明成功了 ,如果没有成功可以看看使用 ./mycat console 看看有没什么错误信息

如果启动失败,可以用控制台模式启动, 这种模式会把错误信息打印出来

bash 复制代码
./mycat console

在这里可以大概看到那里出问题,然后去修改好

3. 连接mycat逻辑库

好了,上面这些设置好后,终于可以连接了

bash 复制代码
mysql -uroot -p888888 -h127.0.0.1 -P8066 -DTESTDB

因为在刚才的mycat的server.xml中配置了,相当于代理 ,密码是888888

其中8066是mycat的监听端口,类似于mysql的3306端口,其中-u,-p,-h分别是用户名,密码和主机,-P是mycat端口 -D是连接的逻辑库.

进入mycat的代理后台后,我们可以看到

3.1 测试一下

由于配置文件里已经设置好数据库,所以可以直接进行sql查询

explain一下,可以查到是节点dn1的数据

bash 复制代码
mysql> explain select * from tb_books;
+-----------+------------------------+
| DATA_NODE | SQL                    |
+-----------+------------------------+
| dn1       | select * from tb_books |
+-----------+------------------------+
1 row in set (0.00 sec)
复制代码

4.常见问题

4.1 如果日志里出现 Error: Could not create the Java Virtual Machine.

解决办法:

wrapper.java.additional.10=-Xmx1G

wrapper.java.additional.11=-Xms512M

修改最后一个值的大小,例如:wrapper.java.additional.11=-Xms1G

4.2 Unsupported major.minor version 51.0

解决办法:调整本地jdk的版本,试试jdk8.0

4.3 关于 schema.xml 和server.xml的详细介绍在这里

MyCat-schema.xml详解 - 冰碟 - 博客园

相关推荐
学地理的小胖砸20 分钟前
【Python 操作 MySQL 数据库】
数据库·python·mysql
dddaidai1231 小时前
Redis解析
数据库·redis·缓存
数据库幼崽1 小时前
MySQL 8.0 OCP 1Z0-908 121-130题
数据库·mysql·ocp
Amctwd1 小时前
【SQL】如何在 SQL 中统计结构化字符串的特征频率
数据库·sql
betazhou2 小时前
基于Linux环境实现Oracle goldengate远程抽取MySQL同步数据到MySQL
linux·数据库·mysql·oracle·ogg
lyrhhhhhhhh2 小时前
Spring 框架 JDBC 模板技术详解
java·数据库·spring
noravinsc2 小时前
国产化中间件 替换 nginx
运维·nginx·中间件
田一一一2 小时前
Android framework 中间件开发(二)
android·中间件·framework
喝醉的小喵3 小时前
【mysql】并发 Insert 的死锁问题 第二弹
数据库·后端·mysql·死锁
付出不多4 小时前
Linux——mysql主从复制与读写分离
数据库·mysql