守听 发表于 2022-8-9 14:41:48

01-MySQL主从复制

问题导入

[*]在之前项目的基础功能实现中,后台管理和移动端在进行数据访问的时候,都是直接操作数据库MySQL。此时的系统有且仅有一台MySQL服务器,则可能会出现如下问题

[*]①、读和写所有压力都由一台数据库承担,压力大
[*]②、数据库服务器磁盘损坏导致数据丢失,单点故障

[*]解决方案

[*]很简单,一台服务器撑不住,那就多台服务器
[*]为了解决上述提到的两个问题,我们可以准备两台MySQL,一台主(Master)服务器,一台从(Slave)服务器,主库的数据变更(写、更新、删除这些操作),需要同步到从库中(主从复制)。而用户在访问我们项目时,如果是写操作(insert、update、delete),则直接操作主库;如果是读(select)操作,则直接操作从库(在这种读写分离的结构中,从库是可以有多个的),这种结构我们称为读写分离 。

一、MySQL主从复制


[*]MySQL主从复制是一个异步的复制过程,底层是基于MySQL数据库自带的二进制日志功能,就是一台或多台MySQL数据库(Slave,从库)从另一台MySQL数据库(master,即从库)进行日志的复制,然后再解析日志并应用到自身。最终实现从库数据和主库的数据保持一致。
PS:MySQL主从复制是MySQL数据库自带功能,无需借助第三方工具
二进制日志

[*]二进制日志(binlog)记录了所有的DDL(数据定义语言)语句和DML(数据操纵语言)语句,但是不包括数据查询语句。此日志对于灾难时的数据恢复有着极其重要的作用,MySQL的主从复制,就是通过binlog实现。默认MySQL是未开启该日志的
1.1、MySQL主从复制原理


[*]MySQL主从复制原理,如下图所示

[*]https://img2022.cnblogs.com/blog/2904930/202206/2904930-20220623171811457-1089513221.jpg

[*]MySQL主从复制的过程

[*]①、Master节点将数据变更写入二进制日志(binary log)
[*]②、slave将master的binary log拷贝到它的中继日志(relay log)
[*]③、slave节点重做中继日志中的事件,完成数据的同步更新

[*]过程原理

[*]①、主库开启二进制日志文件,然后主库增删改操作(DML、DDL)都会记录到二进制日志文件中
[*]②、从库通过IO thread入去二进制日志写入中继日志文件中
[*]③、从库通过SQL thread读取中继日志,把数据同步到从库中

1.2、案例环境搭建

1.2.1、前置工作


[*]Step1:

[*]准备两台服务器(没条件可以使用虚拟机),并且在服务器中安装MySQL,服务器的信息如下所示
[*]数据库IP地址数据库版本Master(主库)192.168.222.1355.7.25Slave(从库)192.168.222.1405.7.25

PS:虚拟机克隆结束之后,还需要更改克隆机子的IP地址
①、cd /etc/sysconfig/network-scripts
②、vim ifcfg-ens33
③、修改IPADDR字段的值为为另一个自己网关的ip地址

[*]Step2

[*]开放3306端口,或者关闭防火墙
[*]方式一:开放3306端口
firewall-cmd --zone=public --add-port=3306/tcp --permanent        // 永久开放3306端口

firewall-cmd --zone=public --list-ports        // 查看端口是否开放

方式二:关闭防火墙
system stop firewalld        // 关闭防火墙

system disable firewalld        // 关闭开机自动启动

[*]Step3

[*]启动数据库服务
[*]systemctl start mysqld
[*]登录MySQL,验证是否正常启动(可以正常登录即可,这里就不多演示)

1.2.2、主库配置


[*]Step1:修改MySQL数据库的配置文件/etc/my.cnf

[*]log-bin=mysql-bin        #启用二进制日志
server-id=200                #设置服务器的唯一id
[*]上述配置需要配置在mysqld下
[*]https://img2022.cnblogs.com/blog/2904930/202206/2904930-20220623171842529-2061422224.jpg

[*]Step2:重启MySQL服务

[*]systemctl restart mysqld

[*]Step3:创建数据同步的用户并授权

[*]前置工作:查看数据库的密码复杂程度

[*]https://img2022.cnblogs.com/blog/2904930/202206/2904930-20220623171859479-1919454609.jpg
[*]MEDIUM等级的密码校验策略要求密码组成为:数字、小写字母、大写字母、特殊字符、长度至少8位(如果觉得麻烦可以更改校验策略的等级)

[*]登录MySQL,并执行如下指令,创建用户并授权
[*]GRANT REPLICATION SLAVE ON *.* to 'coolman'@'%' identified by 'Root@root';
[*]https://img2022.cnblogs.com/blog/2904930/202206/2904930-20220623171923359-872615600.jpg
[*]这句SQL的作用是创建一个用户coolman,密码为Root@root,并且给该用户授予REPLICATION SLAVE权限。常用于建立复制时候所需要用到的用户权限,也就是slave必须被master授权具有该权限的用户,才能通过该用户复制。

