MySQL-主从复制+半同步复制

本文详细介绍了MySQL的主从复制原理和配置,包括异步复制、级联复制、并联复制和双主复制。同时,讲解了高可用集群的概念和可用性级别,以及基于GTIDs的主从复制和半同步复制的实现,确保数据一致性。最后,讨论了在遇到数据不一致情况时的处理策略和插件卸载方法。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

MySQL

MySQL主从复制

高可用集群

  • High Available Cluster,HA Cluster
  • 高可用集群是指通过特殊的软件把独立的服务器连接起来,组成一个能够提供故障切换(Fail Over)功能的集群
  • 高可用的衡量标准
可用性级别(指标) 年度宕机时间 描述 叫法
99% 3.65天/年 基本可用系统 2个9
99.9% 8.76小时/年 可用系统 3个9
99.99% 52.6分钟/年 高可用系统 4个9
99.999% 5.3分钟/年 抗故障系统 5个9
99.9999% 32秒/年 容错系统 6个9

计算方法:

1年 = 365天 = 8760小时
99		8760 * 1% = 8760 * 0.01 = 87.6小时=3.65天
99.9	8760 * 0.1% = 8760 * 0.001 = 8.76小时
99.99	8760 * 0.01% = 0.876小时 = 0.876 * 60 = 52.6分钟
99.999	8760 * 0.001% = 0.0876小时 = 0.0876 * 60 = 5.26分钟
  • MySQL常用集群
    • MySQL Replication主从架构
    • MySQL Cluster 集群架构
    • MySQL Group Replication (MGR) 主复制,多主一从
    • MariaDB Galera Cluster
    • MHA|Keepalived|HeartBeat|Lvs,Haproxy等技术构建高可用集群

MySQL主从复制原理

  • Replication可以实现将数据从一台数据库服务器(master)复制到一台到多台数据库服务器(slave)。默认情况下,属于异步复制,所以无需维持长连接

  • master(主服务器)将数据库的改变写入二进制日志,slave(从服务器)同步这些二进制日志,并根据这些二进制日志进行数据重演操作,实现数据异步同步

  • 具体过程

    • slave端的IO线程发送请求给master端的binlog dump线程
    • master端binlog dump线程将获取的二进制日志信息(文件名和位置信息)发送给slave端的IO线程
    • salve端IO线程获取到的内容依次写到slave端**relay log(中继日志)**里,并把master端的bin-log文件名和位置记录到master.info里
    • salve端的SQL线程,检测到relay log中内容更新,就会解析relay log里更新的内容,并执行这些操作,从而达到和master在这里插入图片描述
      数据一致

中继日志的开启:

在mysql的配置文件中添加relay-log字段,并指定路径和文件名,如:

relay-log=/mysql_3306/data/relaylog

MySQL复制架构

双机热备(AB复制)
  • 传统的复制架构,也被称为M-S
  • 默认情况下,master接受读写请求,slave只接受读请求以减轻master的压力

在这里插入图片描述

级联复制
  • 可以进一步分担读压力,但slave1 出现故障,后面的所有级联slave服务器都会同步失败

在这里插入图片描述

并联复制(一主多从)
  • 解决级联复制的单点故障,同时也分担读压力,但会间接增加master传输二进制日志的压力
    在这里插入图片描述
双主复制

理论上,两台master好像都能接受读、写请求,但实际上,往往运作的过程中,同一时刻只有其中一台master会接受写请求,另外一台接受读请求

在这里插入图片描述

MySQL主从复制搭建(AB复制)

要求
  • master和slave必须安装相同版本的mysql数据库软件
  • master端必须开启二进制日志;slave端必须开启relay log日志
  • master端和slave端的server-id号不能一致
  • slave端配置主从复制,向master来同步数据
  • master端必须创建一个用来主从复制的用户
  • 保证master和slave端初始数据一致
IP地址 主机名
192.168.226.20 master
192,168.226.30 Slave
环境准备
[root@server2 ~]# hostnamectl set-hostname master
[root@server2 ~]# su
[root@server3 ~]# hostnamectl set-hostname slave
[root@server3 ~]# su

#防止NetworkManager对静态ip及高可用软件产生影响
systemctl stop NetworkManager
systemctl disable NetworkManager

systemctl stop firewalld
systemctl disable firewalld

setenforce 0
sed -i '/^SELINUX=/cSELINUX=disabled' /etc/selinux/config

cat >> /etc/hosts <<EOF
	192.168.226.20 master
	192.168.226.30 slave
	EOF

ntpdate cn.ntp.org.cn

#向xshell中传入mysql-5.7.31-linux-glibc2.12-x86_64.tar.gz软件包
yum install -y lrzsz
rz

ls
tar -xzf mysql-5.7.31-linux-glibc2.12-x86_64.tar.gz 
MySQL安装要求
选项 采用默认形式
安装路径 /usr/local/mysql
数据路径 /usr/local/mysql/data
端口号 3306
master上安装mysql
安装
[root@master ~]# vim mysql.sh

