服务搭建篇(三) 主从Mysql搭建 , 保姆级教程 ,包看包会

本文涉及的产品
RDS MySQL Serverless 基础系列,0.5-2RCU 50GB
云数据库 RDS MySQL,集群系列 2核4GB
推荐场景:
搭建个人博客
RDS MySQL Serverless 高可用系列,价值2615元额度,1个月
简介: 而如果要保证数据能够实时同步,对于MySQL,通常就要用到他自身提供的一套通过Binlog日志在多个MySQL服务之间进行同步的集群方案。基于这种集群方案,一方面可以提高数据的安全性,另外也可以以此为基础,提供读写分离、故障转移

一. 主从复制介绍

将主服务器的binlog日志复制到从服务器上执行一遍,达到主从数据的一致状态,称之为主从复制。通俗一点说就是主服务器做什么 , 从服务器也做什么


二. 主从复制原理

其实数据库的主从同步,就是为了要保证多个数据库之间的数据保持一致。最简单的方式就是使用数据库的导入导出工具,定时将主库的数据导出,再导入到从库当中。这是一种很常见,也很简单易行的数据库集群方式。也有很多的工具帮助我们来做这些事情。但是这种方式进行数据同步的实时性比较差。


而如果要保证数据能够实时同步,对于MySQL,通常就要用到他自身提供的一套通过Binlog日志在多个MySQL服务之间进行同步的集群方案。基于这种集群方案,一方面可以提高数据的安全性,另外也可以以此为基础,提供读写分离、故障转移

等其他高级的功能。


即在主库上打开Binlog日志,记录对数据的每一步操作。然后在从库上打开RelayLog日志,用来记录跟主库一样的Binlog日志,并将RelayLog中的操作日志在自己数据库中进行重演。这样就能够更加实时的保证主库与从库的数据一致


需要注意的是 : MySQL的Binlog默认是不打开的。


他的实现过程是在从库上启动一系列IO线程,负责与主库建立TCP连接,请求主库在写入Binlog日志时,也往从库传输一份。这时,主库上会有一个IO Dump线程,负责将Binlog日志通过这些TCP连接传输给从库的IO线程。而从库为了保证日志接收的稳定性,并不会立即重演Binlog数据操作,而是先将接收到的Binlog日志写入到自己的RelayLog日志当中。然后再异步的重演RelayLog中的数据操作


1.从库的IO线程,读取master.info信息,获取主库信息并连接主库

2.主库接收从库的链接请求后,会生成一个准备binlog dump的线程,来响应从库

3.主库一旦有新的日志生成,会发送“信号”给主库的binlog dump线程,然后binlog dump线程会读取binlog日志的更新

4.TP(传送)给从库的IO线程

5.IO线程将收到的日志存储到了TCP/IP 缓存

6.写入TCP/IP缓存后,立即返回ACK给主库 ,此时主库工作完成

7.IO线程更新master.info文件binlog 文件名和postion

8.IO线程将缓存中的数据,存储到relay-log日志文件,此时io线程工作完成

9.从库SQL线程读取relay-log.info文件,获取到上次执行到的relay-log的位置,作为起点

10.从库SQL线程基于从步骤9中获取到的起点,去中继日志relay-log.000001获取后续操作,在从库回放relay-log

11.SQL线程回放完成之后,会更新relay-log.info文件,把当前操作的位置记入,作为下一次操作的起点。

12. relay-log会有自动清理的功能


三.搭建主从复制环境

1.搭建单机Mysql

1.1.删除之前存在的mysql

rpm -qa|grep mysql
rpm -e mysql mysql-libs
yum -y remove mysql-server mysql mysql-libs

1.2.添加yum源

获取源地址 http://dev.mysql.com/downloads/repo/yum/ 添加源命令

rpm -ivh http://dev.mysql.com/get/mysql57-community-release-el7-9.noarch.rpm

1.3.检查是否安装成功

yum repolist enabled | grep "mysql.*-community.*"

1.4.选择版本

