深圳专业的免费建站,wordpress 炫酷主题,西安网页设计培训费用,深圳比较出名的外贸公司文章目录 1.MySQL主从复制集群的核心概念1.1.什么是主从复制集群1.2.主从复制集群中的专业术语1.3.主从复制集群工作原理1.4.主从复制中的小细节1.5.搭建主从复制集群的前提条件1.6.MySQL主从复制集群的架构信息 2.搭建MySQL多实例环境2.1.在mysql-1中搭建身为主库的MySQL实例2… 文章目录 1.MySQL主从复制集群的核心概念1.1.什么是主从复制集群1.2.主从复制集群中的专业术语1.3.主从复制集群工作原理1.4.主从复制中的小细节1.5.搭建主从复制集群的前提条件1.6.MySQL主从复制集群的架构信息 2.搭建MySQL多实例环境2.1.在mysql-1中搭建身为主库的MySQL实例2.2.在mysql-2中搭建MySQL多实例2.2.1.安装数据库软件2.2.1.搭建第一个3306从库的MySQL实例2.2.2.搭建第二个3307从库的MySQL实例 2.3.MySQL多个节点搭建完毕 3.配置MySQL主从复制集群3.1.在主库开启Binlog二进制日志3.2.在主库上创建主从复制的用户3.3.将主库数据备份并在从库中进行还原3.4.配置从库连接主库的复制信息3.5.启动主从复制线程 4.查看主从复制集群状态 1.MySQL主从复制集群的核心概念
1.1.什么是主从复制集群
主从复制是指将主数据库的 DDL 和 DML 操作通过二进制日志传到从库服务器中然后在从库上对这些日志重新执行也叫重做从而使得从库和主库的数据保持同步。
MySQL支持一台主库同时向多台从库进行复制 从库同时也可以作为其他从服务器的主库实现链状复制。
MySQL 复制的优点主要包含以下三个方面
主库出现问题可以快速切换到从库提供服务。实现读写分离降低主库的访问压力。可以在从库中执行备份以避免备份期间影响主库服务。
1.2.主从复制集群中的专业术语
在MySQL主从复制集群中主要分为两大部分文件、线程。
文件
主库 Binlog二进制日志。 从库 relay-log中继日志主库推送过来的Binlog日志都存放在中继日志中。master.info从库复制主库的信息文件记录着主库的地址、用户、Binlog等信息。relay-log.info中继日志的信息文件该文件记录了上次执行relay-log的位置等信息。
线程
主库 binlog_dump_thread二进制日志投递线程主要将二进制日志发送给从库的线程。 从库 IO_Thread从库的IO线程用于请求和接收主库的Binlog二进制日志。SQL_Thread从库的SQL线程用于将主库发来的二进制日志在数据库中进行数据复制。
1.3.主从复制集群工作原理
MySQL主从复制集群的工作原理主要围绕前面提到的文件和线程。 MySQL主从复制集群的原理 1首先从库执行change master to将连接主库的配置信息记录到master.info文件中此时从库上会开启两个线程I/O线程和SQL线程。 2从库上的I/O线程会从master.info文件中读取主库的连接信息。 3从库I/O线程获取到主库的信息后会与主库进行身份认证然后建立连接。 4当从库I/O线程成功连接到主库后主库会立即给从库分配一个binlog_dump_thread线程用于推送Binlog日志到从库。 5从库I/O线程会根据master.info中记录的Binlog信息Binlog日志文件、标识位号与主库的binlog_dump_thread线程请求最新的Binlog日志。 6这时主库的binlog_dump_thread线程就会去查询是否产生了新的Binlog日志如果产生了新的Binlog日志会截取最新的Binlog日志然后推送给从库的I/O线程。 7从库的I/O线程接收到主库推送的Binlog日志后会现将其存放在内存的TCP/IP缓存中然后告知主库的binlog_dump_thread线程Binlog日志已收到。 8此时从库的I/O线程会去更新master.info文件中的Binlog位置点信息记录最新的Binlog标识号。 9然后从库的I/O线程会将主库推送的Binlog日志写入到磁盘上的relay-log文件中。 10最后由从库的SQL线程读取relay-log.ifno文件获取relay-log最新的位置点然后根据的位置点去relay-log中执行最新的Binlog日志执行完成后会再次更新relay-log.info文件中记录的relay-log位置点。 这就是完整的主从复制工作原理。 简单来说MySQL主从复制的原理就是从库的I/O线程读取连接主库的配置信息然后去连接主库开始主从同步当I/O线程连接上主库后主库会立即给I/O线程分配一个Dump线程用于推送Binlog日志到从库此时I/O线程会根据master.info文件中记录的Binlog信息向主库的Dump线程请求最新的BInlogDump线程查询到有最新的Binlog产生会将最新的Binlog截取然后推送给从库的I/O线程I/O线程收到Binlog日志后将其存放在内存的TCP/IP缓存中然后更新master.info文件中最新的Binlog信息紧接着将Binlog日志写入到relay-log中最后由从库的SQL线程从relay-log.info中读取relay-log的位置号然后执行relay-log中最新的Binlog日志执行完成后再次更新relay-log.info中的relay-log位置号以便于下次再relay-log中读取最新的Binlog日志。
relay-log日志会通过MySQL中的其他线程定期清理。
1.4.主从复制中的小细节
从上面说的主从复制原理来看好像每次都是从库向主库去请求新数据那么什么时候从库才应该向主库请求呢请求的频率如何 其实是这样的当主库上产生了新的事务更新到Binlog日之后会给binlog_dump_thread线程发送一个“信号”binlog_dump_thread线程会与从库的I/O线程一直建立连接binlog_dump_thread线程就会通知从库的I/O线程有新数据产生了这时从库的I/O线程就带着master.info中记录的最新Binlog标识位号向binlog_dump_thread线程请求最新的Binlog然后完成数据同步。 MySQL主从复制第一次复制时是按照上面说到的10步完成的第二次复制时只需要等待主库的binlog_dump_thread线程向从库的I/O线程发送信号然后I/O线程去请求最新的Binlog最后由SQL线程复制数据即可。
1.5.搭建主从复制集群的前提条件
搭建MySQL主从复制集群的前提条件如下
首先需要准备多个MySQL实例最少两个MySQL实例能够实现一主一从的架构可以在多个服务器中分布部署独立的MySQL节点也可以在一台服务器中部署多个MySQL实例。每个MySQL实例都需要由单独的sever_id。身为主库角色的MySQL实例需要开启二进制日志从库在特定场景下需要开启。主库需要授权一个专门的用户作为主从复制的用户。如果主库是一个运行很多年的数据库突然要升级为主从复制集群最好先将主库的数据同步一份到从库中。开启专用的复制线程。
1.6.MySQL主从复制集群的架构信息
本次主从复制的架构是一主两从的结构。
IP主机名端口角色server_id192.168.20.11mysql-13306主库1192.168.20.12mysql-23306从库2192.168.20.12mysql-23307从库3
2.搭建MySQL多实例环境
再搭建MySQL主从复制集群之前首先搭建出多个MySQL实例由于服务器有限因此通过两台机器模拟出一主两从的环境。
主从复制集群中有一个节点开启了gtid所有的节点都需要开启gtid否则主从将不能同步。
2.1.在mysql-1中搭建身为主库的MySQL实例
mysql-1服务器中的3306端口的MySQL实例再前面已经搭建完成了就是我们一直在使用的数据库实例里面有数据更加方便演示主从集群下面只是提供一下搭建过程的步骤。
注意每个MySQL节点的server_id都要设置成不同的如果你的一主两从都是单独在不同服务器中部署的那么直接参考本小结的数据库实例安装即可不用再看多实例的步骤了。
1.解压MySQL
[rootmysql-1 ~]# tar xf mysql-5.7.36-linux-glibc2.12-x86_64.tar.gz -C /usr/local/
[rootmysql-1 ~]# mv /usr/local/mysql-5.7.36-linux-glibc2.12-x86_64 /usr/local/mysql2.设置MySQL的环境变量
[rootmysql-1 ~]# vim /etc/profile
export MYSQL_HOME/usr/local/mysql
export PATH$MYSQL_HOME/bin:$PATH
export LD_LIBRARY_PATH:/usr/local/mysql/lib3.创建mysql用户
[rootmysql-1 ~]# groupadd -r mysql
[rootmysql-1 ~]# useradd -M -r -s /sbin/nologin -g mysql mysql4.准备数据目录
[rootmysql-1 ~]# mkdir /data/mysql
[rootmysql-1 ~]# chown -R mysql. /data/mysql5.初始化数据库
[rootmysql-1 ~]# mysqld --initialize-insecure --usermysql --basedir/usr/local/mysql --datadir/data/mysql6.准备mysql配置文件
[rootmysql-1 ~]# vim /etc/my.cnf
[mysqld]
usermysql
port3306
server_id1 #每个MySQL数据库的server_id都设置成不同的
basedir/usr/local/mysql
datadir/data/mysql
log_binmysql-bin
gtid-modeon
enforce-gtid-consistencytrue
socket/tmp/mysql.sock
log_error/data/mysql/mysql_err.log
character-set-serverutf8[mysql]
socket/tmp/mysql.sock7.准备服务管理脚本
[rootmysql-1 ~]# vim /etc/systemd/system/mysqld.service
[Unit]
DescriptionMySQL Server
Documentationman:mysqld(8)
Documentationhttp://dev.mysql.com/doc/refman/en/using-systemd.html
Afternetwork.target
Aftersyslog.target
[Install]
WantedBymulti-user.target
[Service]
Usermysql
Groupmysql
ExecStart/usr/local/mysql/bin/mysqld --defaults-file/etc/my.cnf
LimitNOFILE 50008.启动数据库
[rootmysql-1 ~]# systemctl daemon-reload
[rootmysql-1 ~]# systemctl start mysqld9.设置root密码
[rootmysql-1 ~]# mysqladmin -u root -P 3306 password 12345610.登陆数据库
[rootmysql-1 ~]# mysql -uroot -p123456
mysql2.2.在mysql-2中搭建MySQL多实例
由于服务器数量有限在mysql-2这台服务器中分别搭建两个从库。
2.2.1.安装数据库软件
1.解压MySQL
[rootmysql-2 ~]# tar xf mysql-5.7.36-linux-glibc2.12-x86_64.tar.gz -C /usr/local/
[rootmysql-2 ~]# mv /usr/local/mysql-5.7.36-linux-glibc2.12-x86_64 /usr/local/mysql2.设置MySQL的环境变量
[rootmysql-2 ~]# vim /etc/profile
export MYSQL_HOME/usr/local/mysql
export PATH$MYSQL_HOME/bin:$PATH
export LD_LIBRARY_PATH:/usr/local/mysql/lib3.创建mysql用户
[rootmysql-2 ~]# groupadd -r mysql
[rootmysql-2 ~]# useradd -M -r -s /sbin/nologin -g mysql mysql2.2.1.搭建第一个3306从库的MySQL实例
搭建第一个从库实例端口号为3306server_id为2数据路径为/data/mysql3306。
1.创建3306从库的数据目录
[rootmysql-2 ~]# mkdir /data/mysql3306
[rootmysql-2 ~]# chown -R mysql.mysql /data/mysql3306/2.准备3306从库的配置文件
[rootmysql-1 ~]# vim /etc/my3306.cnf
[mysqld]
usermysql
port3306
server_id2 #每个MySQL数据库的server_id都设置成不同的
basedir/usr/local/mysql
datadir/data/mysql3306
log_bin/data/mysql3306/mysql-bin
gtid-modeon
enforce-gtid-consistencytrue
socket/data/mysql3306/mysql.sock
log_error/data/mysql3306/mysql_err.log
character-set-serverutf8[mysql]
socket/data/mysql3306/mysql.sock3.初始化3306从库
[rootmysql-2 ~]# mysqld --initialize-insecure --usermysql --basedir/usr/local/mysql --datadir/data/mysql33064.准备服务管理脚本
[rootmysql-1 ~]# vim /etc/systemd/system/mysqld3306.service
[Unit]
DescriptionMySQL Server
Documentationman:mysqld(8)
Documentationhttp://dev.mysql.com/doc/refman/en/using-systemd.html
Afternetwork.target
Aftersyslog.target
[Install]
WantedBymulti-user.target
[Service]
Usermysql
Groupmysql
ExecStart/usr/local/mysql/bin/mysqld --defaults-file/etc/my3306.cnf
LimitNOFILE 50005.启动数据库
[rootmysql-1 ~]# systemctl daemon-reload
[rootmysql-1 ~]# systemctl start mysqld33066.设置root密码
[rootmysql-2 ~]# mysqladmin -u root -P 3306 -S /data/mysql3306/mysql.sock password 1234567.登陆数据库
[rootmysql-2 ~]# mysql -uroot -p123456 -P3306 -S /data/mysql3306/mysql.sock
mysql2.2.2.搭建第二个3307从库的MySQL实例
搭建第一个从库实例端口号为3306server_id为2数据路径为/data/mysql3306。
1.创建3307从库的数据目录
[rootmysql-2 ~]# mkdir /data/mysql3307
[rootmysql-2 ~]# chown -R mysql.mysql /data/mysql3307/2.准备3307从库的配置文件
[rootmysql-1 ~]# vim /etc/my3307.cnf
[mysqld]
usermysql
port3307
server_id3 #每个MySQL数据库的server_id都设置成不同的
basedir/usr/local/mysql
datadir/data/mysql3307
log_bin/data/mysql3307/mysql-bin
gtid-modeon
enforce-gtid-consistencytrue
socket/data/mysql3307/mysql.sock
log_error/data/mysql3307/mysql_err.log
character-set-serverutf8[mysql]
socket/data/mysql3307/mysql.sock3.初始化3307从库
[rootmysql-2 ~]# mysqld --initialize-insecure --usermysql --basedir/usr/local/mysql --datadir/data/mysql33074.准备服务管理脚本
[rootmysql-1 ~]# vim /etc/systemd/system/mysqld3307.service
[Unit]
DescriptionMySQL Server
Documentationman:mysqld(8)
Documentationhttp://dev.mysql.com/doc/refman/en/using-systemd.html
Afternetwork.target
Aftersyslog.target
[Install]
WantedBymulti-user.target
[Service]
Usermysql
Groupmysql
ExecStart/usr/local/mysql/bin/mysqld --defaults-file/etc/my3307.cnf
LimitNOFILE 50005.启动数据库
[rootmysql-1 ~]# systemctl daemon-reload
[rootmysql-1 ~]# systemctl start mysqld33076.设置root密码
[rootmysql-2 ~]# mysqladmin -u root -P 3307 -S /data/mysql3307/mysql.sock password 1234567.登陆数据库
[rootmysql-2 ~]# mysql -uroot -p123456 -P3307 -S /data/mysql3307/mysql.sock
mysql2.3.MySQL多个节点搭建完毕
MySQL多个节点已经搭建完毕了下面来查询每个实例的server_id。 3.配置MySQL主从复制集群
MySQL数据库的多个实例节点已经搭建完成了下面将这些搭建的数据库实例配置成主从复制集群一主两从。
IP主机名端口角色192.168.20.11mysql-13306主库192.168.20.12mysql-23306从库192.168.20.12mysql-23307从库
配置MySQL主从复制集群的大致步骤
主库开启Binlog日志从库复制主库数据要通过Binlog进行复制。主库创建专门用作主从复制的用户。将主库数据进行备份再从库中恢复。配置从库连接主库的复制信息。启动主从复制集群。
3.1.在主库开启Binlog二进制日志
主库已经开启了Binlog二进制日志我们来查一下。
mysql show variables like %log_bin%;
--------------------------------------------------------------
| Variable_name | Value |
--------------------------------------------------------------
| log_bin | ON |
| log_bin_basename | /data/mysql/mysql-bin |
| log_bin_index | /data/mysql/mysql-bin.index |
| log_bin_trust_function_creators | OFF |
| log_bin_use_v1_row_events | OFF |
| sql_log_bin | ON |
--------------------------------------------------------------
6 rows in set (0.01 sec)从库复制主库数据都是通过Binlog进行传输和恢复的。
3.2.在主库上创建主从复制的用户
mysql grant replication slave on *.* to replicas192.168.20.% identified by 123456;3.3.将主库数据备份并在从库中进行还原
如果是运行很久的主库要升级为主从复制集群那么建议将主库上的数据备份还原到从库上避免从库一次性同步很多数据浪费性能。
[rootmysql-1 ~]# mysqldump -uroot -p123456 -A --master-data2 -R -E --triggers --single-transaction all_db.sql在192.168.20.12的两个从库中还原主库的备份数据。
1.将备份上传到从库的服务器上
[rootmysql-1 ~]# scp -rp all_db.sql root192.168.20.12:/root2.3306从库还原主库备份数据
[rootmysql-2 ~]# mysql -uroot -p123456 -P3306 -S /data/mysql3306/mysql.sock
mysql set sql_log_bin0;
mysql source /root/all_db.sql;3.3307从库还原主库备份数据
[rootmysql-2 ~]# mysql -uroot -p123456 -P3307 -S /data/mysql3307/mysql.sock
mysql set sql_log_bin0;
mysql source /root/all_db.sql;3.4.配置从库连接主库的复制信息
接下来我们需要配置从库连接主库的信息包括让从库知道主库的IP、端口号、复制的用户密码、Binlog相关的信息。
1获取主库Binlog的信息
从库是通过Binlog复制主库数据的首先要获取主库Binlog日志的一些信息包括主库的Binlog日志使用的是哪个、要从Binlog日志中的哪一个事件标识号处开始复制数据。
从Binlog的哪一个事件标识号处开始复制数据尤为关键因为主库可能运行的时间长了也有很多的数据一定要从合适的位置处开始复制数据要不然也会产生很大的资源浪费。
我们是用主库头一天的全库备份然后还原到从库上的在主库的备份文件中就记录了从库应该从哪一个Binlog事件标识位处开始复制数据。
vim all_db.sql
-- CHANGE MASTER TO MASTER_LOG_FILEmysql-bin.000001, MASTER_LOG_POS452;从备份文件中得知我们应该让从库从主库Binlog事件标识位号452处开始复制数据。
如果主库不是运行很久的不需要备份数据还原到从库而是直接搭建的主从复制集群那么直接可以从主库状态信息那里获取Binlog的标识位号在配置主从时一定要指对Binlog标识位号否则主从将会失败。
mysql show master status;
----------------------------------------------------------------------------------------------------
| File | Position | Binlog_Do_DB | Binlog_Ignore_DB | Executed_Gtid_Set |
----------------------------------------------------------------------------------------------------
| mysql-bin.000001 | 452 | | | 4f87bad8-fc67-11ec-be7b-005056b791aa:1 |
----------------------------------------------------------------------------------------------------
1 row in set (0.00 sec)2配置从库连接主库进行复制的参数信息
配置从库连接主库进行复制的参数有很多不过只需要记住这一条命令help change master to即可在MySQL交互式下执行此命令可以打印出从库连接主库的所有配置参数。
1.3306从库配置
[rootmysql-2 ~]# mysql -uroot -p123456 -P3306 -S /data/mysql3306/mysql.sock
mysql CHANGE MASTER TOMASTER_HOST192.168.20.11,MASTER_USERreplicas,MASTER_PASSWORD123456,MASTER_PORT3306,MASTER_LOG_FILEmysql-bin.000001,MASTER_LOG_POS452,MASTER_CONNECT_RETRY10;1.3307从库配置
[rootmysql-2 ~]# mysql -uroot -p123456 -P3307 -S /data/mysql3307/mysql.sock
mysql CHANGE MASTER TOMASTER_HOST192.168.20.11,MASTER_USERreplicas,MASTER_PASSWORD123456,MASTER_PORT3306,MASTER_LOG_FILEmysql-bin.000001,MASTER_LOG_POS452,MASTER_CONNECT_RETRY10; 参数解释
参数含义MASTER_HOST主库的地址MASTER_USER主从复制的专用用户MASTER_PASSWORD主从复制用户的密码MASTER_PORT主库的端口号MASTER_LOG_FILE主库的Binlog日志名MASTER_LOG_POS从主库BInlog日志的哪一个标识位处开始复制MASTER_CONNECT_RETRY主从连接失败的重试时间间隔
3.5.启动主从复制线程
1.3306从库配置
[rootmysql-2 ~]# mysql -uroot -p123456 -P3306 -S /data/mysql3306/mysql.sock
mysql start slave;1.3307从库配置
[rootmysql-2 ~]# mysql -uroot -p123456 -P3307 -S /data/mysql3307/mysql.sock
mysql start slave;4.查看主从复制集群状态
1.3306从库配置
[rootmysql-2 ~]# mysql -uroot -p123456 -P3306 -S /data/mysql3306/mysql.sock
mysql show slave status\G;1.3307从库配置
[rootmysql-2 ~]# mysql -uroot -p123456 -P3307 -S /data/mysql3307/mysql.sock
mysql show slave status\G;当每个从库的IO线程和SQL线程的状态都是Yes就表示主从复制集群搭建完毕了。 MySQL主从配置过程中从库连接主库的配置写错了应该如何解决
只要不执行start slave再执行一次change master to会覆盖上一次配置。
1.停止主从复制
mysqlstop slave;2.清空从库连接主库的信息
mysql reset slave all;3.重新设置
mysql CHANGE MASTER TOMASTER_HOST192.168.20.11,MASTER_USERreplicas,MASTER_PASSWORD123456,MASTER_PORT3306,MASTER_LOG_FILEmysql-bin.000001,MASTER_LOG_POS452,MASTER_CONNECT_RETRY10;