#!/bin/bash

#Desc='此脚本用于安装MySQL软件'
#Usage=source mysql.sh

yum install -y libaio
rm -rf /usr/local/mysql
mv mysql-5.7.31-linux-glibc2.12-x86_64 /usr/local/mysql
useradd -r -s /sbin/nologin mysql
rm -rf /etc/my.cnf
cd /usr/local/mysql
mkdir mysql-files
chown mysql:mysql mysql-files
chmod 750 mysql-files
bin/mysqld --initialize --user=mysql --basedir=/usr/local/mysql &> /root/password.txt
bin/mysql_ssl_rsa_setup --datadir=/usr/local/mysql/data
cp support-files/mysql.server /etc/init.d/mysqld
service mysqld start
echo 'export PATH=$PATH:/usr/local/mysql/bin' >> /etc/profile
source /etc/profile

[root@master ~]# source mysql.sh 
#脚本中含有source命令,调用脚本时也需要使用source 调用

查看随机密码
[root@master ~]# cat /root/password.txt |grep password
2021-09-28T06:41:36.468051Z 1 [Note] A temporary password is generated for root@localhost: 3KkY)iSsSJo7

安全配置
[root@master ~]# mysql_secure_installation
#顺便更改密码
	Enter password for user root: #产生的随机密码

	The existing password for the user account root has expired. Please 	set a new password.

	New password: #新密码123

	Re-enter new password: #123

配置my.cnf文件
[root@master ~]# cd /usr/local/mysql/
[root@master mysql]# vim my.cnf

[mysqld]
basedir=/usr/local/mysql
datadir=/usr/local/mysql/data
socket=/tmp/mysql.sock
port=3306
log-error=/usr/local/mysql/data/mysql.err
log-bin=/usr/local/mysql/data/binlog		
server-id=20
character_set_server=utf8mb4

[root@master mysql]# service mysqld restart
slave上安装mysql

相对于主服务器MySQL的安装与配置,从服务器端不需要进行初始化操作,因为其数据将来都来自于主服务器

安装
[root@slave ~]# vim mysql.sh

#!/bin/bash

#Desc='此脚本用于slave上安装MySQL软件'
#Usage=source mysql.sh

yum install -y libaio
rm -rf /usr/local/mysql
mv mysql-5.7.31-linux-glibc2.12-x86_64 /usr/local/mysql
useradd -r -s /sbin/nologin mysql
rm -rf /etc/my.cnf
cd /usr/local/mysql
mkdir mysql-files
chown mysql:mysql mysql-files
chmod 750 mysql-files
#bin/mysqld --initialize --user=mysql --basedir=/usr/local/mysql &> /root/password.txt
#bin/mysql_ssl_rsa_setup --datadir=/usr/local/mysql/data
cp support-files/mysql.server /etc/init.d/mysqld
#service mysqld start
echo 'export PATH=$PATH:/usr/local/mysql/bin' >> /etc/profile
source /etc/profile

[root@slave ~]# source mysql.sh 

配置my.cnf文件
[root@slave mysql]# cd /usr/local/mysql/
[root@slave mysql]# vim my.cnf
[mysqld]
basedir=/usr/local/mysql
datadir=/usr/local/mysql/data
socket=/tmp/mysql.sock
port=3306
log-error=/usr/local/mysql/data/mysql.err
#log-bin=/usr/local/mysql/data/binlog		
relay-log=/usr/local/mysql/data/relaylog
server-id=30
character_set_server=utf8mb4

把master主服务器的数据目录同步到slave从服务器
#停止master的mysql
[root@master ~]# service mysqld stop

#删除master的/usr/local/mysql/data下的auto.cnf文件,该文件随安装mysql产生,记录了一个具有唯一性编号
[root@master ~]# rm -rf /usr/local/mysql/data/auto.cnf 

#拷贝数据目录
yum install -y rsync.x86_64
[root@master ~]# rsync -av /usr/local/mysql/data root@192.168.226.30:/usr/local/mysql/

启动mysql
service mysqld start
[root@slave mysql]# mysql -uroot -p123
主从复制的配置
在master上创建专门用于主从复制的账号
[root@master ~]# mysql -uroot -p123
mysql> create user 'slave'@'192.168.226.%' identified by '123';
mysql> grant replication slave on *.* to 'slave'@'192.168.226.%';
mysql> flush privileges;

在master上锁表
mysql> flush tables with read lock;

在master中查看二进制文件的名称及位置
mysql> show master status;
+---------------+----------+--------------+------------------+-------------------+
| File          | Position | Binlog_Do_DB | Binlog_Ignore_DB | Executed_Gtid_Set |
+---------------+----------+--------------+------------------+-------------------+
| binlog.000002 |      773 |              |                  |  
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值