[*]Step4:登录MySQL数据库,查看master同步状态

[*]执行如下SQL,记录下结果中File和Position的值
[*]show master status;
[*]https://img2022.cnblogs.com/blog/2904930/202206/2904930-20220623172010936-1432514977.jpg
[*]PS:上面的SQL作用是查看Master的状态,执行完此SQL后不要再执行任何操作

1.2.3、从库配置


[*]Step1:修改MySQL数据库的配置文件/etc/mycnf

[*]server-id=201        #服务器唯一id

[*]https://img2022.cnblogs.com/blog/2904930/202206/2904930-20220623172025047-1594533548.jpg

[*]PS:由于该Linux是复制出来的,MySQL中还有一个server_uuid是一样的,需要修改,否则会引起冲突

[*]vim /var/lib/mysql/auto.cnf(随意修改后面的字符串即可)
[*]https://img2022.cnblogs.com/blog/2904930/202206/2904930-20220623172040982-1899379808.jpg


[*]Step2:重启MySQL服务

[*]systemctl restart mysqld :重启服务
[*]stop slave; :登录数据库后,停止从库的服务

[*]Step3:登录MySQL数据库,设置主库的地址以及同步位置

[*]change master to master_host='192.168.222.135', master_user='coolman', master_password='Root@123', master_log_file='mysql-bin.000001', master_log_pos=440;

start slave;        # 开启从库服务
[*]https://img2022.cnblogs.com/blog/2904930/202206/2904930-20220623172055512-1572832013.jpg
[*]https://img2022.cnblogs.com/blog/2904930/202206/2904930-20220623172107457-2040465885.jpg
[*]参数说明:

[*]参数名称含义master_host主库的IP地址master_user访问主库进行主从复制的用户名(在主库中创建的用户)master_password访问主库进行主从复制的用户对应的密码master_log_file指定从哪个日志文件开始同步(上述查询的master状态中的file和position)master_log_pos指定从日志文件的哪个位置开始同步


[*]Step4:查看从数据库的状态

[*]show slave status \G;

[*]MySQL命令行中的\G表示将查询结果进行按列打印,可以使每个字段打印到单独的行(即将查到的结构旋转90度变成纵向)

[*]通过状态信息中的Slave_IO_running和Slave_SQL_running可以看出主从同步是否就绪,如果这两个参数都是Yes,表示主从同步已经配置完成。
[*]https://img2022.cnblogs.com/blog/2904930/202206/2904930-20220623172121530-717690135.jpg

1.3、测试


[*]主从复制的环境已经搭建好了,那么可以通过Navicat等MySQL连接工具,连接上数据库后,进行测试
[*]测试的时候,我们只需要在主数据库Master执行操作,查看从数据库Slave中是否会将数据同步过去即可

[*]PS:增删改的操作一定不能在从数据库操作,否则有很大可能Slave_SQL_Running线程被终止,从而导致主从复制失败(如果真出现了两个线程中的一个被终止之后,解决方案可以参考该[https://blog.csdn.net/u013829518/article/details/91869547]

[*]测试1:执行DDL操作(创建数据库)

[*]创建数据库

[*]主库

[*]https://img2022.cnblogs.com/blog/2904930/202206/2904930-20220623172142746-1289013614.jpg

[*]从库

[*]https://img2022.cnblogs.com/blog/2904930/202206/2904930-20220623172210521-1157190521.jpg


[*]创建表

[*]主库

[*]https://img2022.cnblogs.com/blog/2904930/202206/2904930-20220623172223551-1208960566.jpg

[*]从库

[*]https://img2022.cnblogs.com/blog/2904930/202206/2904930-20220623172241649-378031801.jpg



[*]测试2:执行DML操作(增删改)

[*]增加

[*]主数据库

[*]https://img2022.cnblogs.com/blog/2904930/202206/2904930-20220623172257533-1428681014.jpg

[*]从数据库

[*]https://img2022.cnblogs.com/blog/2904930/202206/2904930-20220623172310932-2030603915.jpg


[*]删除

[*]主数据库

[*]https://img2022.cnblogs.com/blog/2904930/202206/2904930-20220623172323680-213598280.jpg

[*]从数据库

[*]https://img2022.cnblogs.com/blog/2904930/202206/2904930-20220623172341321-1680677585.jpg


[*]修改

[*]主数据库

[*]https://img2022.cnblogs.com/blog/2904930/202206/2904930-20220623172359376-1434107996.jpg

[*]从数据库

[*]https://img2022.cnblogs.com/blog/2904930/202206/2904930-20220623172420843-2035648138.jpg




免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!
页: [1]
查看完整版本: 01-MySQL主从复制