大家常说的MyCat是个什么玩意儿?使用它可以干些什么?

Posted 菜鸟封神记

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了大家常说的MyCat是个什么玩意儿?使用它可以干些什么?相关的知识,希望对你有一定的参考价值。

1、MyCat是什么?

    简单介绍: MyCat是一个基于Java开发的数据库中间件产品,可以支持市面上大多数的数据库,提供强大的数据分片处理能力。

    详细介绍: 请参考官网http://www.mycat.io/

2、MyCat能做什么?

    常用的功能为基于心跳的自动故障切换,读写分离,分表;更多功能介绍请参考官网首页上的关键特性部分:

3、搭建

服务器规划:

主库服务器:192.168.0.4:3306
从库服务器:192.168.0.5:3306
代理服务器:192.168.0.6
JDK:jdk1.8.0_161.tar.gz
操作系统:CentOS6.9 x86_64
3.1、配置jdk环境,操作过程如下
[root@mysql-proxy java]# mkdir -pv /usr/local/java
[root@mysql-proxy java]# tar xf jdk-8u161-linux-x64.tar.gz -C /usr/local/java
[root@mysql-proxy java]# vim /etc/profile
#添加如下内容
  JAVA_HOME=/usr/local/java/jdk1.8.0_161
  CLASSPATH=.:$JAVA_HOME/jre/lib/rt.jar:$JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar
  PATH=$PATH:$JAVA_HOME/bin
  export PATH USER LOGNAME MAIL HOSTNAME HISTSIZE HISTCONTROL CLASSPATH
#使环境变量生效
[root@mysql-proxy java]# source /etc/profile
#验证是否配置成功
[root@mysql-proxy java]# java -version
  java version "1.8.0_161"
  Java(TM) SE Runtime Environment (build 1.8.0_161-b12)
  Java HotSpot(TM) 64-Bit Server VM (build 25.161-b12, mixed mode)
[root@mysql-proxy java]# javac -version
  javac 1.8.0_161
3.2、下载mycat安装包,上传至服务器,然后解压
[root@mysql-proxy ~]# tar xf Mycat-server-1.6-RELEASE-20161028204710-linux.tar.gz -C /usr/local/
3.3、配置schema.xml
[root@mysql-proxy local]# vim /usr/local/mycat/conf/schema.xml
#写入如下内容
<?xml version="1.0"?>
<!DOCTYPE mycat:schema SYSTEM "schema.dtd">
<mycat:schema xmlns:mycat="http://io.mycat/">
        <!--schema节点:
        name:数据库设置,此数据库为逻辑数据库,name与server.xml中的schema对应
        checkSQLschema:数据库前缀设置,当该值为true时,当我们执行语句SELECT * FROM TESTDB.student。mycat会把语句修改为SELECT * FROM student 去掉TESTDB
        sqlMaxLimit:当该值设置为某个数值时,每条执行的sql语句,如果没有加上limit语句,MyCat会自动加上对应的值。不写的话,默认返回所有的值
        dataNode:与下文中的dataNode对应
        -->
        <schema name="test_db" checkSQLschema="false" sqlMaxLimit="100" dataNode="wb_node"></schema>
        <!--dataHost节点:
        name:定义数据节点的名字,这个名字需要唯一。我们在table标签上用这个名字来建立表与分片对应的关系
        dataHost:用于定义该分片属于哪个数据库实例,属性与datahost标签上定义的name对应
        database:用于定义该分片属于数据库实例上 的具体库
        -->
        <dataNode name="wb_node" dataHost="wb_host" database="test_db" />
        <dataHost name="wb_host" maxCon="1000" minCon="10" balance="1"
                          writeType="0" dbType="mysql" dbDriver="native" switchType="2"  slaveThreshold="100">
                <heartbeat>show slave status</heartbeat>
                <!--writeHost配置写示例-->
                <!--
                host:标识不同主机,不同即可
                url:标识实例所在的域名(ip)和端口
                username:mycat实例连接数据库实例所用的用户名
                password:mycat实例连接数据库实例所用的密码
                -->
                <writeHost host="mysql-server01" url="192.168.0.4:3306" user="root" password="root">
                        <!-- can have multi read hosts -->
                        <!--配置只读实例-->
                        <readHost host="mysql-server02" url="192.168.0.5:3306" user="root" password="root" />
                </writeHost>
                <writeHost host="mysql-server02" url="192.168.0.5:3306" user="root" password="root" />
        </dataHost>
</mycat:schema>

其他参数解释如下:

balance:负载策略
balance="0",不开启读写分离机制,所有读操作都发送到当前可用的writeHost上
balance="1",全部的readHost与stand by writeHost参与select语句的负载均衡,简单的说,当双主双从模式(M1-S1,M2-S2 并且M1 M2互为主备),正常情况下,M2,S1,S2都参与select语句的负载均衡。
balance="2",所有读操作都随机的在writeHost、readHost上分发
balance="3",所有读请求随机的分发到writeHst对应的readHost执行,writeHost不负担读写压力。

