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

一、环境

操作系统: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、<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

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

195113_M6Tz_3144678.png

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

[client] default-character-set=utf8

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

190650_zlMs_3144678.png

        (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服务器数据库情况

200621_I4Da_3144678.png

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

200349_GZ80_3144678.png

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

六、关键点

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

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

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

 

参考资料

1、 MyCat 官网

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

 

 

 

转载于:https://my.oschina.net/Howard2016/blog/1579741

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值