1000字范文,内容丰富有趣,学习的好帮手!
1000字范文 > 实现↝Mysql数据库主从复制搭建与同步

实现↝Mysql数据库主从复制搭建与同步

时间:2022-05-18 08:16:21

相关推荐

实现↝Mysql数据库主从复制搭建与同步

实现↝Mysql数据库主从复制搭建与同步

🔻 一、mysql 同步复制有关概述⛳ 前言、何为主从复制⛳ 1.1 mysql支持的复制方式⛳ 1.2 mysql支持的复制类型1.2.1🍁异步复制1.2.2🍁同步复制1.2.3🍁半同步复制1.2.4🍁[图解]-异步复制 / 同步复制 / 半同步复制 ⛳ 1.3 mysql复制解决的问题⛳ 1.4 mysql复制是如何工作的 🔻 二、mysql 同步复制搭建⛳ 2.1 主从节点准备⛳ 2.2 主节点配置2.2.1 🍁 创建log-bin二进制日志存储路径2.2.2 🍁 修改f配置文件2.2.3 🍁 重启mysql服务,检查是否生效2.2.4 🍁 主节点创建主从复制账号2.2.5 🍁 查看主节点的二进制日志的名称 ⛳ 2.3 从节点配置2.3.1 🍁 修改f配置文件2.3.2 🍁 在从节点配置需要复制的主机2.3.3 🍁 在从节点开启slave同步,查看同步状态 ⛳ 2.4 主节点创建数据库测试⛳ 2.5 从节点查看同步数据2.5.1 🍁 数据测试-主节点插入数据,从节点查看2.5.2 🍁 数据测试-主节点删除数据,从节点查看 ⛳ 2.6 主从同步关闭和开启 🔻 三、mysql 同步复制延迟问题⛳ 3.1 从节点配置主从同步要求⛳ 3.2 如何解决【数据不一致性】问题 🔻四、总结—温故知新

🔻 一、mysql 同步复制有关概述

⛳ 前言、何为主从复制

一般数据库都是读取压力大于写数据压力,主从复制即为了实现数据库的负载均衡和读写分离。通过将Mysql的某一台主机的数据复制到其它主机(slaves)上,主服务器只负责写,而从服务器只负责读。

如生产环境中,使用redis数据库作为缓存数据库,用户访问业务数据时,先从缓存数据库查询,如果缓存数据库没有,再从业务数据库读取。

⛳ 1.1 mysql支持的复制方式

基于语句的复制--Statement(Statement-Based Replication,SBR): 在主服务器上执行的sql语句,在从服务器上执行同样的语句。mysql默认采用基于语句的复制,效率比较高。一旦发现没法精确复制时,会自动选择基于行的复制,每一条会修改数据的sql都会记录在 binlog 中。

基于行的复制--Row(Row-Based Replication,RBR):把改变的内容复制过去,仅保存哪条记录被修改。而不是把命令在从服务器上执行一遍, 从mysql5.0开始支持。

混合类型的复制--Mixed(Mixed-Based Replication,MBR): 默认采用基于语句的复制,一旦发现基于语句的无法精确的复制时,就会采用基于行的复制,Statement 和 Row 的混合体。

通过alter user root identified by '新密码';

⛳ 1.2 mysql支持的复制类型

1.2.1🍁异步复制

mysql数据库默认的复制方式异步复制指主库以异步的方式同步数据到一个从库或多个从库中。主节点不会主动推送数据到从节点,主库在执行完客户端提交的事务后会立即将结果返给给客户端,并不关心从库是否已经接收并处理。主节点如果掉了,此时主节点上已经提交的事务可能并没有传到从节点上,如果此时,强行将从节点提升为主节点,可能导致新主节点上的数据不完整

1.2.2🍁同步复制

同步复制是mysql主节点特有的复制方式,当主库执行完一个事务,然后所有的从库都复制了该事务并成功执行完才返回成功信息给客户端。

1.2.3🍁半同步复制

介于异步复制和全同步复制之间,主库在执行完客户端提交的事务后不是立刻返回给客户端,而是等待至少一个从库接收到并写到relay log中才返回成功信息给客户端只能保证主库的Binlog至少传输到了一个从节点上,否则需要等待直到超时时间,然后切换成异步模式再提交。

1.2.4🍁[图解]-异步复制 / 同步复制 / 半同步复制

⛳ 1.3 mysql复制解决的问题

数据分布 (Data distribution )—提高数据操作自然并行度,以达到最优的执行效率的目的负载平衡(load balancing)—主服务器只负责写,而从服务器只负责读备份(Backups)—灾难恢复,对损坏的数据进行恢复和还原高可用性和容错行( High availability and failover)—确保 mysql 数据库在故障和异常情况下仍然能够提供可靠的服务

⛳ 1.4 mysql复制是如何工作的

复制整体来说有3个步骤:

master将改变记录到二进制日志(binary log)中(这些记录叫做二进制日志事件,binary log events)slavemaster的binary log events拷贝到它的中继日志(relay log)slave重做中继日志中的事件,将改变反映它自己的数据

🔻 二、mysql 同步复制搭建

⛳ 2.1 主从节点准备

克隆两台安装好mysql8.0的虚拟机,并修改复制的db-server02(从节点)mysql server的UUID。

[root@db-server ~]# vi /var/lib/mysql/f####修改UUID[auto]server-uuid=83822642-0030-11ee-a2cc-000c29c2e1ad####重启mysql服务[root@db-server ~]# systemctl restart mysqld

⛳ 2.2 主节点配置

2.2.1 🍁 创建log-bin二进制日志存储路径

###创建二进制日志存储路径[root@db-server /]# mkdir -p -v /var/log/mysql/mysql-binmkdir: created directory ‘/var/log/mysql/mysql-bin’###赋权mysql用户组合mysql用户[root@db-server ~]# chown -R mysql:mysql /var/log/mysql[root@db-server ~]# chown -R mysql:mysql /var/log/mysql/mysql-bin

2.2.2 🍁 修改f配置文件

【必须参数】:

####添加内容[mysqld]#配置唯一的服务器ID,一般使用IP最后一位server-id=1# 设置需要复制的数据库,默认全部记录。比如: binlog-do-db=db_master_slavebinlog-do-db=db_master_slave#开启log-bin二进制日志,指名路径。如: 本地的路/var/log/mysql/mysql-binlog-bin=/var/log/mysql/mysql-bin#设置binlog格式binlog_format=STATEMENT

【可选参数】:

# 0表示读写 (主机),1表示只读(从机)read-only=0#设置日志文件保留的时长,单位是秒binlog_expire_logs_seconds=6000#控制单个二进制日志大小。此参数的最大和默认值是1GBmax_binlog_size=20#设置不要复制的数据库binlog-ignore-db=test#设置需要复制的数据库,默认全部记录。比如: binlog-do-db=dbtest01binlog-do-db=需要复制的主数据库名字#设置binlog格式binlog_format=STATEMENT

2.2.3 🍁 重启mysql服务,检查是否生效

[root@db-server mysql]# systemctl restart mysqld[root@db-server mysql]# systemctl status mysqld[root@db-server mysql]# mysql -u root -pmysql> show variables like 'server_id';+---------------+-------+| Variable_name | Value |+---------------+-------+| server_id| 1|+---------------+-------+1 row in set (0.02 sec)mysql>

###开启log-bin二进制日志mysql> show variables like 'log_bin';+---------------+-------+| Variable_name | Value |+---------------+-------+| log_bin | ON |+---------------+-------+1 row in set (0.00 sec)mysql>

##skip_networking--tcp/ip协议通信,默认是OFF关闭状态,启用后主从将无法通信mysql> show variables like '%skip_networking%';+-----------------+-------+| Variable_name | Value |+-----------------+-------+| skip_networking | OFF |+-----------------+-------+1 row in set (0.00 sec)mysql>

2.2.4 🍁 主节点创建主从复制账号

mysql5.7版本:

mysql> grant replication slave on *.* to 'slave1'@'%' identified by 'Zyl@123456'; ###用户地址可以指定从机IP192.168.181.102

mysql8.0版本:

mysql> create user 'slave1'@'%' identified by 'Zyl@123456'; Query OK, 0 rows affected (0.02 sec)mysql>grant replication slave on *.* to 'slave1'@'%';Query OK, 0 rows affected (0.01 sec)mysql>alter user 'slave1'@'%' identified with mysql_native_password by 'Zyl@123456'; Query OK, 0 rows affected (0.02 sec)mysql>flush privileges;Query OK, 0 rows affected (0.02 sec)

2.2.5 🍁 查看主节点的二进制日志的名称

File和Position两个参数需要在从库配置中使用。

mysql> show master status;+------------------+----------+-----------------+------------------+-------------------+| File | Position | Binlog_Do_DB | Binlog_Ignore_DB | Executed_Gtid_Set |+------------------+----------+-----------------+------------------+-------------------+| mysql-bin.000004 |157 | db_master_slave | | |+------------------+----------+-----------------+------------------+-------------------+1 row in set (0.00 sec)mysql>

⛳ 2.3 从节点配置

2.3.1 🍁 修改f配置文件

【必须参数】:

[mysqld]#配置唯一的服务器ID,一般使用IP最后一位server-id=2###开启中继日志,从主服务器上同步日志文件记录到本地relay-log=relay-log-bin

【可选参数】:

[mysqld]###定义中继日志文件的位置和名称relay-log-index=slave-relay-bin.index

2.3.2 🍁 在从节点配置需要复制的主机

####语法##change master to master_host='主节点IP',master_user='主节点用户名',master_password='用户密码',master_log_file='mysql-bin.具体数字',master_log_pos=具体值;####本环境配置##mysql> change master to master_host='192.168.181.101',master_user='slave1',master_password='Zyl@123456',master_log_file='mysql-bin.000004',master_log_pos=157 ;Query OK, 0 rows affected, 8 warnings (0.06 sec)mysql>