[root@localhost ~]# yum repolist all | grep mysql
mysql-connectors-community/x86_64 MySQL Connectors Community         启用:    24
mysql-connectors-community-source MySQL Connectors Community - Sourc 禁用
mysql-tools-community/x86_64      MySQL Tools Community              启用:    38
mysql-tools-community-source      MySQL Tools Community - Source     禁用
mysql-tools-preview/x86_64        MySQL Tools Preview                禁用
mysql-tools-preview-source        MySQL Tools Preview - Source       禁用
mysql55-community/x86_64          MySQL 5.5 Community Server         禁用
mysql55-community-source          MySQL 5.5 Community Server - Sourc 禁用
mysql56-community/x86_64          MySQL 5.6 Community Server         禁用
mysql56-community-source          MySQL 5.6 Community Server - Sourc 禁用
mysql57-community/x86_64          MySQL 5.7 Community Server         启用:   146
mysql57-community-source          MySQL 5.7 Community Server - Sourc 禁用
mysql80-community/x86_64          MySQL 8.0 Community Server         禁用
mysql80-community-source          MySQL 8.0 Community Server - Sourc 禁用
[root@localhost ~]# yum-config-manager --disable mysql57-community
[root@localhost ~]# yum-config-manager --enable mysql56-community

如果 yum-config-manager: 未找到命令,就需要安装 yum-utils

[root@localhost ~]# yum install -y yum-utils

1.5.安装Mysql

[root@localhost ~]# yum install mysql-community-server

1.6.启动 mysqld.service

[root@localhost ~]# systemctl start  mysqld.service
[root@localhost ~]# service mysqld start/status/stop
[root@localhost ~]# systemctl stop  mysqld.service
[root@localhost ~]# systemctl status  mysqld.service
[root@localhost ~]# systemctl restart  mysqld.service


1.7.修改Mysql密码

获取默认密码

[root@localhost ~]# grep 'temporary password' /var/log/mysqld.log

设置新密码


mysql> set password = password('liuxs');

1.8.禁止更新

生产环境一般禁止 MySQL 更新,修改 /etc/yum.conf,添加内容

exclude=mysql-community-client,mysql-community-common,mysql-community-libs,mysql-community-server

如果需要更新

[root@localhost ~]# yum update mysql-server

注意: 在使用 yum 更新之后,MySQL服务器会自动重启。


1.9.Mysql my.conf 配置

默认配置文件路径 /etc/my.cnf


[client]
# 端口号
port=3306
# For advice on how to change settings please see
# http://dev.mysql.com/doc/refman/5.7/en/server-configuration-defaults.html
[mysqld]
#
# Remove leading # and set to the amount of RAM for the most important data
# cache in MySQL. Start at 70% of total RAM for dedicated server, else 10%.
# innodb_buffer_pool_size = 128M
#
# Remove leading # to turn on a very important data integrity option: logging
# changes to the binary log between backups.
# log_bin
#
# Remove leading # to set options mainly useful for reporting servers.
# The server defaults are faster for transactions and fast SELECTs.
# Adjust sizes as needed, experiment to find the optimal values.
# join_buffer_size = 128M
# sort_buffer_size = 2M
# read_rnd_buffer_size = 2M
# 数据存储路径
datadir=/var/lib/mysql
socket=/var/lib/mysql/mysql.sock
# Disabling symbolic-links is recommended to prevent assorted security risks
symbolic-links=0
log-error=/var/log/mysqld.log
pid-file=/var/run/mysqld/mysqld.pid
character-set-server=utf8
collation-server=utf8_general_ci
lower_case_table_names=1
max_allowed_packet=100M
net_buffer_length=30M
max_connections=80

1.10.创建用户并授权

CREATE USER 'GreatOne'@'%' IDENTIFIED BY 'GreatOne1!';
GRANT ALL PRIVILEGES ON *.* TO '用户名'@'指定ip' IDENTIFIED BY '用户密码' ;
FLUSH PRIVILEGES;

1.11.查看授权

show grants for 'user'@'%';

1.12.权限回收(这一步不操作 , 知道即可)

# 权限回收(不包含赋权权限)
REVOKE ALL PRIVILEGES ON *.* FROM cacti;
REVOKE ALL PRIVILEGES ON cacti.* FROM cacti;
# 收回赋权权限
REVOKE GRANT OPTION ON *.* FROM cacti;
FLUSH PRIVILEGES;


1.13.密码找回(这一步不操作 , 知道即可)

方法一(–init-file)

MySql 官方提供了一种思路,通过在启动 mysqld 服务时指向 init-file 来实现重置密码 参考

https://dev.mysql.com/doc/refman/5.7/en/resetting-permissions.html

实际操作没有成功


方法二(skip-grant-tables)

修改 MySQL 配置,不用密码登录 MySQL 在 [mysqld] 下面添加 skip-grant-tables


