(三)、MySQL读写分离-MyCat

12. MySQL读写分离-MyCat

12.1、MySQL读写分离概述

我们为什么要实现mysql的读写分离呢?

​ 随着还联网的高速发展,上网的人越来也多,人们的查询和存储的数据也越来越多,查询和写入大量的集中在一台服务器上,使得单体数据库服务器无法承受。所以人们想到了,讲读取数据和写入数据分开操作,这样就可以大大的减轻主库的压力。

​ 因此,一般来说都是通过主从复制(Master-Slave)的方式来同步数据,再通过读写分离(MySQL-

Proxy/Amoeba)来提升数据库的并发负载能力 这样的方案来进行部署与实施的

我们在上一节通过主从复制实现了多台mysql的数据共享,这一节我们将通过mycat实现读写分离。

读写分离的原理

  • 主库只负责处理事务,增加(insert into)、删除(delete)、修改(update)
  • 从库中负责查询的操作(select)
  • 通过主从复制,将主库执行的事务同步到从库中,使之保持一致

读写分离的优势

面对越来越大的访问压力,单台的服务器的性能成为瓶颈,需要分担负载

  • 主从只负责各自的写和读,极大程度的缓解X锁和S锁争用
  • 从库可配置myisam引擎,提升查询性能以及节约系统开销
  • 增加冗余,提高可用性

12.2、实现方式

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

A:应用程序内部实现读写分离,安装既可以使用

B:减少一定部署难度

C:性能很好

缺点:

A:架构一旦调整,代码要跟着变

B:难以实现高级应用,如自动分库,分表

C:无法适用大型应用场景

  • 使用中间件实现

优点:

A:架构设计更灵活

B:可以在程序上实现一些高级控制,如:透明化水平拆分,failover,监控

C:可以依靠些技术手段提高mysql性能,

D:对业务代码的影响小,同时也安全

缺点:

需要一定的开发运维团队的支持

12.3、部署读写分离

实验环境

一主两从

主机名 IP 系统版本 角色
mycat 192.168.116.101 CentOS 7 Mycat/NTP
mysqlmaster 192.168.116.20 CentOS 7 Master
mysqlslave1 192.168.116.3 CentOS 7 Slave
mysqlslave2 192.168.116.2 CentOS 7 Slave

实验步骤

1、建立同步时间

在Mycat上配置NTP服务,为其他三台mysql服务器提供时间服务

配置好本地yum源

安装NTP

 [root@mycat ~]# yum -y install ntp

配置NTP

 [root@mycat ~]# vim /etc/ntp.conf

添加如下两行

 server 127.127.1.0  
 fudge 127.127.1.0 stratum 8

启动NTP服务

 [root@mycat ~]# systemctl enable ntpd //设置为开机自启
 [root@mycat ~]# systemctl start ntpd //开启ntp服务

在其它三台服务器上连接NTP校对同步时间

分别在其他三台服务器上输入以下两条命令

 # yum -y install ntpdate
 # /usr/sbin/ntpdate 192.168.116.101  //这里是NTP服务器的ip地址

2、配置主从复制

1)主服务mysqlmaster的配置:

创建实验数据库并插入数据

 mysql> create database HA;
 mysql> use HA;
 mysql> create table T1(id int,name varchar(20));
 mysql> insert into T1 values(1,'Tom1');

创建主从复制授权用户,允许slave连接主机

 mysql> grant replication slave on *.* to 'slave'@'192.168.116.%' identified by "123";
 mysql> flush privileges; //刷新权限

配置my.cnf

[root@mysqlmaster~ ]# vim/etc/my.cnf

添加以下内容

 [mysqld]
 …………    //省略部分内容
 server-id=1
 log-bin=/data/mysql/log/mysql-bin-master
 binlog-do-db=HA
 sync-binlog=1
 binlog-format=mixed

重启mysql

[root@mysqlmaster~ ]# /etc/init.d/mysqld restart

查看master状态信息:

 mysql> show master status; #显示主服务器的当前binlog文件及事件位置

导出数据库

复制前要保证同步的数据库一致

 [root@mysqlmaster ~]# mysqldump  -uroot -p123 HA >HA.sql

将导出的数据库传给从服务器

 [root@mysqlmaster ~]# scp HA.sql [email protected]:~
 [root@mysqlmaster1 ~]# scp HA.sql [email protected]:~

2)从服务器配置

1、mysqlslave1 配置

导入数据库,和主数据库服务器保持一致

 [root@mysqlslave1 ~]# mysql -uroot -p123 -e 'create database HA;'
 [root@mysqlslave1 ~]# mysql -uroot -p123 HA 
 [root@mysqlslave2 ~]# mysql -uroot -p123 -e 'create database HA;'
 [root@mysqlslave2 ~]# mysql -uroot -p123 HA < HA.sql

