17.MySQL读写分离2

一、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

 

#查看java版本
[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)

 

#查看javac版本

[root@mysql-proxy java]# javac -version

javac 1.8.0_161

(2)下载mycat安装包,上传至服务器,然后解压
下载地址:http://dl.mycat.io/1.6-RELEASE/Mycat-server-1.6-RELEASE-20161028204710-linux.tar.gz

[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)

至此,读写分离搭建完毕。

注:文章属原创,如果转发,请标注出处。

发表评论

电子邮件地址不会被公开。