mysql主从搭建、使用mycat实现主从读写分离[通俗易懂]

mysql主从搭建、使用mycat实现主从读写分离[通俗易懂]mysql主从搭建实现数据库实时备份;使用mycat实现主从读写分离,提高数据库的性能。

大家好,又见面了,我是你们的朋友全栈君。如果您正在找激活码,请点击查看最新教程,关注关注公众号 “全栈程序员社区” 获取激活教程,可能之前旧版本教程已经失效.最新Idea2022.1教程亲测有效,一键激活。

Jetbrains全系列IDE稳定放心使用

Mysql Replication 概述

什么是Mysql Replication?

Replication 可以实现将数据从一台数据库服务器(master)复制到一台或多台数据库服务器(slave),默认情况下属于异步复制,无需维持长连接。通过配置,可以复制所有的库或者几个库,甚至库中的一些表。它是 MySQL 内建的,本身自带的功能。

Replication 的原理

简单的说就是 master 将数据库的改变写入二进制日志,slave 同步这些二进制日志,并根据这些二进制日志进行数据操作以实现主从同步。
在这里插入图片描述
DML:SQL 操作语句,update, insert,delete
binlog:二进制日志
relay log :中继日志
在这里插入图片描述
MySQL 主从复制中

第一步:master 记录二进制日志。在每个事务更新数据完成之前,master 在二进制日志记录这些改变。MySQL 将事务写入二进制日志,即使事务中的语句都是交叉执行的。在事件写入二进制日志完成后,master 通知存储引擎提交事务。

第二步:slave 将 master 的 binary log 拷贝到它自己的中继日志。首先,slave 开始一个工作线程——I/O 线程。I/O 线程在 master 上打开一个普通的连接,然后开始 binlog dump process。Binlog dump process 从 master 的二进制日志中读取事件,如果已经执行完 master 产生的所有文件,它会睡眠并等待 master 产生新的事件。I/O 线程将这些事件写入中继日志。

第三步:SQL slave thread(SQL 从线程)是处理该过程的最后一步。SQL 线程从中继日志读取事件,并重新执行其中的事件而更新 slave 的数据,使其与 master 中的数据一致。

Replication的作用

  • 1、Fail over (故障切换)
  • 2、Backup server (备份服务,无法对 SQL 语句执行产生的故障恢复,有限的备份)
  • 3、High Performance (高性能,可以多台 slave,实现读写分离)

Replication 常见方案

1. One master and Muti salve 一主多备

在这里插入图片描述
一般用来做读写分离的,master 写,其他 slave 读,这种架构最大问题 I/O 压力集中在 Master 上<多台同步影响 IO>

2. M-S-S

使用一台 slave 作为中继,分担 Master 的压力,slave 中继需要开启 bin-log,并配置 log-slave-updates
在这里插入图片描述
Slave 中继可使用 Black-hole 存储引擎,不会把数据存储到磁盘,只记录二进制日志。

3. M-M 双主互备 (互为主从)

很多人误以为这样可以做到 MySQL 负载均衡,实际没什么好处,每个服务器需要做同样的同步更新,破坏了事物的隔离性和数据的一致性。
在这里插入图片描述

4. M-M-M

监控三台机器互相作对方的 master
在这里插入图片描述
天生的缺陷:复制延迟,slave 上同步要慢于 master,如果大并发的情况那延迟更严重
mysql 在 5.6 已经自身可以实现 fail over 故障切换

5. One slave Muti master 一从对多主

好处:节省成本,将多个 master 数据自动化整合
缺陷:对库和表数据的修改较多

部署 MySQL 主从同步

环境准备

基础环境:关防火墙、关selinux、hosts、免密登录、yum源
基础环境的准备不赘述

以下环境准备操作在master、slave都要做

集群规划

主机名 IP 系统/MySQL 版本 角色
s66 192.168.1.66 CentOS7.6/5.7.25 Master
s67 192.168.1.67 CentOS7.6/5.7.25 Slave
s68 192.168.1.68 CentOS7.6 MyCat

安装mysql

到官网下载rpm安装包,下载好后上传到服务器。
官网地址:https://www.mysql.com/cn/

tar xf mysql-5.7.tar.gz                        # 解压安装包
yum install -y ./mysql*.rpm                    # 安装mysql

