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

Stella981
• 阅读 763

一、环境

操作系统:CentOS-6.7-x86_64-bin-DVD1.iso
JDK 版本:jdk1.8.0_45
MyCat 版本:Mycat-server-1.6
MyCat 节点 IP:10.1.10.15 主机名:ebus-mycat-01 主机配置:4 核 CPU、4G 内存 
MySQL版本:mysql5.6.26.tar.gz
主节点 IP:10.1.10.99 主机名:ebus-mysql-01 主机配置:4 核 CPU、4G 内存 
从节点 IP:10.1.10.98 主机名:ebus-mysql-02 主机配置:4 核 CPU、4G 内存

二、MyCat 介绍

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

三、MyCat 的安装

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

        # vi /etc/sysconfig/network

NETWORKING=yes
HOSTNAME=ebus-mycat-01
#NTPSERVERARGS=iburst

        # vi /etc/hosts

127.0.0.1   ebus-mycat-01
127.0.0.1   ebus-mysql-02
10.1.10.15  ebus-mycat-01
10.1.10.99  ebus-mysql-01
10.1.10.98  ebus-mysql-03
10.1.10.97  ebus-mysql-04

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

        # vi /etc/profile

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

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

java -version

java version "1.8.0_144"
Java(TM) SE Runtime Environment (build 1.8.0_144-b01)
Java 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

$ su root
Password:

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

        5、设置 MyCat 的环境变量

vi /etc/profile

## mycat env
export MYCAT_HOME=/usr/local/mycat
export 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

<?xml version="1.0"?>
<!DOCTYPE mycat:schema SYSTEM "schema.dtd">
<mycat:schema xmlns:mycat="http://io.mycat/">
    <schema name="pcx_schema" checkSQLschema="false" sqlMaxLimit="100" dataNode="pcxNode"></schema>

    <!-- 定义MyCat的数据节点,database为所关注数据库名称 -->
    <dataNode name="pcxNode" dataHost="dtHost" database="lh_test" />


    <!-- 定义数据主机dtHost,连接到MySQL读写分离集群 ,schema中的每一个dataHost中的host属性值必须唯一-->
    <!-- dataHost实际上配置就是后台的数据库集群,一个datahost代表一个数据库集群 -->
    <!-- balance="1",全部的readHost与stand by writeHost参与select语句的负载均衡-->
    <!-- writeType="0",所有写操作发送到配置的第一个writeHost,这里就是我们的hostmaster,第一个挂了切到还生存的第二个writeHost-->
    <dataHost name="dtHost" maxCon="500" minCon="20" balance="1"
        writeType="0" dbType="mysql" dbDriver="native" switchType="2" slaveThreshold="100">
        <!--心跳检测 -->
        <heartbeat>show slave status</heartbeat>

        <!--配置后台数据库的IP地址和端口号,还有账号密码,用户名/密码为远程配置用户 -->
        <writeHost host="hostMaster" url="10.1.10.99:3306" user="root" password="www.liuhao.com" />
        <writeHost host="hostSlave" url="10.1.10.98:3306" user="root" password="www.liuhao.com" />
    </dataHost>

</mycat:schema>

注:

1、的database指的是所要进行读写分离的数据库名称

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

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

<?xml version="1.0" encoding="UTF-8"?>
<!-- - - Licensed under the Apache License, Version 2.0 (the "License");
        - you may not use this file except in compliance with the License. - You
        may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0
        - - Unless required by applicable law or agreed to in writing, software -
        distributed under the License is distributed on an "AS IS" BASIS, - WITHOUT
        WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - See the
        License for the specific language governing permissions and - limitations
        under the License. -->
<!DOCTYPE mycat:server SYSTEM "server.dtd">
<mycat:server xmlns:mycat="http://io.mycat/">
    <system>
    <!-- 这里配置的都是一些系统属性,可以自己查看mycat文档 -->
    <property name="defaultSqlParser">druidparser</property>
    <property name="charset">utf8mb4</property>
    </system>



    <!-- 用户1,对应的MyCat逻辑库连接到的数据节点对应的主机为主从复制集群 -->
    <user name="user1">
        <property name="password">root</property>
        <property name="schemas">pcx_schema</property>
    </user>

    <!-- 用户2,只读权限-->
    <user name="user2">
        <property name="password">root</property>
        <property name="schemas">pcx_schema</property>
        <property name="readOnly">true</property>
    </user>
</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
        增加:

-A INPUT -m state --state NEW -m tcp -p tcp --dport 8066 -j ACCEPT
-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

