6.MyCat实现MySQL主从读写分离

MySQL读写分离的概述

MySQl作为目前世界上使用最广泛的免费数据库,相信所有从事系统运维的工程师都一定接触过。但在实际的生产环境中,由单台MySQL作为独立的数据库是完全不能满足实际需求的,无论是在安全性,高可用性以及高并发等各个方面。

因此,一般来说都是通过 主从复制(Master-Slave)的方式来同步数据,再通过读写分离(MySQL-Proxy/Amoeba)来提升数据库的并发负载能力,这样的方案来进行部署与实施的。

读写分离工作原理

基本的原理是让主数据库处理事务性增、改、删操作(INSERT、UPDATE、DELETE),而从数据库处理SELECT查询操作。数据库复制被用来把事务性操作导致的变更同步到集群中的从数据库。


为什么要读写分离

1.面对越来越大的访问压力,单台的服务器的性能成为瓶颈,需要分担负载
2.主从只负责各自的写和读,极大程度的缓解X锁和S锁争用
3.从库可配置myisam引擎,提升查询性能以及节约系统开销
4.增加冗余,提高可用性

实现读写分离的方式

1. 应用程序层实现,网站的程序实现

应用程序层实现指的是在应用程序内部及连接器中实现读写分离

2.中间件层实现:

中间件层实现是指在外部中间件程序实现读写分离

常见的中间件程序


什么是MyCAT

MyCAT官方地址


MyCat服务安装与配置

MyCat有提供编译好的安装包,支持Windows、Linux、Mac、Solaris等系统上安装与运行。 官方下载主页http://www.mycat.io
Linux下可以下载Mycat-server-xxxxx.linux.tar.gz 解压在某个目录下,注意目录不能有空格,在Linux(Unix)下,建议放在usr/local/Mycat目录下,
如下:

[root@ShuaiGuo ~]# wget http://dl.mycat.io/1.6.7.1/Mycat-server-1.6.7.1-release-20190213150257-linux.tar.gz
[root@ShuaiGuo ~]# ll
total 17152
-rw-------. 1 root root     1742 Jun 12 16:54 anaconda-ks.cfg
-rw-r--r--  1 root root 17558357 Feb 22 16:20 Mycat-server-1.6.7.1-release-20190213150257-linux.tar.gz
[root@ShuaiGuo ~]# tar zvxf Mycat-server-1.6.7.1-release-20190213150257-linux.tar.gz -C /usr/local/
[root@ShuaiGuo ~]# cd /usr/local/
[root@ShuaiGuo local]# ls
bin  etc  games  include  lib  lib64  libexec  mycat  sbin  share  src
[root@ShuaiGuo local]# 
[root@ShuaiGuo local]# ls /usr/local/mycat/
bin  catlet  conf  lib  version.txt
[root@ShuaiGuo local]# useradd mycat 
[root@ShuaiGuo local]# passwd mycat
Changing password for user mycat.
New password: 
BAD PASSWORD: The password is shorter than 8 characters
Retype new password: 
passwd: all authentication tokens updated successfully.
[root@ShuaiGuo local]# 
[root@ShuaiGuo local]# chown -R mycat:mycat /usr/local/mycat/

[root@ShuaiGuo local]# ll /usr/local/mycat/
total 12
drwxr-xr-x 2 mycat mycat  190 Jun 15 18:53 bin
drwxrwxrwx 2 mycat mycat    6 Feb 13 14:46 catlet
drwxrwxrwx 4 mycat mycat 4096 Jun 15 18:53 conf
drwxr-xr-x 2 mycat mycat 4096 Jun 15 18:53 lib
-rwxrwxrwx 1 mycat mycat  185 Feb 13 15:02 version.txt
[root@ShuaiGuo local]# 


[root@ShuaiGuo ~]# cd /usr/local/mycat/bin/
[root@ShuaiGuo bin]# ll
total 384
-rwxr-xr-x 1 mycat mycat   3567 Feb 13 14:46 dataMigrate.sh
-rwxr-xr-x 1 mycat mycat   1225 Feb 13 14:46 init_zk_data.sh
-rwxr-xr-x 1 mycat mycat  15714 Feb 13 15:03 mycat
-rwxr-xr-x 1 mycat mycat   2941 Feb 13 14:46 rehash.sh
-rwxr-xr-x 1 mycat mycat   2496 Feb 13 14:46 startup_nowrap.sh
-rwxr-xr-x 1 mycat mycat 140198 Feb 13 15:03 wrapper-linux-ppc-64
-rwxr-xr-x 1 mycat mycat  99401 Feb 13 15:03 wrapper-linux-x86-32
-rwxr-xr-x 1 mycat mycat 111027 Feb 13 15:03 wrapper-linux-x86-64
[root@ShuaiGuo bin]# 

