MyCat读写分离

发布于 2022-07-25  8.22k 次阅读


#1. 读写分离(一主一从)

##1.1 前期准备

一主一从准备两台机器:

IP
MySQL
MyCat
角色
192.168.68.133
安装配置
安装配置
Matser
192.168.68.134
安装配置
Slave

##1.2 配置主从复制

步骤:

  1. 配置Master主机
  2. 配置Slave从机

###1.2.1 配置Master

步骤:

  1. 配置my.cnf文件
  2. 重启,后进入MySQL
  3. 创建一个Slave账号
  4. 查看Master状态

① 在Master的配置文件(/etc/my.cnf)中,添加如下内容

# mysql服务ID,必须保证整个集群环境中的唯一性
server-id=1
# mysql binlog 日志的存储路径和文件名
log-bin=/var/lib/mysql/mysqlbin
# 设置logbin格式
# binlog_format=STATMENT
# 是否只读,1代表只读,0代表读写
read-only=0
# 忽略的数据,指不需要同步的数据库
# binlog-ignore-db=mysql
# 指定同步的数据库
binlog-do-db=wqltest
② 配置完成之后,重启MySQL
systemctl restart mysqld.service
③ 创建同步数据的账户,并继续授权操作(这个账户给slave使用)
grant replication slave on *.* to 'slavewql'@'192.168.68.134' identified by '123456789';
flush privileges;
④ 查master的状态
show master status;

状态释义:

  1. File:从哪个日志文件开始推送日志文件
  2. Position:从哪个位置开始推送日志
  3. Binlog_Do_DB:指定需要同步的数据库
  4. Binlog_Ignore_DB:指定不需要同步的数据库

###1.2.2 配置Slave

① 在slave端配置文件/etc/my.cnf中,添加如下内容

# mysql服务ID,唯一
server-id=2

# mysql binlog 日志的存储路径和文件名
log-bin=/var/lib/mysql/mysqlbin

# 启动中继日志
relay-log=mysql-relay

② 重启MySQL服务

systemctl restart mysqld.service

③ 指定master主节点位置

change master to master_host='192.168.68.133',
master_user='slavewql',
master_password='123456789',
master_log_file='mysqlbin.000007',
master_log_pos=154;

指定当前从库对应的主库的IP地址,用户,密码,从那个日志文件开始的,那个位置开始同步推送日志

注:这些消息查看master状态时有

④ 开启同步操作

start slave;

⑤ 查看slave的状态

show slave status\G;

##1.3 读写分离

###1.3.1 读写分离原理

读写分离:把数据库的读和写操作分开,以对应不同的数据库服务器。主数据库提供写操作,从数据库提供读操作,这样减轻单台数据库的压力

通过MyCat可以轻松实现上述功能,不仅可以支持MySQL,也可以支持Oracle和SQL Servre

MyCat控制后台数据库的读写分离和负载均衡由schema.xml文件datahost标签的balance属性控制

###1.3.2读写分离配置

① 检查MySQL主从复制是否配置成功

② 配置Schema.xml文件

<?xml version="1.0"?>
<!DOCTYPE mycat:schema SYSTEM "schema.dtd">
<mycat:schema xmlns:mycat="http://io.mycat/">
    <!--逻辑库-->
    <schema name="ZC_DB" checkSQLschema="true" sqlMaxLimit="100">
        <!--逻辑表-->
        <table name="wql" dataNode="dn1" primaryKey="id" rule="mod-long"/>
    </schema>

    <!--数据节点,绑定dataHost数据源和database数据库-->
    <dataNode name="dn1" dataHost="localhost1" database="fq" />

    <dataHost name="localhost1" maxCon="1000" minCon="10" balance="1"
              writeType="0" dbType="mysql" dbDriver="jdbc" switchType="1"  slaveThreshold="100">
        <!--心跳检测-->
        <heartbeat>select user()</heartbeat>
        <!--writeHost数据写入节点,也就是数据源-->
        <writeHost host="hostM1" url="jdbc:mysql://192.168.68.133:3306" user="root"
                   password="123456789">
            <readHost host="hostS1" url="jdbc:mysql://192.168.68.134:3306" user="root" password="123456789"/>
                    
        </writeHost>
    </dataHost>
</mycat:schema>

注意事项:

1)cheackSQLschema

    当值设置为true时,如果执行语句"select * from test01;"语句时,MyCat则会把schema字符去掉,可以避免数据库执行报错

2)balance

负载均衡类型,目前取值有4种:

  1. 0 --> 不开启读写分离机制,所有操作都发送到当前可用的writeHost上
  2. 1 --> 全部的readHost与stand by writeHost(备用WriteHost)都参与负载均衡,简而言之就是支持读写分离
  3. 2 --> 所有的读写操作都随机在writeHost和readHost上分发
  4. 3 --> 所有的读请求随机分发到writeHost对应的readHost上执行,writeHost不负担读压力;balance=3只在MyCat1.4之后生效

配置完成自行测试:测试可以结合mycat.log

tail -f mycat.log

#2. 读写分离(双主双从)

##2.1前期准备

编号
角色
IP地址
端口号
Mycat
1
Master1
192.168.68.133
3306
配置
2
Slave1
192.168.68.151
3306
3
Master2
192.168.68.134
3306
4
Slave2
192.168.68.152
3306

