(1).读写分离概述

1)工作原理

  读写分离是让主数据库处理事务性增删改操作(insert、delete、update),让从数据库处理查询查询操作(select)。

2)作用

  1.分担负载

  2.主从只负责各自的写和读,极大的缓解X锁和S锁争用

  3.从库可配置MyISAM引擎,提升查询性能以及节约系统开销

  4.增加冗余,提高可用性

3)实现方法

一、应用程序和网站程序的实现。指的是在应用程序内部及连接器中实现读写分离。

  优点:1.应用程序内部实现读写分离,安装就可以使用;2. 减少一定部署难度;3.访问压力在一定级别以下,性能很好。

  缺点:1.架构一旦调整,代码要跟着变;2.难以实现高级应用,如自动分库,分表;3.无法适用大型应用场景。

二、中间件实现。指的是在外部中间件程序实现读写分离。

  优点:1.架构设计更灵活;2.可以在程序上实现一些高级控制,如:透明化水平拆分,failover,监控;3.可以依靠些技术手段提高mysql性能;4.对业务代码的影响小,同时也安全

  缺点:需要一定的开发运维团队的支持。

4)常见的Mysql中间键

  Cobar、MyCAT、OneProxy、Vitess、Kingshard、Atlas、MaxScale与MySQL Route。

  使用mycat原因是这是一款开源的免费的Mysql中间件,基于Cobar基础上二次开发,其功能也是相当完善。而且目前Mycat社区很活跃,支持度比较高,维护短期内应该不会中断。

(2).实验环境

youxi1  192.168.5.101  CentOS7.5  Mysql5.7.16  Mysql端口3306  Mycat中间件

youxi2  192.168.5.102  CentOS7.5  Mysql5.7.16  Mysql端口3306  Master

youxi3  192.168.5.103  CentOS7.5  Mysql5.7.16  Mysql端口3306  Slave

(3).Mycat服务的安装与配置

  使用mycat中间件搭建读写分离,那么应访问的是mycat中间件,再由mycat访问主从服务器。

  Mycat的官网是http://www.mycat.io,我下载的版本是Mycat-server-1.6.7.1-release-20190213150257-linux.tar.gz,然后上传到youxi1服务器上。

  Mycat需要安装JDK1.7或以上版本,我下载的是jdk-8u191-linux-x64.tar.gz,然后上传到youxi1服务器上。

  然后解压到/usr/local/目录下

[root@youxi1 ~]# tar zxf Mycat-server-1.6.7.1-release-20190213150257-linux.tar.gz -C /usr/local/
[root@youxi1 ~]# ls /usr/local/
bin etc games include lib lib64 libexec mycat sbin share src
[root@youxi1 logs]# ls /usr/local/mycat/
bin catlet conf lib version.txt
[root@youxi1 logs]# mkdir /usr/local/mycat/logs  //少一个logs目录就创建一个

  添加mysql用户以及修改文件夹权限

[root@youxi1 ~]# useradd mycat
[root@youxi1 ~]# echo "mycat:123456" | chpasswd
[root@youxi1 ~]# chown -R mycat:mycat /usr/local/mycat/
[root@youxi1 ~]# ll /usr/local/mycat/
总用量 12
drwxr-xr-x 2 mycat mycat 190 6月 18 15:30 bin
drwxrwxrwx 2 mycat mycat 6 2月 13 14:46 catlet
drwxrwxrwx 4 mycat mycat 4096 6月 18 15:30 conf
drwxr-xr-x 2 mycat mycat 4096 6月 18 15:30 lib
drwxr-xr-x 2 mycat mycat 6 6月 20 15:09 logs
-rwxrwxrwx 1 mycat mycat 185 2月 13 15:02 version.txt