关闭密码强度审计插件

为了实验方便而设置简单密码,生产环境可设置复杂密码而不用关闭。

systemctl start mysqld                         # 开启mysql
echo "validate-password=OFF">> /etc/my.cnf     # 关闭密码强度审计插件
systemctl restart mysqld                       # 重启mysql

修改mysql root用户密码

grep "password" /var/log/mysqld.log            # 查看临时密码
mysql -uroot -p'-NEjo1gbPllh'                  # 使用临时密码登录数据库
set password for root@localhost = password('123456'); 
exit

配置主数据库 s66

创建需要同步的数据库

mysql -u root -p'123456'                       # 登录数据库
create database HA;                            # 创建数据库HA
use HA;                                        # 进入数据库HA
create table T1(id int,name varchar(20));      # 创建表T1
exit                                           # 退出数据库

修改配置文件

vim /etc/my.cnf

在 [mysqld] 下面加如下内容:

log-bin=mysql-bin-master                       # 启用二进制日志
server-id=1                                    # 本机数据库 ID 标示
binlog-do-db=HA #可以被从服务器复制的库, 二进制需要同步的数据库名
binlog-ignore-db=mysql #不可以被从服务器复制的库
systemctl restart mysqld                       # 重启mysql

授权

mysql -u root -p'123456'
grant replication slave on *.* to slave@192.168.1.64 identified by "123456";
show master status;                            # 查看状态信息 

在这里插入图片描述

show binlog events\G                           # 查看二进制日志
exit                                           # 退出

在这里插入图片描述

导出要同步的数据库

mysqldump -uroot -p123456 -B HA >HA.sql        # 导出要同步的数据库
scp HA.sql s67:/root/                          # 将备份文件传到slave服务器

配置从数据库 s67

要同步的两台数据库服务器Mysql版本要一致

mysql -u root -p123456
show variables like '%version%';               # 查看mysql版本

测试连接主服务器

 mysql -u slave -p123456 -h 192.168.1.66       # 在s67登录s66数据库
 show databases;                               # 查看数据库
 exit

在这里插入图片描述
因为slave账号只有复制权限,所以看不到HA数据库。

导入数据

mysql -uroot -p123456 <HA.sql                 # 导入数据

修改从服务器配置文件

vim /etc/my.cnf

在 [mysqld] 下添加如下内容:

server-id = 67                                # 服务器ID,全局唯一

在这里插入图片描述

systemctl restart mysqld                      # 重启服务
mysql -u root -p123456          
change master to master_host='192.168.1.66',master_user='slave',master_password='123456';    # 指定要复制的数据库信息
start slave;                                  # 启动slave 

在这里插入图片描述
Slave_IO_Running :一个负责与 Master 主机的 IO 通信
Slave_SQL_Running:负责自己的 slave mysql 进程
看到图中标红的两个线程均为 YES 则成功

主从同步情况测试

到master上查看状态

 mysql -u root -p123456
 show processlist \G

在这里插入图片描述

插入数据测试同步

在master上插入数据:

 use HA;
 insert into T1 values (1,'man');             # 插入数据

在slave上查看 :

 use HA;
 select * from T1;                             # 查看数据

在这里插入图片描述
主从同步搭建成功!

排错

如果遇到主从不同步,看一下主从 bin-log 的位置,然后再同步。

show master status;

在这里插入图片描述
从服务器执行如下mysql 命令:

stop slave;                                    # 停止slave 服务
# 根据上面主服务器的 show master status 的结果,进行从服务器的二进制数据库记录回归,达到同步的效果
change master to master_log_file='mysql-bin-master.000002',master_log_pos=410;
start slave;                                   # 启动 I/O 线程和 SQL 线程
show slave status\G;                           # 看一下从服务器的同步情况

Slave_IO_Running: Yes
Slave_SQL_Running: Yes
看到两个都是 YES,代表同步成功。

可能出现的问题

  • io线程
  • 防火墙没关
  • ip地址写错,用户名密码写错。

使用MyCat实现读写分离

MySQL读写分离概述

工作原理

基本的原理是让主数据库处理事务性增、改、删操作(INSERT、UPDATE、DELETE),而从数据库处理 SELECT 查询操作。数据库复制被用来把事务性操作导致的变更同步到集群中的从数据库。
在这里插入图片描述

