线上环境mysql主从同步的搭建过程

算法维
• 阅读 5631

之前搭建过一套主从同步的mysql集群,但是是基于新数据库,而这次线上环境要升级成主从同步的集群,记录一下升级过程和中间遇到的各种问题。

由于是直接对线上数据库进行修改,因此要保证对线上环境造成尽量小的影响。所以把之前的数据库当作主数据库,这样相应的服务不用修改配置文件。要做的就是安装一个从数据库并且实时同步主数据库的改动。

如果两个库在同一个服务器的话则安装mysql时需要改变其端口。

如果在另一个服务器安装的话注意查看并卸载旧的mysql。

首先安装从库:

安装mysql

下载软件包:

wget https://repo.mysql.com//mysql80-community-release-el7-1.noarch.rpm

本地安装:

yum localinstall mysql80-community-release-el7-1.noarch.rpm

安装mysql:

yum install mysql-community-server

设为开机启动:

systemctl enable mysqld

systemctl daemon-reload

启动mysql:

systemctl start mysqld

以上步骤就安装好mysql8了。

获取mysql的临时密码:

grep 'temporary password' /var/log/mysqld.log

登录mysql:

mysql -uroot -p

会提示输入密码,输入之前获取的临时密码即可登录。

此时需要修改mysql的密码,要不然之后的步骤也会强制提示你需要修改密码:

ALTER USER 'root'@'localhost' IDENTIFIED BY '121b33dAj934J1^Sj9aa';

mysql8默认对密码的强度有要求,需要设置复杂一点,要不然也会提示错误。

刷新配置:

FLUSH PRIVILEGES;

关于主服务器的相关配置

设置server-id值并开启binlog参数 根据mysql的同步原理:关键因素就是binlog日志。 编辑/etc/my.cnf配置文件,修改和添加相关参数。

vi /etc/my.cnf

[mysqld]
# 同一局域网内注意要唯一
server-id = 1
log-bin = mysql-bin
relay_log配置中继日志
relay_log=edu-mysql-relay-bin

修改配置后需要重启才能生效:

service mysqld restart

重启后进入mysql:

mysql -u root -p

在master数据库创建数据同步用户,授予用户 slave REPLICATION SLAVE权限和REPLICATION CLIENT权限,用于在主从库之间同步数据。

CREATE USER 'slave'@'%' IDENTIFIED BY '@#$Rfg345634523rft4fa';

GRANT REPLICATION SLAVE, REPLICATION CLIENT ON *.* TO 'slave'@'%';

语句中的%代表所有服务器都可以使用这个用户,如果想指定特定的ip,将%改成ip即可。

主数据库需要重启一次,但是时间非常短,如果对服务可用性非常高的服务要提前做好准备。

因为主从同步开启必须确保需要同步的库数据完全一致,因此需要先备份主数据库,但是备份时不能有新数据的加入,所以需要给主库加一个读锁然后备份,这个过程持续的时间依赖于数据库中数据量的多少,像我们这个库有千万级的数据,备份时间花了几十秒,在这几十秒的时间里用户的读操作不受影响,但是不能写入。

备份主库

对主数据库锁表只读: 注:锁表会影响业务,请谨慎处理 mysql>flush tables with read lock;

对主数据库备份:

mysqldump -uroot -p --databases doctor quartz | gzip >/backup/mysql_bak.$(date +%F)sql.gz

这个命令会备份doctor库和quartz库并且压缩,然后保存在/back/文件夹下并以日期结尾。

注意:

这里当时遇到了一个大坑,最开始执行的备份命令是:

mysqldump -uroot -pmysql -A -B |gzip >/backup/mysql_bak.$(date +%F)sql.gz

(注:-A表示备份所有库, -B表示增加user DB和drop等参数(导库时会直接覆盖所有的)。)

在正式上从库导入数据后没问题,但是一旦把从库的主从同步配置改了之后mysql就起不来了,而这个命令在测试环境是没问题的,但是还是建议把需要同步的库一个一个列出来,避免出现奇怪的问题。

记录位置

主库备份完成之后需要记录当前的位置:

