MYSQL-主从复制

1.MYSQL基础

yum安装数据库

bash 复制代码
# 安装 wget下载工具
yum -y install wget

# 下载 mysql 官方 yum 源安装包
wget https://repo.mysql.com/mysql57-community-release-el7-11.noarch.rpm

# 安装 mysql 官方 yum 源
yum -y localinstall mysql57-community-release-el7-11.noarch.rpm

# 配置yum源秘钥
rpm --import https://repo.mysql.com/RPM-GPG-KEY-mysql-2022

# 列出所有版本
yum repolist all | grep mysql

# 安装yum配置工具
yum -y install yum-utils

# 禁用8.0的版本
yum-config-manager --disable mysql80-community

# 启动5.7的版本
yum-config-manager --enable mysql57-community

# 检查启动版本
yum repolist enabled | grep mysql

# 安装服务端,客户端
yum -y install mysql-community-server mysql

# 设置开机启动并启动mysql服务端
systemctl enable mysqld --now

# 检查mysql的安装
ls /var/lib/mysql

# 获取首次登录密码
grep 'password' /var/log/mysqld.log

数据库操作语言

SQL(structured querylanguage)结构化查询语言,主要是用来实现对数据库进行增删查改数据操作的,必须依赖于DBMS。

SQL分类:

DDL:数据定义语言,主要是用来实现对数据库以及表进行操作

复制代码
create database 数据库名
create table 表名{字段名 数据类型 约束,...}
alter table 表名

DML:数据操作语言,主要是用来实现增删改操作

复制代码
insert into
update
delete drop truncate

DCL:数据控制语言,主要是用来控制数据库的权限操作

复制代码
grant
revoke

DQL:数据查询语言。主要是用来查询数据的

复制代码
select 字段名 from 表名 [where <condition>] group by having order by limit ;

数据库配置文件存储位置

bash 复制代码
# 查询数据库配置文件存储路径
find / -name "my.conf"

# 查看MYSQL拍配置问阿金,查询数据存储位置
vim /etc/my.cnf

2.MYSQL主从复制

1.概述

MVSQL主从(Master-lave)复制是一种数据复制机制,用于将一个MVSQL数据库服务器(主服务器)的数据复制到其他一个或多个MVSOL数据库服务器(从服务器)。这种复制机制可以提供数据冗余、增加读取性能、实现高可用性、灾难恢复和数据分析等功能

MySQL 主从复制,是基于主库的二进制日志 binlog,将主库的数据变更事件通过网络同步到从库,从库通过重放 binlog 事件实现与主库的数据最终一致,是 MySQL 实现高可用、读写分离、数据容灾的核心技术。

数据冗余和备份

通过主从复制,可以将主服务器上的数据复制到从服务器上,实现数据的冗余和备份。当主服务器发生硬件故障、数据损坏或人为错误时,可以通过从服务器恢复数据,确保数据的安全性和可用性

分摊读取负载

主服务器负责处理写入操作,而从服务器可以用于处理读取操作,从而分摊读取负载。通过在从服务器上执行读取操作,可以提高整个系统的读取个能和吞吐量,减轻主服务器的压力

提供高可用性

通过设置主从复制,可以实现主服务器的冗余,从而提供高可用性。当主服务器发生故障或维护时,可以快速将从服务器提升为新的主服务器,保#系统的连续性和可用性,减少服务中断时间

灾难恢复和故障转移

在主从复制架构下,可以使用从服务器恢复数据,从而实现快速的灾难恢复。当主服务器不可用时,可以切换到从服务器继续提供服务,实现故障轻移

数据分析和报表生成

通过从服务器进行数据分析、查询和报表生成等操作,可以减少对主服务器的影响,保持主服务器的高性能。从服务器可以用于处理复杂的查询和发据分析任务,从而提供更好的用户体验

2.原理

实际上主从同步的原理就是基于 binog,进行数据同步的。在主从复制过程中,会基于3 个线程来操作,一个主库线程,两个从库线程

二进制日志转储线程(Binlog dumpthread)是一个主库线程。当从库线程连接的时候, 主库可以将二进制日志发送给从库,当主库读取事件(Event)的时候,会在 Binlog 上加锁,读取完成之后,再将锁释放掉。也就是说主库写的时候从库不能读取数据