为什么要读写分离

    1. 面对越来越大的访问压力,单台的服务器的性能成为瓶颈,需要分担负载。
    1. 主从只负责各自的写和读,极大程度的缓解 X(写)锁和 S(读)锁争用。
    1. 从库可配置 myisam 引擎,提升查询性能以及节约系统开销。
    1. 增加冗余,提高可用性。

实现读写分离的方式

应用程序层实现

应用程序层实现指的是在应用程序内部及连接器中实现读写分离

优点

  • 应用程序内部实现读写分离,安装既可以使用;
  • 减少一定部署难度;
  • 访问压力在一定级别以下,性能很好。

缺点

  • 架构一旦调整,代码要跟着变;
  • 难以实现高级应用,如自动分库,分表;
  • 无法适用大型应用场景。

中间件层实现

中间件层实现是指在外部中间件程序实现读写分离

常见的中间件
在这里插入图片描述
优点

  • 架构设计更灵活;
  • 可以在程序上实现一些高级控制,如:透明化水平拆分,failover,监控;
  • 可以依靠技术手段提高 mysql 性能;
  • 对业务代码的影响小,同时也安全。

缺点

  • 需要一定的开发运维团队的支持。

MyCat服务安装与配置

架构
在这里插入图片描述
上面我们已经安装并配置好了mysql的主从,接下来只需安装并配置mycat。

JDK安装

Mycat 需要安装 JDK 1.7 或者以上版

下载文件

到官网下载jdk:https://www.oracle.com/java/technologies/downloads/
本实验用到的JDK版本为 :“1.8.0_191”

上传并解压

将下载的安装包上传到服务器

mkdir /usr/java                                    # 创建文件夹
tar xf jdk-8u191-linux-x64.tar.gz -C /usr/java/    # 解压到新建的文件夹

配置环境变量

 vim /etc/profile.d/java.sh                        # /etc/profile.d/目录下创建java.sh 文件并定入如下内容
 JAVA_HOME=/usr/java/jdk1.8.0_191
 PATH=$JAVA_HOME/bin:$PATH 
 CLASSPATH=$JAVA_HOME/jre/lib/ext:$JAVA_HOME/lib/tools.jar
 export PATH JAVA_HOME CLASSPATH
 chmod +x /etc/profile.d/java.sh                   # 赋予可执行权限
 source /etc/profile.d/java.sh                     # 使环境变量生效
 java -version                                     # 查看java版本

mycat安装

下载上传

下载mycat:https://github.com/MyCATApache/Mycat-download/blob/master/1.5-RELEASE/Mycat-server-1.5.1-RELEASE-20161130213509-linux.tar.gz

上传到s68并解压:

tar xf Mycat-server-1.5.1-RELEASE-20161130213509-linux.tar.gz -C /usr/local/

配置环境变量

 vim /etc/profile.d/mycat.sh                       # 在/etc/profile.d 目录下创建mycat.sh 文件,并写入如下

 MYCAT_HOME=/usr/local/mycat 
 PATH=$MYCAT_HOME/bin:$PATH
source /etc/profile.d/mycat.sh                     # 使环境变量生效

mycat配置

账号授权

分别到master、slave上创建mycat登录数据库使用的账号,进入数据库执行如下命令:

GRANT ALL PRIVILEGES ON *.* TO 'mycat'@"%" IDENTIFIED BY "123456";

修改mycat 的用户账号和授权信息

在s68进行如下操作:

vim /usr/local/mycat/conf/server.xml               # 用户账户和授权信息文件
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mycat:server SYSTEM "server.dtd">
<mycat:server xmlns:mycat="http://org.opencloudb/">
	<system>
		<property name="defaultSqlParser">druidparser</property>
	</system>
	<!--以下设置为应用访问帐号权限 -->
 	<user name="root">                                   # 定义管理员用户,也就是连接 Mycat 的用户名
		<property name="password">123456</property>      # 密码
		<property name="schemas">ha</property>           # 定义一个逻辑库,与schema 配置文件对应
	</user>
	<!--以下设置为应用只读帐号权限 -->
	<user name="user">
		<property name="password">user</property>
		<property name="schemas">ha</property>          # 定义一个逻辑库,与schema 配置文件对应
		<property name="readOnly">true</property>
	</user>
