深入理解 MySQL 主从复制原理以及集群部署过程

您所在的位置:网站首页 docker安装redis哨兵集群 深入理解 MySQL 主从复制原理以及集群部署过程

深入理解 MySQL 主从复制原理以及集群部署过程

2023-04-07 01:17| 来源: 网络整理| 查看: 265

2.2.在 mysql-2 中搭建 MySQL 多实例

由于服务器数量有限,在 mysql-2 这台服务器中分别搭建两个从库。

2.2.1.安装数据库软件 1.解压MySQL[root@mysql-2 ~]# tar xf mysql-5.7.36-linux-glibc2.12-x86_64.tar.gz -C /usr/local/[root@mysql-2 ~]# mv /usr/local/mysql-5.7.36-linux-glibc2.12-x86_64 /usr/local/mysql 2.设置MySQL的环境变量[root@mysql-2 ~]# vim /etc/profileexport MYSQL_HOME=/usr/local/mysqlexport PATH=$MYSQL_HOME/bin:$PATHexport LD_LIBRARY_PATH=:/usr/local/mysql/lib 3.创建mysql用户[root@mysql-2 ~]# groupadd -r mysql[root@mysql-2 ~]# useradd -M -r -s /sbin/nologin -g mysql mysql 复制代码 2.2.1.搭建第一个 3306 从库的 MySQL 实例

搭建第一个从库实例,端口号为 3306,server_id 为 2,数据路径为/data/mysql3306。

1.创建3306从库的数据目录[root@mysql-2 ~]# mkdir /data/mysql3306[root@mysql-2 ~]# chown -R mysql.mysql /data/mysql3306/ 2.准备3306从库的配置文件[root@mysql-1 ~]# vim /etc/my3306.cnf[mysqld] user=mysql port=3306 server_id=2 #每个MySQL数据库的server_id都设置成不同的basedir=/usr/local/mysql datadir=/data/mysql3306 log_bin=/data/mysql3306/mysql-bingtid-mode=onenforce-gtid-consistency=truesocket=/data/mysql3306/mysql.socklog_error=/data/mysql3306/mysql_err.logcharacter-set-server=utf8 [mysql]socket=/data/mysql3306/mysql.sock 3.初始化3306从库[root@mysql-2 ~]# mysqld --initialize-insecure --user=mysql --basedir=/usr/local/mysql --datadir=/data/mysql3306 4.准备服务管理脚本[root@mysql-1 ~]# vim /etc/systemd/system/mysqld3306.service [Unit]Description=MySQL ServerDocumentation=man:mysqld(8)Documentation=http://dev.mysql.com/doc/refman/en/using-systemd.htmlAfter=network.targetAfter=syslog.target[Install]WantedBy=multi-user.target[Service]User=mysqlGroup=mysqlExecStart=/usr/local/mysql/bin/mysqld --defaults-file=/etc/my3306.cnfLimitNOFILE = 5000 5.启动数据库[root@mysql-1 ~]# systemctl daemon-reload [root@mysql-1 ~]# systemctl start mysqld3306 6.设置root密码[root@mysql-2 ~]# mysqladmin -u root -P 3306 -S /data/mysql3306/mysql.sock password '123456' 7.登陆数据库[root@mysql-2 ~]# mysql -uroot -p123456 -P3306 -S /data/mysql3306/mysql.sockmysql> 复制代码 2.2.2.搭建第二个 3307 从库的 MySQL 实例

搭建第一个从库实例,端口号为 3306,server_id 为 2,数据路径为/data/mysql3306。