<?xml version="1.0" encoding="UTF-8"?>
<Configuration status="WARN">
    <Appenders>
        <Console name="Console" target="SYSTEM_OUT">
            <PatternLayout pattern="%d [%-5p][%t] %m %throwable{full} (%C:%F:%L) %n"/>
        </Console>

        <RollingFile name="RollingFile" fileName="${sys:MYCAT_HOME}/logs/mycat.log"
                     filePattern="${sys:MYCAT_HOME}/logs/$${date:yyyy-MM}/mycat-%d{MM-dd}-%i.log.gz">
        <PatternLayout>
                <Pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} %5p [%t] (%l) - %m%n</Pattern>
            </PatternLayout>
            <Policies>
                <OnStartupTriggeringPolicy/>
                <SizeBasedTriggeringPolicy size="250 MB"/>
                <TimeBasedTriggeringPolicy/>
            </Policies>
        </RollingFile>
    </Appenders>
    <Loggers>
        <!--<AsyncLogger name="io.mycat" level="info" includeLocation="true" additivity="false">-->
            <!--<AppenderRef ref="Console"/>-->
            <!--<AppenderRef ref="RollingFile"/>-->
        <!--</AsyncLogger>-->
        <asyncRoot level="debug" includeLocation="true">

            <AppenderRef ref="Console" />
            <AppenderRef ref="RollingFile"/>

        </asyncRoot>
    </Loggers>
</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(具有数据库写权限)

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

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

[client] default-character-set=utf8

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

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

        (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 *命令试试

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

       测试结果:

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

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

       3、再测试一下写操作

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

        结果:

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

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

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

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

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

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

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

六、关键点

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

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

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

参考资料

1、 MyCat 官网

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

点赞
收藏
评论区
推荐文章
blmius blmius
2年前
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
Jacquelyn38 Jacquelyn38
2年前
2020年前端实用代码段,为你的工作保驾护航
有空的时候,自己总结了几个代码段,在开发中也经常使用,谢谢。1、使用解构获取json数据let jsonData  id: 1,status: "OK",data: 'a', 'b';let  id, status, data: number   jsonData;console.log(id, status, number )
皕杰报表之UUID
​在我们用皕杰报表工具设计填报报表时,如何在新增行里自动增加id呢?能新增整数排序id吗?目前可以在新增行里自动增加id,但只能用uuid函数增加UUID编码,不能新增整数排序id。uuid函数说明:获取一个UUID,可以在填报表中用来创建数据ID语法:uuid()或uuid(sep)参数说明:sep布尔值,生成的uuid中是否包含分隔符'',缺省为
Stella981 Stella981
2年前
KVM调整cpu和内存
一.修改kvm虚拟机的配置1、virsheditcentos7找到“memory”和“vcpu”标签,将<namecentos7</name<uuid2220a6d1a36a4fbb8523e078b3dfe795</uuid
Easter79 Easter79
2年前
Twitter的分布式自增ID算法snowflake (Java版)
概述分布式系统中,有一些需要使用全局唯一ID的场景,这种时候为了防止ID冲突可以使用36位的UUID,但是UUID有一些缺点,首先他相对比较长,另外UUID一般是无序的。有些时候我们希望能使用一种简单一些的ID,并且希望ID能够按照时间有序生成。而twitter的snowflake解决了这种需求,最初Twitter把存储系统从MySQL迁移
Wesley13 Wesley13
2年前
mysql设置时区
mysql设置时区mysql\_query("SETtime\_zone'8:00'")ordie('时区设置失败,请联系管理员!');中国在东8区所以加8方法二:selectcount(user\_id)asdevice,CONVERT\_TZ(FROM\_UNIXTIME(reg\_time),'08:00','0
Wesley13 Wesley13
2年前
00:Java简单了解
浅谈Java之概述Java是SUN(StanfordUniversityNetwork),斯坦福大学网络公司)1995年推出的一门高级编程语言。Java是一种面向Internet的编程语言。随着Java技术在web方面的不断成熟,已经成为Web应用程序的首选开发语言。Java是简单易学,完全面向对象,安全可靠,与平台无关的编程语言。
Wesley13 Wesley13
2年前
MySQL部分从库上面因为大量的临时表tmp_table造成慢查询
背景描述Time:20190124T00:08:14.70572408:00User@Host:@Id:Schema:sentrymetaLast_errno:0Killed:0Query_time:0.315758Lock_
为什么mysql不推荐使用雪花ID作为主键
作者:毛辰飞背景在mysql中设计表的时候,mysql官方推荐不要使用uuid或者不连续不重复的雪花id(long形且唯一),而是推荐连续自增的主键id,官方的推荐是auto_increment,那么为什么不建议采用uuid,使用uuid究
Python进阶者 Python进阶者
3个月前
Excel中这日期老是出来00:00:00,怎么用Pandas把这个去除
大家好,我是皮皮。一、前言前几天在Python白银交流群【上海新年人】问了一个Pandas数据筛选的问题。问题如下:这日期老是出来00:00:00,怎么把这个去除。二、实现过程后来【论草莓如何成为冻干莓】给了一个思路和代码如下:pd.toexcel之前把这