mysql5.7主从配置+mycat读写分离配置-常用经典模式-必学必会

准备工作

  • 两台虚拟机服务器(可自行扩展至多台),centos 7.6操作系统,主库ip:192.168.174.130,从库ip:192.168.174.128
  • 安装jdk 1.8+
  • mysql 5.7 数据库服务器
  • mycat-1.6.7.3 数据库中间件服务器
  • 数据库连接工具mysql workbench 6.3.10

mysql5.7主从复制配置

mysql5.7安装可以网上百度,有很多教程。这里主要讲解主从配置的设置,从库不设置只读操作

主库配置

  1. 开启bin-log功能
# 编辑my.cnf文件
vi /etc/my.cnf

# 修改如下配置
[mysqld]
log_bin=mysql-bin    # 二进制日志的文件名称
server_id=1    # 服务器的唯一id
# 为了在使用InnoDB和事务的复制设置中获得最大的持久性和一致性,建义配置以下两项
innodb_flush_log_at_trx_commit=1
sync_binlog=1

# 重启服务器
systemctl restart mysqld
  1. 创建从库连接帐号
CREATE USER 'slave'@'%' IDENTIFIED BY '123456';    # 创建用户,生产环境不建议放开ip
GRANT REPLICATION SLAVE ON *.* TO 'slave'@'%';     # 分配权限
flush privileges;   # 刷新权限数据
  1. 查看主库状态
SHOW MASTER STATUS;

在这里插入图片描述

从库配置

  1. 修改my.cnf配置文件,vi /etc/my.cnf
[mysqld]
server-id=2    # 增加此项配置,值是唯一,与主库的不重复
  1. 重启mysql服务
systemctl restart mysqld
  1. 登录mysql从库,配置主库信息
# MASTER_LOG_FILE指主服务器二进制文件名称,MASTER_LOG_POS指同步的下标位置,可通过查看主库master状态得到
CHANGE MASTER TO MASTER_HOST='192.168.174.130', MASTER_USER='slave', MASTER_PASSWORD='123456'; MASTER_PORT=3306, MASTER_LOG_FILE='mysql-bin.000012', MASTER_LOG_POS=1063;
  1. 开始并查看从库状态
START SLAVE;    # 开启从库
STOP SLAVE;    # 停止从库
SHOW SLAVE STATUS;    # 查看从库状态

在这里插入图片描述
这两项都为Yes表明从库能正常复制主库的数据。

mycat读写分离配置

mycat是一款性能好、功能强大、稳定的数据库中间件。使用简单,可用于数据库读写分离、分库分表。提高数据存储层的性能和存储容量。对业务代码透明,不需要修改dao层即可无缝扩展。
可以把mycat看成一个数据库,就像使用mysql一样的去连接和使用,没有任何区别。mycat是用java语言开发的,可以想像成一个类似于tomcat的程序,安装简单。下载好tar包,解压后,修改配置文件,起动即可。

安装mycat

  1. 下载mycat程序包,使用的是Mycat-server-1.6.7.3-release-20190927161129-linux.tar.gz版本
wget http://dl.mycat.io/1.6.7.3/20190927161129/Mycat-server-1.6.7.3-release-20190927161129-linux.tar.gz
  1. 解压缩tar包
tar -zxvf Mycat-server-1.6.7.3-release-20190927161129-linux.tar.gz -C /usr/local/

解压后的目录结构如下:
mysql5.7主从配置+mycat读写分离配置-常用经典模式-必学必会_第1张图片
bin目录主要存放了启动、停止mycat服务器的脚本命令
conf目录下有几个重要的配置文件,比如:server.xml、schema.xml。后面会重点介绍。
lib目录下存放项目使用到的第三方jar包。
logs目录下存放系统的运行日志。

  1. 配置mycat环境变量
vi /etc/profile # 编辑文件
# 在文件的最尾处追加如下内容
export MYCAT_HOME=/usr/local/mycat
# 让配置文件生效
source /etc/profile
  1. 创建mycat运行用户,为了安全不建议使用root用户启动mycat服务
