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

0.系统环境要求

Mysql版本:5.5版本以上

jdk:1.7

Mycat:1.6

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

1.简介

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

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

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

##1.基于程序代码内部实现##

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

##2.基于中间代理层实现##

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

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

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

2.详细步骤

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

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

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

2.1  安装jdk环境

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

rpm -qa |grep jdk

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

2.2 下载并安装

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

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

2.3 新建用户和组

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

cd /usr/local/mycat/conf
vi server.xml

找到下面的这一段

开启实时统计,便于后期安装mycat-eye的监测
 
1
 这四项都去掉注释,使得生效

65535
0
1
1

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


    123456
    TESTDB
     
     


    user
    TESTDB
    true

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

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

2.5 修改 schema.xml

cd /usr/local/mycat/conf
vi schema.xml

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




        
         
         
         
         
                select user()
                
                 
                 
                         
                 

         

注意

注意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语句的负载均衡,也就是说,当系统的写操作压力不大的情况下,所有主机都可以承担负载均衡;


2.6 修改 wrapper.conf

同样在conf下面

vi wrapper.conf

找到这一行,然后修改

wrapper.java.command=/usr/local/jdk1.8/bin/java

修改下面2个值

wrapper.java.additional.10=-Xmx1G
 wrapper.java.additional.11=-Xms512M

最后一个改为

wrapper.java.additional.11=-Xms1G

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

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

进入mycat/conf
 vim log4j2.xml
 
 改为
 

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

为了mycat逻辑库能正常连接

GRANT ALL PRIVILEGES ON *.* TO 'slaveuser'@'192.168.75.129' IDENTIFIED BY '123' WITH GRANT OPTION;
FLUSH PRIVILEGES;

还要注意一下开通3306端口

iptables -A INPUT -p tcp --dport 3306 -j ACCEPT
service iptables save
service iptables restart

2.9 启动Mycat

cd /usr/local/mycat/bin
./mycat start

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

netstat -ant | grep '8066'

tcp        0      0 :::8066                    :::*                        LISTEN 

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

如果启动失败,可以打印一下错误,用调试模式

./mycat console

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


3.0 连接mycat逻辑库

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

#mysql -uroot -p888888 -h127.0.0.1 -P8066 -DTESTDB

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

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

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

Mysql读写分离(2)-中间件mycat和实践方案_第1张图片

3.1 测试一下

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


Mysql读写分离(2)-中间件mycat和实践方案_第2张图片

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


Mysql读写分离(2)-中间件mycat和实践方案_第3张图片


4.常见问题

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

解决办法:

wrapper.java.additional.10=-Xmx1G

wrapper.java.additional.11=-Xms512M

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

3.2 Unsupported major.minor version 51.0

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

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

https://www.cnblogs.com/icebutterfly/p/9505624.html

你可能感兴趣的:(Mysql读写分离(2)-中间件mycat和实践方案)