从服务器mysqlslave1修改配置文件

 [root@mysqlslave1 ~]# vim /etc/my.cnf

添加如下内容

 [mysqld]
 …………    //省略部分内容
 server-id=2
 relay-log=/data/mysql/log/relay-log-bin
 relay-log-index=/data/mysql/log/slave-relay-bin.index
 replicate-do-db=HA   

重启Mysql服务

 [root@mysqlslave1 ~]# /etc/init.d/mysqld restart

进入从数据库进行授权

 mysql>change master to master_host='192.168.116.20',
 	   master_user='slave',master_password='123',
 	   master_log_file='mysql-bin-master.000001',master_log_pos=154;

查看状态

 mysql> start slave;
 mysql> show slave status\G;

2、mysqlslave2

配置参考mysqlsalve1

注意:在mysqlslave2配置文件中 server-id 不能与其他数据库相同 之前已将讲过

3、配值mycat

MyCAT有提供编译好的安装包,支持windows、Linux、Mac、Solaris等系统上安装与运行。
官方下载主页http://www.mycat.io

安装mycat

上传mycat、jdk软件包到mycat服务器

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Mua3lF30-1644028922172)(C:\Users\77259\AppData\Roaming\Typora\typora-user-images\1629282309108.png)]

解压安装包

 [root@mycat ~]# tar -zxvf Mycat-server-1.6.6.1-release-20181031195535-linux.tar.gz -C /usr/local/

进入解压的mycat查看目录

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-9C3Eztj0-1644028922173)(C:\Users\77259\AppData\Roaming\Typora\typora-user-images\1629282442541.png)]

目录解释

  • bin:maycat命令、启动、重启、停止等
    例如: ./mycat console
    mycat支持的命令{ console | start | stop | restart | status | dump }
  • conf目录:存放配置文件
  • lib:主要存放mycat依赖的一些jar文件,mycat是java开发的。
  • logs:日志文件,包括Mycat启动的日志和运行的日志。

配置java环境

解压jdk

 [root@mycat ~]# tar -zxvf jdk-8u171-linux-x64.tar.gz -C /usr/local/

配置JDK环境变量

 [root@mycat-node ~]# vim /etc/profile 

在文件最后加入以下内容

 JAVA_HOME=/usr/local/jdk1.8.0_171 
 PATH=$JAVA_HOME/bin:$PATH
 CLASSPATH=$JAVA_HOME/jre/lib/ext:$JAVA_HOME/lib/tools.jar 
 export PATH JAVA_HOME CLASSPATH

使环境变量生效

 [root@mycat ~]# source /etc/profile

查看java环境

 [root@mycat ~]# java -version

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-u0CKqxNR-1644028922173)(C:\Users\77259\AppData\Roaming\Typora\typora-user-images\1629282889633.png)]

修改mycat配置文件

配置mycat环境变量

 [root@mycat ~]# ln -s /usr/local/mycat/bin/*  /usr/local/bin/

配置mycat用户账号和授权信息

 [root@mycat conf]# cd /usr/local/mycat/conf/
 [root@mycat conf]# cp server.xml server.xml.bak	//将源文件备份一份,安全
 [root@mycat ~]# vim server.xml

server.xml文件其实跟读写分离策略关系不大,但是需要用此文件来配置连接MyCat的用户及权限等。

        #name:连接mycat的账号
        <user name="mycatroot" defaultAccount="true">
                <property name="password">123456</property>  #连接mycat的密码
                <property name="schemas">HA</property>   
                #这里的HA指的是mycat的逻辑数据库名称,可以自定义。这个在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="mycatreadonly">
                <property name="password">123456</property>
                <property name="schemas">HA</property>
                <property name="readOnly">true</property>
        </user>

这里的 HA 只的是逻辑数据库名

并不是真正的数据库

mycat会在 schema.xml中配置关于逻辑数据库对应的真实数据库,并同时实现读写分离

修改schema.xml配置文件

[root@mycat ~]# cd /usr/local/mycat/conf/
[root@mycat conf]# cp schema.xml schema.xml.bak
[root@mycat ~] # vim schema.xml
<?xml version="1.0"?>
<!DOCTYPE mycat:schema SYSTEM "schema.dtd">
<mycat:schema xmlns:mycat="http://io.mycat/">

        <schema name="HA" checkSQLschema="false" sqlMaxLimit="100" dataNode="dn1">
        </schema>
        <dataNode name="dn1" dataHost="dh1" database="HA" />
        <dataHost name="dh1" maxCon="1000" minCon="10" balance="1"
                          writeType="0" dbType="mysql" dbDriver="native" switchType="-1"  slaveThreshold="100">
                <heartbeat>select user()</heartbeat>
                <writeHost host="mysqlmaster" url="192.168.116.20:3306" user="root" password="123" />
                <writeHost host="mysqlsalve1" url="192.168.116.3:3306" user="root" password="123" />
                <writeHost host="mysqlsalve2" url="192.168.116.2:3306" user="root" password="123" />
        </dataHost>
