1 为什么要搭建主从集群?
- 为了数据的安全性。方便于数据的备份。
- 同时也是为了后面做“高可用架构”,以及“读写分离”打基础。
- MySQL数据库的高可用就是基于主从数据库集群的数据同步,主节点宕机时可以把一个从节点切换为主节点。
- 读写分离,即主库负责执行写操作,而从库负责执行读操作,依赖于MySQL数据库的主从集群模式来实现主节点与从节点间的数据一致。
2 主从集群的同步数据的原理
2.1 前提条件
-
相同的日期时间。主节点服务器和从节点服务器的日期时间要相同。
-
相同的数据库实例。要同步的数据库实例(如: database1)在主节点和从节点都要有,创建时要用相同的默认字符集。
-
相同的表。要同步的表在主节点和从节点都要有,同样,应该用相同的DDL语句来创建。
-
同样的数据。开始实时同步前,主节点和从节点的数据要相同。也就是要全量同步一次数据。
2.2 实时同步数据过程
- 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_bin、log_bin-index、skip-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-log、relay-log-index、log-bin、log-slave-updates 等4个参数。
- 同样,server-id 是指主从集群内的ID,不能重复。
3.3 主从集群配置
3.3.1 主节点配置
- 把**主节点配置文件(/etc/mysql/my.cnf)**放到目标目录下,再重启一下数据库,mysql数据库的数据存放目录下就会出现 binlog日志文件。如下图:
- 从节点连接主节点时,需要一个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;
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;
- 往主节点写一条数据看看,如果能在从节点查询到,即大功告成。
##### 重新对暗号(设置同步主节点)的方式 #####
# 先关停 slave,不然对暗号会失败。
stop slave
# 设置同步主节点。。。copy 上面的吧。。。
4 问题
- 1、主节点和从节点之间建立的TCP连接是长连接还是短连接?用的是什么协议?
- 2、新接入的从节点需要先全量同步一次数据,那后面从节点宕机重启后是否还需要全量同步一次数据?
注意:本文归作者所有,未经作者允许,不得转载