</mycat:server>

修改schema.xml

mv /usr/local/mycat/conf/schema.xml /usr/local/mycat/conf/schema.xml.bak   # 备份原文件
vim /usr/local/mycat/conf/schema.xml                               # 新建,写入如下内容
<?xml version="1.0"?>
<!DOCTYPE mycat:schema SYSTEM "schema.dtd">
<mycat:schema xmlns:mycat="http://org.opencloudb/">
	<!--下面schema的name为逻辑数据库 -->
	<schema name="ha" checkSQLschema="false" sqlMaxLimit="100" dataNode='dn1'>
	</schema>
	<!--dataNode的database对应物理数据库(实际存在) -->
	<dataNode name="dn1" dataHost="dthost" database="HA"/>
	<dataHost name="dthost" maxCon="500" minCon="10" balance="1" writeType="0" dbType="mysql" dbDriver="native" switchType="-1" slaveThreshold="100">
	<heartbeat>select user()</heartbeat>
	<writeHost host="s66" url="192.168.1.66:3306" user="mycat" password="123456">
	</writeHost>
	<writeHost host="s67" url="192.168.1.67:3306" user="mycat" password="123456">
	</writeHost>
	</dataHost>
</mycat:schema>

dataNode里设置的database为我们做主从同步的数据库名

注释

  • schema 标签用于定义 MyCat 实例中的逻辑库,name:后面就是逻辑库名,MyCat 可以有多个逻辑库,每个逻辑库都有自己的相关配置。可以使用 schema 标签来划分这些不同的逻辑库。
  • checkSQLschema 这个属性默认就是 false,官方文档的意思就是是否去掉表前面的数据库的名称,”select * from db1.testtable” ,设置为 true 就会去掉 db1。但是如果 db1 的名称不是schema 的名称,那么也不会被去掉,因此官方建议不要使用这种语法。同时默认设置为 false。
  • sqlMaxLimit 当该值设置为某个数值时。每条执行的 SQL 语句,如果没有加上 limit 语句,MyCat 也会自动的加上所对应的值。例如设置值为 100,执行”select * from test_table”,则效果为“selelct * from test_table limit 100”.
  • dataNode 标签定义了 MyCat 中的数据节点,也就是我们通常说所的数据分片。一个dataNode 标签就是一个独立的数据分片.

在这里插入图片描述
dataHost 该标签定义了具体的数据库实例、读写分离配置和心跳语句
在这里插入图片描述
在这里插入图片描述

writeHost /readHost 这两个标签都指定后端数据库的相关配置,用于实例化后端连接池。唯一不同的是,writeHost 指定写实例、readHost 指定读实例。 在一个 dataHost 内可以定义多个writeHost 和 readHost。但是,如果 writeHost 指定的后端数据库宕机,那么这个 writeHost 绑定的所有 readHost 都将不可用。另一方面,由于这个 writeHost 宕机,系统会自动的检测到,并切换到备用的 writeHost 上去。这两个标签的属性相同。

经过以上两个步骤的配置,就可以到/usr/local/mycat/bin 目录下执行 ./mycat start,即可启动mycat 服务!

/usr/local/mycat/bin/mycat start
cat /usr/local/mycat/logs/wrapper.log              # 查看日志,启动成功

在这里插入图片描述

测试读写分离

使用mysql客户端登录mycat进行数据读、写操作

mysql -uroot -p123456 -h 192.168.1.63 -P8066
use HA;
insert into T1 values(1,'dafengche');
select * from T1;

在这里插入图片描述

可以看到读、写数据正常,如果打开数据库速度非常慢,则检查schema中关于物理库的配置是否正确。

修改schema.xml里switchType的值可以实现故障自动切换

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

发布者:全栈程序员-用户IM,转载请注明出处:https://javaforall.cn/182258.html原文链接:https://javaforall.cn

【正版授权,激活自己账号】: Jetbrains全家桶Ide使用,1年售后保障,每天仅需1毛

【官方授权 正版激活】: 官方授权 正版激活 支持Jetbrains家族下所有IDE 使用个人JB账号...

(0)


相关推荐

发表回复

您的电子邮箱地址不会被公开。

关注全栈程序员社区公众号