此文档来源于网络,如有侵权,请联系删除!
MySQL
是一个关系型数据库管理系统
。MySQL 是最流行的关系型数据库管理系统之一,在 WEB 应用方面,MySQL是最好的 RDBMS (Relational Database Management System,关系数据库管理系统) 应用软件之一。MySQL所使用的 SQL 语言是用于访问数据库的最常用标准化语言。MySQL体积小、速度快、总体拥有成本低,尤其是开放源码这一特点,一般中小型和大型网站的开发都选择 MySQL 作为网站数据库。
SQL
是结构化查询语言(Structured Query Language)的英文首字母,它是一种专门用来与数据库通信的语言。
错误日志
错误日志是 MySQL 中最重要的日志之一,它记录了当 mysgld 启动和停止时,以及服务器在运行过程中发生任何严重错误时的相关信息。当数据库出现任何故障导致无法正常使用时,建议首先查看此日志。
该日志是默认开启的,默认存放目录 /var/log/,默认的日志文件名为 mysqld.log 。
查看日志位置
show variables like '%log error%';
二进制日志
介绍
二进制日志(BINLOG)记录了所有的 DDL(数据定义语言)语和 DML(数据操纵语言)语句,但不包括数据查询(SELECT、SHOW)语句。
作用
①.灾难时的数据恢复;
②.MySQL的主从复制。
在MySQL8版本中,默认二进制日志是开启着的,Linux系统日志存放在/var/lib/mysql路径下。涉及到的参数如下:
show variables like '%log_bin%';
日志格式
MySQL服务器中提供了多种格式来记录二进制日志,具体格式及特点如下:
日志格式 | 含义 |
---|---|
STATEMENT | 基于SQL语句的日志记录,记录的是SQL语句,对数据进行修改的SQL都会记录在日志文件中。 |
ROW | 基于行的日志记录,记录的是每一行的数据变更。(默认) |
MIXED | 混合了STATEMENT和ROW两种格式,默认采用STATEMENT,在某些特殊情况下会自动切换为ROW进行记录。 |
show variables like '%binlog_format%';
日志查看
由于日志是以二进制方式存储的,不能直接读取,需要通过二进制日志查询工具 mysqlbinlog 来查看,具体语法:
mysqlbinlog [参数选项] log-files
参数选项:
-d 指定数据库名称,只列出指定的数据库相关操作。
-o 忽略掉日志中的前n行命令。
-v 将行事件(数据变更)重构为SQL语句。
-w 将行事件(数据变更)重构为SQL语句,并输出注释信息。
将日志格式修改为STATEMENT
#编辑配置文件
vim /etc/my.cnf
#添加参数(:wq保存退出)
binlog_format=STATEMENT
#重启数据库服务
systemctl restart mysqld
#查看日志格式
show variables like '%binlog_format%';
日志删除
对于比较繁忙的业务系统,每天生成的binlog数据巨大,如果长时间不清除,将会占用大量磁盘空间。可以通过以下几种方式清理日志:
指令 | 含义 |
---|---|
reset master | 删除全部binlog日志,删除之后,日志编号,将从 binlog.000001重新开始 |
purge master logs to ‘binlog.******’ | 删除******编号之前的所有日志 |
purge master logs before ‘yyyy-mm-dd hh24:mi:ss’ | 删除日志为"yyyy-mm-dd hh24:mi:ss"之前产生的所有日志 |
也可以在mysql的配置文件中配置二进制日志的过期时间,设置了之后,二进制日志过期会自动删除
#默认为2592000秒=30天
show variables like '%binlog_expire_logs_seconds%';
例子
reset master;
例子
#删除binlog.000008之前二进制日志文件
purge master logs to 'binlog.000008';
查询日志
查询日志中记录了客户端的所有操作语句,而二进制日志不包含查询数据的SQL语句。默认情况下,查询日志是未开启的。如果需要开启查询日志,可以设置以下配置:
show variables like '%general%';
修改MySQL的配置文件 /etc/my.cnf 文件,添加如下内容:
#该选项用来开启查询日志,可选值:0 或者1;0代表关闭,1代表开启
general_log=1
#设置日志的文件名,如果没有指定,默认的文件名为 host_name.log
general_log_file=mysql_query.log
示例
#修改配置文件
vim /etc/my.cnf
#开启查询日志
general_log=1
#设置日志的文件名为host_name.log
general_log_file=/var/lib/mysql/mysql_query.log
#重启数据库服务
systemctl restart mysqld
#查看查询日志相关配置(修改完成)
show variables like '%general%';
#查看/var/lib/mysql目录下的文件信息(mysql_query.log文件已生成)
ll /var/lib/mysql
查询日志记录了所有增删改查以及DDL语句(日志文件比较大)
慢查询日志
慢查询日志记录了所有执行时间超过参数 long_query_time 设置值并且扫描记记录数不小于 min_examined_row_limit的所有的SQL语句的日志,默认未开启。long_query_time 默认为 10 秒,最小为0,精度可以到微秒。
#查看慢查询日志相关参数配置
show variables like '%slow_query_log%';
#查看慢查询日志执行时间参数
show variables like '%long_query_time%';
开启慢查询日志
#开启慢查询日志
slow_query_log=1
#执行时间参数
long_query_time=2
示例
#修改数据库配置文件
vim /etc/my.cnf
#开启慢查询日志
slow_query_log=1
#设置执行时间参数为2秒
long_query_time=2
#重启数据库服务
systemctl restart mysqld
#查看慢查询日志执行时间参数
show variables like '%long_query_time%';
#查看慢查询日志相关参数配置
show variables like '%slow_query_log%';
#查看/var/lib/mysql目录下的慢日志文件
ll /var/lib/mysql/
默认情况下,不会记录管理语句,也不会记录不使用索引进行查找的查询。可以使用log_slow_admin_statements和更改此行为log_queries_not_using_indexes,如下所述。
#记录执行较慢的管理语句
log_slow_admin_statements=1
#记录执行较慢的未使用索引的语句
log_queries_not_using_indexes=1
概述
主从复制是指将主数据库的DDL和 DML操作通过二进制日志传到从库服务器中,然后在从库上对这些日志重新执行(也叫重做),从而使得从库和主库的数据保持同步。
MySQL支持一台主库同时向多台从库进行复制,从库同时也可以作为其他从服务器的主库,实现链状复制。
MySQL复制的优点主要包含以下三个方面:
①主库出现问题,可以快速切换到从库提供服务。
②实现读写分离,降低主库的访问压力。
③可以在从库中执行备份,以避免备份期间影响主库服务
复制分成三步:(master代表是主库,slave代表从库)
①Master 主库在事务提交时,会把数据变更记录在二进制日志文件 Binlog 中。
②从库读取主库的二进制日志文件 Binlog,写入到从库的中继日志 Relay Log。
③slave重做中继日志中的事件,将改变反映它自己的数据。
1.修改配置文件/etc/my.cnf
#mysql服务ID,保证整个集群环境中唯一,取值范围: 1 - 2的32次方 - 1,默认为1
server-id=1
#是否只读,1 代表只读,0 代表读写
read-only=0
#忽略的数据,指不需要同步的数据库
#binlog-ignore-db=mysql
#指定同步的数据库
#binlog-do-db=db01
2.重启MySQL服务
systemctl restart mysqld
3.登录MySQL,创建远程连接的账号,并授予主从复制权限
#创建test用户,并设置密码,该用户可以在任意主机连接该MySQL服务
create user 'test'@'%' identified with mysql_native_password by 'Root@123456';
#为'test'@'%'用户分配主从复制权限
grant replication slave on *.* to 'test'@'%';
> 4.通过指令,查看二进制日志坐标
show master status;
字段含义说明
File:从哪个日志文件开始推送日志文件
Position:从哪个位置开始推送日志
Binlog_Do_DB:指定不需要同步的数据库
从库配置
1.修改配置文件/etc/my.cnf
#mysql服务ID,保证整个集群环境中唯一,取值范围: 1 - 2的32次方 - 1,和主库不一样即可
server-id=2
#是否只读,1 代表只读,0 代表读写
read-only=1
2.重启MySQL服务
systemctl restart mysqld
3.登录MySQL,设置主库配置(
在从库中执行下面SQL语句
)
change replication source to source_host = 'xxx.xxx.xxx.xxx',source_user = 'xxx',source_password = 'xxx',source_log_file = 'xxx',source_log_pos = xxx;
例子
change replication source to source_host = '192.168.200.200',source_user = 'test',source_password = 'Root@123456',source_log_file = 'binlog.000008',source_log_pos = 156;
上述是8.0.23中的语法。如果MySQL是8.0.23之前的版本,执行如下SQL:
change master to master_host = 'xxx.xxx.xxx.xxx',master_user = 'xxx',master_password = 'xxx',master_log_file = 'xxx',master_log_pos = xxx;
参数名 | 含义 | 8.0.23之前 |
---|---|---|
SOURCE_HOST | 主库IP地址 | MASTER_HOST |
SOURCE_USER | 连接主库的用户名 | MASTER_USER |
SOURCE_PASSWORD | 连接主库的密码 | MASTER_PASSWORD |
SOURCE_LOG_FILE | binlog日志文件名 | MASTER_LOG_FILE |
SOURCE_LOG_POS | binlog日志文件位置 | MASTER_LOG_POS |
4.开启同步操作
start replica; #8.0.22之后
start slave; #8.0.22之前
5.查看主从同步状态
show replica status; #8.0.22之后
show slave status; #8.0.22之前
测试
1.在主库上创建数据库、表,并插入数据
2.在从库中查询数据,验证主从是否同步
介绍
问题分析
随着互联网及移动互联网的发展,应用系统的数据量也是成指数式增长,若采用单数据库进行数据存储,存在以下性能瓶颈:
①IO瓶颈:热点数据太多,数据库缓存不足,产生大量磁盘IO,效率较低。请求数据太多,带宽不够,网络IO瓶颈。
②CPU瓶颈:排序、分组、连接查询、聚合统计等SQL会耗费大量的CPU资源,请求数太多,CPU出现瓶颈。
分库分表的中心思想都是将数据分散存储,使得单一数据库/表的数据量变小来缓解单一数据库的性能问题,从而达到提升数据库性能的目的。
垂直拆分
垂直分库:
以表为依据,根据业务将不同表拆分到不同库中。
特点
①每个库的表结构都不一样。
②每个库的数据也不一样。
③所有库的并集是全量数据。
垂直分表:
以字段为依据,根据字段属性将不同字段拆分到不同表中。
特点
①每个表的结构都不一样。
②每个表的数据也不一样,一般通过一列(主键/外键)关联。
③所有表的并集是全量数据。
水平分库:
以字段为依据,按照一定策略,将一个库的数据拆分到多个库中。
特点
①每个库的表结构都一样。
②每个库的数据都不一样。
③所有库的并集是全量数据。
水平分表:
以字段为依据,按照一定策略,将一个表的数据拆分到多个表中。
特点
①每个表的表结构都一样。
②每个表的数据都不一样。
③所有表的并集是全量数据。
shardingJDBC:
基于AOP原理,在应用程序中对本地执行的SQL进行拦截,解析、改写、路由处理。需要自行编码配置实现,只支持java语言,性能较高。
MyCat:
数据库分库分表中间件,不用调整代码即可实现分库分表,支持多种语言,性能不及前者。
介绍
MyCat是开源的、活跃的、基于Java语言编写的MySQL
数据库中间件
。可以像使用MySQL一样来使用MyCat,对于开发人员来说根本感觉
不到MyCat的存在。
优势
①性能可靠稳定
②强大的技术团队
③体系完善
④ 社区活跃
MyCat下载
下载地址:http://www.mycat.org.cn/ 点击前往
网盘下载链接:https://pan.baidu.com/s/1xcylGdwv_k7nACh1ab_9dQ?pwd=xjv5
提取码:xjv5
MyCat是采用java语言开发的开源的数据库中间件,支持Windows和Linux运环境,下面介绍MyCat的Linux中的环境搭建。我们需要在准备好的服务器中安装如下软件。
①MySQL
②JDK
③MyCat
服务器 | 安装软件 | 说明 |
---|---|---|
192.168.200.210 | JDK、MyCat | MyCat中间件服务器 |
192.168.200.210 | MySQL | 分片服务器 |
192.168.200.213 | MySQL | 分片服务器 |
192.168.200.214 | MySQL | 分片服务器 |
安装JDK与MyCat
安装JDK
1.上传JDK安装包到Linux服务器
2.将jdk-8u171-linux-x64.tar.gz安装包解压到/usr/local/目录下
tar -zxvf jdk-8u171-linux-x64.tar.gz -C /usr/local/
3.查看/usr/local/目录下的解压后的jdk文件夹
ll /usr/local/
4.配置JDK环境变量
#1.编辑profile文件
vim /etc/profile
#2.配置环境变量
JAVA_HOME=/usr/local/jdk1.8.0_171
PATH=$JAVA_HOME/bin:$PATH
#3.重新加载profile配置文件(全局变量刷新)
source /etc/profile
#4.查看jdk版本(安装完成)
java -version
安装MyCat
1.上传MyCat安装包到Linux服务器
2.将Mycat-server-1.6.7.3-release-20210913163959-linux.tar.gz安装包解压到/usr/local/目录下
在这里插入代码片
3.查看/usr/local/目录下的解压后的MyCat文件夹
ll /usr/local/
MyCat目录结构
目录名 | 存放内容 |
---|---|
bin | 存放可执行文件,用于启动停止MyCat |
conf | 存放MyCat的配置文件 |
lib | 存放MyCat的项目依赖包(jar) |
logs | 存放MyCat的日志文件 |
更换MySQL数据库连接驱动包
数据库连接驱动包网盘下载链接:https://pan.baidu.com/s/191zIAN1N7ZTFNLxuanfqjw?pwd=xjv5
提取码:xjv5
#1.查看/usr/local/mycat/lib/目录下的jar包
ll /usr/local/mycat/lib/
#2.删除/usr/local/mycat/lib/目录下的mysql-connector-java-5.1.35.jar包
rm -rf /usr/local/mycat/lib/mysql-connector-java-5.1.35.jar
#3.上传新的mysql数据库连接驱动包
#4.查看/usr/local/mycat/lib/目录下的jar包
ll /usr/local/mycat/lib/
#5.给新的mysql数据库连接驱动包授权
chmod 777 /usr/local/mycat/lib/mysql-connector-java-8.0.22.jar
#6.查看/usr/local/mycat/lib/目录下的jar包
ll /usr/local/mycat/lib/
MyCat入门
需求
由于tb_order 表中数据量很大,磁盘IO及容量都到达了瓶颈,现在需要对tb_order 表进行数据分片,分为三个数据节点,每一个节点主机位于不同的服务器上,具体的结构,参考下图:
一.关闭防火墙
1.查看防火墙是否开启
#active (running)代表防火墙处于开启状态
systemctl status firewalld
2.关闭防火墙
systemctl stop firewalld
3.查看防火墙是否开启
#inactive (dead)代表防火墙处于关闭状态
systemctl status firewalld
4.分别在三台服务器上创建一个名为db01的数据库
create database db01;
确保三台服务器防火墙都处于关闭状态,如果不想关闭防火墙,可以开放所有对应的端口号。
分片配置(schema.xml)
二.schema.xml配置文件信息修改
查看/usr/local/mycat/conf/目录下的文件
ll /usr/local/mycat/conf/
便于方便修改配置文件我这边使用了Notepad++中的NppFTP插件
关于Notepad++下载安装NppFTP插件可以参考下面连接:https://blog.csdn.net/weixin_44904239/article/details/130551833 点击前往
使用Notepad++中的NppFTP插件修改配置文件
NppFTP插件使用
1.打开Notepad++,显示NppFTP窗口
2.设置配置文件
3.添加
4.配置文件配置
5.连接成功
6.连接上以后看不到目录点击下刷新按钮就行
7.点击/usr/local/mycat/conf/目录下的schema.xml文件
8.修改schema.xml配置文件信息如下:
DOCTYPE mycat:schema SYSTEM "schema.dtd">
<mycat:schema xmlns:mycat="http://io.mycat/">
<schema name="DB01" checkSQLschema="true" sqlMaxLimit="100">
<table name="TB_ORDER" dataNode="dn1,dn2,dn3" rule="auto-sharding-long" />
schema>
<dataNode name="dn1" dataHost="dhost1" database="db01" />
<dataNode name="dn2" dataHost="dhost2" database="db01" />
<dataNode name="dn3" dataHost="dhost3" database="db01" />
<dataHost name="dhost1" maxCon="1000" minCon="10" balance="0"
writeType="0" dbType="mysql" dbDriver="jdbc" switchType="1" slaveThreshold="100">
<heartbeat>select user()heartbeat>
<writeHost host="master" url="jdbc:mysql://192.168.200.210:3306?useSSL=false&serverTimezone=Asia/Shanghai&characterEncoding=utf8" user="root" password="1234" />
dataHost>
<dataHost name="dhost2" maxCon="1000" minCon="10" balance="0"
writeType="0" dbType="mysql" dbDriver="jdbc" switchType="1" slaveThreshold="100">
<heartbeat>select user()heartbeat>
<writeHost host="master" url="jdbc:mysql://192.168.200.213:3306?useSSL=false&serverTimezone=Asia/Shanghai&characterEncoding=utf8" user="root" password="1234" />
dataHost>
<dataHost name="dhost3" maxCon="1000" minCon="10" balance="0"
writeType="0" dbType="mysql" dbDriver="jdbc" switchType="1" slaveThreshold="100">
<heartbeat>select user()heartbeat>
<writeHost host="master" url="jdbc:mysql://192.168.200.214:3306?useSSL=false&serverTimezone=Asia/Shanghai&characterEncoding=utf8" user="root" password="1234" />
dataHost>
mycat:schema>
三.servse.xml配置文件信息修改
2.修改servse.xml配置文件信息如下:(部分主要配置信息展示)
<user name="root" defaultAccount="true">
<property name="password">123456property>
<property name="schemas">DB01property>
user>
<user name="user">
<property name="password">123456property>
<property name="schemas">DB01property>
<property name="readOnly">trueproperty>
user>
测试
切换到MyCat的安装目录,执行如下指令,启动MyCat:
#启动MyCat
bin/mycat start
#停止MyCat
bin/mycat stop
MyCat启动之后,占用端口号8066。
一、启动MyCat
1.切换到/usr/local/mycat/目录
cd /usr/local/mycat/
2.启动MyCat
bin/mycat start
3.启动完毕后,可以查看logs目录下的启动日志,查看MyCat是否启动完成
tail -f logs/wrapper.log #如下图所示表示MyCat启动成功
通过如下指令,就可以连接并登录MyCat
(这里的用户名和密码就是来自servse.xml配置文件里所配置的用户名和密码)
#登录连接MyCat
mysql -h 192.168.200.210 -P 8066 -uroot -p123456
查看数据库
(这里只有一个数据库,这个数据库来自schema.xml配置文件)
show databases;
切换到DB01数据库
use DB01;
查看表
(这个tb_order表MySQL数据库没有,只有MyCat有)
show tables;
二、创建表结构
创建表结构
CREATE TABLE TB_ORDER(
id BIGINT(20) NOT NULL ,
titleVARCHAR(100) NOT NULL ,
PRIMARY KEY(id)
)ENGINE=INNODB DEFAULT CHARSET=utf8;
当在MyCat中创建了TB_ORDER逻辑表,则数据库表结构中对应的真实表TB_ORDER就已经创建了。此时三个数据库都都已经有了TB_ORDER表。
三、插入数据
往TB_ORDER表中插入数据
insert into tb_order(id, titile) values (1,'goods1');
insert into tb_order(id, titile) values (2,'goods2');
insert into tb_order(id, titile) values (3,'goods3');
此时数据只会在真实数据库192.168.200.201中,而192.168.200.213和192.168.200.214数据中是没有的
往MyCat的TB_ORDER表中插入数据的分布规则取决于schema.xml配置文件中的 rule="auto-sharding-long"分片规则
rule="auto-sharding-long"这个分片规则引用了MyCat中分片定义的rule.xml文件
rang-long引用了auto-sharding-long.txt文件
# range start-end ,data node index
# K=1000,M=10000.
0-500M=0 #表示id在0-500万的数据放在第一个节点
500M-1000M=1 #表示id在500万-1000万的数据放在第二个节点
1000M-1500M=2 #表示id在1000万-1500万的数据放在第三个节点
例子
往TB_ORDER表中插入id在500万-1000万的数据
insert into tb_order(id, titile) values (5000001,'goods5000001');
此时数据会在192.168.200.213数据库上
往TB_ORDER表中插入id在1000万-1500万的数据
insert into tb_order(id, titile) values (10000001,'goods10000001');
此时数据会在192.168.200.214数据库上
往TB_ORDER表中插入id大于1500万的数据
insert into tb_order(id, titile) values (15000001,'goods15000001');
此时MyCat报错:不能找到一个有效的数据节点,如果超过id大于1500万的数据可以在auto-sharding-long.txt文件中进行配置
MyCat配置
一、schema.xml
schema.xml作为MyCat中最重要的配置文件之一,涵盖了MyCat的逻辑库、逻辑表、分片规则、分片节点及数据源的配置。
主要包含以下三组标签
①schema标签
②datanode标签
③datahost标签
schema 标签用于定义 MyCat实例中的逻辑库,一个MyCat实例中,可以有多个逻辑库,可以通过 schema 标签来划分不同的逻辑库。MyCat中的逻辑库的概念,等同于MySOL中的database概念,需要操作某个逻辑库下的表时,也需要切换逻辑库(use xxx)。
核心属性
属性名 | 作用 |
---|---|
name | 指定自定义的逻辑库库名 |
checkSQLschema | 在SQL语句操作时指定了数据库名称,执行时是否自动去除; true: 自动去除,false: 不自动除 |
sqlMaxLimit | 如果未指定limit进行查询,列表查询模式查询多少条记录 |
table 标签定义了MyCat中逻辑库schema下的逻辑表,所有需要拆分的表都需要在table标签中定义。
核心属性
属性名 | 作用 |
---|---|
name | 定义逻辑表表名,在该逻辑库下唯一 |
dataNode | 定义逻辑表所属的dataNode,该属性需要与dataNode标签中name对应; 多个dataNode逗号分隔 |
rule | 分片规则的名字,分片规则名字是在rule.xml中定义的 |
primarykey | 逻辑表对应真实表的主键 |
type | 逻辑表的类型,目前逻辑表只有全局表和普通表,如果未配置,就是普通表;全局表,配置为 global |
dataNode标签中定义了MyCat中的数据节点,也就是我们通常说的数据分片。一个dataNode标签就是一个独立的数据分片。
核心属性
属性名 | 作用 |
---|---|
name | 定义数据节点名称 |
dataHost | 数据库实例主机名称,引用自 dataHost 标签中name属性 |
database | 定义分片所属数据库 |
该标签在MyCat逻辑库中作为底层标签存在,直接定义了具体的数据库实例、读写分离、心跳语句。
核心属性
属性名 | 作用 |
---|---|
name | 唯一标识,供上层标签使用 |
maxCon/minCon | 最大连接数/最小连接数 |
balance | 负载均衡策略,取值 0,1,2,3 |
writeType | 写操作分发方式(0:写操作转发到第一个writeHost,第一个挂了,切换到第二个;1:写操作随机分发到配置的writeHost) |
dbDriver | 数据库驱动,支持native、jdbc |
rule.xml中定义所有拆分表的规则,在使用过程中可以灵活的使用分片算法,或者对同一个分片算法使用不同的参数,它让分片过程可配置化。主要包含两类标签: tableRule、Function。
server.xml配置问年包含了MyCat的系统配置信息,主要有两个重要的标签:system、user。
<property name="nonePasswordLogin">0property>
<property name="useSqlStat">0property>
垂直分库
场景
在业务系统中,涉及以下表结构,但是由于用户与订单每天都会产生大量的数据,单台服务器的数据存储及处理能力是有限的,可以对数据
库表进行拆分,原有的数据库表如下。
准备
①如图所示准备三台Linux服务器(ip为:192.168.200.210、192.168.200.213、192.168.200.214)可以根据自己的实际情况进行准备。
②三台服务器上都安装MySQL,在192.168.200.210服务器上安装MyCat。
③三台服务器关闭防火墙或者开放对应的端口。
④分别在三台MySQL中创建数据库 shopping。
schema.xml文件配置如下:
DOCTYPE mycat:schema SYSTEM "schema.dtd">
<mycat:schema xmlns:mycat="http://io.mycat/">
<schema name="SHOPPING" checkSQLschema="true" sqlMaxLimit="100">
<table name="tb_goods_base" dataNode="dn1" primaryKey="id" />
<table name="tb_goods_brand" dataNode="dn1" primaryKey="id" />
<table name="tb_goods_cat" dataNode="dn1" primaryKey="id" />
<table name="tb_goods_desc" dataNode="dn1" primaryKey="id" />
<table name="tb_goods_item" dataNode="dn1" primaryKey="goods_id" />
<table name="tb_order_item" dataNode="dn2" primaryKey="id" />
<table name="tb_order_master" dataNode="dn2" primaryKey="order_id" />
<table name="tb_order_pay_log" dataNode="dn2" primaryKey="out_trade_no" />
<table name="tb_user" dataNode="dn3" primaryKey="id" />
<table name="tb_user_address" dataNode="dn3" primaryKey="id" />
<table name="tb_areas_provinces" dataNode="dn3" primaryKey="id" />
<table name="tb_areas_city" dataNode="dn3" primaryKey="id" />
<table name="tb_areas_region" dataNode="dn3" primaryKey="id" />
schema>
<dataNode name="dn1" dataHost="dhost1" database="shopping" />
<dataNode name="dn2" dataHost="dhost2" database="shopping" />
<dataNode name="dn3" dataHost="dhost3" database="shopping" />
<dataHost name="dhost1" maxCon="1000" minCon="10" balance="0"
writeType="0" dbType="mysql" dbDriver="jdbc" switchType="1" slaveThreshold="100">
<heartbeat>select user()heartbeat>
<writeHost host="master" url="jdbc:mysql://192.168.3.248:3306?useSSL=false&serverTimezone=Asia/Shanghai&characterEncoding=utf8" user="root" password="1234" />
dataHost>
<dataHost name="dhost2" maxCon="1000" minCon="10" balance="0"
writeType="0" dbType="mysql" dbDriver="jdbc" switchType="1" slaveThreshold="100">
<heartbeat>select user()heartbeat>
<writeHost host="master" url="jdbc:mysql://192.168.200.213:3306?useSSL=false&serverTimezone=Asia/Shanghai&characterEncoding=utf8" user="root" password="1234" />
dataHost>
<dataHost name="dhost3" maxCon="1000" minCon="10" balance="0"
writeType="0" dbType="mysql" dbDriver="jdbc" switchType="1" slaveThreshold="100">
<heartbeat>select user()heartbeat>
<writeHost host="master" url="jdbc:mysql://192.168.200.214:3306?useSSL=false&serverTimezone=Asia/Shanghai&characterEncoding=utf8" user="root" password="1234" />
dataHost>
mycat:schema>
server.xml文件配置如下:
<user name="root" defaultAccount="true">
<property name="password">123456property>
<property name="schemas">SHOPPINGproperty>
user>
<user name="user">
<property name="password">123456property>
<property name="schemas">SHOPPINGproperty>
<property name="readOnly">trueproperty>
user>
垂直分库-测试
1.切换到/usr/local/mycat/目录
cd /usr/local/mycat/
2.停止MyCat
bin/mycat stop
3.启动MyCat
bin/mycat start
4.启动完毕后,可以查看logs目录下的启动日志,查看MyCat是否启动完成
tail -f logs/wrapper.log #如下图所示表示MyCat启动成功
5.登录MyCat
mysql -h 192.168.200.210 -P 8066 -uroot -p123456
6.查看数据库、表信息
#查看数据库
show databases;
#切换到SHOPPING数据库
use SHOPPING;
#查看表
show tables;
7.上传shopping-table.sql表结构文件与shopping-insert.sql数据文件
由于文件内容过多无法展示,需要自行下载:
链接:https://pan.baidu.com/s/11Om-w1Oty0jO98GIL8dK3w?pwd=xjv5 点击前往
提取码:xjv5
上传文件到/root目录下
8.执行shopping-table.sql表结构文件与shopping-insert.sql数据文件
#执行shopping-table.sql文件
source /root/shopping-table.sql
查看三个数据库可以发现(根据schema.xml配置文件的配置进行了实现)
192.168.200.210的数据库中存放了 tb_goods_base、tb_goods_brand、tb_goods_cat、tb_goods_desc、tb_goods_item这五张表
192.168.200.213的数据库中存放了 tb_order_item、tb_order_master、tb_order_pay_log这三张表;
192.168.200.214的数据库中存放了 tb_user、tb_user_address、tb_areas_provinces、tb_areas_city、tb_areas_region这五张表
#执行shopping-insert.sql文件
source /root/shopping-insert.sql
查看三个数据库内的表可以发现有数据了
全局表配置
例子1
查询用户的收件人及收件人地址信息(包含省、市、区)。
查询成功
select ua.user_id,ua.contact,p.province,c.city,r.area,ua.address from tb_user_address ua,tb_areas_city c,tb_areas_provinces p,tb_areas_region r where ua.province_id = p.provinceid and ua.city_id = c.cityid and ua.town_id = r.areaid;
此查询语句只涉及了一个分片所以查询成功
例子2
查询每一笔订单及订单的收件地址信息(包含省、市、区)。
SELECT order_id,payment,receiver,province,city,area FROM tb_order_master o,tb_areas_provinces p,tb_areas_city c,tb_areas_region r WHERE o.receiver_province = p.provinceid AND o.receiver_city = c.cityid AND o.receiver_region = r.areaid;
查询报错
此查询语句涉及多个分片所以查询报错,为了解决这个问题需要进行全局表配置
全局表配置
对于省、市、区/县表tb_areas_provinces,tb_areas_city,tb_areas_region,是属于数据字典表,在多个业务模块中都可能会遇到,可以将其设置为全局表,利于业务操作。
1.修改MyCat—schema.xml文件配置
schema.xml文件配置如下:
DOCTYPE mycat:schema SYSTEM "schema.dtd">
<mycat:schema xmlns:mycat="http://io.mycat/">
<schema name="SHOPPING" checkSQLschema="true" sqlMaxLimit="100">
<table name="tb_goods_base" dataNode="dn1" primaryKey="id" />
<table name="tb_goods_brand" dataNode="dn1" primaryKey="id" />
<table name="tb_goods_cat" dataNode="dn1" primaryKey="id" />
<table name="tb_goods_desc" dataNode="dn1" primaryKey="id" />
<table name="tb_goods_item" dataNode="dn1" primaryKey="goods_id" />
<table name="tb_order_item" dataNode="dn2" primaryKey="id" />
<table name="tb_order_master" dataNode="dn2" primaryKey="order_id" />
<table name="tb_order_pay_log" dataNode="dn2" primaryKey="out_trade_no" />
<table name="tb_user" dataNode="dn3" primaryKey="id" />
<table name="tb_user_address" dataNode="dn3" primaryKey="id" />
<table name="tb_areas_provinces" dataNode="dn1,dn2,dn3" primaryKey="id" type="global" />
<table name="tb_areas_city" dataNode="dn1,dn2,dn3" primaryKey="id" type="global" />
<table name="tb_areas_region" dataNode="dn1,dn2,dn3" primaryKey="id" type="global" />
schema>
<dataNode name="dn1" dataHost="dhost1" database="shopping" />
<dataNode name="dn2" dataHost="dhost2" database="shopping" />
<dataNode name="dn3" dataHost="dhost3" database="shopping" />
<dataHost name="dhost1" maxCon="1000" minCon="10" balance="0"
writeType="0" dbType="mysql" dbDriver="jdbc" switchType="1" slaveThreshold="100">
<heartbeat>select user()heartbeat>
<writeHost host="master" url="jdbc:mysql://192.168.3.248:3306?useSSL=false&serverTimezone=Asia/Shanghai&characterEncoding=utf8" user="root" password="1234" />
dataHost>
<dataHost name="dhost2" maxCon="1000" minCon="10" balance="0"
writeType="0" dbType="mysql" dbDriver="jdbc" switchType="1" slaveThreshold="100">
<heartbeat>select user()heartbeat>
<writeHost host="master" url="jdbc:mysql://192.168.200.213:3306?useSSL=false&serverTimezone=Asia/Shanghai&characterEncoding=utf8" user="root" password="1234" />
dataHost>
<dataHost name="dhost3" maxCon="1000" minCon="10" balance="0"
writeType="0" dbType="mysql" dbDriver="jdbc" switchType="1" slaveThreshold="100">
<heartbeat>select user()heartbeat>
<writeHost host="master" url="jdbc:mysql://192.168.200.214:3306?useSSL=false&serverTimezone=Asia/Shanghai&characterEncoding=utf8" user="root" password="1234" />
dataHost>
mycat:schema>
2.测试
①停止MyCat
②清空三台数据库shopping数据库中的表
③启动MyCat
④重新导入表结构及数据
查询用户的收件人及收件人地址信息(包含省、市、区)。
查询成功
查询成功
水平分表
场景
在业务系统中,有一张表(日志表),业务系统每天都会产生大量的日志数据,单台服务器的数据存储及处理能力是有限的,可以对数据库表进行拆分。
①如图所示准备三台Linux服务器(ip为:192.168.200.210、192.168.200.213、192.168.200.214)可以根据自己的实际情况进行准备。
②三台服务器上都安装MySQL,在192.168.200.210服务器上安装MyCat。
③三台服务器关闭防火墙或者开放对应的端口。
④分别在三台MySQL中创建数据库 itcast。
1.MyCat—schema.xml文件配置
schema.xml文件配置如下:(部分主要配置信息展示)
<schema name="ITCAST" checkSQLschema="true" sqlMaxLimit="100">
<table name="tb_los" dataNode="dn4,dn5,dn6" primaryKey="id" rule="mod-long" />
schema>
<dataNode name="dn4" dataHost="dhost1" database="itcast" />
<dataNode name="dn5" dataHost="dhost2" database="itcast" />
<dataNode name="dn6" dataHost="dhost3" database="itcast" />
2.MyCat—server.xml文件配置
server.xml文件配置如下:(部分主要配置信息展示)
<user name="root" defaultAccount="true">
<property name="password">123456property>
<property name="schemas">SHOPPING,ITCASTproperty>
user>
<user name="user">
<property name="password">123456property>
<property name="schemas">SHOPPINGproperty>
<property name="readOnly">trueproperty>
user>
3.MyCat启动
1.进入到MyCat的安装目录
#切换到/usr/local/mycat/目录
cd /usr/local/mycat/
2.启动MyCat(若MyCat处于启动状态需要停止MyCat在重新启动)
#启动MyCat
bin/mycat start
#停止MyCat
bin/mycat stop
3.查看logs目录下的启动日志,查看MyCat是否启动完成(如下图所示表示MyCat启动成功)
#查看wrapper.log日志内容
tail -f logs/wrapper.log
4.MyCat登录
1.登录MyCat
mysql -h 192.168.200.210 -P 8066 -uroot -p123456
2.查看数据库、表等相关信息
#查看数据库(schema.xml配置文件中定义的数据库已存在)
show databases;
#切换到SHOPPING数据库
use ITCAST;
#查看表(schema.xml配置文件中定义的虚拟表已存在)
show tables;
5.创建表结构及数据导入
创建表结构
CREATE TABLE tb_log (
id bigint(20) NOT NULL COMMENT 'ID',
model_name varchar(200) DEFAULT NULL COMMENT '模块名',
model_value varchar(200) DEFAULT NULL COMMENT '模块值',
return_value varchar(200) DEFAULT NULL COMMENT '返回值',
return_class varchar(200) DEFAULT NULL COMMENT '返回值类型',
operate_user varchar(20) DEFAULT NULL COMMENT '操作用户',
operate_time varchar(20) DEFAULT NULL COMMENT '操作时间',
param_and_value varchar(500) DEFAULT NULL COMMENT '请求参数名及参数值',
operate_class varchar(200) DEFAULT NULL COMMENT '操作类',
operate_method varchar(200) DEFAULT NULL COMMENT '操作方法',
cost_time bigint(20) DEFAULT NULL COMMENT '执行方法耗时, 单位 ms',
source int(1) DEFAULT NULL COMMENT '来源 : 1 PC , 2 Android , 3 IOS',
PRIMARY KEY (id)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
查看三个数据库可以发现表和表结构都有了
添加数据
INSERT INTO tb_log (id, model_name, model_value, return_value, return_class, operate_user, operate_time, param_and_value, operate_class, operate_method, cost_time,source) VALUES('1','user','insert','success','java.lang.String','10001','2022-01-06 18:12:28','{\"age\":\"20\",\"name\":\"Tom\",\"gender\":\"1\"}','cn.itcast.controller.UserController','insert','10',1);
INSERT INTO tb_log (id, model_name, model_value, return_value, return_class, operate_user, operate_time, param_and_value, operate_class, operate_method, cost_time,source) VALUES('2','user','insert','success','java.lang.String','10001','2022-01-06 18:12:27','{\"age\":\"20\",\"name\":\"Tom\",\"gender\":\"1\"}','cn.itcast.controller.UserController','insert','23',1);
INSERT INTO tb_log (id, model_name, model_value, return_value, return_class, operate_user, operate_time, param_and_value, operate_class, operate_method, cost_time,source) VALUES('3','user','update','success','java.lang.String','10001','2022-01-06 18:16:45','{\"age\":\"20\",\"name\":\"Tom\",\"gender\":\"1\"}','cn.itcast.controller.UserController','update','34',1);
INSERT INTO tb_log (id, model_name, model_value, return_value, return_class, operate_user, operate_time, param_and_value, operate_class, operate_method, cost_time,source) VALUES('4','user','update','success','java.lang.String','10001','2022-01-06 18:16:45','{\"age\":\"20\",\"name\":\"Tom\",\"gender\":\"1\"}','cn.itcast.controller.UserController','update','13',2);
INSERT INTO tb_log (id, model_name, model_value, return_value, return_class, operate_user, operate_time, param_and_value, operate_class, operate_method, cost_time,source) VALUES('5','user','insert','success','java.lang.String','10001','2022-01-06 18:30:31','{\"age\":\"200\",\"name\":\"TomCat\",\"gender\":\"0\"}','cn.itcast.controller.UserController','insert','29',3);
INSERT INTO tb_log (id, model_name, model_value, return_value, return_class, operate_user, operate_time, param_and_value, operate_class, operate_method, cost_time,source) VALUES('6','user','find','success','java.lang.String','10001','2022-01-06 18:30:31','{\"age\":\"200\",\"name\":\"TomCat\",\"gender\":\"0\"}','cn.itcast.controller.UserController','find','29',2);
查看三个数据库内的tb_log表发现有数据了,数据的分布规则是 id模以3的结果为0的数据分布在第一个节点,id模以3的结果为1的数据分布在第二个节点,id模以3的结果为2的数据分布在第三个节点
范围分片
根据指定的字段及其配置的范围与数据节点的对应情况,来决定该数据属于哪一个分片。
# range start-end ,data node index
# K=1000,M=10000.
0-500M=0 #表示id在0-500万的数据放在第一个节点
500M-1000M=1 #表示id在500万-1000万的数据放在第二个节点
1000M-1500M=2 #表示id在1000万-1500万的数据放在第三个节点
枚举分片
通过在配置文件中配置可能的枚举值,指定数据分布到不同数据节点上,本规则适用于按照省份、性别、状态拆分数据等业务。
为了不影响默认的分片规则,这里创建了一个分片规则。默认节点是为了避免匹配规则中无法匹配的数据,默认放到第几个节点的数据库中,避免报错。
MyCat管理工具
Mycat默认开通了2个端口,可以在server.xml中进行修改
8066 数据访问端口,即进行DML和DDL 操作。
9066 数据库管理端口,即Mycat 服务管理控制功能,用于管理Mycat的整个集群状态。
#登录
mysql -h 192.168.200.210 -P 9066 -uroot -p123456
命令 | 含义 |
---|---|
show @@help | 查看Mycat管理工具帮助文档 |
show @@version | 查看Mycat的版本 |
reload @@config | 重新加载Mycat的配置文件 |
show @@datasource | 查看Mycat的数据源信息 |
show @@datanode | 查看MyCat现有的分片节点信息 |
show @@threadpool | 查看Mvcat的线程池信息 |
show @@sgl | 查看执行的SQL |
show @@sgl.sum | 查看执行的SQL统计 |
MyCat监控
Mycat-eye
Mycat-eye介绍
Mycat-web(Mycat-eye)是对mycat-server提供监控服务,功能不局限于对mycat-server使用。他通过DBC连接对Mycat、 Mysql监控,监控远程服务器(目前仅限于linux系统)的cpu、内存、网络、磁盘。
Mycat-eye运行过程中需要依赖zookeeper,因此需要先安装zookeeper。
Zookeeper与MyCat-web安装
Zookeeper与MyCat-web安装包网盘下载地址:
链接:https://pan.baidu.com/s/1t5YMeHzSExHcfKqse1kjag?pwd=xjv5 点击前往
提取码:xjv5
Zookeeper安装
1.上传Zookeeper安装包
2.将Zookeeper安装包解压到/usr/local/目录下
tar -zxvf zookeeper-3.4.6.tar.gz -C /usr/local/
3.切换到/usr/local/zookeeper-3.4.6/目录下
cd /usr/local/zookeeper-3.4.6/
#创建data文件夹
mkdir data
#进入到data目录下
cd data
#查看当前目录(复制目录)
pwd
5.切换到/usr/local/zookeeper-3.4.6/conf/目录下
cd /usr/local/zookeeper-3.4.6/conf/
6.将zoo_sample.cfg文件重命名为zoo.cfg
mv zoo_sample.cfg zoo.cfg
7.编辑zoo.cfg文件,修改dataDir=/usr/local/zookeeper-3.4.6/data
#编辑zoo.cfg文件
vim zoo.cfg
#修改dataDir=/usr/local/zookeeper-3.4.6/data
dataDir=/usr/local/zookeeper-3.4.6/data
#保存退出
8.启动zookeeper
#切换到/usr/local/zookeeper-3.4.6/目录下(cd .. #返回上一级目录)
cd /usr/local/zookeeper-3.4.6/
#启动zookeeper
bin/zkServer.sh start
#查看zookeeper的启动状态(Mode: standalone 表示启动成功)
bin/zkServer.sh status
MyCat-web安装
1.上传MyCat-web安装包
2.将MyCat-web安装包解压到/usr/local/目录下
tar -zxvf Mycat-web.tar.gz -C /usr/local/
#切换到/usr/local/mycat-web/目录下
cd /usr/local/mycat-web/
#启动MyCat-web(如图所示启动成功)
sh start.sh
注意
如果zookeeper和MyCat-web没有安装在同一台服务器上,需要修改/usr/local/mycat-web/mycat-web/WEB-INF/classes/目录下的mycat.properties配置文件,将zookeeper=localhost:2181中的localhost修改为对应服务器的IP地址
4.访问MyCat-web
#浏览器访问MyCat-web安装所在的服务器地址
http://192.168.3.248:8082/mycat/
5.配置MyCat-web
开启Mycat的实时统计功能(server.xml)
在Mycat监控界面配置服务地址
录入信息-保存
保存完成点击返回列表即可看到刚才配置好的信息
Mycat-eye主要信息展示
介绍
读写分离,简单地说是把对数据库的读和写操作分开,以对应不同的数据库服务器。主数据库提供写操作,从数据库提供读操作,这样能有效地减轻单台数据库的压力。
通过MyCat即可轻易实现上述功能,不仅可以支持MySOL,也可以支持Oracle和SQL Server。
一主一从准备
原理
MySQL的主从复制,是基于二进制日志(binlog)实现的。
主机 | 角色 | 用户名 | 密码 |
---|---|---|---|
192.168.3.211 | master | root | 1234 |
192.168.3.212 | slave | root | 1234 |
主从复制的搭建,可以参考前面讲解的步骤操作
#登录从库
mysql -uroot -p1234
#查看当前从库的状态(Slave_IO_Running和Slave_SQL_Running为Yes说明当前主从复制是正常的)
show slave status\G;
一主一从读写分离
参数值 | 含义 |
---|---|
0 | 不开启读写分离机制,所有读操作都发送到当前可用的writeHost上 |
1 | 全部的readHost与备用的writeHost 都参与select 语句的负载均衡(主要针对于双主双从模式) |
2 | 所有的读写操作都随机在writeHost,readHost上分发 |
3 | 所有的读请求随机分发到writeHost对应的readHost上执行,writeHost不负担读压力 |
schema.xml配置文件(部分主要配置)
DOCTYPE mycat:schema SYSTEM "schema.dtd">
<mycat:schema xmlns:mycat="http://io.mycat/">
<schema name="ITCAST_RW" checkSQLschema="true" sqlMaxLimit="100" dataNode="dn7">
schema>
<dataNode name="dn7" dataHost="dhost7" database="itcast" />
<dataHost name="dhost3" maxCon="1000" minCon="10" balance="3"
writeType="0" dbType="mysql" dbDriver="jdbc" switchType="1" slaveThreshold="100">
<heartbeat>select user()heartbeat>
<writeHost host="master" url="jdbc:mysql://192.168.200.211:3306?useSSL=false&serverTimezone=Asia/Shanghai&characterEncoding=utf8" user="root" password="1234">
<readHost host="slave" url="jdbc:mysql://192.168.200.212:3306?useSSL=false&serverTimezone=Asia/Shanghai&characterEncoding=utf8" user="root" password="1234">
readHost>
writeHost>
dataHost>
mycat:schema>
server.xml配置文件(部分主要配置)
<user name="root" defaultAccount="true">
<property name="password">123456property>
<property name="schemas">ITCAST_RWproperty>
user>
连接Mycat,并在Mycat中执行DML、DQL查看是否能够进行读写分离。
问题:主节点Master宕机之后,业务系统就只能够读,而不能写入数据了
双主双从介绍
一个主机 Master1 用于处理所有写请求,它的从机 Slave1 和另一台主机 Master2还有它的从机 Slave2 负责所有读请求。当Master1主机宕机后,Master2 主机负责写请求,Master1、Master2 互为备机。架构图如下:
双主双从搭建
主备工作
我们需要准备5台服务器,具体的服务器及软件安装情况如下:
编号 | IP | 预装软件 | 角色 |
---|---|---|---|
1 | 192.168.200.210 | MyCat、MySQL | MyCat中间件服务器 |
2 | 192.168.200.211 | MySQL | Master1 |
3 | 192.168.200.212 | MySQL | Slave1 |
4 | 192.168.200.213 | MySQL | Master2 |
5 | 192.168.200.214 | MySQL | Slave2 |
关闭以上所有服务器的防火墙
双主双从搭建
一、主库配置(Master1-192.168.200.211)
1.修改配置文件 /etc/my.cnf
#mysql服务ID,保证整个集群环境中唯一,取值范围: 1 - 2的32次方-1,默认为1
server-id=1
#指定同步的数据库
binlog-do-db=db01
binlog-do-db=db02
binlog-do-db=db03
#在作为从数据库的时候,有写入操作也要更新二进制日志文件
log-slave-updates
2.重启MySQL服务
systemctl restart mysqld
二、主库配置(Master2-192.168.200.213)
1.修改配置文件 /etc/my.cnf
#mysql服务ID,保证整个集群环境中唯一,取值范围: 1 - 2的32次方-1,默认为1
server-id=3
#指定同步的数据库
binlog-do-db=db01
binlog-do-db=db02
binlog-do-db=db03
#在作为从数据库的时候,有写入操作也要更新二进制日志文件
log-slave-updates
2.重启MySQL服务
systemctl restart mysqld
三、两台主库创建账户并授权
1.创建账户并授权
#创建itcast用户,并设置密码,该用户可在任意主机连接该MySQL服务
CREATE USER 'itcast'@'%' IDENTIFIED WITH mysql_native_password BY 'Root@123456';
#为itcast用户分配主从复制权限
GRANT REPLICATION SLAVE ON *.* TO 'itcast'@'%';
2.通过指令,查看两台主库的二进制日志坐标
show master status;
四、从库配置(Slave1-192.168.200.212)
1.修改配置文件 /etc/my.cnf
#mysql服务ID,保证整个集群环境中唯一,取值范围: 1 - 2的32次方-1,默认为1
server-id=2
2.重启MySQL服务
systemctl restart mysqld
五、从库配置(Slave1-192.168.200.214)
1.修改配置文件 /etc/my.cnf
#mysql服务ID,保证整个集群环境中唯一,取值范围: 1 - 2的32次方-1,默认为1
server-id=4
2.重启MySQL服务
systemctl restart mysqld
六、两台从库配置关联的主库
CHANGE MASTER TO MASTER_HOST='',MASTER_USER='',MASTER_PASSWORD='',MASTER_LOG_FILE='',MASTER_LOG_POS='';
例子
CHANGE MASTER TO MASTER_HOST='192.168.200.211',MASTER_USER='itcast',MASTER_PASSWORD='Root@123456',MASTER_LOG_FILE='binlog.000001',MASTER_LOG_POS='156';
需要注意slave1对应的是master1,slave2对应的是master2。MASTER_LOG_FILE='binlog.000001',MASTER_LOG_POS='156'这两个参数可以通过主库执行show master status;命令进行查看
启动两台从库主从复制,查看从库状态
start slave;
show slave status\G;
七、两台主库相互复制
Master2 复制 Master1,Master1 复制 Master2
CHANGE MASTER TO MASTER_HOST='',MASTER_USER='',MASTER_PASSWORD='',MASTER_LOG_FILE='',MASTER_LOG_POS='';
启动两台从库主从复制,查看从库状态
start slave;
show slave status\G;
八、测试
分别在两台主库Master1、Master2上执行DDL、DML语句,查看涉及到的数据库服务器的数据同步情况。
双主双从读写分离
配置
MyCat控制后台数据库的读写分离和负载均衡由schema.xml文件datahost标签的balance属性控制,通过writeType及switchType来完成失败自动切换的。
balance="1"
代表全部的 readHost 与 stand by writeHost 参与 select 语句的负载均衡,简单的说,当双主双从模式(M1->S1, M2->S2,并 M1 与 M2 互为主备),正常情况下,M2,S1,S2 都参与 select 语句的负载均衡;
writeType
0:写操作都转发到第1台writeHost,writeHost1挂了,会切换到writeHost2上;
1:所有的写操作都随机地发送到配置的writeHost上;
switchType
-1:不自动切换
1:自动切换
schema.xml配置文件(部分主要配置)
DOCTYPE mycat:schema SYSTEM "schema.dtd">
<mycat:schema xmlns:mycat="http://io.mycat/">
<schema name="ITCAST_RW2" checkSQLschema="true" sqlMaxLimit="100" dataNode="dn7">schema>
<dataNode name="dn7" dataHost="dhost7" database="db01" />
<dataHost name="dhost3" maxCon="1000" minCon="10" balance="1"
writeType="0" dbType="mysql" dbDriver="jdbc" switchType="1" slaveThreshold="100">
<heartbeat>select user()heartbeat>
<writeHost host="master1" url="jdbc:mysql://192.168.200.211:3306?useSSL=false&serverTimezone=Asia/Shanghai&characterEncoding=utf8" user="root" password="1234">
<readHost host="slave1" url="jdbc:mysql://192.168.200.212:3306?useSSL=false&serverTimezone=Asia/Shanghai&characterEncoding=utf8" user="root" password="1234">readHost>
writeHost>
<writeHost host="master2" url="jdbc:mysql://192.168.200.213:3306?useSSL=false&serverTimezone=Asia/Shanghai&characterEncoding=utf8" user="root" password="1234">
<readHost host="slave2" url="jdbc:mysql://192.168.200.214:3306?useSSL=false&serverTimezone=Asia/Shanghai&characterEncoding=utf8" user="root" password="1234">readHost>
writeHost>
dataHost>
mycat:schema>
server.xml配置文件(部分主要配置)
<user name="root" defaultAccount="true">
<property name="password">123456property>
<property name="schemas">ITCAST_RW2property>
user>
测试
登录MyCat,测试查询及更新操作,判定是否能够进行读写分离,以及读写分离的策略是否正确。
当主库挂掉一个之后,是否能够自动切换。
此文档来源于网络,如有侵权,请联系删除!