从库 1/0 线程会连接到主库,向主库发送请求更新 Binlog。这时从库的 I/O 线程就可以读取到主库的二进制日志转储线程发送的Binlog 更新部分,并且拷贝到本地的中继日志(Relaylog)。

从库 SQL线程会读取从库中的中继日志,并且执行日志中的事件,将从库中的数据与主库保持同步。

3.方案实现

传统基于binlog的搭建方式

1.修改配置文件,启动binlog日志就相关的配置,修改后重启MySQL服务

2.查看并确认binlog日志开启(记住binlog日志的位置)

3.添加并授权slave复制用户的复制权限,刷新权限

4.备份主库数据(如果是从0开始搭建主从同步,可以不用进行该操作/如果是主库之前就有了数据,则需要将数据导出来,现在从库中导入数据)

5.将备份文件发送到从机(如果不是从0搭建的话,需要执行该步骤)

1.修改主库配置文件

bash 复制代码
# 查找MySQL的配置文件位置
find / -name "my.cnf"
#修改配置文件
vim /etc/my.cnf
#mysq1服务ID,保证整个集群环境中唯一,取值范围:1-2的32次方-1,默认为1
server-id=1
#是否只读,1 代表当前服务器只读(不能做增删改操作),0代表读写
read-only=0
#开启bin1og日志
1og_bin=mysq1-bin
#日志格式
binlog_format=row
#下面两个选项大家可以不设置,但可以了解下。我们这里不指定这两个参数,也就是说我们现在创建的所有数据库都需要同步。
#忽略的数据,指不需要同步的数据库
#bin1og-ignore-db=mysq1
#指定同步的数据库
#bin1og-do-db=db01
systemct1 restart mysqld

配置完成之后重启mysqld,输出sql语句,判断bin_log日志是否开启

bash 复制代码
show master status;

出现以上显示,说明日志开启,且在之前设置的时候,没有设置执行的数据库和忽略的数据库

2.添加并授权slave复制用户的权限,刷新权限

bash 复制代码
# 登录数据库
mysql -u root -p

# 创建用于同步数据的用户,设置密码添加,添加全选
CREATE USER 'slave'@'%' IDENTIFIED WITH mysql_native_password By 'xxxxx';
GRANT REPLICATION SLAVE ON *.* To 'slave'a'%';
flush privileges;

创建同步用户语句

关键字 / 参数 核心作用 主从场景的特殊说明
CREATE USER MySQL 创建新用户的固定关键字 先创建用户再授权是 MySQL 5.7 + 的规范写法,避免直接用 GRANT 隐式创建用户带来的权限风险
'slave' 要创建的用户名 这里命名为 slave,是为了一眼识别这是主从同步专用账号,也可以自定义为 repl、replication 等名称
@ 固定分隔符,分隔「用户名」和「允许登录的客户端地址」 MySQL 的用户是「用户名 + 登录地址」的组合,二者绑定才是一个完整的用户
'%' 允许该账号登录的客户端 IP 地址%是通配符,代表「允许从任意 IP 地址登录」 主从复制中,从库需要远程连接主库,因此用%允许从库访问;生产环境建议替换为从库的固定 IP(比如'192.168.1.100'),只允许指定从库服务器登录,大幅提升安全性
IDENTIFIED WITH 固定关键字,用于指定该用户的密码认证插件 MySQL 通过认证插件完成登录时的密码校验,不同插件的加密、认证逻辑不同
mysql_native_password 认证插件名称,MySQL 原生的密码认证插件 这是主从复制的关键配置:1. MySQL 8.0 默认认证插件是caching_sha2_password,该插件需要 SSL 连接才能正常认证,主从默认不开启 SSL 时,会导致从库连不上主库;2. 强制指定该插件,可兼容 MySQL 5.7/8.0 全版本,保证主从同步的连接兼容性
BY 'xxxx' BY后跟该账号的登录密码 从库连接主库时,必须使用这个密码完成认证;MySQL 5.7 + 默认开启密码强度校验,密码需满足长度、大小写 + 数字 + 特殊字符的复杂度要求,否则会创建失败

同步权限授权语句

