目录
1、到底是主服务器主动通知从服务器来取二进制日志文件,还是从服务每隔一段时间来拿二进制日志文件的?
2、主服务器如何知道从服务器上已经有哪些数据了,需要从哪里开始给数据给从服务器呢?
3、是否任何一台机器都可以充当从服务器,不需要验证就可以去拿主服务器的二进制日志文件呢?
2台2cpu/4G的linux服务器(虚拟机),CentOS Linux release 7.9.2009 (Core),mysql-5.7.41。
1、准备好两台安装好Centos系统的服务器,使用脚本一键部署好二进制版本的Mysql,并且设置好mysql配置文件my.cnf文件的内容。
2、在master服务器上开启二进制日志,在从服务器上配置server_id。
3、在master上创建可以给slave服务器过来复制二进制日志文件的用户
4、在master上做一个全备,导出数据,导入到slave上,保持master和slave上的数据是一致的。
5、在slave上配置master上拉取的二进制日志用户名和密码和日志文件名称和位置号和端口等信息
6、在master和slave上都关闭防火墙和selinux(可以防止我们的端口信息备防火墙拦截了)
7、启动slave服务器,查看IO线程和SQL线程是否正常启动
1、主从复制搭建的过程中,怎样在Mysql提供服务的时候(运行)搭建主从复制呢?
实现主从复制的配置后,slave是如何拉取master上的二进制日志文件的呢?
如何将网站的流量切换到经过主从切换后的新的master服务器上去呢?
官方文档:MySQL :: MySQL 5.7 Reference Manual :: 16.3.9 Semisynchronous Replication
参考文档:MySQL 5.7 基于组复制(MySQL Group Replication) - 运维小结 - 散尽浮华 - 博客园 (cnblogs.com)
多节点模式:我们可以根据官方文档进行配置:MySQL :: MySQL 5.7 Reference Manual :: 17.5.1.2 Multi-Primary Mode
MYSQL主从复制
什么是Mysql的主从复制呢?
Mysql的主从复制(Master-slave replication)是一种数据库复制方式,它允许在多个Mysql数据库服务器之间自动地复制数据。其中,一个Mysql服务器充当主服务器,而其他Mysql服务器则充当从服务器。主服务器上的更改会自动地被复制到从服务器上,从而实现数据的同步和备份。这种复制方式可以提高数据库的可用性和可靠性,并且可以用于负载均衡、备份、读写分离和灾难恢复等场景。
Mysql主从复制:其实就是复制的是主服务器的二进制日志,从服务然后根据日志再操作一遍,从而达到跟主服务器里一样的数据,但是时间上会有延迟
我们可以通过Mysql的主从复制实现Mysql集群操作:
MySQL集群是一种高可用性的解决方案,它使用多个MySQL实例在多个服务器上运行,以提供数据的高可用性和可扩展性。MySQL集群通过将数据分布在多个节点上来提高性能和可用性,并在节点之间自动同步数据。MySQL集群还提供了故障转移和自动故障恢复功能,以确保在节点故障时系统仍然可用。
我们为什么需要Mysql集群呢?
高可用性:通过数据复制和自动容错,可以保证系统的高可用性,即使其中一个节点出现故障,整个集群也可以继续工作。
负载均衡:通过将数据分散到多个节点上,可以避免单一节点的负载过重,从而提高系统的性能和可扩展性。
数据安全:通过数据复制和备份,可以保证数据的安全性,即使其中一个节点出现故障,也可以通过备份数据来恢复数据。
数据一致性:通过使用同步复制和多主复制等技术,可以保证数据在多个节点之间的一致性,避免数据冲突和不一致的问题。
灵活性:通过配置不同的节点和拓扑结构,可以根据应用的需要来进行灵活的部署和扩展。
主从复制基本原理图:
Binary log:二进制日志
Relay log :中继日志 --》中间继续传递的日志
问题:
1、到底是主服务器主动通知从服务器来取二进制日志文件,还是从服务每隔一段时间来拿二进制日志文件的?
通常情况下,是主服务器主动通知从服务器来取二进制日志文件。这是因为从服务器需要及时地同步主服务器上的数据变更,以保证数据的一致性和完整性。如果从服务器每隔一段时间来拿二进制日志文件,可能会导致数据同步的延迟和不完整,从而影响业务的正常运行,并且影响从服务器的性能。因此,主服务器通常会配置二进制日志文件的自动转储和推送功能,以便及时地通知从服务器来取二进制日志文件。
因此可以断定,是主服务器主动通知从服务器来取二进制日志文件的
2、主服务器如何知道从服务器上已经有哪些数据了,需要从哪里开始给数据给从服务器呢?
主服务器可以通过记录从服务器的同步位置来知道从服务器上已经有哪些数据了。具体来说,主服务器会记录每个从服务器最后一次成功同步的位置,这个位置就是从服务器已经拥有的数据的位置。当主服务器要给从服务器同步数据时,就从这个位置开始向从服务器发送数据。这个位置一般使用二进制日志文件的偏移量来表示。
与master-info文件有关。
3、是否任何一台机器都可以充当从服务器,不需要验证就可以去拿主服务器的二进制日志文件呢?
不是任何一台机器都可以充当从服务器,需要在从服务器上配置主服务器的信息,并进行验证才能获取主服务器的二进制日志文件。在配置时需要指定正确的主服务器IP地址、端口号、用户名和密码等信息,以及确保主从服务器之间有正确的网络连接。同时,还需要确保从服务器与主服务器的版本、字符集等信息一致,以避免数据传输和解析的问题。
4、从服务器如何知道它的主服务器呢,是否需要配置呢?
从服务器可以通过配置文件或命令行参数来指定主服务器的信息,包括主服务器的IP地址、端口号、用户名和密码等。在配置文件中,可以使用replication-master-server选项来指定主服务器的IP地址和端口号,使用replication-username和replication-password选项来指定连接主服务器的用户名和密码。在命令行中,可以使用--master-host、--master-port、--master-user和--master-password等选项来指定主服务器的信息。需要注意的是,从服务器必须在主服务器上创建一个用于复制的用户,并且该用户需要有足够的权限才能成功复制数据。
5、master-info文件的作用?
master-info文件是MySQL复制过程中用于存储主库信息的文件。它记录了复制过程中主库的相关信息,如主库的IP地址、端口号、二进制日志文件名和位置等。在从库启动复制时,从库会读取master-info文件中的信息,以便从库可以连接到主库并从正确的位置开始复制。因此,master-info文件对于MySQL复制过程的正确性非常重要。
它记录了日志结束的pos位置号 和 日志的名字
6、relay-log.info文件的作用?
relay-log.info文件是MySQL复制中的一个元数据文件,用于记录当前复制进程的状态信息。它包含了从主库复制的二进制日志文件名和位置信息,以及正在使用的中继日志文件名和位置信息。这些信息对于复制进程的正确性和稳定性非常重要,因为它们可以帮助复制进程在出现故障或中断时恢复,并保证数据的一致性。在MySQL复制过程中,每个从库都有一个相应的relay-log.info文件。
项目名称:构建一个简单的Mysql主从复制集群
项目环境:
2台2cpu/4G的linux服务器(虚拟机),CentOS Linux release 7.9.2009 (Core),mysql-5.7.41。
Mysql版本:
[root@mysql ~]# mysql -V
mysql Ver 15.1 Distrib 5.5.68-MariaDB, for Linux (x86_64) using readline 5.1
Centos版本:
[root@mysql ~]# cat /etc/centos-release
CentOS Linux release 7.9.2009 (Core)
项目描述:为了提升Mysql的并发能力,构建一个简单的Mysql集群,实现读写分离功能,大大提升了Mysql集群的业务处理能力,同时深入学习Mysql整体的部署和对集群架构的理解。
项目步骤:
1、准备好两台安装好Centos系统的服务器,使用脚本一键部署好二进制版本的Mysql,并且设置好mysql配置文件my.cnf文件的内容。
安装二进制版本的Mysql:(15条消息) Mysql的介绍和软件环境的部署_mysql软件简介_Claylpf的博客-CSDN博客
2、在master服务器上开启二进制日志,在从服务器上配置server_id。
对主从两台服务器上的mysql配置文件进行如下配置:
[mysqld_safe]
[client]
socket=/data/mysql/mysql.sock
[mysqld]
socket=/data/mysql/mysql.sock
log-error=/data/mysql/mysql_error.log #表示设置Mysql的error日志的路径
slow_query_log = 1 #表示开启Mysql慢日志
long_query_time = 0.001 #表示设置慢日志的阈值为0.001毫秒
general_log #我们不需要添加路径了,因为Mysql会自动帮助我们添加通用日志的路径和日志文件,表示打开了通用日志
log_bin #表示我们开启了二进制日志
server_id = 1 #给我们的Mysql服务器进行编号
expire_logs_days = 7 #表示二进制日志文件过 7天 自动清除
port = 3306
open_files_limit = 8192
innodb_buffer_pool_size = 512M
character-set-server=utf8
[mysql]
auto-rehash
prompt=\u@\d \R:\m mysql>
但是从服务器上的 server_id 为 2(必须加),而且从服务器可以不开启二进制日志和其他日志,你可以选择开启。
3、在master上创建可以给slave服务器过来复制二进制日志文件的用户
创建sc_slave用户,允许任意网段访问
root@(none) 07:14 mysql>create user 'sc_slave'@'%' identified by '123456';
Query OK, 0 rows affected (0.01 sec)
赋予该用户允许复制二进制日志文件的权限
root@(none) 07:14 mysql>grant replication slave on *.* to 'sc_slave'@'%';
Query OK, 0 rows affected (0.00 sec)
root@(none) 07:14 mysql>
4、在master上做一个全备,导出数据,导入到slave上,保持master和slave上的数据是一致的。
为master上的数据做全备,并导出
[root@mysql ~]# mysqldump -uroot -p'123456' --all-databases > /backup/all_db.sql
mysqldump: [Warning] Using a password on the command line interface can be insecure.
[root@mysql ~]#
再将导出的数据传出到slave服务器上去
[root@mysql ~]# scp /backup/all_db.sql root@192.168.2.150:/root
The authenticity of host '192.168.2.150 (192.168.2.150)' can't be established.
ECDSA key fingerprint is SHA256:0Q2Gbu5Qj6ads614hulwxfDqGB6XnsMvwLMpQxFXJtk.
ECDSA key fingerprint is MD5:9a:d4:88:61:e7:96:c6:e7:94:11:2d:3f:47:c2:1f:c4.
Are you sure you want to continue connecting (yes/no)? yes
Warning: Permanently added '192.168.2.150' (ECDSA) to the list of known hosts.
root@192.168.2.150's password:
all_db.sql 100% 889KB 34.8MB/s 00:00
[root@mysql ~]#
我们能再slave服务器上的/root目录下找到传输的文件
将该sql文件导入mysql中
在slave上导入数据
[root@mysql ~]# mysql -uroot -p'123456' < all_db.sql
mysql: [Warning] Using a password on the command line interface can be insecure.
[root@mysql ~]#
检查我们的slave的Mysql数据是否与master的Mysql数据一致
5、在slave上配置master上拉取的二进制日志用户名和密码和日志文件名称和位置号和端口等信息
在master上查看二进制日志文件和位置号:
上图所示,我通过flush logs命令刷新了二进制日志,产生了一个新的二进制日志文件,位置号为:154。
下面我们在slave上配置master上拉取二进制日志的用户信息和日志文件的名称和位置号
root@(none) 11:17 mysql>CHANGE MASTER TO MASTER_HOST='192.168.2.149',
-> MASTER_USER='sc_slave',
-> MASTER_PASSWORD='123456',
-> MASTER_PORT=3306,
-> MASTER_LOG_FILE='mysql-bin.000006',
-> MASTER_LOG_POS=154;
Query OK, 0 rows affected, 2 warnings (0.01 sec)
root@(none) 11:18 mysql>
如果你在输入CHANGE MASTER TO的时候现了如下问题:
ERROR 1794 (HY000): Slave is not configured or failed to initialize properly......
当我们的信息配置完成后,查看slave服务器状态
6、在master和slave上都关闭防火墙和selinux(可以防止我们的端口信息备防火墙拦截了)
在master和slave上我们要关闭防火墙和selinux哦
[root@mysql ~]# service firewalld stop
Redirecting to /bin/systemctl stop firewalld.service
[root@mysql ~]# systemctl disable firewalld
[root@mysql ~]# getenforce
Disabled
[root@mysql ~]#
7、启动slave服务器,查看IO线程和SQL线程是否正常启动
直接使用start slave命令
如果启动了,可以查看如下:
Slave_IO_Running: Yes
Slave_SQL_Running: Yes
如果我的master的IP地址打错了,我们应该如何清除slave上的master的信息呢?
8、验证Mysql主从复制是否配置成功了
测试:我们将在master上创建一个新的库,如果slave上也存在这个新的库,说明我们的主从复制配置成功了。
master服务器上:
slave服务器上:
我们成功的配置了Mysql的主从复制集群啦!
思考的问题:
1、主从复制搭建的过程中,怎样在Mysql提供服务的时候(运行)搭建主从复制呢?
在Mysql提供服务的时候搭建主从复制,需要进行以下步骤:
确认主服务器的配置是否正确,并在主服务器上进行必要的配置更改,如开启二进制日志记录等。
在从服务器上安装Mysql,并修改从服务器的配置文件my.cnf,配置从服务器的基本信息,如端口号、IP地址等。
在从服务器上创建一个用于复制的账号,并赋予该账号复制所需的权限。
在主服务器上执行show master status命令,查看主服务器的二进制日志文件名和偏移量,记录下这些信息。
在从服务器上执行change master to命令,将从服务器设置为主服务器的从服务器,并指定主服务器的IP地址、端口号、二进制日志文件名和偏移量等信息。(在定位位置号的时候可能会产生误差,如果mysql一直运行的话,一直插入数据,位置点变化的很快,找不准确)
在从服务器上执行start slave命令,启动从服务器的复制进程。
在主服务器上进行正常的数据库操作,从服务器将自动复制主服务器上的数据。
需要注意的是,搭建主从复制会对主服务器和从服务器的性能产生一定影响,因此在进行搭建过程中需要谨慎操作,确保数据库的正常运行。
我们需要考虑的是位置号(时间点)的选取 和 二进制日志文件是使用的哪一个。
2、如果master挂了,如何提升slave从服务器为主?(目前我们只能手动的去停止从服务器上的slave服务,把业务的写和查询的操作都切换到从服务器上,然后我们在搞一台服务器,认原来的从服务器为主。)(要求原来的从服务器必须开启二进制日志)
在slave服务器上运行STOP SLAVE命令,停止其作为从服务器的功能。
确保主服务器已经停止,然后在slave服务器上运行RESET MASTER命令,清除所有日志和二进制文件。
在slave服务器上编辑my.cnf文件,将server-id设置为1,并将log-bin设置为一个新的文件名。
重启MySQL服务器,使更改生效。
在slave服务器上运行CHANGE MASTER TO命令,将其配置为主服务器的从服务器。这需要指定主服务器的IP地址、端口号、用户名和密码等信息。
在slave服务器上运行START SLAVE命令,以开始将数据从主服务器复制到从服务器。
现在,slave服务器已经成为主服务器,并且可以接受来自其他从服务器的连接。
思考:是否存在自动切换主从复制的操作呢?
方法:1、自己写脚本完成
2、是否存在第三方的软件可以完成。
实现主从复制的配置后,slave是如何拉取master上的二进制日志文件的呢?
1、在slave 服务器上执行start slave 命令开启主从复制开关,开始进行主从复制。
2、此时,slave服务器的IO线程会通过在master上已经授权的复制用户权限请求连接master服务器,并请求从执行binglog日志文件的指定位置(日志文件名和位置的配置,就是我们在配置主从复制服务时执行的change)
3、master服务器接收到了来自slave服务器的IO线程请求后,其上负责复制的IO线程会根据slave服务器的IO线程请求的信息分批读取指定binlog日志文件的指定位置(位置号)之后的binglog日志信息,然后返回给slave端的IO线程。返回的信息除了binlog的日志内容外,还有在master服务器端记录的IO线程,返回的信息中有binlog中下一个指定的更新位置。
什么时候会发生主从复制切换,主从切换如何实现呢?
主从复制切换通常在以下情况下发生:
- 主服务器故障或宕机;
- 主服务器网络故障;
- 主服务器出现性能问题,导致延迟过高或无法提供服务。
主从切换的实现方式通常有以下几种:
- 手动切换:管理员手动将从服务器切换为主服务器,需要一定的技术水平和经验; ( 手动切换步骤:1、stop slave 2、reset slave all(在从服务器上清除主从复制配置)3、开启二进制日志 4、建立授权复制用户,5、再启动一台机器做从服务器,配置master信息去拉去二进制日志)
- 自动切换:使用一些自动化工具或脚本,如Pacemaker、Keepalived等,实现主从切换的自动化,减少人工干预;
- 云服务提供商的主从切换:一些云服务提供商可以提供主从切换服务,当主服务器出现故障时,自动将从服务器切换为主服务器,无需手动干预。
在主从切换时,需要注意以下几点:
- 主从切换可能会导致数据丢失或数据不一致,应该在进行主从切换前备份数据;
- 主从切换后,需要重新配置从服务器的IP地址等信息;
- 主从切换后,需要测试新的主服务器是否正常工作,以确保服务正常。
手动配置主从切换图解:
如何将网站的流量切换到经过主从切换后的新的master服务器上去呢?
1、直接修改web里代码里的IP地址,更换成新的master的IP地址
2、修改域名对应的IP地址为新的master的IP地址
3、如果需要使用中间件,就需要在中间件里调整。
是否可以进行自动实现主从切换呢?
使用脚本实现
1、监控master是否挂了(看master上的端口3306是否还可以访问,使用另外一台机器去扫描master端口3306,使用nc命令,或者直接访问mysql :mysql -h ip -u root -p'**' -e 'show databases;')每秒钟监控一次。
2、如果master挂了,马上执行手工操作的步骤,脚本自动执行
如何在线搭建主从复制?
xtrabackup可以实现在线主从复制(它解决了备份的时候自动记录二进制文件和位置号)
使用 Xtrabackup 在线对MySQL做主从复制 - Sean's Notes - SegmentFault 思否
master上:
1、开启二进制日志,配置server_id = 1
2、进行全备
3、创建可以进行复制的用户
slave上:
1、配置server_id = 2
2、进行change master配置(日志文件 + pos号)
(准确获取全备过后是哪一个日志文件,哪一个位置号,xtrabackup记录了当时全备过后是哪一个二进制日志文件,哪一个位置号。而masqldump却不能记录)
3、start slave
图解:
主从复制的模式:
1、异步模式
它是我们常见的主从复制
缺点:有延迟(网络是有延迟的)、会丢失数据
主主复制:
优势:
1、2台主机都是master,业务数据同时往2台机器上写,机器的使用率会提升
2、避免数据冗余
主主复制主键冲突问题解决方案:mysql--主主复制 - 简书 (jianshu.com)
延迟备份:(起到了备份的作用)
它可以快速的恢复数据(比使用全备+二进制日志恢复更加快些)
操作:
root@(none) 16:37 mysql>stop slave;
Query OK, 0 rows affected (0.00 sec)
root@(none) 16:37 mysql>CHANGE MASTER TO MASTER_DELAY = 10;
Query OK, 0 rows affected (0.02 sec)
root@(none) 16:37 mysql>start slave;
Query OK, 0 rows affected (0.00 sec)
root@(none) 16:37 mysql>
2、半同步模式(semi-sync)
官方文档:MySQL :: MySQL 5.7 Reference Manual :: 16.3.9 Semisynchronous Replication
图解:
先写日志,再写数据
启用半同步复制
1、在主服务器master上执行安装:
INSTALL PLUGIN rpl_semi_sync_master SONAME 'semisync_master.so';
2、在从服务器slave上执行安装:
INSTALL PLUGIN rpl_semi_sync_slave SONAME 'semisync_slave.so';
我们可以通过命令show plugins;命令查看我们mysql安装的插件。
3、接下来我们将启用我们下载好的插件(在master服务器上)
SET GLOBAL rpl_semi_sync_master_enabled = 1;
在slave服务器上:
SET GLOBAL rpl_semi_sync_slave_enabled = {0|1};
4、接下来我们将在slave从服务器上刷新服务
查看是否在slave上打开了半同步复制
在master上查看
rpl_semi_sync_master_timeout, the value N is given in milliseconds. The default value is 10000 (10 seconds).意思是如果ack确认包在10秒钟内没有送达,master会启用异步模式
验证是否可以实现同步操作:
在master上创建一个新库;
在slave上查看是否存在lao6库
如上所示,存在lao6库,说明可以进行同步复制
我们将slave服务中断,然后在master上创建一个库,10s过后,查看slave服务器上是否产生了相同的库
如上图所示,一共维持了10s钟才完成了库的创建,然后我们打开slave服务,查看slave服务器上是否存在了lao10库
如上图所示,当我们一打开slave服务,databases里面就出现了了lao10这个库,说明他变成了异步复制。而这两者的结合就是半同步复制。
当我们关闭slave服务的时候,我们也能在master主服务器上看到有关于slave服务的进程
说明他们两者是一直在连接的。
我们也可以通过修改 rpl_semi_sync_master_timeout 参数来改变延时时间,将他加到我们的配置文件中,如下图所示:
最后刷新服务即可。
3、同步模式(组复制)
图解:
组复制是什么,他的优势是什么 ?
组复制(Group Replication)是一种基于MySQL InnoDB集群的高可用解决方案,它提供了多个MySQL实例之间的数据同步和自动故障转移的能力,从而提供了数据复制和负载均衡的高可用性解决方案。
组复制的优势有以下几点:
数据复制:组复制提供了数据复制的能力,使得多个MySQL实例可以实现数据的同步备份。这样,在一个节点出现故障或无法访问时,其他节点可以接替其工作,保证系统的可用性。
自动故障转移:组复制支持快速和自动的故障转移,可以在主节点宕机或无法正常工作时,自动选取另一个节点作为新的主节点,继续提供服务,不需要进行人工干预。
数据一致性:由于组复制采用了同步复制技术,因此每个节点上的数据都是相同的,保证了数据的一致性。
高可用性:通过将多个MySQL实例连接在一起,组成一个高可用性的集群,从而保证了系统的高可靠性和高可用性,提供了负载均衡和故障容错的能力。
扩展性:通过在集群中添加更多的MySQL实例,可以增加系统的处理能力和存储容量,从而轻松地扩展应用系统。
总之,通过组复制,我们可以轻松地构建一个高可靠、高可用性的MySQL集群,并实现数据复制、自动故障转移、数据一致性、高可用性和扩展性等一系列功能,提供稳定、可靠的服务。
单主和多主的区别是什么?
在组复制中,有两种不同的实现方式:单主和多主。
单主架构:在单主架构中,只有一个节点充当主节点,负责所有写操作。其他节点作为备份节点,只负责读操作和数据复制。主节点接收所有的写请求,并将这些写操作的结果存储到本地数据库中。随后,主节点将这些写操作转发给备份节点进行执行,以保证各个节点之间的数据一致性。
多主架构:在多主架构中,每个节点都可以处理读和写请求,并且它们之间互相复制对方的变更。因此,多个节点之间的数据是相互同步的,而不是像单主架构中那样单向复制。这种架构具有更好的负载均衡性能和数据可用性,并且可以快速故障转移,但需要更复杂的架构和配置(更多的Mysql服务器),以及更高的管理成本
总的来说,单主架构的配置相对简单,易于使用和管理,适用于小规模应用和数据量不大的场景;多主架构虽然配置复杂,但适合处理高并发负载和故障容错,支持更大规模的应用和数据集群。选择哪种架构应该根据具体场景和业务需求进行综合考虑。