</mycat:schema>

截图如下

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-MnobUF8u-1644028922174)(C:\Users\77259\AppData\Roaming\Typora\typora-user-images\1629283799975.png)]

注意:格式不要有错误否则会初始化异常,无法启动

参数说明

  • schema:

    一个schema标签对代表一个逻辑库

    其中:

    ​ Name:逻辑数据库名,与server.xml中的schema对应

    ​ sqlMaxLimit: select 时默认的limit,避免查询全表

    ​ dataNode=‘dn1’ 分库的时候用到,不分也可以。

  • dataNode:

    name:指定逻辑数据节点名称,与schema中的dataNode一致。

    dataHost:对应< dataHost >的name

    database:真正要使用的数据库名称。

  • dataHost:
    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-YfIUv8bs-1644028922174)(C:\Users\77259\AppData\Roaming\Typora\typora-user-images\1629284198468.png)]

    • balance:指的负载均衡类型,目前的取值有4种
      balance=“0”, 不开启读写分离机制,所有读操作都发送到当前可用的writeHost上。
      balance=“1”,全部的readHost与stand by writeHost(备主)参与select语句的负载均衡,
      balance=“2”,所有读操作都随机的在writeHost、readhost上分发。

      ​ balance=“3”,所有读请求随机的分发到wiriterHost对应的readhost执行, writerHost不负担读压力

    • switchType:指的是切换的模式,目前的取值也有4种

      ​ switchType=’-1’ 表示不自动切换

      ​ switchType=‘1’ 默认值,表示自动切换

      ​ switchType=‘2’ 基于MySQL主从同步的状态决定是否切换,心跳语句为show slave status

      ​ switchType=‘3’ 基于MySQL galary cluster的切换机制(适合集群)(1.4.1),心跳语句为 show
      ​ status like ‘wsrep%’

    • writeType:表示写模式
      writeType=“0”,所有的操作发送到配置的第一个writehost

      ​ writeType=“1”,随机发送到配置的所有writehost

      ​ writeType=“2”,不执行写操作

其他参数说明:

  • maxCon:指定物理主机服务最大支持1000个连接;

  • minCon:指定物理主机服务最小保持10个连接;

  • heartbeat:这个标签内指明用于和后端数据库进行心跳检查的语句

这里的schema.xml的配置还有之中方式

<writeHost host="hostM1" url="192.168.30.11:3306" password="123456" user="root">
	<readHost host="hostS2" url="192.168.30.12:3306" password="123456" user="root"/>
	<readHost host="hostS3" url="192.168.30.13:3306" password="123456" user="root"/>
</writeHost>

这样的话当writeHost对用的服务器宕机的话 它下面的readHost主机也不能使用了

授权

给所有的mysql服务器授权root,因为在使用mycat连接数数据库时使用的是root用户

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-U7DMSvTw-1644028922175)(C:\Users\77259\AppData\Roaming\Typora\typora-user-images\1629285043662.png)]

进每个Mysql服务器中进行以下操作

 mysql> grant all on *.* to root@'192.168.116.%' identified by '123'; 
 mysql>flush privileges;

启动mycat

 [root@mycat ~]# mycat console
# 如果失败那一定是配置文件的错误。
# 可能是格式错误,或者信息配置错误

检测端口8806

 [root@mycat ~]# netstat -antup | grep 8066

4、登录测试

使用一个有数据库的客户端进行登录测试

使用mycatroot账号登录

此账户可以进行增删改查

 [root@client ~]# mysql -u mycatroot -p123456 -h 192.168.116.10 -P 8066
  mysql> show databases;

使用mycatreadonly账户登录

此账户只可以进行查看的操作

 [root@client ~]# mysql -u mycatreadonly -p123456 -h 192.168.116.10 -P 8066

使用不同账户登录,自己进行以下select delete update操作就明白了

5、模拟故障

将主库或从库停止然后通过客户端进行登录在进行select delete update操作 检测

是格式错误,或者信息配置错误


检测端口8806

```bash
 [root@mycat ~]# netstat -antup | grep 8066

4、登录测试

使用一个有数据库的客户端进行登录测试

使用mycatroot账号登录

此账户可以进行增删改查

 [root@client ~]# mysql -u mycatroot -p123456 -h 192.168.116.10 -P 8066
  mysql> show databases;

使用mycatreadonly账户登录

此账户只可以进行查看的操作

 [root@client ~]# mysql -u mycatreadonly -p123456 -h 192.168.116.10 -P 8066

使用不同账户登录,自己进行以下select delete update操作就明白了

5、模拟故障

将主库或从库停止然后通过客户端进行登录在进行select delete update操作 检测

你可能感兴趣的:(mysql,mysql,数据库,服务器)