说明:bin 程序目录,存放了封装成服务的版本,还存放了nowrap的shell脚本命令,方便大家选择和修改。mycat支持的命令有{ console | start | stop | restart | status | dump }

   conf目录下存放了配置文件,其中server.xml是Mycat服务器参数调整和用户授权的配置文件,schema.xml是逻辑库、表和分片定义的配置文件,rule.xml是分片规则的配置文件。另外分片规则的一些具体参数信息单独作为一个文件,也是存放在这个目录下。配置文件修改后,需要重启Mycat或者通过9066端口reload。

   lib目录下主要存放mycat依赖的一些jar文件。

   另外mycat启动后还会生成${sys:MYCAT_HOME}/logs/mycat.log,日志会存放在其中(默认250M上限,时间上限为1天,超出会创建新的日志文件,并且会自动备份),可以在conf/log4j.xml中配置日志文件,默认输出级别为info,可以调整为debug,输出更多信息方便排错。

  注意:Linux下部署安装MySQL,默认不忽略表名大小写,需要手动到/etc/my.cnf下配置lower_case_table_names=1,使Linux环境下MySQL忽略表名大小写,否则使用MyCAT的时候会提示找不到表的错误!

  解压JDK,添加jdk的环境变量文件,然后加载环境变量

[root@youxi1 ~]# mkdir /usr/local/java/
[root@youxi1 ~]# tar xf jdk-8u191-linux-x64.tar.gz -C /usr/local/java/
[root@youxi1 ~]# ls /usr/local/java/
jdk1.8.0_191
[root@youxi1 ~]# vim /etc/profile.d/java.sh  //配置环境变量
JAVA_HOME=/usr/local/java/jdk1.8.0_191
PATH=$JAVA_HOME/bin:$PATH
CLASSPATH=$JAVA_HOME/jre/lib/ext:$JAVA_HOME/lib/tools.jar
export PATH JAVA_HOME CLASSPATH
[root@youxi1 ~]# source /etc/profile.d/java.sh  //加载环境变量
[root@youxi1 ~]# java -version  //查看是否生效
java version "1.8.0_191"
Java(TM) SE Runtime Environment (build 1.8.0_191-b12)
Java HotSpot(TM) 64-Bit Server VM (build 25.191-b12, mixed mode)

(4).Mycat启动

  添加mycat的环境变量文件,然后加载环境变量

[root@youxi1 ~]# vim /etc/profile.d/mycat.sh
MYCAT_HOME=/usr/local/mycat
PATH=$MYCAT_HOME/bin:$PATH
[root@youxi1 ~]# source /etc/profile.d/mycat.sh

  注意:JDK的环境变量和Mycat的环境变量也可以一次性添加到/etc/profile文件中,然后重新加载。不过没有分开编辑好管理。

  配置mycat本身的用户信息server.xml文件

[root@youxi1 ~]# vim /usr/local/mycat/conf/server.xml
//直接拉到最后修改<user>部分,设置访问mycat的用户信息,以及其能够访问的逻辑库
<user name="root">  //设置用户名。如果存在defaultAccount="true",则表示在不指定用户的情况下,默认以该用户访问mycat。
  <property name="password">123456</property>  //设置当前用户的密码
  <property name="schemas">TESTDB</property>  //能够访问的逻辑库(虚拟库),逻辑库需要在同目录下的schema.xml定义
//没有设置任何权限,则默认具有所有权限
  <!-- 表级 DML 权限设置 -->
  <!--
  <privileges check="false">
    <schema name="TESTDB" dml="0110" >
      <table name="tb01" dml="0000"></table>
      <table name="tb02" dml="1111"></table>
    </schema>
  </privileges>
  -->
</user> <user name="user">  //设置用户名
  <property name="password">123456</property>  //设置当前用户的密码
  <property name="schemas">TESTDB</property>  //能够访问的逻辑库(虚拟库)
  <property name="readOnly">true</property>  //设置只读权限
</user>

  配置schema.xml文件,定义逻辑库信息

