MySQL数据库主从集群-实现实时同步数据

rollo 1年前 ⋅ 377 阅读

1 为什么要搭建主从集群?

  • 为了数据的安全性。方便于数据的备份。
  • 同时也是为了后面做“高可用架构”,以及“读写分离”打基础。
    • MySQL数据库的高可用就是基于主从数据库集群的数据同步,主节点宕机时可以把一个从节点切换为主节点。
    • 读写分离,即主库负责执行写操作,而从库负责执行读操作,依赖于MySQL数据库的主从集群模式来实现主节点与从节点间的数据一致。

2 主从集群的同步数据的原理

2.1 前提条件

  • 相同的日期时间。主节点服务器和从节点服务器的日期时间要相同。

  • 相同的数据库实例。要同步的数据库实例(如: database1)在主节点和从节点都要有,创建时要用相同的默认字符集。

  • 相同的表。要同步的表在主节点和从节点都要有,同样,应该用相同的DDL语句来创建。

  • 同样的数据。开始实时同步前,主节点和从节点的数据要相同。也就是要全量同步一次数据

2.2 实时同步数据过程

1657381012610.png

  • 1、主节点会打开 binlog 记录所执行的写操作的SQL;
  • 2、主从间通过TCP建立起连接后,从节点会请求主节点传输 binlog 日志;
  • 3、主节点上的IO dump线程负责把 binlog 日志通过TCP连接传输给从节点;
  • 4、从节点上的IO线程通过TCP发起同步数据请求后,会将响应的 binlog 日志数据写到自已的 relay 日志文件中。
  • 5、从节点上的SQL线程通过读取 relay 日志的内容,来执行新的写操作,从而实现新数据的同步。

3 主从集群的搭建

3.1 环境准备

  • 操作系统版本: (查询命令:cat /proc/version)
    • 主节点服务器(Ubuntu 20.04 64位):Linux version 5.4.0-92-generic (buildd@lgw01-amd64-016) (gcc version 9.3.0 (Ubuntu 9.3.0-17ubuntu1~20.04)) #103-Ubuntu SMP Fri Nov 26 16:13:00 UTC 2021
    • 从节点服务器(Ubuntu 18.04 64位):Linux version 5.4.0-120-generic (buildd@lcy02-amd64-037) (gcc version 7.5.0 (Ubuntu 7.5.0-3ubuntu1~18.04)) #136~18.04.1-Ubuntu SMP Fri Jun 10 18:00:44 UTC 2022
  • Docker版本:(查询命令:docker version)
    • 主节点:20.10.7
    • 从节点:20.10.14
  • MySQL版本: 5.7
  • MySQL部署方式:Docker容器(主、从节点都是)
docker run -d -p 3307:3307 --restart=always --name=mysql -e MYSQL_ROOT_PASSWORD=123456 -v /home/data/mysql/conf:/etc/mysql -v /home/data/mysql/data:/var/lib/mysql mysql:5.7

PS: docker部署的**-v** 参数,即 Volumes (数据卷)是一个可供一个或多个容器使用的位于宿主机上特殊目录 。

3.2 配置文件

MySQL在linux操作系统上默认的(会自动加载的)配置文件路径在哪?

/etc/my.cnf
/etc/mysql/my.cnf
SYSCONFDIR/my.cnf

很明显我会用第二个,因为docker容器给映射的就是这个路径的(还没配置的时候,里面是空的)。

主节点MySQL配置文件(/etc/mysql/my.cnf)

[mysqld]
server-id=99

# 开启binlog
log_bin=master-bin
log_bin-index=master-bin.index
skip-name-resolve

# 设置连接端口
port=3306

# 设置mysql的安装目录(docker mysql:5.7镜像的安装目录)
basedir=/usr/share/mysql

# 设置mysql数据库的数据存放目录(docker mysql:5.7镜像的数据存放目录)
datadir=/var/lib/mysql

# 允许最大连接数
max_connections=200

# 允许连接失败的次数
max_connect_errors=10

# 服务端使用的字符集默认为utf8
character-set-server=utf8

# 创建新表时将使用的默认存储引擎
default-storage-engine=INNODB

# 默认使用“mysql_native_password”插件认证
default_authentication_plugin=mysql_native_password

PS:

  • 核心的有:log_binlog_bin-indexskip-name-resolve 等三次配置;
  • server-id 是指主从集群内的ID,不能重复。
  • 其它参数理论上可以不配置,用默认的。

从节点MySQL配置文件(/etc/mysql/my.cnf)

[mysqld]
server-id=02

# 打开MySQL中继日志
relay-log-index=slave-relay-bin.index
relay-log=slave-relay-bin

# 打开从服务二进制日志
log-bin=mysql-bin

# 使得更新的数据写进二进制日志中
log-slave-updates=1

# 设置3307端口
port=3307

# 设置mysql的安装目录(docker mysql:5.7镜像的安装目录)
basedir=/usr/share/mysql

# 设置mysql数据库的数据存放目录(docker mysql:5.7镜像的数据存放目录)
datadir=/var/lib/mysql

# 允许最大连接数
max_connections=200

# 允许连接失败的次数
max_connect_errors=10

# 服务端使用的字符集默认为utf8
character-set-server=utf8

# 创建新表时将使用的默认存储引擎
default-storage-engine=INNODB

# 默认使用“mysql_native_password”插件认证
default_authentication_plugin=mysql_native_password

PS

  • 核心参数有:relay-logrelay-log-indexlog-binlog-slave-updates 等4个参数。
  • 同样,server-id 是指主从集群内的ID,不能重复。

3.3 主从集群配置

3.3.1 主节点配置

  • 把**主节点配置文件(/etc/mysql/my.cnf)**放到目标目录下,再重启一下数据库,mysql数据库的数据存放目录下就会出现 binlog日志文件。如下图:

1657380456676.png

  • 从节点连接主节点时,需要一个user,所以我们应该单独创建一个,并给一下对应的权限。
# 创建从节点user
create user 'nb_plus'@'%' identified by '不告诉你咋滴';

# 授权数据库&表
grant all on *.* to 'nb_plus'@'%';

# 授权从节点复制
grant replication slave on *.* to 'nb_plus'@'%';

# 刷新一下
flush privileges;
  • 并顺便查看一下主节点的同步状态。
show master status;

1657382125898.png

3.3.2 从节点配置

  • 把**从节点配置文件(/etc/mysql/my.cnf)**放到目标目录下,再重启一下数据库。
  • 首次连接主节点,需要对一下暗号。我们登录MySQL,输入 be like:
# 设置同步主节点
change master to
master_host='192.168.1.69',
master_port=3306,
master_user='nb_plus',
master_password='还是不告诉你',
master_log_file='master-bin.000002',
master_log_pos=5516;

#########
# 上面查看到的主节点的同步状态
# master_log_file 就是主节点的 binlog 日志文件名
# master_log_pos 就是 binlog 同步到的位置(position)
#########

# 开启 slave
start slave;
  • 查看一下主从同步状态
show slave status \G;

# 或者不太简洁的直接用 show slave status; 

1657383249040.png

1657383300891.png

  • 往主节点写一条数据看看,如果能在从节点查询到,即大功告成。
##### 重新对暗号(设置同步主节点)的方式 #####
# 先关停 slave,不然对暗号会失败。
stop slave

# 设置同步主节点。。。copy 上面的吧。。。

4 问题

  • 1、主节点和从节点之间建立的TCP连接是长连接还是短连接?用的是什么协议?
  • 2、新接入的从节点需要先全量同步一次数据,那后面从节点宕机重启后是否还需要全量同步一次数据?

全部评论: 0

    我有话说:

    目录