基于MyCat实现MySQL读写分离

一、MyCat概述

1.1 是什么

1.2 干什么

1.3 原理

二、安装启动

2.1 安装

  • 将安装包上传至/opt目录
[root@iZbp1i0x4t16rv8q20zeiwZ minio]# cd /opt/
[root@iZbp1i0x4t16rv8q20zeiwZ opt]# ls
containerd  Mycat-server-1.6.7.1-release-20190627191042-linux.tar.gz  Mycat-web-1.0-SNAPSHOT-20170102153329-linux.tar.gz  zookeeper-3.4.11.tar.gz
  • 解压,并将加压后文件拷贝到软件安装目录:/usr/local
[root@iZbp1i0x4t16rv8q20zeiwZ opt]# tar -zxvf Mycat-server-1.6.7.1-release-20190627191042-linux.tar.gz 
[root@iZbp1i0x4t16rv8q20zeiwZ opt]# ls
containerd  mycat  Mycat-server-1.6.7.1-release-20190627191042-linux.tar.gz  Mycat-web-1.0-SNAPSHOT-20170102153329-linux.tar.gz  zookeeper-3.4.11.tar.gz
[root@iZbp1i0x4t16rv8q20zeiwZ opt]# cp -r mycat /usr/local/
[root@iZbp1i0x4t16rv8q20zeiwZ opt]# ls /usr/local/
aegis  bin  etc  games  include  lib  lib64  libexec  mycat  sbin  share  src
  • 三个配置文件

1.schema.xml: 定义逻辑库,表、分片节点等内容
2.rule.xml: 定义分片规则
3.server.xml: 定义用户以及系统相关变量,如端口等

[root@iZbp1i0x4t16rv8q20zeiwZ local]# cd mycat/
[root@iZbp1i0x4t16rv8q20zeiwZ mycat]# ls
bin  catlet  conf  lib  logs  version.txt
[root@iZbp1i0x4t16rv8q20zeiwZ mycat]# cd conf/
[root@iZbp1i0x4t16rv8q20zeiwZ conf]# ls
autopartition-long.txt      cacheservice.properties  index_to_charset.properties  myid.properties          rule.xml                  sequence_db_conf.properties           server.xml            zkconf
auto-sharding-long.txt      dbseq.sql                log4j2.xml                   partition-hash-int.txt   schema.xml                sequence_distributed_conf.properties  sharding-by-enum.txt  zkdownload
auto-sharding-rang-mod.txt  ehcache.xml              migrateTables.properties     partition-range-mod.txt  sequence_conf.properties  sequence_time_conf.properties         wrapper.conf

2.2 启动

  • 修改配置文件server.xml

修改用户信息,与MySQL区分,如下:

 
                123456
                TESTDB

                
                
        
  • 修改配置文件 schema.xml

删除标签间的表信息,标签只留一个,标签只留一个, 只留一对





        
        
        
        
                select user()
                
                
                        
                        
                
        

  • 验证数据库访问情况

Mycat 作为数据库中间件要和数据库部署在不同机器上,所以要验证远程访问情况。

mysql -uroot -proot -h 47.98.181.17 -P 3307
mysql -uroot -proot -h 47.98.181.17 -P 3308

如远程访问报错,请建对应用户
grant all privileges on . to root@'缺少的host' identified by 'root';

  • 启动程序

1.控制台启动 :去 mycat/bin 目录下执行 ./mycat console
2.后台启动 :去 mycat/bin 目录下 ./mycat start
为了能第一时间看到启动日志,方便定位问题,我们选择①控制台启动。

启动成功

[root@pve-ct01 bin]# ./mycat console
Running Mycat-server...
wrapper  | --> Wrapper Started as Console
wrapper  | Launching a JVM...
jvm 1    | Java HotSpot(TM) 64-Bit Server VM warning: ignoring option MaxPermSize=64M; support was removed in 8.0
jvm 1    | Wrapper (Version 3.2.3) http://wrapper.tanukisoftware.org
jvm 1    |   Copyright 1999-2006 Tanuki Software, Inc.  All Rights Reserved.
jvm 1    | 
jvm 1    | MyCAT Server startup successfully. see logs in logs/mycat.log

2.3 登陆

1、登录后台管理窗口(此登录方式用于管理维护 Mycat)

mysql -umycat -p123456 -P 9066 -h 192.168.0.177
➜  ~ mysql -umycat -p123456 -P 9066 -h 192.168.0.177  
Welcome to the MySQL monitor.  Commands end with ; or \g.
Your MySQL connection id is 1
Server version: 5.6.29-mycat-1.6.7.1-release-20190627191042 MyCat Server (monitor)

Copyright (c) 2000, 2013, 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> 

2、登录数据窗口
此登录方式用于通过 Mycat 查询数据,我们选择这种方式访问 Mycat

mysql -umycat -p123456 -P 8066 -h 192.168.0.177

三、搭建读写分离

3.1 搭建一主一从

一个主机用于处理所有写请求,一台从机负责所有读请求,架构图如下


image.png
  1. 搭建MySQL主从复制
    1.1 主从复制原理


    image.png

1.2 主机配置

修改配置文件:vim /etc/my.cnf

