文章目录
- 概述
- 搭建 MySQL 数据库主从复制
- MySQL 主从复制原理
- 主机配置(atguigu01)
- 从机配置(atguigu02)
- 主机、从机重启 MySQL 服务
- 主机从机都关闭防火墙
- 在主机上建立帐户并授权 slave
- 在从机上配置需要复制的主机
- 主机新建库、新建表、insert 记录,从机复制
- 停止从服务复制功能
- 重新配置主从
- Mycat安装
- 下载
- 启动
- Mycat读写分离配置
- 创建逻辑库
- 重新启动 Mycat
- 验证读写分离
概述
通过 Mycat 和 MySQL 的主从复制配合搭建数据库的读写分离,实现 MySQL 的
高可用性。
将搭建:一主一从、双主双从两种读写分离模式。
搭建 MySQL 数据库主从复制
Docker搭建主从(建议Docker创建,方便快速)
https://blog.csdn.net/qq_45742250/article/details/137911684
MySQL 主从复制原理
主机配置(atguigu01)
修改配置文件:vim /etc/my.cnf
#主服务器唯一ID
server-id=1
#启用二进制日志
log-bin=mysql-bin
# 设置不要复制的数据库(可设置多个)
binlog-ignore-db=mysql
binlog-ignore-db=information_schema
#设置需要复制的数据库
binlog-do-db=需要复制的主数据库名字
#设置logbin格式
binlog_format=STATEMENT
一般用ROW,为了后续演示使用STATEMENT
binlog 日志有三种格式,分别为 STATMENT 、 ROW 和 MIXED。
在 MySQL 5.7.7 之前,默认的格式是 STATEMENT , MySQL 5.7.7 之后,默认值是 ROW。日志格式通过 binlog-format 指定。
- STATMENT:基于SQL 语句的复制( statement-based replication, SBR ),每一条会修改数据的sql语句会记录到binlog 中 。
优点:不需要记录每一行的变化,减少了 binlog 日志量,节约了 IO , 从而提高了性能;
缺点:在某些情况下会导致主从数据不一致,比如执行sysdate() 、 slepp() 等 。 - ROW:基于行的复制(row-based replication, RBR ),不记录每条sql语句的上下文信息,仅需记录哪条数据被修改了 。
优点:不会出现某些特定情况下的存储过程、或function、或trigger的调用和触发无法被正确复制的问题 ;
缺点:会产生大量的日志,尤其是alter table 的时候会让日志暴涨 - MIXED:基于STATMENT 和 ROW 两种模式的混合复制(mixed-based replication, MBR ),一般的复制使用STATEMENT 模式保存 binlog ,对于 STATEMENT 模式无法复制的操作使用 ROW 模式保存 binlog
从机配置(atguigu02)
修改配置文件:vim /etc/my.cnf
#从服务器唯一ID
server-id=2
#启用中继日志
relay-log=mysql-relay
主机、从机重启 MySQL 服务
主机从机都关闭防火墙
在主机上建立帐户并授权 slave
#在主机MySQL里执行授权命令
CREATE USER 'slave2'@'%' IDENTIFIED BY '123123';
GRANT REPLICATION SLAVE ON *.* TO 'slave2'@'%';
#此语句必须执行。否则见下面。
ALTER USER 'slave2'@'%' IDENTIFIED WITH mysql_native_password BY '123123';
flush privileges;
#查询master的状态
show master status;
#记录下File和Position的值
#执行完此步骤后不要再操作主服务器MySQL,防止主服务器状态值变化
在从机上配置需要复制的主机
#复制主机的命令
CHANGE MASTER TO MASTER_HOST='主机的IP地址',
MASTER_USER='slave',
MASTER_PASSWORD='123123',
MASTER_LOG_FILE='mysql-bin.具体数字',MASTER_LOG_POS=具体值;
# 下面图1
#启动从服务器复制功能
start slave;
#查看从服务器状态
show slave status\G;
#下面两个参数都是Yes,则说明主从配置成功!
# Slave_IO_Running: Yes
# Slave_SQL_Running: Yes
图1
主机新建库、新建表、insert 记录,从机复制
#建库语句
CREATE DATABASE mydb1;
#建表语句
CREATE TABLE mytbl(id INT,NAME VARCHAR(50));
#插入数据
INSERT INTO mytbl VALUES(1,"zhang3");
停止从服务复制功能
stop slave;
重新配置主从
stop slave;
reset master;
Mycat安装
需要JDK环境,可参考下载这一节末尾出现启动不了没有JDK问题
下载
镜像下载:
https://www.topunix.com/post-12169.html
下载对应的 tar 安装包,以及对应的 jar 包
tar(zip)包 :
http://dl.mycat.org.cn/2.0/install-template/mycat2-install-template-1.20.zip
jar 包 :
http://dl.mycat.org.cn/2.0/1.21-release/
把这个 jar 放进解压的 tar 中的 mycat\lib 文件夹下
把整合好的文件夹拷贝到 linux 下 /usr/local/
修改文件夹及以下文件的权限
修改成最高权限,否则运行启动命令时,会因权限不足而报错
cd /usr/local/mycat/bin
chmod 777 *linux*
chmod 777 mycat
cd /usr/local/mycat
# 启动报错的话建一下
mkdir logs
启动
1、mysql中配置用户
CREATE USER 'mycat'@'%' IDENTIFIED BY '123456';
--必须要赋的权限mysql8才有的
GRANT XA_RECOVER_ADMIN ON *.* TO 'root'@'%';
---视情况赋权限
GRANT ALL PRIVILEGES ON *.* TO 'mycat'@'%' ;
flush privileges;
2、修改mycat的prototype的配置
启动mycat之前需要确认prototype数据源所对应的mysql数据库配置,修改对应的
user(用户),password(密码),url中的ip
# password、url、user至少需要修改
vim conf/datasources/prototypeDs.datasource.json
{
"dbType":"mysql",
"idleTimeout":60000,
"initSqls":[],
"initSqlsGetConnection":true,
"instanceType":"WRITE",
"maxCon":1000,
"maxConnectTimeout":3000,
"maxRetryCount":5,
"minCon":1,
"name":"prototypeDs",
"password":"123123",
"type":"JDBC",
"url":"jdbc:mysql://localhost:3306/mycat?useUnicode=true&serverTimezone=Asi
a/Shanghai&characterEncoding=UTF-8",
"user":"root",
"weight":0
}
3、验证数据库访问情况
Mycat 作为数据库中间件要和数据库部署在不同机器上,所以要验证远程访问
情况
mysql -uroot -p123123 -h 192.168.140.100 -P 3307
mysql -uroot -p123123 -h 192.168.140.100 -P 3308
#如远程访问报错,请建对应用户
grant all privileges on *.* to root@'缺少的host'
identified by '123123';
4、启动mycat
linux启动命令
cd mycat/bin
./mycat start
./mycat status
./mycat start 启动
./mycat stop 停止
./mycat console 前台运行
./mycat install 添加到系统自动启动(暂未实现)
./mycat remove 取消随系统自动启动(暂未实现)
./mycat restart 重启服务
./mycat pause 暂停
./mycat status 查看启动状态…
出现启动不了没有JDK问题
Java Downloads | Oracle
cd /opt
tar -zxvf jdk-8u381-linux-x64.tar.gz
# 1、用vim编辑器来编辑profile文件(按“i”进入编辑)
vim /etc/profile
# 2、在文件末尾添加以下内容
export JAVA_HOME=/opt/jdk1.8.0_381
export JRE_HOME=${JAVA_HOME}/jre
export CLASSPATH=.:${JAVA_HOME}/lib:${JRE_HOME}/lib
export PATH=${JAVA_HOME}/bin:$PATH
source /etc/profile
Mycat读写分离配置
逻辑库的库名必须和物理库的 库名完全一样,如果不一样,逻辑库无法自动更新物理库中的数据表
创建逻辑库
# 检查mycat是否运行,有防火墙的关闭防火墙否则navicate远程连接不上
ps -ef|grep mycat
通过navicate连接mycat,创建逻辑库
在Mycat里创建数据库mydb1
创建db2逻辑库
create database mydb1;
多生成一个mydb1.schema.json
修改mydb1.schema.json 指定数据源 “targetName”:“prototype”,配置主机数据源
vim /usr/local/mycat/conf/schemas/mydb1.schema.json
# "targetName":"prototype"
/*+ mycat:createDataSource{ "name":"rwSepw","url":"jdbc:mysql://192.168.217.129:3307/mydb1?useSSL=false&characterEncoding=UTF-8&useJDBCCompliantTimezoneShift=true","user":"root","password":"123456" } */;
/*+ mycat:createDataSource{ "name":"rwSepr","url":"jdbc:mysql://192.168.217.129:3308/mydb1?useSSL=false&characterEncoding=UTF-8&useJDBCCompliantTimezoneShift=true","user":"root","password":"123456" } */;
查询数据源
/*+ mycat:showDataSources{} */;
更新集群信息
/*!mycat:createCluster{"name":"prototype","masters":["rwSepw"],"replicas":["rwSepr"]} */;
查询配置集群情况
/*+ mycat:showClusters{} */;
查看集群配置文件
vim /usr/local/mycat/conf/clusters/prototype.cluster.json
readBalanceType:查询负载均衡策略
可选值:
BALANCE_ALL(默认值):获取集群中所有数据源
BALANCE_ALL_READ:获取集群中允许读的数据源
BALANCE_READ_WRITE:获取集群中允许读写的数据源,但允许读的数据源优先
BALANCE_NONE:获取集群中允许写数据源,即主节点中选择
switchType
NOT_SWITCH:不进行主从切换
SWITCH:进行主从切换
重新启动 Mycat
./mycat restart
如果不放心可使用下面命令查看是否已经启动
ps -ef|grep mycat
验证读写分离
在写主机数据库表mytbl中插入带系统变量数据,造成主从数据不一致
INSERT INTO myth1 VALUES(2,@@hostname);
在mycat中执行下面sql会出现交替读取两个物理库
select * from myth1;