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

一、环境

1操作系统:CentOS-6.7-x86_64-bin-DVD1.iso 2JDK 版本:jdk1.8.0_45 3MyCat 版本:Mycat-server-1.6 4MyCat 节点 IP10.1.10.15 主机名:ebus-mycat-01 主机配置:4CPU、4G 内存 5MySQL版本:mysql5.6.26.tar.gz 6主节点 IP10.1.10.99 主机名:ebus-mysql-01 主机配置:4CPU、4G 内存 7从节点 IP10.1.10.98 主机名:ebus-mysql-02 主机配置:4CPU、4G 内存

二、MyCat 介绍

        MyCat 的读写分离是基于后端 MySQL 集群的主从同步来实现的,而 MyCat 提供语句的分发功能。MyCat1.4 开始支持 MySQL 主从复制状态绑定的读写分离机制,让读更加安全可靠。

三、MyCat 的安装

        1、设置 MyCat 的主机名和 IP 与主机名的映射

        # vi /etc/sysconfig/network

1NETWORKING=yes 2HOSTNAME=ebus-mycat-01 3#NTPSERVERARGS=iburst

        # vi /etc/hosts

1127.0.0.1 ebus-mycat-01 2127.0.0.1 ebus-mysql-02 310.1.10.15 ebus-mycat-01 410.1.10.99 ebus-mysql-01 510.1.10.98 ebus-mysql-03 610.1.10.97 ebus-mysql-04

        2、因为 MyCat 是用 Java 开发的,因此 MyCat 运行需要安装 JDK(准确来说是 JRE 就够了), 并且需要 JDK1.7 或以上版本。

        # vi /etc/profile

1export JAVA_HOME=/usr/local/java/jdk1.8.0_144 2export JRE_HOME=$JAVA_HOME/jre 3export PATH=$JAVA_HOME/bin:$JRE_HOME/bin:$PATH 4export CLASSPATH=.:$JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar

        # source /etc/profile(让环境配置生效)

java -version

1java version "1.8.0_144" 2Java(TM) SE Runtime Environment (build 1.8.0_144-b01) 3Java HotSpot(TM) 64-Bit Server VM (build 25.144-b01, mixed mode)

        3、创建 mycat 用户并设置密码

        # useradd mycat
        # passwd mycat(liuhao)

        4、上传安装包 Mycat-server-1.6-RELEASE-20161028204710-linux.tar.gz 到 MyCat 服务器中的
/home/mycat 目录,并解压并移动到 /usr/local/mycat 目录

       $ tar -zxvf Mycat-server-1.6-RELEASE-20161028204710-linux.tar.gz

1$ su root 2Password:

      # mv /home/mycat/mycat /usr/local/
        # cd /usr/local/mycat/
        # ll

        5、设置 MyCat 的环境变量

vi /etc/profile

1## mycat env 2export MYCAT_HOME=/usr/local/mycat 3export PATH=$PATH:$MYCAT_HOME/bin

   # source /etc/profile(让环境配置生效)

四、配置 MyCat

        1、在配置 MyCat 前,请确认 MySQL 的主从复制安装配置已完成并正常运行。MySQL 主从数据的同步在 MySQL 中配置,MyCat 不负责数据同步的问题
        补充:
           (1) MySQL 主从复制配置中,如果涉及到函数或存储过程的同步复制,需要在/etc/my.cnf 中的[mysqld]段中增加配置 log_bin_trust_function_creators=true 或在客户端中设置 set globallog_bin_trust_function_creators = 1;
            (2) 如果要做读写分离下的主从切换,那么从节点也有可能会变为写节点,因此从节点就不能设置为只读 read_only=1 。
            (3) Linux 版本的 MySQL,需要设置为 MySQL 大小写不敏感,否则可能会发生找不到表的问题。可在/etc/my.cnf 的[mysqld]段中增加 lower_case_table_names=1 。

        2、配置 MyCat 的 schema.xml

      schema.xml 是 MyCat 最重要的配置文件之一,用于设置 MyCat 的逻辑库、表、数据节点、dataHost 等内容,
        [mycat@ebus-mycat-01 conf]$ cd /usr/local/mycat/conf/
        [mycat@ebus-mycat-01 conf]$ vi schema.xml

1<?xml version="1.0"?> 2<!DOCTYPE mycat:schema SYSTEM "schema.dtd"> 3<mycat:schema xmlns:mycat="http://io.mycat/"> 4 <schema name="pcx_schema" checkSQLschema="false" sqlMaxLimit="100" dataNode="pcxNode"></schema> 5 6 <!-- 定义MyCat的数据节点,database为所关注数据库名称 --> 7 <dataNode name="pcxNode" dataHost="dtHost" database="lh_test" /> 8 9 10 <!-- 定义数据主机dtHost,连接到MySQL读写分离集群 ,schema中的每一个dataHost中的host属性值必须唯一--> 11 <!-- dataHost实际上配置就是后台的数据库集群,一个datahost代表一个数据库集群 --> 12 <!-- balance="1",全部的readHost与stand by writeHost参与select语句的负载均衡--> 13 <!-- writeType="0",所有写操作发送到配置的第一个writeHost,这里就是我们的hostmaster,第一个挂了切到还生存的第二个writeHost--> 14 <dataHost name="dtHost" maxCon="500" minCon="20" balance="1" 15 writeType="0" dbType="mysql" dbDriver="native" switchType="2" slaveThreshold="100"> 16 <!--心跳检测 --> 17 <heartbeat>show slave status</heartbeat> 18 19 <!--配置后台数据库的IP地址和端口号,还有账号密码,用户名/密码为远程配置用户 --> 20 <writeHost host="hostMaster" url="10.1.10.99:3306" user="root" password="www.liuhao.com" /> 21 <writeHost host="hostSlave" url="10.1.10.98:3306" user="root" password="www.liuhao.com" /> 22 </dataHost> 23 24</mycat:schema>