[mysqld]
## 设置server_id,同一局域网中需要唯一
server_id=101
## 开启二进制日志功能
log-bin=mysql-bin
## 设置不要复制的数据库(可设置多个)
binlog-ignore-db=mysql
binlog-ignore-db=information_schema
## 设置需要复制的数据库
#binlog-do-db=需要复制的主数据库名字
## 设置二进制日志使用内存大小(事务)
binlog_cache_size=1M
## 设置使用的二进制日志格式(mixed,statement,row)
binlog_format=mixed
## 二进制日志过期清理时间。默认值为0,表示不自动清理。
expire_logs_days=7
## 跳过主从复制中遇到的所有错误或指定类型的错误,避免slave端复制中断。
## 如:1062错误是指一些主键重复,1032错误是因为主从数据库数据不一致
slave_skip_errors=1062
## 不区分大小写
lower_case_table_names=1

1.3 从机配置

[mysqld]
## 设置server_id,同一局域网中需要唯一
server_id=102
## 指定不需要同步的数据库名称
binlog-ignore-db=mysql
## 开启二进制日志功能,以备Slave作为其它数据库实例的Master时使用
log-bin=mysql-slave1-bin     
## 设置二进制日志使用内存大小(事务)
binlog_cache_size=1M
## 设置使用的二进制日志格式(mixed,statement,row)
binlog_format=mixed
## 二进制日志过期清理时间。默认值为0,表示不自动清理。
expire_logs_days=7
## 跳过主从复制中遇到的所有错误或指定类型的错误,避免slave端复制中断。
## 如:1062错误是指一些主键重复,1032错误是因为主从数据库数据不一致
slave_skip_errors=1062
## relay_log配置中继日志
relay_log=mysql-relay-bin     
## log_slave_updates表示slave将复制事件写进自己的二进制日志
log_slave_updates=1
## slave设置为只读(具有super权限的用户除外)
read_only=1

1.4 主机、从机重启 MySQL 服务

1.5 主机从机都关闭防火墙

1.6 创建数据同步用户:

CREATE USER 'slave'@'%' IDENTIFIED BY '123456';
GRANT REPLICATION SLAVE, REPLICATION CLIENT ON *.* TO 'slave'@'%';

1.7 连接到主数据库的mysql客户端,查看主数据库状态:

mysql> show master status;
+------------------+----------+--------------+--------------------------------+-------------------+
| File             | Position | Binlog_Do_DB | Binlog_Ignore_DB               | Executed_Gtid_Set |
+------------------+----------+--------------+--------------------------------+-------------------+
| mysql-bin.000002 |      154 |              | mysql,mysql,information_schema |                   |
+------------------+----------+--------------+--------------------------------+-------------------+
1 row in set (0.00 sec)

1.8 连接到从数据库的mysql客户端,配置主数据库相关信息

change master to master_host='47.98.181.17', master_user='slave', master_password='123456', master_port=3307, master_log_file='mysql-bin.000001', master_log_pos=154, master_connect_retry=30;  

主从复制命令参数说明:

master_host:主数据库的IP地址;
master_port:主数据库的运行端口;
master_user:在主数据库创建的用于同步数据的用户账号;
master_password:在主数据库创建的用于同步数据的用户密码;
master_log_file:指定从数据库要复制数据的日志文件,通过查看主数据的状态,获取File参数;
master_log_pos:指定从数据库从哪个位置开始复制数据,通过查看主数据的状态,获取Position参数;
master_connect_retry:连接失败重试的时间间隔,单位为秒。

1.9 启动从服务器复制功能

start slave;

1.10 查看从服务器状态

show slave status\G;

1.11 下面两个参数都是Yes,则说明主从配置成功!

 Slave_IO_Running: Yes
 Slave_SQL_Running: Yes

1.12 主机新建库、新建表、insert记录,从机复制

1.13 如何停止从服务复制功能

stop slave;

1.14 如何重新配置主从

stop slave;
reset master;

2、 修改 Mycat 的配置文件 schema.xml
之前的配置已分配了读写主机,是否已实现读写分离?
验证读写分离
(1)在写主机插入:insert into mytbl values (1,@@hostname);
主从主机数据不一致了
(2)在Mycat里查询:select * from mytbl;

修改的balance属性,通过此属性配置读写分离的类型
负载均衡类型,目前的取值有4 种:
(1)balance="0", 不开启读写分离机制,所有读操作都发送到当前可用的 writeHost 上。
(2)balance="1",全部的 readHost 与 stand by writeHost 参与 select 语句的负载均衡,简单的说,当双主双从
模式(M1->S1,M2->S2,并且 M1 与 M2 互为主备),正常情况下,M2,S1,S2 都参与 select 语句的负载均衡。
(3)balance="2",所有读操作都随机的在 writeHost、readhost 上分发。
(4)balance="3",所有读请求随机的分发到 readhost 执行,writerHost 不负担读压力

为了能看到读写分离的效果,把balance设置成2,会在两个主机间切换查询

writeType="0" dbType="mysql" dbDriver="native" switchType="1"
slaveThreshold="100">

3、 启动 Mycat
(1)在写主机数据库表mytbl中插入带系统变量数据,造成主从数据不一致
INSERT INTO mytbl VALUES(2,@@hostname);
(2)在Mycat里查询mytbl表,可以看到查询语句在主从两个主机间切换

你可能感兴趣的:(基于MyCat实现MySQL读写分离)