上篇文章中介绍了读写分离的含义及读写分离的意义,然后结合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的分库和分表操作,欢迎评论转发!
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。