关键字 / 参数 核心作用 主从场景的特殊说明
GRANT MySQL 权限分配的固定关键字,用于给用户授予指定权限 只有授予了对应权限,用户才能执行权限范围内的操作
REPLICATION SLAVE 主从复制专属的核心权限,也是唯一必需的权限 该权限的作用:允许该账号(从库的 IO 线程)连接主库,并且读取主库的 binlog 二进制日志。⚠️ 没有这个权限,从库无法和主库建立同步连接,根本拿不到 binlog 日志,同步完全无法进行;⚠️ 遵循最小权限原则,主从同步只需要这个权限即可,不要给ALL PRIVILEGES等多余权限,避免账号泄露导致数据被篡改
ON *.* 权限的生效范围 ,格式为 数据库名.表名 *.* 代表「所有数据库的所有表」:主从复制默认同步整个 MySQL 实例的全量数据,因此权限范围必须是*.*,不能限定单个库 / 表,否则会导致同步失败
TO 'slave'@'%' 指定要把权限授予哪个用户 必须和前面CREATE USER创建的「用户名 + 登录地址」完全一致,MySQL 中'slave'@'%''slave'@'localhost'是两个完全独立的用户,写错会导致授权给错账号,从库连接失败

3.备份主库数据

如果是从0开始搭建主从同步,那么就不用进行该操作,若在主从同步之前数据库中就有了数据需要将数据导出来,导入从库中

4.修改从库配置文件

1.修改配置文件(可以将master上的配置文件复制过来进行修改,修改server_id,添加"read_only=on")2,修改数据库UUID的值(因为机器是克隆出来的,数据库的UUID是一样的,会导致主从失败)

3.重启MySQL服务

4.从库导入数据(导入master发送过来的备份数据)

配置同步master(在从库中配置主从同步,就是从master上复制数据过来)5.

6,查看同步状态

添加两项

bash 复制代码
vim /etc/my.cnf

server-id=2    # id值需要与主机不同
read-only=1    # 从库只读

5.修改从库数据库的UUID值

只要主库和从库的UUID值不同即可

bash 复制代码
vim /var/lib/mysql/auto.cnf

[auto]
server-uuid=server-uuid=6b333ac6-4117-11f1-8500-000c297a97af

6.导入主库数据库的备份文件

由于这里是从0开始的主从复制,在第三步中没有备份数据库文件就不用进行这一步

7.配置同步master

bash 复制代码
mysql -u root -p     # 登录数据库

stop slave;          # 停止从库复制

CHANGE MASTER TO MASTER_HOST='192.168.22.145',MASTER_USER='slave',MASTER_PASSWORD='xxxxx',MASTER_LOG_FILE='mysql-bin.000001',MASTER_LOG_POS=154;

start slave;         # 开启从库复制

show slave status\G; # 检查连接是否成功 

显示红框里面的就是成功连接

在主库中创建数据库

从库复制

遇到的问题

不能找到你定义的日志文件,检查第7步骤的内容是否正确

3.MYSQL读写分离

一般来说数据库的读写操作对于对磁盘有关系的操作就会对性能有比较大的影响,读的操作对性能影响远小于写的操作,只有增改查操作涉及到磁盘操作

1.mycat安装-读写分离

mycat是一个java开发的软件,可以将数据库查数据和增改删数据分开到两台服务器上,实现读写分离

这是mycat的软件地址

https://github.com/MyCATApache/Mycat-Server/releases/tag/Mycat-server-1675-release

mycat是基于java环境使用的因此还需要安装java环境且版本最好是1.8

bash 复制代码
# 列出yum源的java版本
yum list -y java*

# 安装jdk1.8的版本
yum install -y java-1.8.0-openjdk.x86_64

# 验证安装是否完成
java -version

解压mycat软件包

bash 复制代码
# 将mycat解压到/usr/local目录下
tar -zvxf mycat -C /usr/local

2.目录概述

3.启动mycat

bash 复制代码
# 创建日志目录
mkdir /usr/local/mycat/logs

# 添加hosts解析
vim /etc/hosts

192.168.22.137 mycat

# 启动mycat(console是启动时显示控制台,这样能看到启动时的日志目录)
/usr/local/mycat/bin/mycat console

启动成功

注意其中启动失败可能存在的问题

1.注意如果启动不成功,可能是由于没有解析主机名称。需要在hosts文件中进行解析

2.jvm内存设置:vim //usr/local/mycat/conf/wrapper.conf(大约在35行)wrapper.java.additional.9=-Xmx512Mwrapper.java.additional.10=-Xms256M