show master status;

+----------------------+----------+--------------+------------------+-------------------+
| File                 | Position | Binlog_Do_DB | Binlog_Ignore_DB | Executed_Gtid_Set |
+----------------------+----------+--------------+------------------+-------------------+
| edu-mysql-bin.000002 |   22361 |             | mysql           |                   |
+----------------------+----------+--------------+------------------+-------------------+

记下File和Position之后就能解锁主库了:

unlock tables;

到这里之后就没主库什么事了。

从库的配置

导入数据

把主库备份的mysql数据迁移到从库:

scp -P 8523 /backup/mysql_bak.2022-07-17sql.gz root@11.11.111.66:/backup/mysql_bak.2022-07-17sql.gz

如果不想用scp命令可以手动复制粘贴数据过去,但是速度真的慢很多,传输之前要建好文件夹。

解压:gzip -d mysql_bak.2022-07-17sql.gz

导入数据。

在从my.cnf配置中新增:

mysqld]
## 设置server_id,注意要唯一
server-id=101
## 开启二进制日志功能,以备Slave作为其它Slave的Master时使用
log-bin=mysql-slave-bin
## relay_log配置中继日志
relay_log=edu-mysql-relay-bin

修改配置后需要重启才能生效:

service mysql restart

重启之后进入mysql:

mysql -uroot -p

change master to master_host='111.11.0.2', master_user='slave', master_password='@#$Rfg345634523rft4fa', master_port=3306, master_log_file='mysql-bin.000001', master_log_pos= 2830, master_connect_retry=30;

master_host :Master的地址

master_port:Master的端口号

master_user:用于数据同步的用户

master_password:用于同步的用户的密码

master_log_file:指定 Slave 从哪个日志文件开始复制数据,即上文中提到的 File 字段的值

master_log_pos:从哪个 Position 开始读,即上文中提到的 Position 字段的值

master_connect_retry:如果连接失败,重试的时间间隔,单位是秒,默认是60秒

在从mysql中查看主从同步状态:

show slave status \G;

此时的SlaveIORunning 和 SlaveSQLRunning 都是No,因为我们还没有开启主从复制过程。

开启主从复制:

start slave;

再次查看同步状态:

show slave status \G;

SlaveIORunning 和 SlaveSQLRunning 都是Yes说明主从复制已经开启。

理论上此时应该已经成功了,但是很抱歉我们每一次在这里都会卡住。

查看日志可以看到主从连接失败,这是由于mysql8特殊的密码机制造成的,在最开始我们在主数据库中建了一个用户用于主从同步,问题就出在这个用户的密码上,给这个用户改一下密码就行了。

ALTER USER 'slave'@'%' IDENTIFIED WITH mysql_native_password BY '@#$Rfg345634523rft4fa';

目前只有这个命令能生效,其他的都不能生效。把密码再覆盖一次,等超时时间一过,就自动连接上了。