[root@youxi1 ~]# cp /usr/local/mycat/conf/schema.xml /usr/local/mycat/conf/schema.xml.bak  //提供的是分库分表,用法比较高级了
[root@youxi1 ~]# 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标签用于定义mycat中的逻辑库。
*name是逻辑库名;
*checkSQLschema默认为false,含义为是否去掉表名前的逻辑库名,只能去除当前定义的逻辑库名;
*sqlMaxLimit是隐式limit,如果查询没有定义limit,则自动加上limit;
*dataNode指定所属的数据节点,也就是常说的数据分片。*/
<schema name="TESTDB" checkSQLschema="false" sqlMaxLimit="100" dataNode='dn1'/> //dataNote标签用于定义数据节点。name是数据节点名称;dataHost指定所属数据库实例;database指定数据库实例上的实际数据库名(要和真实数据库一样的名字)。
<dataNode name="dn1" dataHost="dthost" database="ha"/> /*dataHost标签用于定义数据库实例。
*name数据库实例名称;
*maxCon指定每个读写实例连接池的最大连接;
*minCon指定每个读写实例连接池的最小连接,初始化连接池的大小
*balance和writeType请看下方说明;
*dbType指定后端连接的数据库类型,支持二进制的mysql协议,以及其他使用JDBC连接的数据库,例如mongodb、oracle、spark等;
*dbDriver指定后端数据库使用的驱动,可选值JDBC和native,其中native对应二进制的mysql协议,即mysql和maridb,其余都使用JDBC;
*switchType请看下发说明
*slaveThreshold slave服务器读的安全边界,如果Seconds_Behind_Master大于这个值,这台slave服务器会被临时剔除,以免被读。*/
<dataHost name="dthost" maxCon="500" minCon="10" balance="1" writeType="0" dbType="mysql" dbDriver="native" switchType="-1" slaveThreshold="100"> //heartbeat标签用于定义心跳语句,用语句执行成功与否来判断数据库的可用性
<heartbeat>select user()</heartbeat> /*writeHost和readHost标签都指定数据库的相关配置,用于实例化后端连接池。writeHost定义写实例,readHost定义读实例。
*host是writeHost或readHost的名称,也是唯一标识;
*usrl指定后端实例连接地址;
*user指定后端存储实例需要的用户名(数据库的用户名);
*password指定后端存储实例需要的密码(数据库用户的密码);
*weight权重,是配置在readHost中作为读节点的权重*/
<writeHost host="youxi2" url="192.168.5.102:3306" user="mycat" password="123456" />
<writeHost host="youxi3" url="192.168.5.103:3306" user="mycat" password="123456" />
</dataHost>
</mycat:schema>

  注意:如果使用readHost标签,请使用writeHost标签将readHost标签包裹。

说明:

  balance负载均衡类型。0表示不开启读写分离,所有读操作(select查询)都发送到当前writeHost上。1表示全部的readHost和备用writeHost都参与读操作(select查询)的负载均衡。2表示读操作随机在writeHost和readHost上发布。3表示所有读操作随机分发到当前writeHost对应的readHost上执行,writeHost不用执行。

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

  switchType切换类型。-1表示不自动切换。1表示自动切换,默认值。2表示基于Mysql主从同步状态决定是否切换,心跳语句为show slave status。3表示基于MySQL galary cluster的切换机制(适合集群),心跳语句为show status like 'wsrep%'。

  启动测试Mycat,并设置开机自启

[root@youxi1 conf]# mycat start  //因为已经配置环境变量,所以可以不写绝对路径
Starting Mycat-server...
[root@youxi1 conf]# tail /usr/local/mycat/logs/wrapper.log
STATUS | wrapper | 2019/06/20 15:26:47 | --> Wrapper Started as Daemon
STATUS | wrapper | 2019/06/20 15:26:47 | Launching a JVM...
INFO | jvm 1 | 2019/06/20 15:26:47 | Java HotSpot(TM) 64-Bit Server VM warning: ignoring option MaxPermSize=64M; support was removed in 8.0
INFO | jvm 1 | 2019/06/20 15:26:48 | Wrapper (Version 3.2.3) http://wrapper.tanukisoftware.org
INFO | jvm 1 | 2019/06/20 15:26:48 | Copyright 1999-2006 Tanuki Software, Inc. All Rights Reserved.
INFO | jvm 1 | 2019/06/20 15:26:48 |
INFO | jvm 1 | 2019/06/20 15:26:57 | MyCAT Server startup successfully. see logs in logs/mycat.log  //成功启动
[root@youxi1 conf]# echo "/usr/local/mycat/bin/mycat start" >> /etc/rc.local
[root@youxi1 conf]# chmod +x /etc/rc.d/rc.local
[root@youxi1 conf]# vim /usr/local/mycat/conf/wrapper.conf
wrapper.java.command=/usr/local/java/jdk1.8.0_191/bin/java  //第5行,指向java

  注意:如果防火墙是打开的,记得添加mysql的端口号。