2.3.3 🍁 在从节点开启slave同步,查看同步状态

####开启slave同步mysql> start slave;Query OK, 0 rows affected, 1 warning (0.05 sec)####查看同步状态mysql> show slave status\G*************************** 1. row ***************************Slave_IO_State: Waiting for source to send eventMaster_Host: 192.168.181.101Master_User: slave1Master_Port: 3306Connect_Retry: 60Master_Log_File: mysql-bin.000004Read_Master_Log_Pos: 157Relay_Log_File: relay-log-bin.000006Relay_Log_Pos: 373Relay_Master_Log_File: mysql-bin.000004Slave_IO_Running: YesSlave_SQL_Running: YesReplicate_Do_DB: Replicate_Ignore_DB: Replicate_Do_Table: Replicate_Ignore_Table: Replicate_Wild_Do_Table: Replicate_Wild_Ignore_Table: mysql>

⛳ 主要看这两个参数,两个参数的值都为Yes,即主从配置搭建成功:

Slave_IO_Running:IO线程,负责与主机的io通信Slave_SQL_Running:SQL线程,责自己的slave MySQL进程

如果报错Slave failed to initialize relay_log info structure from the repository,需要清理之前的relay_log,重新启用新的relay_log即可。

reset slave;

⛳ 2.4 主节点创建数据库测试

主节点配置的db_master_slave

####主节点创建数据库db_master_slavemysql> create database db_master_slave;Query OK, 1 row affected (0.01 sec)mysql> use db_master_slaveDatabase changedmysql> ####创建表mysql> CREATE TABLE `tab1` (-> `id` int NOT NULL,-> `name` varchar(255) CHARACTER SET utf8mb3 COLLATE utf8mb3_general_ci NULL DEFAULT NULL,-> `class` varchar(255) CHARACTER SET utf8mb3 COLLATE utf8mb3_general_ci NULL DEFAULT NULL,-> PRIMARY KEY (`id`) USING BTREE-> ) ENGINE = InnoDB CHARACTER SET = utf8mb3 COLLATE = utf8mb3_general_ci ROW_FORMAT = Dynamic;Query OK, 0 rows affected, 6 warnings (0.02 sec)mysql> ####插入测试数据mysql> INSERT INTO `tab1` VALUES (1001, '曹操', '1班');Query OK, 1 row affected (0.01 sec)mysql> INSERT INTO `tab1` VALUES (1002, '张飞', '1班');Query OK, 1 row affected (0.00 sec)mysql> INSERT INTO `tab1` VALUES (1003, '项羽', '3班');Query OK, 1 row affected (0.00 sec)mysql> INSERT INTO `tab1` VALUES (1004, '刘备', '2班');Query OK, 1 row affected (0.00 sec)mysql>

⛳ 2.5 从节点查看同步数据

2.5.1 🍁 数据测试-主节点插入数据,从节点查看

mysql> show databases;

###查看tab1表数据mysql> select * from tab1;+------+--------+-------+| id | name | class |+------+--------+-------+| 1001 | 曹操 | 1班 || 1002 | 张飞 | 1班 || 1003 | 项羽 | 3班 || 1004 | 刘备 | 2班 |+------+--------+-------+4 rows in set (0.00 sec)mysql>

2.5.2 🍁 数据测试-主节点删除数据,从节点查看

⛳ 2.6 主从同步关闭和开启

🍁 停止主从服务复制的功能------从机执行

####开启slave同步mysql> start slave;Query OK, 0 rows affected, 1 warning (0.05 sec)####关闭slave同步mysql> stop slave;Query OK, 0 rows affected, 1 warning (0.03 sec)

🔻 三、mysql 同步复制延迟问题

⛳ 3.1 从节点配置主从同步要求

🍁 读库与写库数据一致(最终一致)🍁 写数据必须写到写库🍁 读数据不一定必须到读库

主从同步复制的内容是二进制文件,在传输过程中会存在主从延迟的情况,会导致用户在从库读取的数据不是最新数据----->即数据不一致性问题。

⛳ 3.2 如何解决【数据不一致性】问题

🍁 异步复制—master执行操作后直接返回给client结果,不再等待slave反馈同步信息,但这种方式数据一致性最弱。🍁 半同步复制—只要有一个slave复制了该事务并成功执行完就返回成功信息给client,这种方式提高了数据一致性,但是增加了网络延迟时间,降低了主库写的效率。组复制(MGR)----mysql 5.7.17 推出的新的数据复制技术,基于Paxos协议复制,很好的弥补了前面两种复制的不足。

🔻四、总结—温故知新

❓ 了解何为主从复制❓ mysql支持的复制类型之间区别,以及解决的问题❓ mysql主从复制搭建❓ mysql主从复制延迟及解决方案

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。