##2.2主从复制

###2.2.1双主的配置 

① Master1配置

# 主服务器唯一ID
server-id=1
# 启动二进制日志
log-bin=/var/lib/mysql/mysql-bin
# 设置需要复制的数据库
binlog-do-db=db01
binlog-do-db=db02
# 设置logbin格式
# binlog_format=STATMENT
# 在作为从数据库的时候,有写入操作也要更新二进制日志文件
log-slave-updates

② Master2配置

# 主服务器唯一ID
server-id=3
# 启动二进制日志
log-bin=/var/lib/mysql/mysql-bin
# 设置需要复制的数据库
binlog-do-db=db01
binlog-do-db=db02
# 设置logbin格式
# binlog_format=STATMENT
# 在作为从数据库的时候,有写入操作也要更新二进制日志文件
log-slave-updates

③ 两台主机重启MySQL服务

systemctl restart mysqld.service

④ 两台主机关闭防火墙

systemctl stop firewalld

⑤ 在两台主机上建立slave授权账号

grant replication slave on *.* to 'slavefq'@'%' identified by '123456789';
flush privileges;

查询Master1的状态:

mysql> show master status;
+------------------+----------+--------------+------------------+-------------------+
| File             | Position | Binlog_Do_DB | Binlog_Ignore_DB | Executed_Gtid_Set |
+------------------+----------+--------------+------------------+-------------------+
| mysql-bin.000001 |      592 | db01,db02    |                  |                   |
+------------------+----------+--------------+------------------+-------------------+
1 row in set (0.00 sec)

###2.2.2 双从的配置

① Slave1配置

# 服务器唯一ID
server-id=2
# 启动中继日志
relay-log=mysql-relay

② Slave2配置

# 服务器唯一ID
server-id=4
# 启动中继日志
relay-log=mysql-relay

③ Slave1指令,在从机上配置需要复制的主机

change master to master_host='192.168.68.133',
master_user='slavefq',
master_password='123456789',
master_log_file='mysql-bin.000001',
master_log_pos=592;

④ Slave2指令,在从机上配置需要复制的主机

change master to master_host='192.168.68.134',
master_user='slavefq',
master_password='123456789',
master_log_file='mysql-bin.000001',
master_log_pos=584;

⑤启动两台从服务器复制功能,查看主从复制的运行状态

start slave;
show slave status\G;

###2.2.3双主相互复制

高可用必须保证单节点故障备用节点必须顶替正常维持运行,所以Master1和Master2一个主机一个备用主机

Master1复制Master2,Master2复制Master1

① Master1执行指令:

change master to master_host='192.168.68.134',
master_user='slavefq',
master_password='123456789',
master_log_file='mysql-bin.000001',
master_log_pos=584;

② Master2执行指令:

change master to master_host='192.168.68.133',
master_user='slavefq',
master_password='123456789',
master_log_file='mysql-bin.000001',
master_log_pos=592;

③ 启动两台主机复制功能,查看主从复制运行状态

start slave;
show slave status\G;

配置完成后自行测试,建一个db01数据库看是否全部同步

##2.3 读写分离

###2.3.1 读写分离的原理

一个主机Master1用于处理所有写请求,它的从机slave1和另一台主机Master2还有它的从机slave2 负责所有读请求。当Master1主机容机后,Master2主机负责写请求,Masterl,Muster2互为备机

###2.3.2读写分离的配置

① 检查MySQL主从配置是否成功

② 在Master1中对Mycat的Schema.xml进行配置

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

    <!--逻辑库-->
    <schema name="SZC_DB" checkSQLschema="true" sqlMaxLimit="100">
        <!--逻辑表-->
        <table name="lala" dataNode="dn1" primaryKey="id"/>
        
    </schema>

    <!--数据节点,绑定dataHost数据源和database数据库-->
    <dataNode name="dn1" dataHost="localhost1" database="db01" />

    <dataHost name="localhost1" maxCon="1000" minCon="10" balance="1"
              writeType="0" dbType="mysql" dbDriver="jdbc" switchType="1"  slaveThreshold="100">
        <!--心跳检测-->
        <heartbeat>select user()</heartbeat>
        <!--writeHost数据写入节点,也就是数据源-->
        <writeHost host="hostM1" url="jdbc:mysql://192.168.68.133:3306" user="root"
                   password="123456789">
            <readHost host="hostS1" url="jdbc:mysql://192.168.68.151:3306" user="root" password="123456789"/>

        </writeHost>
        <writeHost host="hostM2" url="jdbc:mysql://192.168.68.134:3306" user="root"
                   password="123456789">
            <readHost host="hostS2" url="jdbc:mysql://192.168.68.152:3306" user="root" password="123456789"/>

        </writeHost>
    </dataHost>
</mycat:schema>

③ 配置server.xml文件

<user name="root" defaultAccount="true">
      <property name="password">123456789</property>
      <property name="schemas">SZC_DB</property>
  </user>
  <user name="user">
      <property name="password">123456789</property>
      <property name="schemas">SZC_DB</property>
      <property name="readOnly">true</property>
  </user>

配置完成自行测试:测试可以结合mycat.log

tail -f mycat.log

路漫漫其修远兮,吾将上下而求索