[root@youxi1 ~]# firewall-cmd --permanent --zone=public --add-port=8066/tcp
success
[root@youxi2 ~]# firewall-cmd --reload
success
[root@youxi2 ~]# firewall-cmd --zone=public --list-ports
8066/tcp

(5).配置主从复制

1)youxi2上操作

  创建mycat中schema.xml文件设置的用户名和密码,以及指定的数据库。创建复制用的用户

mysql> grant all privileges on *.* to 'mycat'@'192.168.5.%' identified by '123456';  //mycat指定的用户
Query OK, 0 rows affected, 1 warning (0.01 sec) mysql> grant replication slave on *.* to 'slave'@'192.168.5.%' identified by '123456';  //复制用的用户
Query OK, 0 rows affected, 1 warning (0.00 sec) mysql> flush privileges;  //刷新权限表
Query OK, 0 rows affected (0.00 sec) mysql> create database ha;  //mycat指定的数据库
Query OK, 1 row affected (0.00 sec)

  修改配置文件,并重启

[root@youxi2 ~]# vim /etc/my.cnf
server-id=1
log-bin=mysql-bin-master
binlog-do-db=ha
[root@youxi2 ~]# systemctl restart mysqld

  查看master状态

mysql> show master status\G
*************************** 1. row ***************************
File: mysql-bin-master.000001
Position: 154
Binlog_Do_DB: ha
Binlog_Ignore_DB:
Executed_Gtid_Set:
1 row in set (0.00 sec)

  注意:如果防火墙是打开的,记得添加mysql的端口号。

[root@youxi2 ~]# firewall-cmd --permanent --zone=public --add-port=3306/tcp
success
[root@youxi2 ~]# firewall-cmd --reload
success
[root@youxi2 ~]# firewall-cmd --zone=public --list-ports
3306/tcp

2)youxi3上操作

  创建mycat中schema.xml文件设置的用户名和密码,以及指定的数据库。

mysql> grant all privileges on *.* to 'mycat'@'192.168.5.%' identified by '123456';  //mycat指定的用户
Query OK, 0 rows affected, 1 warning (0.01 sec) mysql> flush privileges;  //刷新权限表
Query OK, 0 rows affected (0.00 sec) mysql> create database ha;  //mycat指定的数据库
Query OK, 1 row affected (0.01 sec)

  修改配置文件

[root@youxi3 ~]# vim /etc/my.cnf
server-id=2
[root@youxi3 ~]# systemctl restart mysqld

  配置master信息

mysql> stop slave;
Query OK, 0 rows affected (0.01 sec) mysql> change master to master_host='192.168.5.102',master_user='slave',master_password='123456',master_log_file='mysql-bin-master.000001',master_log_pos=154;
Query OK, 0 rows affected, 2 warnings (0.01 sec) mysql> start slave;
Query OK, 0 rows affected (0.00 sec)

  查看slave状态

mysql> show slave status\G
*************************** 1. row ***************************
Slave_IO_State: Waiting for master to send event
Master_Host: 192.168.5.102
Master_User: slave
Master_Port: 3306
Connect_Retry: 60
Master_Log_File: mysql-bin-master.000001
Read_Master_Log_Pos: 154
Relay_Log_File: youxi3-relay-bin.000003
Relay_Log_Pos: 327
Relay_Master_Log_File: mysql-bin-master.000001
Slave_IO_Running: Yes
Slave_SQL_Running: Yes

  注意:如果防火墙是打开的,记得添加mysql的端口号。