writeType:负载均衡类型
writeType="0", 所有写操作发送到配置的第一个 writeHost,第一个挂了切到还生存的第二个writeHost,重新启动后已切换后的为准,切换记录在配置文件中:dnindex.properties .
writeType="1",所有写操作都随机的发送到配置的 writeHost

switchType:发生故障是否自动切换
switchType="1",默认值 自动切换
switchType="2",基于MySql主从同步的状态决定是否切换心跳语句为 show slave status
switchType="3",基于mysql galary cluster 的切换机制(适合集群)1.4.1版本的心跳语句为 show status like 'wsrep%'
3.4、配置server.xml
[root@mysql-proxy conf]# vim server.xml
#写入如下内容
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mycat:server SYSTEM "server.dtd">
<mycat:server xmlns:mycat="http://io.mycat/">
        <!--登录的用户名,也就是连接MyCat的用户名-->
        <user name="user">
                <!--登录的密码,也就是连接MyCat的密码-->
                <property name="password">user</property>
                <!--数据库名,会和schema.xml中的配置关联,多个用逗号分开-->
                <property name="schemas">test_db</property>
                <!--表示该用户是否是只读用户,如果为true,则该用户只能执行DQL操作-->
                <property name="readOnly">false</property>
        </user>
</mycat:server>
3.5、配置jdk的执行路径
[root@mysql-proxy conf]# vim wrapper.conf
#将如下内容改为自己java命令所在的路径
  wrapper.java.command=/usr/local/java/jdk1.8.0_161/bin/java
3.6、配置主机名称

    如果主机配置有主机名称,需要在/etc/hosts文件中指定,否则启动mycat会提示找不到主机名类似的错误,本人配置的主机名称为mysql-proxy,所以需要在/etc/hosts文件中加如下内容

[root@mysql-proxy conf]# vim /etc/hosts
#添加如下内容
192.168.0.6 mysql-proxy
3.7、启动mycat服务
[root@mysql-proxy conf]# cd /usr/local/mycat/bin/
3.8、查看是否启动成功,mycat启动之后,会默认监听在tcp的8066端口
[root@mysql-proxy logs]# netstat -tunlp | grep 8066
 tcp        0      0 :::8066                     :::*                        LISTEN      2994/java

4、测试mycat的读写分离

4.1、使用server.xml配置文件中配置的用户连接mycat服务
[root@mysql-proxy logs]# mysql -uuser -puser -P8066
4.2、查看数据库,会看到配置文件中所配置的数据库
mysql> SHOW DATABASES;
+----------+
| DATABASE |
+----------+
| test_db  |
+----------+
1 row in set (0.01 sec)

注意:

a、在server.xml中会配置数据库名称,这个数据库名称和schema.xml中配置的数据库关联,如果配置多个数据库,中间使用逗号隔开。如:db1,db2。
b、配置的数据库提前需要存在,否则使用过程中会出现错误。
4.3、验证读写分离效果

    首先需要修改mycat的日志级别,因为mycat默认的日志级别为info级别,看不到主机,查询语句等信息,需要将其改为debug级别

[root@mysql-proxy conf]# cd /usr/local/mycat/conf/
[root@mysql-proxy conf]# vim log4j2.xml
#修改如下内容
<Loggers>
    <!--将asyncRoot中的level="info"改为level="debug"-->
    <asyncRoot level="debug" includeLocation="true">
        <AppenderRef ref="Console" />
        <AppenderRef ref="RollingFile"/>
    </asyncRoot>
</Loggers>
4.4、保存,重启mycat服务
[root@mysql-proxy conf]# cd ../bin/
[root@mysql-proxy bin]# ./mycat restart
4.5、查看实时日志
[root@mysql-proxy bin]# tail -f ../logs/wrapper.log
4.6、执行create建表操作

    重新打开一个shell窗口,然后执行创建表操作

mysql> CREATE TABLE student(id int);
Query OK, 0 rows affected (0.21 sec)

大家常说的MyCat是个什么玩意儿?使用它可以干些什么?

4.7、执行select读操作

    然后执行select操作,查看日志。如下,可以看到查询表的操作是在slave(192.168.0.5)上完成的

mysql> SELECT * FROM student;
Empty set (0.01 sec)


近期精彩回顾:

   


     


  


  


  

常驻内容:

源码搭建:

关注菜鸟封神记,定期分享技术干货!

点赞在看是最大的支持,感谢↓↓↓


以上是关于大家常说的MyCat是个什么玩意儿?使用它可以干些什么?的主要内容,如果未能解决你的问题,请参考以下文章

我离职后要干些什么

请问大家常说的对HTML语义化的理解是啥?

3编程语言是个什么玩意儿

3编程语言是个什么玩意儿

正则表达式是个什么玩意儿?

频频闯祸的 JNDI,到底是个什么 垃圾 玩意儿?