点赞
收藏
评论区
推荐文章
Wesley13 Wesley13
4年前
Mysql主从 读写分离(一主一从或一主多从),双机热备(互为主从)
什么是主从复制 当mysql数据库的数据量太大的时候,查询数据就很吃力了,无论怎么优化都会产生瓶颈,这时我们需要增加服务器设备来实现分布式数据库,首先要了解主从数据库服务器的版本的需求,主从mysql的安装运行版本需一致。因此,我们利用mysql自带的REPLICATION来实现mysql多机主从同步的功能,mysql版本为5.7进行演示。!
Stella981 Stella981
4年前
RocketMQ 平滑升级到主从切换(实战篇)
本文主要介绍如何将RocketMQ集群从原先的主从同步升级到主从切换。本文首先介绍与DLedger多副本即RocketMQ主从切换相关的核心配置属性,然后尝试搭建一个主从同步集群,最后将原先的RocketMQ集群平滑升级到DLedger集群的示例,并简单测试一下主从切换功能。1、RocketMQ主从切换核心配置参数详解
Wesley13 Wesley13
4年前
MySQL 主从复制(实时热备)原理与配置
MySQL是现在普遍使用的数据库,但是如果宕机了必然会造成数据丢失。为了保证MySQL数据库的可靠性,就要会一些提高可靠性的技术。MySQL主从复制可以做到实时热备数据。本文介绍MySQL主从复制原理及其配置过程。术语:主从复制——masterslavereplication(MS模式)。用途备份读写分离高
Wesley13 Wesley13
4年前
Mysql数据库的主从与主主
前言:首先,我们得知道我们为什么要做数据库的主从与主主,而后,再讨论他们的优劣与特点:为什么要做主从呢?因为Mysql数据库没有增量备份的机制,当数据量太大的时候备份是个难以解决的问题。但是mysql数据库有主从备份的机制,说白了就是把主数据库的所有的数据同时写到备份的数据库中。实现mysql数据库的热备份。 要想实现主从或主主,首先要满足主从
Stella981 Stella981
4年前
RocketMQ 平滑升级到主从切换(实战篇)
本文主要介绍如何将RocketMQ集群从原先的主从同步升级到主从切换。首先先介绍与DLedger多副本即RocketMQ主从切换相关的核心配置属性,然后尝试搭建一个主从同步集群,再从原先的RocketMQ集群平滑升级到DLedger集群的示例,并简单测试一下主从切换功能。1、RocketMQDLedger多副本即主从切换核心配
Stella981 Stella981
4年前
RocketMQ 升级到主从切换(DLedger、多副本)实战
本文主要介绍如何将RocketMQ集群从原先的主从同步升级到主从切换。首先先介绍与DLedger多副本即RocketMQ主从切换相关的核心配置属性,然后尝试搭建一个主从同步集群,再从原先的RocketMQ集群平滑升级到DLedger集群的示例,并简单测试一下主从切换功能。1、RocketMQDLedger多副本即主从切换核心配
Wesley13 Wesley13
4年前
mysql主从同步问题梳理
前言:MySQL主从复制故障机延迟原因有很多,之前详细介绍了Mysql主从复制的原理和部署过程,在mysql同步过程中会出现很多问题,导致数据同步异常。以下梳理了几种主从同步中可能存在的问题:1)slave运行过慢不能与master同步,也就是MySQL数据库主从同步延迟MySQL数据库slave服务器延迟的现象是非常普遍的,MySQ
Wesley13 Wesley13
4年前
mysql8基于gtid导出导入搭建主从
mysql8基于gtid导出导入搭建主从开启GTID的情况下导出导入库的注意事项在开启了GTID功能的MySQL数据库中,不论是否使用了GTID的方式做了主从同步,导出导入时都需要特别注意数据库中的GTID信息.\导出\在主库上全备,setgtidpur
Wesley13 Wesley13
4年前
MySQL主从延迟如何解决?
我们知道生产环境中经常会遇到MySQL主从延迟问题,从原理上也能看出主库的事务提交是并发模式,而从库只有一个SQL线程负责解析,所以本身上就可能存在延迟。延迟的主要原因在于:1、从库的配置往往没有主库的配置高2、主库支持并发写入,而5.7之前的版本上从库只有单线程SQL来完成任务。3、MySQL主从之间的同步,并不是完全的实时同步,而是主库
Wesley13 Wesley13
4年前
MYSQL数据库之主从复制及读写分离
MYSQL数据库之主从复制及读写分离一、MySQL的主从复制1、概述  MySQLReplication俗称MySQLAB复制或主从复制,是MySQL官方推荐的数据同步技术。数据同步基本过程:从库会实时去读取主库的二进制日志文件,按照日志中记录对从座进行同样的操作,以达到数据同步效果。2、MySQLReplication优点
Wesley13 Wesley13
4年前
mysql的主从与读写分离
首先我们搭建两个MySQL服务器,这一步地球人都知道。搭建好后,把两个数据库的数据同步。这一步就要用到我们前面说的备份和还原了。注意:我们只要同步MySQL以外的数据,MySQL库中的帐号密码肯定不用备份。这些准备工作准备好了,那我们就可以真正开始搭建MySQL主从了。主主上配置只要两步就可以了1.修改配置文件serverid