[mysqld]
skip-grant-tables
#
# Remove leading # and set to the amount of RAM for the most important data
# cache in MySQL. Start at 70% of total RAM for dedicated server, else 10%.
# innodb_buffer_pool_size = 128M
#
# Remove leading # to turn on a very important data integrity option: logging
# changes to the binary log between backups.
# log_bin
#

重启 mysqld.service 后可以用 mysql 命令免密码登录,此时通过 UPDATE 语句便可修改 root 密码


[root@localhost ~]# systemctl restart mysqld.service
[root@localhost ~]# mysql
Welcome to the MySQL monitor.  Commands end with ; or \g.
Your MySQL connection id is 2
Server version: 5.7.33 MySQL Community Server (GPL)
Copyright (c) 2000, 2021, Oracle and/or its affiliates.
Oracle is a registered trademark of Oracle Corporation and/or its
affiliates. Other names may be trademarks of their respective
owners.
Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.
mysql>


MySQL 5.7 之后 user 表里用 authentication_string 字段代替 password 字段

mysql> use mysql;
mysql> DESC user;
mysql> UPDATE user SET authentication_string=password('ABCabc123!');

修改好之后把配置改回去,再重启 mysqld.service


2.主从Mysql

在另外一台机器也参考以上步骤安装Mysql , 让然后选择一台在当作主服务


2.1 修改master节点的配置文件

#复制集群中的各节点的id均必须唯一
server-id = 1
开启二进制日志
log-bin = master-bin
开启中继日志
relay-log = relay-log
关闭域名解析
skip_name_resolve 

2.2 重启服务

service mysqld restart

2.3 修改slave节点配置

#复制集群中的各节点的id均必须唯一;第二台slave节点改为3
server-id = 2
#开启中继日志
relay-log = relay-log
#开启二进制日志
log-bin = master-bin
#启用只读属性
read_only = ON 
#是否自动清空不再需要中继日志
relay_log_purge = 0
#关闭名称解析(非必须) 
skip_name_resolve 
#使得更新的数据写进二进制日志中
log_slave_updates = 1


2.4 连接master数据库

grant replication slave,replication client on *.* to 'slave'@'192.168.%.%' identified by 'keer'; 

查看主库状态

show master status; 

2.5 连接slave数据库

注意 : master_log_pos=120;的属性一定要和master节点的对应

c5540e17ac42b83090b45e22dbc4bf27_5222fff53ee844d7b5d68289c88a9900.png

change master to master_host='192.168.154.138', 
master_user='slave', 
master_password='keer', 
master_log_file='master-bin.000001', 
master_log_pos=120;

启动slave

start slave;

查看slave状态

show slave status; 

另外一个从节点也是这样配置 , 查询slave节点状态之后看到如下两个属性都为yes就表示成功

6e4f7bfa184930df774ddc4fe7b14cd5_573c19b9a3c646f099f8014c4cf831e2.png

Slave_IO_Running和Slave_sql_Running状态必须都为yes才可 , 只要有一个为no就不行 , 那么就需要检查配置


3.主从不同步问题解决

如果出现主从不同的原因 , 可以查看我的这篇博客 : https://blog.csdn.net/qq_45001002/article/details/128343697

