上篇文章中介绍了读写分离的含义及读写分离的意义,然后结合mysql-proxy中间件介绍了读写分离的搭建及验证过程,本篇文章将继续介绍另一种流行的数据库中间件MyCat的搭建及使用过程!

一、mysql-proxy的启动及停止脚本
1、编辑/etc/init.d/mysqlproxy,然后写入如下内容

[root@mysql-proxy ~]# vim /etc/init.d/mysqlproxy

2、然后写入如下内容

#!/bin/bash
#
# chkconfig: - 85 15
# description: mysql-proxy start|stop|restart|status
#
# Source function libary
. /etc/rc.d/init.d/functions
#目录、配置文件和日志目录根据自身的安装目录而定
BASEPATH=/usr/local/mysql-proxy-0.8.5
CMD=$BASEPATH/bin
CONF_FILE=$BASEPATH/conf/mysql-proxy.conf
LOG_PATH=$BASEPATH/logs

# log dir
if [ ! -z "$LOG_PATH" ]; then
   mkdir -pv $LOG_PATH
fi
function Usage() {
   echo "Please Use service mysqlproxy {start|stop|restart|status}"
   exit 1
}
# desision the mysql-proxy is running or not
function isrunning(){
   if [ `ps -ef| grep mysql-proxy | grep -v grep | wc -l` -gt 1 ]; then
      return 1
   else
      return 0
   fi
}
# start the mysql-proxy service
function start_mysql_proxy() {
   isrunning
   RET_VAL=$?
   if [ $RET_VAL -eq 1 ]; then
      echo "mysql-proxy already running!"
   else
      $CMD/mysql-proxy --defaults-file=$CONF_FILE
      sleep 2
      isrunning
      RET_VAL=$?
      if [ $RET_VAL -eq 1 ]; then
          action "mysql-proxy start success!" /bin/true
      else
          action "mysql-proxy start failure!" /bin/false
          exit 2
      fi
   fi
}
# stop the mysql-proxy service
function stop_mysql_proxy() {
   isrunning
   RET_VAL=$?
   if [ $RET_VAL -eq 0 ]; then
      echo "mysql-proxy already stopped!"
   else
      killall mysql-proxy
      sleep 1
      isrunning
      RET_VAL=$?
      if [ $RET_VAL -eq 0 ]; then
          action "mysql-proxy stop success!" /bin/true
      else
          action "mysql-proxy stop failure!" /bin/false
          exit 2
      fi
   fi
}
# restart the mysql-proxy service
function restart_mysql_proxy() {
   stop_mysql_proxy
   sleep 2
   start_mysql_proxy
}
# show status for mysql-proxy
function status_mysql_proxy() {
   isrunning
   RET_VAL=$?
   if [ $RET_VAL -eq 1 ] ;then
      echo "mysql-proxy is running!"
   else
      echo "mysql-proxy is stopped!"
   fi
}
if [ ! $# -eq 1 ]; then
   Usage
fi
case $1 in
start)
  start_mysql_proxy
  ;;
stop)
  stop_mysql_proxy
  ;;
restart)
  restart_mysql_proxy
  ;;
status)
  status_mysql_proxy
  ;;
*)
  Usage
  ;;
esac

3、将服务添加到系统服务中

[root@mysql-proxy ~]# chkconfig --add mysqlproxy

二、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
(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

(2)下载mycat安装包,上传至服务器,然后解压
下载地址:http://dl.mycat.io/1.6-RELEAS...

[root@mysql-proxy ~]# tar xf Mycat-server-1.6-RELEASE-20161028204710-linux.tar.gz -C /usr/local/

(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%'

(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>

(5)配置jdk的执行路径

[root@mysql-proxy conf]# vim wrapper.conf
#将如下内容改为自己java命令所在的路径
  wrapper.java.command=/usr/local/java/jdk1.8.0_161/bin/java

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

[root@mysql-proxy conf]# vim /etc/hosts
#添加如下内容
192.168.0.6 mysql-proxy

(7)启动mycat服务

[root@mysql-proxy conf]# cd /usr/local/mycat/bin/

(8)查看是否启动成功,mycat启动之后,会默认监听在tcp的8066端口

[root@mysql-proxy logs]# netstat -tunlp | grep 8066
 tcp        0      0 :::8066                     :::*                        LISTEN      2994/java

4、测试mycat的读写分离
(1)使用server.xml配置文件中配置的用户连接mycat服务

[root@mysql-proxy logs]# mysql -uuser -puser -P8066

(2)查看数据库,会看到配置文件中所配置的数据库

mysql> SHOW DATABASES;
+----------+
| DATABASE |
+----------+
| test_db  |
+----------+
1 row in set (0.01 sec)

注意:

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

(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)保存,重启mycat服务

[root@mysql-proxy conf]# cd ../bin/
[root@mysql-proxy bin]# ./mycat restart

(5)查看实时日志

[root@mysql-proxy bin]# tail -f ../logs/wrapper.log

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

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

执行完成之后,可以看到另外一个窗口中打印出的日志信息中的IP地址。如下,可以看到创建表的操作是在master(192.168.0.4)上完成的

图片描述

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

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

图片描述

后续更多文章将更新在个人小站上,欢迎查看。

另外提供一些优秀的IT视频资料,可免费下载!如需要请查看https://www.592xuexi.com

至此,基于MyCat的读写分离搭建及验证完毕!对于Mycat中间件,它的功能非常强大,还有其他好多高级功能。下篇文章将介绍MyCat的分库和分表操作,欢迎评论转发!


夏日寒冰
318 声望85 粉丝

忠实的技术爱好者,追求极致,喜欢总结一些自己用过的技术点,与他人交流分享。