[root@youxi3 ~]# firewall-cmd --permanent --zone=public --add-port=3306/tcp
success
[root@youxi3 ~]# firewall-cmd --reload
success
[root@youxi3 ~]# firewall-cmd --zone=public --list-ports
3306/tcp

(6).测试

  在youxi1上连接mycat,当然也可以使用软件客户端远程连接mycat。并创建测试数据

[root@youxi1 ~]# mysql -uroot -p123456 -h192.168.5.101 -P8066  //这边的用户名和密码必须是mycat配置文件server.xml中定义的用户
mysql> show databases;  //注意这里显示的是mycat定义的逻辑库TESTDB
+----------+
| DATABASE |
+----------+
| TESTDB |
+----------+
1 row in set (0.00 sec) mysql> use TESTDB;
Database changed
mysql> show tables;
Empty set (0.00 sec) mysql> create table user_tb(user int,name varchar(20));
Query OK, 0 rows affected (0.03 sec) mysql> insert into user_tb values(1,'zhangsan');
Query OK, 1 row affected (0.05 sec)

  再到youxi2和yousi3上查看

[root@youxi2 ~]# mysql -uroot -p123456
mysql> select * from ha.user_tb;  //查询时需要查询实际存在的数据库
+------+----------+
| user | name |
+------+----------+
| 1 | zhangsan |
+------+----------+
1 row in set (0.00 sec) [root@youxi3 ~]# mysql -uroot -p123456
mysql> select * from ha.user_tb;
+------+----------+
| user | name |
+------+----------+
| 1 | zhangsan |
+------+----------+
1 row in set (0.01 sec)

  再试一下只读用户user

[root@youxi1 ~]# mysql -uuser -p123456 -h192.168.5.101 -P8066
mysql> use TESTDB;
Reading table information for completion of table and column names
You can turn off this feature to get a quicker startup with -A Database changed
mysql> insert into user_tb values(2,'lisi');
ERROR 1495 (HY000): User readonly

  如果master服务器youxi2宕机,那么mycat将只能读不能写。

//youxi2上停止mysqld,模拟宕机
[root@youxi2 ~]# systemctl stop mysqld //此时的再进行测试
[root@youxi1 logs]# mysql -uroot -p123456 -h192.168.5.101 -P8066
mysql> use TESTDB;
Reading table information for completion of table and column names
You can turn off this feature to get a quicker startup with -A Database changed
mysql> select * from user_tb;
+------+----------+
| user | name |
+------+----------+
| 1 | zhangsan |
+------+----------+
1 row in set (0.03 sec) mysql> insert into user_tb values(2,'lisi');
ERROR 1184 (HY000): java.net.ConnectException: 拒绝连接

  注意:再次启动mysqld,能够恢复正常

参考:https://www.cnblogs.com/conanwang/p/5961019.html