相关实践学习
如何在云端创建MySQL数据库
开始实验后,系统会自动创建一台自建MySQL的 源数据库 ECS 实例和一台 目标数据库 RDS。
全面了解阿里云能为你做什么
阿里云在全球各地部署高效节能的绿色数据中心,利用清洁计算为万物互联的新世界提供源源不断的能源动力,目前开服的区域包括中国(华北、华东、华南、香港)、新加坡、美国(美东、美西)、欧洲、中东、澳大利亚、日本。目前阿里云的产品涵盖弹性计算、数据库、存储与CDN、分析与搜索、云通信、网络、管理与监控、应用服务、互联网中间件、移动服务、视频服务等。通过本课程,来了解阿里云能够为你的业务带来哪些帮助     相关的阿里云产品:云服务器ECS 云服务器 ECS(Elastic Compute Service)是一种弹性可伸缩的计算服务,助您降低 IT 成本,提升运维效率,使您更专注于核心业务创新。产品详情: https://www.aliyun.com/product/ecs
相关文章
|
3月前
|
关系型数据库 MySQL Java
centos7安装mysql教程及Navicat平替软件
【8月更文挑战第17天】本教程详述CentOS 7上安装MySQL的过程。首先确保移除任何预装的MySQL组件,然后通过wget获取并安装MySQL的YUM源。可以选择安装特定版本如5.7或8.0。安装MySQL服务器后,启动服务并查找初始密码。登录MySQL后应立即更改密码,并可根据需要设置远程访问权限。此外,还推荐使用免费开源的DBeaver作为数据库管理工具,提供了安装步骤以方便管理和操作MySQL数据库。
155 3
|
1月前
|
安全 关系型数据库 MySQL
Linux下安装mysql8.0(以tar.xz包安装--编译安装)
通过上述步骤,您完成了从下载、编译、安装到配置MySQL 8.0的全过程。此过程虽然较为复杂,但提供了对MySQL安装环境的完全控制,有助于满足特定的部署需求。在实际操作中,根据具体的系统环境,可能还需调整部分步骤或解决未预见的依赖问题。始终参考官方文档和社区资源,保持安装过程与最新版本的兼容性。
773 67
|
25天前
|
关系型数据库 MySQL Linux
Linux系统如何设置自启动服务在MySQL数据库启动后执行?
【10月更文挑战第25天】Linux系统如何设置自启动服务在MySQL数据库启动后执行?
72 3
|
25天前
|
关系型数据库 MySQL Linux
在 CentOS 7 中通过编译源码方式安装 MySQL 数据库的详细步骤,包括准备工作、下载源码、编译安装、配置 MySQL 服务、登录设置等。
本文介绍了在 CentOS 7 中通过编译源码方式安装 MySQL 数据库的详细步骤,包括准备工作、下载源码、编译安装、配置 MySQL 服务、登录设置等。同时,文章还对比了编译源码安装与使用 RPM 包安装的优缺点,帮助读者根据需求选择最合适的方法。通过具体案例,展示了编译源码安装的灵活性和定制性。
77 2
|
1月前
|
存储 SQL 关系型数据库
【入门级教程】MySQL:从零开始的数据库之旅
本教程面向零基础用户,采用通俗易懂的语言和丰富的示例,帮助你快速掌握MySQL的基础知识和操作技巧。内容涵盖SQL语言基础(SELECT、INSERT、UPDATE、DELETE等常用语句)、使用索引提高查询效率、存储过程等。适合学生、开发者及数据库爱好者。
44 0
【入门级教程】MySQL:从零开始的数据库之旅
|
1月前
|
tengine 关系型数据库 MySQL
Tengine、Nginx安装MySQL数据库命令教程
本指南详细介绍了在Linux系统上安装与配置MySQL数据库的步骤。首先通过下载并安装MySQL社区版本,接着启动MySQL服务,使用`systemctl start mysqld.service`命令。若启动失败,可尝试使用`sudo /etc/init.d/mysqld start`。利用`systemctl status mysqld.service`检查MySQL的服务状态,确保其处于运行中。通过日志文件获取初始密码,使用该密码登录数据库,并按要求更改初始密码以增强安全性。随后创建一个名为`tengine`的数据库,最后验证数据库创建是否成功以及完成整个设置流程。
|
1月前
|
关系型数据库 MySQL 数据库
vertx 的http服务表单提交与mysql验证
本文介绍了如何使用Vert.x处理HTTP服务中的表单提交,并通过集成MySQL数据库进行验证,包括项目依赖配置、表单HTML代码和完整的Vert.x服务代码。
20 2
|
2月前
|
SQL JavaScript 关系型数据库
Node服务连接Mysql数据库
本文介绍了如何在Node服务中连接MySQL数据库,并实现心跳包连接机制。
44 0
Node服务连接Mysql数据库
|
3月前
|
SQL 关系型数据库 MySQL
PHP与MySQL交互之基础教程
【8月更文挑战第31天】 在数字世界中,数据是推动一切的核心力量。本文将引导你探索PHP与MySQL的协同工作,通过实际代码示例,展示如何建立连接、执行查询以及处理结果集。无论你是初学者还是希望巩固知识的开发者,这篇文章都将为你提供宝贵的实践知识。
|
3月前
|
关系型数据库 MySQL 网络安全
MySQL主从复制详细教程
配置MySQL的主从复制是一个细致的过程,需要仔细遵循上述步骤进行。一旦配置完成并运行正常,主从复制将大大提高数据库的可用性和读写性能。在操作过程中,务必保持谨慎,确保数据的一致性和安全性。
404 0
下一篇
无影云桌面