超时时间设置

wrapper.startup.timeout=300

4.配置读写分离

读写分离的配置文件

1.server.xml

两个账号要不相同

原本项目连接的是后端真实数据库的账号密码,现在连接的是mycat,再由mycat连接真实后端服务器,相当于加了一个代理

2.schema.xml

bash 复制代码
<?xml version="1.0"?>
<!DOCTYPE mycat:schema SYSTEM "schema.dtd">
<mycat:schema xmlns:mycat="http://io.mycat/">

    <!-- 需和server.xml中配置的schemas名称完全一致 -->
    <schema name="TESTDB" checkSQLschema="false" sqlMaxLimit="100" dataNode="dn3"></schema>

    <!-- dataHost和下方dataHost的name完全匹配,database为后端MySQL真实存在的库名 -->
    <dataNode name="dn3" dataHost="localhost" database="test1" />

    <!-- 读写分离核心:balance="3" 读请求只走从库,写请求只走主库,一主一从场景最常用 -->
    <dataHost name="localhost1" maxCon="1000" minCon="10" balance="3" writeType="0" dbType="mysql"
    dbDriver="native" switchType="1"  slaveThreshold="100">
        <!-- 后端MySQL心跳检测,兼容性最强 -->
        <heartbeat>select 1</heartbeat>
        <!-- 主库(写节点)配置 -->
        <writeHost host="hostM1" url="192.168.22.145:3306" user="root" password="Aa123456">
            <!-- 从库(读节点)配置,可新增多个readHost实现读负载均衡 -->
            <readHost host="hostS2" url="192.168.22.146:3306" user="root" password="Aa123456" />
        </writeHost>
    </dataHost>
</mycat:schema>

3.启动读写分离

这样就是启动成功,尝试读写分离服务器登录

这里的mycat的端口是8066,我们直接登录

bash 复制代码
mysql -h 192.168.22.137 -P8066 -uroot -p'123456';

能够登录但是无法对服务器产生操作

4.添加权限

找一台客户机安装mysql的客户端,连接mycat,操作数据库,实际上操作的则是后端真实的数据库服务,master与slave需要添加root账号的远程访问权限;

在mysql数据库中的user表中的host和user字段其中host中的代表访问控制%表示可以远程访问,而localhost代表只能在本地访问,我们添加一个root账号可以远程访问的

bash 复制代码
# 添加账号
grant all on *.* to 'root'@'%' identified by "123456";
# 刷新权限
flush privileges;

添加成功后,尝试连接mycat

bash 复制代码
mysql -h 192.168.22.137 -P8066 -uroot -p'123456';

连接成功后尝试操作数据库

插入一个数据

发现只读,回顾前面的server.xml,发现我设置的root账号是只读的在最后一个,我们用另一个user登录

bash 复制代码
mysql -h 192.168.22.137 -P8066 -uuser -p'123456';

操作成功

相关推荐
CDN3602 小时前
【硬核架构】2026年服务器运维:Rust重写核心组件与eBPF内核观测的实战
运维·服务器·架构
网络笨猪10 小时前
# Nginx企业级全套配置\+排错手册
运维·nginx
Yupureki10 小时前
《Linux网络编程》8.网络层IP原理
linux·运维·服务器·网络·ip
yyuuuzz10 小时前
aws亚马逊入门常见认知误区
运维·服务器·网络·云计算·github·aws
DeepFlow 零侵扰全栈可观测11 小时前
运动战:AI 时代 IT 运维的决胜之道——DeepFlow 业务全链路可观测性的落地实践
运维·网络·人工智能·arcgis·云计算
林叔聊渠道分销12 小时前
saas产品运营案例 | 联盟营销计划如何帮助企业提高销售额?
运维·产品运营·sass·流量运营·用户运营
志栋智能13 小时前
告别报告堆砌:超自动化巡检的智能分析与洞察
运维·服务器·网络·人工智能·自动化
雅斯驰15 小时前
AES-128加密+滚动码认证:ATA5702W如何防御中继攻击与信号重放
运维·单片机·嵌入式硬件·物联网·自动化
网络与设备以及操作系统学习使用者15 小时前
直连路由优先级最高
运维·网络·学习·华为·智能路由器