1.创建3307从库的数据目录[root@mysql-2 ~]# mkdir /data/mysql3307[root@mysql-2 ~]# chown -R mysql.mysql /data/mysql3307/ 2.准备3307从库的配置文件[root@mysql-1 ~]# vim /etc/my3307.cnf[mysqld] user=mysql port=3307 server_id=3 #每个MySQL数据库的server_id都设置成不同的basedir=/usr/local/mysql datadir=/data/mysql3307 log_bin=/data/mysql3307/mysql-bingtid-mode=onenforce-gtid-consistency=truesocket=/data/mysql3307/mysql.socklog_error=/data/mysql3307/mysql_err.logcharacter-set-server=utf8 [mysql]socket=/data/mysql3307/mysql.sock 3.初始化3307从库[root@mysql-2 ~]# mysqld --initialize-insecure --user=mysql --basedir=/usr/local/mysql --datadir=/data/mysql3307 4.准备服务管理脚本[root@mysql-1 ~]# vim /etc/systemd/system/mysqld3307.service [Unit]Description=MySQL ServerDocumentation=man:mysqld(8)Documentation=http://dev.mysql.com/doc/refman/en/using-systemd.htmlAfter=network.targetAfter=syslog.target[Install]WantedBy=multi-user.target[Service]User=mysqlGroup=mysqlExecStart=/usr/local/mysql/bin/mysqld --defaults-file=/etc/my3307.cnfLimitNOFILE = 5000 5.启动数据库[root@mysql-1 ~]# systemctl daemon-reload [root@mysql-1 ~]# systemctl start mysqld3307 6.设置root密码[root@mysql-2 ~]# mysqladmin -u root -P 3307 -S /data/mysql3307/mysql.sock password '123456' 7.登陆数据库[root@mysql-2 ~]# mysql -uroot -p123456 -P3307 -S /data/mysql3307/mysql.sockmysql> 复制代码 2.3.MySQL 多个节点搭建完毕

MySQL 多个节点已经搭建完毕了,下面来查询每个实例的 server_id。

3.配置 MySQL 主从复制集群

MySQL 数据库的多个实例节点已经搭建完成了,下面将这些搭建的数据库实例配置成主从复制集群(一主两从)。

配置 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 replicas@'192.168.20.%' identified by '123456'; 复制代码 3.3.将主库数据备份并在从库中进行还原

如果是运行很久的主库,要升级为主从复制集群,那么建议将主库上的数据备份还原到从库上,避免从库一次性同步很多数据,浪费性能。

[root@mysql-1 ~]# mysqldump -uroot -p123456 -A --master-data=2 -R -E --triggers --single-transaction > all_db.sql 复制代码

在 192.168.20.12 的两个从库中还原主库的备份数据。

1.将备份上传到从库的服务器上[root@mysql-1 ~]# scp -rp all_db.sql [email protected]:/root 2.3306从库还原主库备份数据[root@mysql-2 ~]# mysql -uroot -p123456 -P3306 -S /data/mysql3306/mysql.sock mysql> set sql_log_bin=0;mysql> source /root/all_db.sql; 3.3307从库还原主库备份数据[root@mysql-2 ~]# mysql -uroot -p123456 -P3307 -S /data/mysql3307/mysql.sock mysql> set sql_log_bin=0;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_FILE='mysql-bin.000001', MASTER_LOG_POS=452; 复制代码

从备份文件中得知,我们应该让从库从主库 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从库配置[root@mysql-2 ~]# mysql -uroot -p123456 -P3306 -S /data/mysql3306/mysql.sock mysql> CHANGE MASTER TO MASTER_HOST='192.168.20.11', MASTER_USER='replicas', MASTER_PASSWORD='123456', MASTER_PORT=3306, MASTER_LOG_FILE='mysql-bin.000001', MASTER_LOG_POS=452, MASTER_CONNECT_RETRY=10; 1.3307从库配置[root@mysql-2 ~]# mysql -uroot -p123456 -P3307 -S /data/mysql3307/mysql.sock mysql> CHANGE MASTER TO MASTER_HOST='192.168.20.11', MASTER_USER='replicas', MASTER_PASSWORD='123456', MASTER_PORT=3306, MASTER_LOG_FILE='mysql-bin.000001', MASTER_LOG_POS=452, MASTER_CONNECT_RETRY=10; 复制代码

参数解释:

3.5.启动主从复制线程 1.3306从库配置[root@mysql-2 ~]# mysql -uroot -p123456 -P3306 -S /data/mysql3306/mysql.sock mysql> start slave; 1.3307从库配置[root@mysql-2 ~]# mysql -uroot -p123456 -P3307 -S /data/mysql3307/mysql.sock mysql> start slave; 复制代码 4.查看主从复制集群状态 1.3306从库配置[root@mysql-2 ~]# mysql -uroot -p123456 -P3306 -S /data/mysql3306/mysql.sock mysql> show slave status\G; 1.3307从库配置[root@mysql-2 ~]# mysql -uroot -p123456 -P3307 -S /data/mysql3307/mysql.sock mysql> show slave status\G; 复制代码

当每个从库的 IO 线程和 SQL 线程的状态都是 Yes,就表示主从复制集群搭建完毕了。



【本文地址】


今日新闻


推荐新闻


CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3