[root@ShuaiGuo ~]# cd /usr/local/mycat/
[root@ShuaiGuo mycat]# mkdir logs
[root@ShuaiGuo mycat]# chmod -R a+rwx ./logs/
[root@ShuaiGuo mycat]# chown -R mycat.mycat ./logs/
[root@ShuaiGuo mycat]# cd bin/
[root@ShuaiGuo bin]# ./mycat console 
Running Mycat-server...
wrapper  | --> Wrapper Started as Console
wrapper  | Launching a JVM...
wrapper  | JVM exited while loading the application.
jvm 1    | wrapper  | Unable to start JVM: No such file or directory (2)
wrapper  | Launching a JVM...
wrapper  | JVM exited while loading the application.
jvm 2    | wrapper  | Unable to start JVM: No such file or directory (2)
^Cwrapper  | INT trapped.  Shutting down.
wrapper  | <-- Wrapper Stopped
[root@ShuaiGuo bin]# 

Mycat 需要安装JDK 1.7 或者以上版:

[root@ShuaiGuo ~]# wget http://dl.mycat.io/jdk-8u20-linux-x64.tar.gz

第二步:新建/usr/java文件夹,将/jdk-8u20-linux-x64.tar.gz解压到该目录中
[root@ShuaiGuo ~]#  mkdir /usr/java
[root@ShuaiGuo ~]#  tar xf /jdk-8u20-linux-x64.tar.gz -C /usr/java/

[root@ShuaiGuo ~]# ll
total 157108
-rw-------. 1 root root      1742 Jun 12 16:54 anaconda-ks.cfg
-rw-r--r--  1 root root 160872342 Jun 27  2015 jdk-8u20-linux-x64.tar.gz
[root@ShuaiGuo ~]# mkdir /usr/java
[root@ShuaiGuo ~]# tar zvxf jdk-8u20-linux-x64.tar.gz -C /usr/java/
[root@ShuaiGuo ~]# vim /etc/profile.d/java.sh
JAVA_HOME=/usr/java/jdk1.8.0_20
PATH=$JAVA_HOME/bin:$PATH
CLASSPATH=$JAVA_HOME/jre/lib/ext:$JAVA_HOME/lib/tools.jar
export PATH JAVA_HOME CLASSPATH


[root@ShuaiGuo ~]# vim /etc/profile.d/java.sh
[root@ShuaiGuo ~]# ls /etc/profile.d/java.sh 
/etc/profile.d/java.sh
[root@ShuaiGuo ~]# source /etc/profile.d/java.sh   #使环境变量生效
[root@ShuaiGuo ~]# java -version
java version "1.8.0_20"
Java(TM) SE Runtime Environment (build 1.8.0_20-b26)
Java HotSpot(TM) 64-Bit Server VM (build 25.20-b23, mixed mode)
[root@ShuaiGuo ~]# 

MyCat服务启动与启动设置

MyCAT在Linux中部署启动时,首先需要在Linux系统的环境变量中配置MYCAT_HOME,操作方式如下:

[root@ShuaiGuo ~]# vim /etc/profile.d/mycat.sh

MYCAT_HOME=/usr/local/mycat
PATH=$MYCAT_HOME/bin:$PATH

[root@ShuaiGuo ~]# source /etc/profile.d/mycat.sh   #使环境变量生效
[root@ShuaiGuo ~]# mycat -v
Usage: /usr/local/mycat/bin/mycat { console | start | stop | restart | status | dump }
[root@ShuaiGuo ~]# 

如果是在多台Linux系统中组建的MyCAT集群,那需要在MyCAT Server所在的服务器上配置对其他IP和主机名的映射,配置方式如下:

vim /etc/hosts
例如:我有4台机器,4台机器主机配置如下:
IP 主机名:
192.168.31.62 ShuaiJhou
192.168.31.63 ZhouShuai
192.168.31.64 ShuaiZhou
192.168.31.65 ShuaiGuou
编辑完后,保存文件。


mycat的用户账号和授权信息是在conf/server.xml文件中配置

[root@ShuaiGuo ~]# cd /usr/local/mycat/conf/
[root@ShuaiGuo conf]# vim server.xml 

                        <property name="frontWriteQueueSize">4096</property> <property name="processors">32</property> -->
        </system>
        <!--以下设置为应用访问帐号权限 -->
        <user name="zhoushuai">
                <property name="password">123456</property>
                <property name="schemas">test</property>
        </user>
         <!--以下设置为应用只读帐号权限 -->
        <user name="shuaishuai">
                <property name="password">123456</property>
                <property name="schemas">test</property>
                <property name="readOnly">true</property>
        </user>

编辑MyCAT的配置文件schema.xml,关于dataHost的配置信息如下:

[root@ShuaiGuo conf]# cp schema.xml schema.xml.bak  #备份原文件。
[root@ShuaiGuo conf]# vim schema.xml