useradd mycat # 新建mycat用户
passwd mycat # 设置mycat用户的密码,可以不设置,通过root用户切换
chown -R mycat:mycat /usr/local/mycat # 把mycat的安装目录的用户和用户组修改成mycat
  1. 起动和停止mycat服务
/usr/local/mycat/bin/mycat start # 起动mycat服务
/usr/local/mycat/bin/mycat stop # 停止mycat服务
/usr/local/mycat/bin/mycat restart # 重启mycat服务
ps -ef | grep mycat # 查看mycat服务进程,确认是否已起动

读写分离配置

  1. 修改schema.xml配置文件。


<mycat:schema xmlns:mycat="http://io.mycat/">
  
 
  <schema name="catdb" checkSQLschema="true" sqlMaxLimit="100" dataNode="dn1">
  schema>
  
  <dataNode name="dn1" dataHost="dh1" database="orders" />
  <dataNode name="dn2" dataHost="dh2" database="orders" />
   
  <dataHost name="dh1" maxCon="1000" minCon="10" balance="1" writeType="0" dbType="mysql" dbDriver="native"> 
      <heartbeat>select user()heartbeat> 
      <writeHost host="myhostM1" url="192.168.174.130:3306" user="root" password="123456">          
          <readHost host="myhostS1" url="192.168.174.128:3306" user="root" password="123456" weight="1" /> 
      writeHost> 
  dataHost>
   
  <dataHost name="dh2" maxCon="1000" minCon="10" balance="1" writeType="0" dbType="mysql" dbDriver="native"> 
      <heartbeat>select user()heartbeat> 
      <writeHost host="myhostM2" url="192.168.174.130:3306" user="root" password="123456">writeHost> 
      <writeHost host="myhostS2" url="192.168.174.128:3306" user="root" password="123456">writeHost> 
  dataHost> 
 mycat:schema>
  1. 修改server.xml文件

<user name="root" defaultAccount="true">
 <property name="password">123456property>
 
 <property name="schemas">catdbproperty>
user>
  
 
  1. 重启mycat服务
/usr/local/mycat/bin/mycat restart

测试

测试内容包括使用工具连接mycat,通过mycat创建表,增加、修改、删除、查询数据。

连接mycat

编者使用的是mysql workbench 6.3.10版本,8.0的版本实测无法连接mycat,一直报密码错误,此处需要注意一下。连接跟普通的mysql连接没有任何区别,只需要把端口改成8066就可以。

通过mycat创建表结构并插入一些数据

首先,直连mysql主库建立好orders数据库,OK了之后从库会同步到数据。然后在mycat上执行如下命令

# 新创t_order表
CREATE TABLE t_order(id BIGINT PRIMARY KEY, order_time DATETIME, customer_id BIGINT, order_amount DECIMAL(10,2));
# 插入一些测试数据
INSERT INTO t_order VALUES (2, NOW(), 1001, 200.88);
INSERT INTO t_order VALUES (3, NOW(), 1002, 168.88);
INSERT INTO t_order VALUES (4, NOW(), 1003, 198.88);

执行成功后,直连mysql主库和从库,检查表和数据是否已经创建好。

测试用例

  1. 第一种读写分离配置方式,把主库停掉。通过mycat查询数据失败(有缓存影响,需要重连mycat),说明主库down了,从库也不能再使用。
  2. 第一种读写分离配置方式,直连从库把id=2的数据的价格修改到2000,通过mycat查询能得到正确的数据。说明查询走从库。
  3. 第二种读写分离配置方式,把主库停掉。通过mycat查询数据,依然可查,说明主库down了,从库能继续使用。
  4. 第二种读写分离配置方式,直连从库把id=2的数据的价格修改到2500,通过mycat查询不一定能得到正确数据。返回重连和查询,发现有时会返回2000,有时会2500.说明查询是分配到两台服务器执行。

注意事项

项目应用了读写分离机制后,写操作都会走主库节点。在代码层面读操作都不要事务,否则会去主库查询而非从库查询,并且如果读操作在其它事务方法里面,那么它也会去主库查询。

你可能感兴趣的:(数据库_mysql,数据库,java,mysql,mycat)