注:

1、<dataNode name="pcxNode" dataHost="dtHost" database="lh\_test" />的database指的是所要进行读写分离的数据库名称

2、****<writeHost>节点(包含主节点和从节点)连接mysql的用户名和密码均是设置的远程连接的用户名/密码

        3、配置 server.xml
        server.xml 主要用于设置系统变量、管理用户、设置用户权限等。
       [wusc@ebus-mycat-01 conf]$ vi server.xml

1<?xml version="1.0" encoding="UTF-8"?> 2<!-- - - Licensed under the Apache License, Version 2.0 (the "License"); 3 - you may not use this file except in compliance with the License. - You 4 may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 5 - - Unless required by applicable law or agreed to in writing, software - 6 distributed under the License is distributed on an "AS IS" BASIS, - WITHOUT 7 WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - See the 8 License for the specific language governing permissions and - limitations 9 under the License. --> 10<!DOCTYPE mycat:server SYSTEM "server.dtd"> 11<mycat:server xmlns:mycat="http://io.mycat/"> 12 <system> 13 <!-- 这里配置的都是一些系统属性,可以自己查看mycat文档 --> 14 <property name="defaultSqlParser">druidparser</property> 15 <property name="charset">utf8mb4</property> 16 </system> 17 18 19 20 <!-- 用户1,对应的MyCat逻辑库连接到的数据节点对应的主机为主从复制集群 --> 21 <user name="user1"> 22 <property name="password">root</property> 23 <property name="schemas">pcx_schema</property> 24 </user> 25 26 <!-- 用户2,只读权限--> 27 <user name="user2"> 28 <property name="password">root</property> 29 <property name="schemas">pcx_schema</property> 30 <property name="readOnly">true</property> 31 </user> 32</mycat:server>

注:

1、user1和user2均是mycat虚拟连接用户

2、用户user2仅具有读权限

3、用户user1才具体读和写权限

        4、防火墙中打开 8066 和 9066 端口
        MyCat 的默认数据端口为 8066,mycat 通过这个端口接收数据库客户端的访问请求。 管理端口为 9066,用来接收 mycat 监控命令、查询 mycat 运行状况、重新加载配置文件等。
        [root@ebus-mycat-01 mycat]# vi /etc/sysconfig/iptables
        增加:

1-A INPUT -m state --state NEW -m tcp -p tcp --dport 8066 -j ACCEPT 2-A INPUT -m state --state NEW -m tcp -p tcp --dport 9066 -j ACCEPT

        重启防火墙:
        [root@ebus-mycat-01 mycat]# service iptables restart

        5、修改 log 日志级别为 debug,以便通过日志确认基于 MyCat 的 MySQL 数据库集群读写分离的数据操作状态(可以在正式上生产前改成 info 级别)

        [mycat@ebus-mycat-01 conf]$ vi /usr/local/mycat/conf/log4j2.xml

1<?xml version="1.0" encoding="UTF-8"?> 2<Configuration status="WARN"> 3 <Appenders> 4 <Console name="Console" target="SYSTEM_OUT"> 5 <PatternLayout pattern="%d [%-5p][%t] %m %throwable{full} (%C:%F:%L) %n"/> 6 </Console> 7 8 <RollingFile name="RollingFile" fileName="${sys:MYCAT_HOME}/logs/mycat.log" 9 filePattern="${sys:MYCAT_HOME}/logs/$${date:yyyy-MM}/mycat-%d{MM-dd}-%i.log.gz"> 10 <PatternLayout> 11 <Pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} %5p [%t] (%l) - %m%n</Pattern> 12 </PatternLayout> 13 <Policies> 14 <OnStartupTriggeringPolicy/> 15 <SizeBasedTriggeringPolicy size="250 MB"/> 16 <TimeBasedTriggeringPolicy/> 17 </Policies> 18 </RollingFile> 19 </Appenders> 20 <Loggers> 21 <!--<AsyncLogger name="io.mycat" level="info" includeLocation="true" additivity="false">--> 22 <!--<AppenderRef ref="Console"/>--> 23 <!--<AppenderRef ref="RollingFile"/>--> 24 <!--</AsyncLogger>--> 25 <asyncRoot level="debug" includeLocation="true"> 26 27 <AppenderRef ref="Console" /> 28 <AppenderRef ref="RollingFile"/> 29 30 </asyncRoot> 31 </Loggers> 32</Configuration>

        6、启动 MyCat

    [mycat@ebus-mycat-01 bin]$ cd /usr/local/mycat/bin/
        (1) 控制台启动,这种启动方式在控制台关闭后,MyCat 服务也将关闭,适合调试使用:
        [mycat@ebus-mycat-01 bin]$ ./mycat console
        (2) 可以采用以下后台启动的方式:

        [mycat@ebus-mycat-01 bin]$ ./mycat start