<?xml version="1.0"?>
<!DOCTYPE mycat:schema SYSTEM "schema.dtd">
<mycat:schema xmlns:mycat="http://org.opencloudb/">

        <schema name="test" checkSQLschema="false" sqlMaxLimit="100" dataNode="dn1" >
        </schema>
        <dataNode name="dn1" dataHost="dbHost" database="test" />
        <dataHost name="dbHost" maxCon="1000" minCon="10" balance="1"
                writeType="0" dbType="mysql" dbDriver="native" switchType="-1"  slaveThreshold="100">
                <heartbeat>select user()</heartbeat>
                <!-- can have multi write hosts -->
                <writeHost host="ShuaiJhou" url="192.168.31.62:3306" user="mycat"
                        password="123456">
                </writeHost>
                <writeHost host="ZhouShuai" url="192.168.31.63:3306" user="mycat"
                        password="123456" />
        </dataHost>
</mycat:schema>

经过以上两个步骤的配置,就可以到/usr/local/mycat/bin 目录下执行 ./mycat start,即可启动mycat服务!

[root@ShuaiGuo conf]# /usr/local/mycat/bin/mycat start
Starting Mycat-server...
Mycat-server is already running.
[root@ShuaiGuo conf]# /usr/local/mycat/bin/mycat restart
Stopping Mycat-server...
Stopped Mycat-server.
Starting Mycat-server...
[root@ShuaiGuo conf]# cat /usr/local/mycat/logs/wrapper.log


在主从数据库上:授权给mycat登陆数据库使用的帐号

[root@ShuaiZhou ~]# mysql -uroot -p123456
mysql> set global validate_password_policy=0;
Query OK, 0 rows affected (0.00 sec)

mysql> set global validate_password_length=1;
Query OK, 0 rows affected (0.00 sec)

mysql> GRANT ALL PRIVILEGES ON *.* TO 'mycat'@"%" IDENTIFIED BY "123456"; 
Query OK, 0 rows affected, 1 warning (0.00 sec)

mysql> flush privileges;
Query OK, 0 rows affected (0.01 sec)

启动服务Mycat服务:

[root@ShuaiGuo ~]# mycat start
Starting Mycat-server...
Mycat-server is already running.
[root@ShuaiGuo ~]# mycat restart
Stopping Mycat-server...
Stopped Mycat-server.
Starting Mycat-server...
[root@ShuaiGuo ~]# tail -5 /usr/local/mycat/logs/wrapper.log 
INFO   | jvm 1    | 2019/06/15 22:51:57 | Wrapper (Version 3.2.3) http://wrapper.tanukisoftware.org
INFO   | jvm 1    | 2019/06/15 22:51:57 |   Copyright 1999-2006 Tanuki Software, Inc.  All Rights Reserved.
INFO   | jvm 1    | 2019/06/15 22:51:57 | 
INFO   | jvm 1    | 2019/06/15 22:51:58 | log4j 2019-06-15 22:51:58 [./conf/log4j.xml] load completed.
INFO   | jvm 1    | 2019/06/15 22:51:58 | MyCAT Server startup successfully. see logs in logs/mycat.log
[root@ShuaiGuo ~]# 
[root@ShuaiGuo ~]# netstat -ant | grep 8066
tcp6       0      0 :::8066                 :::*                    LISTEN     
tcp6       0      0 192.168.31.65:8066      192.168.31.14:58150     ESTABLISHED
tcp6       0      0 192.168.31.65:8066      192.168.31.14:58154     ESTABLISHED
tcp6       0      0 192.168.31.65:8066      192.168.31.14:58156     ESTABLISHED
[root@ShuaiGuo ~]# 


[root@ShuaiGuo ~]# mysql -uzhoushuai -p123456  -h 192.168.31.65 -P8066
mysql: [Warning] Using a password on the command line interface can be insecure.
Welcome to the MySQL monitor.  Commands end with ; or \g.
Your MySQL connection id is 5
Server version: 5.5.8-mycat-1.5-RELEASE-20160301083012 MyCat Server (OpenCloundDB)

Copyright (c) 2000, 2019, Oracle and/or its affiliates. All rights reserved.

Oracle is a registered trademark of Oracle Corporation and/or its
affiliates. Other names may be trademarks of their respective
owners.

Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.

mysql> 


测试读写分离


最后编辑于
?著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 214,172评论 6 493
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 91,346评论 3 389
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事?!?“怎么了?”我有些...
    开封第一讲书人阅读 159,788评论 0 349
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 57,299评论 1 288
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 66,409评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,467评论 1 292
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,476评论 3 412
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,262评论 0 269
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,699评论 1 307
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,994评论 2 328
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,167评论 1 343
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,827评论 4 337
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,499评论 3 322
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,149评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,387评论 1 267
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,028评论 2 365
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,055评论 2 352

推荐阅读更多精彩内容