Mysql读写分离(Mycat版)的更多相关文章

  1. docker环境 mysql读写分离 mycat maxscale

    #mysql读写分离测试 环境centos 7.4 ,docker 17.12 ,docker-compose mysql 5.7 主从 mycat 1.6 读写分离 maxscale 2.2.4 读 ...

  2. MySQL读写分离---Mycat

    一.什么是读写分离 在数据库集群架构中,让主库负责处理事务性查询,而从库只负责处理select查询,让两者分工明确达到提高数据库整体读写性能.当然,主数据库另外一个功能就是负责将事务性查询导致的数据变 ...

  3. 高可用Mysql架构_Mysql主从复制、Mysql双主热备、Mysql双主双从、Mysql读写分离(Mycat中间件)、Mysql分库分表架构(Mycat中间件)的演变

    [Mysql主从复制]解决的问题数据分布:比如一共150台机器,分别往电信.网通.移动各放50台,这样无论在哪个网络访问都很快.其次按照地域,比如国内国外,北方南方,这样地域性访问解决了.负载均衡:M ...

  4. MySQL读写分离之MyCAT

    Mycat实现MySQL主从复制读写分离 MyCAT的安装及部署 1.部署jdk环境 MyCAT用Java开发,需要有JAVA运行环境,mycat依赖jdk1.7的环境 1)上传jdk [root@l ...

  5. 基于MYCAT中间件实现MYSQL读写分离

    基于mycat实现mysql读写分离 完成主从复制的配置 /* 主节点:192.168.47.101 从节点:192.168.47.102 */ /*mycat为同一网段客户端*/ /* 修改主节点基 ...

  6. Mycat安装并实现mysql读写分离,分库分表

    Mycat安装并实现mysql读写分离,分库分表 一.安装Mycat 1.1 创建文件夹 1.2 下载 二.mycat具体配置 2.1 server.xml 2.2 schema.xml 2.3 se ...

  7. Docker安装Mycat并实现mysql读写分离,分库分表

    Docker安装Mycat并实现mysql读写分离,分库分表 一.拉取mycat镜像 二.准备挂载的配置文件 2.1 创建文件夹并添加配置文件 2.1.1 server.xml 2.1.2 serve ...

  8. mysql读写分离的解决方案

    来源于网上整理 http://yanwt.iteye.com/blog/1460780 现有三种解决方式实现mysql读写分离 1 程序修改mysql操作类 优点:直接和数据库通信,简单快捷的读写分离 ...

  9. 使用Spring实现MySQL读写分离(转)

    使用Spring实现MySQL读写分离 为什么要进行读写分离 大量的JavaWeb应用做的是IO密集型任务, 数据库的压力较大, 需要分流 大量的应用场景, 是读多写少, 数据库读取的压力更大 一个很 ...

  10. Database基础(六):实现MySQL读写分离、MySQL性能调优

    一.实现MySQL读写分离 目标: 本案例要求配置2台MySQL服务器+1台代理服务器,实现MySQL代理的读写分离: 用户只需要访问MySQL代理服务器,而实际的SQL查询.写入操作交给后台的2台M ...

随机推荐

  1. JVM堆空间用途分析与划分依据

    在上一次[https://www.cnblogs.com/webor2006/p/9876493.html]已经对JVM的内存空间的划分进行了理论化的学习,这次还是对上一次提到的理论进行进一步的补充, ...

  2. U盘损坏?

  3. 为RIDE创建桌面快捷方式

    问题场景:默认情况下,RIDE的图标不是自动创建的,需要手动添加.     解决方法: 在桌面上新建"快捷方式" 目标对象的位置:C:\Python27\python2.exe - ...

  4. vue 对象更改检测注意事项

  5. go常量的定义和枚举类型

    const a,b int = 1,2 const a,b     = 1,2 const ( a = "hello" b,c =3,4 ) 常量数值可作为各种类型使用 枚举类型的 ...

  6. Linux下安装mysql(离线安装和在线安装)

    一:在线安装mysql 1.首先检测一下,mysql之前有没有被安装 命令:rpm -qa | grep mysql 2.删除mysql的命令: rpm -e --nodeps `rpm -qa | ...

  7. 使用 Java 创建聊天客户端-2

    1.项目截图 java聊天核心代码: MyJavaChatClient ================================================================ ...

  8. python打包成exe,太大了该怎么解决?

    这是一个很长的故事,嫌长的直接看最后的结论 事情经过 上周接了个需求,写了个小工具给客户,他要求打包成exe文件,这当然不是什么难事.因为除了写Python的,绝大多数人电脑里都没有Python编译器 ...

  9. centos6安装Python3环境

    Python3安装 CentOS 6+系统默认安装的python版本是2.6.6,python2版本与python3还有有一些语法上的不一样.我们要把python升级到3版本,但是系统自带的旧版本py ...

  10. IDEA正确设置编码统一为UTF-8

    之前代码在myeclispe10跑得好好的来这个intellij idea 就一直出错 改了好久的编码都没卵用,如下设置才正确.还有idea的web工程目录和myeclispe的目录是不一样的,神坑. ...