Starting Mycat-server...

       (对应的,重启: mycat restart, 关闭: mycat stop)

        7、MyCat 连接测试
        (1) 如果本地 Windows 安装有 MySQL,可以使用已有的 mysql 客户端远程操作 MyCat
       (2) 如果为了方便,需要在 MyCat 主机上对 MyCat 进行操作(把 MyCat 当是本地 MySQL 来操作),可以在 MyCat 节点主机上安装 MySQL 客户端:

        [mycat@ebus-mycat-01 bin]$ su root
        [root@ebus-mycat-01 bin]# yum install mysql

        使用安装好的 mysql 客户端登录 MyCat

   [mycat@ebus-mycat-01 bin]$ mysql -uuser2 -proot -h10.1.10.15 -P8066(仅具有查询数据库权限)
   [mycat@ebus-mycat-01 bin]$ mysql -uuser1 -proot -h10.1.10.15 -P8066(具有数据库写权限)

        [root@ebus-mycat-01 mycat]# vi /etc/my.cnf
        增加:

[client] default-character-set=utf8

        保存后再查询,乱码问题解决,如下:

        (3) 使用第三方 MySQL 管理客户端连接 MyCat 测试(navicat 支持,MySQL-Front 兼容性不太 好),以 navicat 为例:

        8、读写分离测试
        (1) 监听 MyCat 日志
        [mycat@ebus-mycat-01 ~]$ cd /usr/local/mycat/logs/
        [mycat@ebus-mycat-01 logs]$ tail -f mycat.log

五、读写分离测试

       1、监听 MyCat 日志

          [mycat@ebus-mycat-01 ~]$ cd /usr/local/mycat/logs/
          [mycat@ebus-mycat-01 logs]$ tail -f mycat.log

       2、先测试一下读操作

          我们连接到mycat发送一句select *命令试试

       测试结果:

        可以看到select 操作被路由到了10.1.10.98也就是我们的slave节点,执行多次select *看看依然是同样的结果,即还是被路由到了读节点。

       3、再测试一下写操作

        结果:

         可见插入被路由到了master节点

      4、然后看一下Mycat服务器数据库情况

      5、最后我们看看master的数据是否被同步到slave

        记录成功的同步过来了,可见读写分离搭建成功。

六、关键点

    1、Mycat是在Mysql主从复制基础上所做的工作,因此必须确保主从复制没有问题;

2、Mycat相当于一个对外暴露的服务,其连接Mysql内部的一些细节被隐藏,Mycat读取/写入哪个真正数据库由Mycat"路由规则"决定;

3、Mycat的schema.xml配置文件中的数据库名称配置以及所连接的真正数据库的用户名/密码是对于远程用户名/密码而言的。

参考资料

1、 MyCat 官网

2、用mycat做读写分离:基于 MySQL主从复制

点赞
收藏

评论区

加载中...

相关推荐

MySQL:[Err] 1292 - Incorrect datetime value: ‘0000-00-00 00:00:00‘ for column ‘CREATE_TIME‘ at row 1

文章目录问题用navicat导入数据时,报错:原因这是因为当前的MySQL不支持datetime为0的情况。解决修改sql\mode:sql\mode:SQLMode定义了MySQL应支持的SQL语法、数据校验等,这样可以更容易地在不同的环境中使用MySQL。全局s

Oracle 分组与拼接字符串同时使用

SELECTT.,ROWNUMIDFROM(SELECTT.EMPLID,T.NAME,T.BU,T.REALDEPART,T.FORMATDATE,SUM(T.S0)S0,MAX(UPDATETIME)CREATETIME,LISTAGG(TOCHAR(

MySQL部分从库上面因为大量的临时表tmp_table造成慢查询

背景描述Time:20190124T00:08:14.70572408:00User@Host:@Id:Schema:sentrymetaLast_errno:0Killed:0Query_time:0.315758Lock_

皕杰报表之UUID

​在我们用皕杰报表工具设计填报报表时,如何在新增行里自动增加id呢?能新增整数排序id吗?目前可以在新增行里自动增加id,但只能用uuid函数增加UUID编码,不能新增整数排序id。uuid函数说明:获取一个UUID,可以在填报表中用来创建数据ID语法:uuid()或uuid(sep)参数说明:sep布尔值,生成的uuid中是否包含分隔符'',缺省为

手写Java HashMap源码

HashMap的使用教程HashMap的使用教程HashMap的使用教程HashMap的使用教程HashMap的使用教程22

KVM调整cpu和内存

一.修改kvm虚拟机的配置1、virsheditcentos7找到“memory”和“vcpu”标签,将<namecentos7</name<uuid2220a6d1a36a4fbb8523e078b3dfe795</uuid