mysql集群(主从复制)实操

1.环境准备

1.准备5台全新的机器

​ 192.168.31.23 master1

​ 192.168.31.24 master2
​ 192.168.31.89 slave1
​ 192.168.31.159 slave2
​ 192.168.31.241 mycat

2.在每个机器本地hosts文件加入一下内容

[root@master1_23 ~]# cat /etc/hosts
127.0.0.1   localhost localhost.localdomain localhost4 localhost4.localdomain4
::1         localhost localhost.localdomain localhost6 localhost6.localdomain6192.168.31.23 master1
192.168.31.24 master2
192.168.31.89 slave1
192.168.31.159 slave2
192.168.31.241 mycat

3.前四台机器分别全新安装mysql57

[root@master1_23 srv]# rpm -qa | grep mysql
mysql-community-common-5.7.27-1.el7.x86_64
mysql-community-client-5.7.27-1.el7.x86_64
mysql-community-server-5.7.27-1.el7.x86_64
mysql-community-libs-5.7.27-1.el7.x86_64
mysql-community-libs-compat-5.7.27-1.el7.x86_64

4.将所有机器的防火墙和selinux关掉

systemctl stop firewalld
systemctl disable firewalld
[root@master1-23 ~]# getenforce
Disabledvim /etc/selinux/config
SELINUX=disabled

2.一主一从(M-S)(1)

主(master1)

登陆数据库

1.首先启动数据库
systemctl start mysqld2.通过日志找到临时密码,并且设置数据密码
[root@master1-23 ~]# grep password /var/log/mysqld.log
2022-05-26T11:26:39.973413Z 1 [Note] A temporary password is generated for root@localhost: (ZT%>jydv6pP# 更改数据库密码
mysqladmin -uroot -p'(ZT%>jydv6pP' password 'QazWsx@123'3.登陆数据库
mysql -uroot -p'QazWsx@123'

准备数据1(验证主从同步使用)

master1

mysql> create database master1db;   # 创建master1db库
Query OK, 1 row affected (0.00 sec)# 创建mastertab表
mysql> create table master1db.mastertab (id int,name varchar(50));
Query OK, 0 rows affected (0.01 sec)# 往表中写入数据
mysql> insert into master1db.mastertab values(1,'zhangsan');
Query OK, 1 row affected (0.02 sec)mysql> insert into master1db.mastertab values(2,'lisi');
Query OK, 1 row affected (0.00 sec)

开启二进制日志 master1

[root@master1-23 ~]# vim /etc/my.cnf
log_bin         # 开启二进制日志
server-id=1        # 数据库id 每台机器的id不能相同# 重新启动mysql
systemctl restart mysqld

创建复制用户 master1

 msyql> grant replication slave, replication client on *.* to 'rep'@'192.168.31.%' identified by 'QazWsx@123';# 参数解释
grant  # 授权
replication  # 授予复制权限
*.*   # 所有库和所有表
rep     # 授权用户
192.168.31.%   # 该网段所有机器能够访问
by 'QazWsx@123'  # 指定该用户密码

将**(master1)主数据与(master2)从**数据手动一致

1.备份master1数据
[root@master1-23 ~]# mysqldump -uroot -p'QazWsx@123'\
> --all-databases --single-transaction \
> --master-data=2 --flush-logs > `date +%F`-mysql-all.sql
mysqldump: [Warning] Using a password on the command line interface can be insecure.2.将数据远程发送到(master2)从机器上
[root@master1-23 ~]# scp -r 2022-05-26-mysql-all.sql  master2:~/
root@master2's password:
2022-05-26-mysql-all.sql      100%  203   284.8KB/s   00:003.观察二进制日志分割点,方便(master2)从机器上恢复
vim 2022-05-26-mysql-all.sql
CHANGE MASTER TO MASTER_LOG_FILE='master1-23-bin.000002', MASTER_LOG_POS=154;master1-23-bin.000002  # 分割的二进制文件
MASTER_LOG_POS=154     # 分割的位置

准备数据2(用于验证主从同步使用)master1

mysql -uroot -p'QazWsx@123' -e "insert into master1db.mastertab values(3,'wangsu');"
mysql -uroot -p'QazWsx@123' -e "insert into master1db.mastertab values(4,'zhaoliu'');"
mysql -uroot -p'QazWsx@123' -e "insert into master1db.mastertab values(5,'qi');"

从(master2)

首先测试一下刚才授权的rep用户是否可用(master2)

1.远程登陆master1的数据库
# 此环节如果登陆报错,查看是否授权问题,还有防火墙是否关闭
mysql -h master1 -urep -p'QazWsx@123'

启动服务器序号,防止乱序

# 不用在从设备上开启二进制日志,没有人向master2请求日志。
vim /etc/my.cnf
server-id=2# 设置完了之后重启mysql
systemctl restart mysqld# 测试一下能否正常登陆
mysql -uroot -p'QazWsx@123'

手动同步数据

# 在数据库中执行以下命令
mysql> set sql_log_bin=0;   # 临时关闭二进制日志文件,防止恢复数据被记录下来,是无用的mysql> source ~/2022-05-26-mysql-all.sql   # 恢复备份文件数据

设置主服务器

1.此操作在master2(从)机器上
# 设置master1为主服务器,master2为slave服务器# 这是该数据的主人,地址为master1    也可以写IP地址
mysql> change master to master_host='master1' , -> master_user='rep',       # 访问主数据库的用户为 rep-> master_password='QazWsx@123',     # 访问 密码#   注意,二进制日志的位置,应该参照主服务器备份时生成的新位置。-> master_log_file='master1-23-bin.000002',        -> master_log_pos=154;2.开始运行/停止运行   stop slave;
mysql> start slave;   # 查看启动状态(IO-YES/SQL-YES)show slave status\G;
*************************** 1. row ***************************Slave_IO_State: Waiting for master to send eventMaster_Host: master1Master_User: repMaster_Port: 3306Connect_Retry: 60Master_Log_File: master1-23-bin.000002Read_Master_Log_Pos: 1295Relay_Log_File: master2-24-relay-bin.000002Relay_Log_Pos: 1466Relay_Master_Log_File: master1-23-bin.000002Slave_IO_Running: Yes          Slave_SQL_Running: Yes

此时返回主服务器(master1)更新数据,在(master2)观察是否同步

(master1)主服务器

mysql> insert into master1db.mastertab values(6,'liu');
Query OK, 1 row affected (0.00 sec)mysql> insert into master1db.mastertab values(7,'yi');
Query OK, 1 row affected (0.00 sec)mysql> select * from mastertab;
+------+----------+
| id   | name     |
+------+----------+
|    1 | zhangsan |
|    2 | lisi     |
|    3 | wangsu   |
|    4 | zhaoliu  |
|    5 | qi       |
|    6 | liu      |
|    7 | yi       |
+------+----------+
7 rows in set (0.00 sec)

此时观察(master2)从服务器

# (master1)更新数据前
mysql> select * from master1db.mastertab;
+------+----------+
| id   | name     |
+------+----------+
|    1 | zhangsan |
|    2 | lisi     |
|    3 | wangsu   |
|    4 | zhaoliu  |
|    5 | qi       |
+------+----------+
5 rows in set (0.00 sec)# (master1)更新数据前
mysql> select * from mastertab;
+------+----------+
| id   | name     |
+------+----------+
|    1 | zhangsan |
|    2 | lisi     |
|    3 | wangsu   |
|    4 | zhaoliu  |
|    5 | qi       |
|    6 | liu      |
|    7 | yi       |
+------+----------+

3.一主一从(M-S)(2)

简单来说:可以通过 GTID 自动找点,无需像之前那样通过 binlog 名 和 position 号找点

GTID复制

1、master 更新数据时,会在事务前产生 GTID 并一同记录到 binlog 日志中;
2、slave 端的 IO 线程将变更的 binlog写入到本地的 relay-log(中继日志)中;
3、sql 线程从 relay-log 中获取对应的 GTID,对比 slave 端的 binlog 的记录 ;
4、如果有记录,说明该 GTID 的事务已执行,slave 会忽略该 GTID;
5、如果没有记录,slave 会从 relay-log 中执行该 GTID 的事务,并记录到 binlog 中;

实验2与上一个实验需求基本相同经。master1 作为主mysql,master2 作为从mysql。

不同之处,使用了
“gtid_mode=ON
enforce_gtid_consistency=1”
该属性自动记录position位置。不需要手动指定了。

环境

在上一个实验的基础上

重置master2数据库

1. 清空master2数据库
[root@master2-24 ~]# systemctl stop mysqld
[root@master2-24 ~]# rm -rf /var/lib/mysql/*
[root@master2-24 ~]# rm -rf /var/log/mysqld.log2.启动数据库,重新获取临时密码,并且设定新的数据库密码
[root@master2-24 ~]# systemctl start mysqld
[root@master2-24 ~]# grep password /var/log/mysqld.log
2022-05-26T14:06:22.892911Z 1 [Note] A temporary password is generated for root@localhost: aHqO-6bUeW:d
[root@master2-24 ~]# mysqladmin -uroot -p'aHqO-6bUeW:d' password 'QazWsx@123'3.登陆数据库
[root@master2-24 ~]# mysql -uroot -p'QazWsx@123'

master1 主服务器

1.启动二进制日志,服务器ID,GTID master1

1.修改/etc/my.cnf配置文件 ,添加如下内容
vim /etc/my.cnf
log_bin
server-id=1
gtid_mode=ON     # 启用GTID模块
enforce_gtid_consistency=1     #强制GTID的一致性2.重启mysql
systemctl restart mysqld

2.授权复制用户rep (如果你实验一master1没有情况无需此操作)

grant replication slave,replication client on *.* to 'rep'@'192.168.122.%' identified by 'QianFeng@123';# 参数解释
grant  # 授权
replication  # 授予复制权限
*.*   # 所有库和所有表
rep     # 授权用户
192.168.31.%   # 该网段所有机器能够访问
by 'QazWsx@123'  # 指定该用户密码# 刷新数据库
flush privileges;

3.备份数据 master1

1.创建新的数据
mysql> create database master1;
Query OK, 1 row affected (0.00 sec)mysql> use master1;
Database changed
mysql> create table t1 (id int);
Query OK, 0 rows affected (0.00 sec)mysql> insert into t1 values(1);
Query OK, 1 row affected (0.01 sec)mysql> insert into t1 values(2);
Query OK, 1 row affected (0.01 sec)mysql> select * from master1.t1;
+------+
| id   |
+------+
|    1 |
|    2 |
+------+
2 rows in set (0.00 sec)2.备份数据
# master-data=2设置为2,已经不需要这个标记了。mysqldump -uroot -p'QazWsx@123' --all-databases --single-transaction  --master-data=2 --flush-logs > `date +%F`-mysql.sql.bak3.将备份文件发送到master2从服务器中
scp -r 2022-05-26-mysql.sql.bak  master2:~/
root@master2's password:
2022-05-26-mysql.sql.bak      100%  827KB  65.2MB/s   00:004. 模拟数据变化insert into  master1.t1 values(2);

master2 从服务器

1.测试一下rep用户是否可用 master2

1.远程登陆master1的数据库
# 此环节如果登陆报错,查看是否授权问题,还有防火墙是否关闭
mysql -h master1 -urep -p'QazWsx@123'

2.启动二进制日志,服务器ID,GTID master2

1.修改/etc/my.cnf配置文件 ,添加如下内容
vim /etc/my.cnf
log_bin
server-id=1
gtid_mode=ON     # 启用GTID模块
enforce_gtid_consistency=1     #强制GTID的一致性2.重启mysql
systemctl restart mysqld

3.手动恢复同步数据

# 在数据库中执行以下命令
mysql> set sql_log_bin=0;   # 临时关闭二进制日志文件,防止恢复数据被记录下来,是无用的mysql> source ~/2022-05-26-mysql.sql.bak   # 恢复备份文件数据# 验证一下是否恢复
mysql> select * from master1.t1;
+------+
| id   |
+------+
|    1 |
|    2 |
+------+
2 rows in set (0.00 sec)

4.设置主服务器(master2)

1. 设置master1为主服务器,master2为slave服务器# 这是该数据的主人,地址为master1    也可以写IP地址
mysql> change master to master_host='master1' , -> master_user='rep',       # 访问主数据库的用户为 rep-> master_password='QazWsx@123',     # 访问 密码-> master_auto_position=1;       # 与master1协商自动找到定位点
Query OK, 0 rows affected, 2 warnings (0.05 sec)# 此操作比第一次实验少了两行,不用手动添加定位点,GTID自动协商定位点2.开始运行/停止运行   stop slave;
mysql> start slave;   # 检查状态
mysql> show slave status\G;
*************************** 1. row ***************************Slave_IO_State: Waiting for master to send eventMaster_Host: master1Master_User: repMaster_Port: 3306Connect_Retry: 60Master_Log_File: master1-23-bin.000007Read_Master_Log_Pos: 446Relay_Log_File: master2-24-relay-bin.000002Relay_Log_Pos: 629Relay_Master_Log_File: master1-23-bin.000007Slave_IO_Running: YesSlave_SQL_Running: Yes

在主服务器(masger1)更新数据,查看从服务器(master2)是否同步

1. 现在从服务器(master2)更改前的数据
mysql> select * from master1.t1;
+------+
| id   |
+------+
|    1 |
|    2 |
|    2 |
+------+
3 rows in set (0.00 sec)2.切换到master1更新数据mysql> insert into master1.t1 values(3);
Query OK, 1 row affected (0.00 sec)mysql> insert into master1.t1 values(4);
Query OK, 1 row affected (0.00 sec)mysql> insert into master1.t1 values(5);
Query OK, 1 row affected (0.00 sec)3.切换到master2查看是否同步# 这是更新后的数据
mysql> select * from master1.t1;
+------+
| id   |
+------+
|    1 |
|    2 |
|    2 |
|    3 |
|    4 |
|    5 |
+------+
6 rows in set (0.00 sec)

mysql集群(主从复制)实操相关推荐

  1. 将MongoDB部署到分布式集群(实操)

    本教程前面的内容基本涵盖了 MongoDB 的基本知识,现在在单机环境下操作 MongoDB 已经不存在问题,但是单机环境只适合学习和开发测试,在实际的生产环境中,MongoDB 基本是以集群的方式工 ...

  2. mysql 集群 主从复制

    1.binlog日志,如果是多个数据库,binlog日志是不是也是分为多个日志? 2.binlog日志存储的路径在哪里? 3.常用的binlog模式,大家都是使用哪种? 1.statement lev ...

  3. MySQL集群(一)之主从复制

    前面学完了JDBC,接下来带大家感受一下MySQL集群!其实什么是MySQL集群?简单的说就是一群机器(服务器)的集合,它们连在一起来工作. 其实各种数据库都有自己的集群,常常的多: 我们要学习的就是 ...

  4. mysql集群一:主从复制,通过mysql-proxy做负载均衡

    mysql集群架构方式很多,根据不同的需求做不一样的架构,简单一点的就是mysql的replication,也就是Mysql的复制功能,模式有:master-slaves,master-slaves- ...

  5. mysql 集群操作系统_高性能MySQL集群详解(二)

    一.通过Keepalived搭建MySQL双主模式的高可用集群系统 1.MySQL Replication介绍: MySQL Replication是MySQL自身提供的一个主从复制功能,其实也就是一 ...

  6. haproxy keepalived_详解mycat+haproxy+keepalived搭建高可用负载均衡mysql集群

    概述 目前业界对数据库性能优化普遍采用集群方式,而oracle集群软硬件投入昂贵,mysql则比较推荐用mycat去搭建数据库集群,下面介绍一下怎么用mycat+haproxy+keepalived搭 ...

  7. mysql 集群_MySQL之PXC集群搭建

    一.PXC 介绍 1.1 PXC 简介 PXC 是一套 MySQL 高可用集群解决方案,与传统的基于主从复制模式的集群架构相比 PXC 最突出特点就是解决了诟病已久的数据复制延迟问题,基本上可以达到实 ...

  8. 「mysql优化专题」高可用性、负载均衡的mysql集群解决方案(12)

    不可避免的是,使用MySQL时随着时间的增长,用户量以及数据量的逐渐增加,访问量更是剧增,最终将会使MySQL达到某个瓶颈,那么MySQL的性能将会大大降低.怎么办?前面已经讲过十一篇优化方案,接下来 ...

  9. Mysql 集群双主双从安装使用详细讲解

    文章目录 下载Mysql 安装单机Mysql 配置Mysql集群 双Master配置 master1配置 master2配置 配置说明 双Slave配置 Slave1配置 Slave2配置 双 Mas ...

最新文章

  1. C++关键字union
  2. [计算机网络] C++模拟telnet登陆SMTP服务发送邮件过程
  3. QT5中实现多窗口切换,并从子窗口返回数据
  4. java 抽象工厂 类图_spring学习中常用到的工厂,抽象工厂学习 | 学步园
  5. 内网用户之间使用MSN Messenger快速传送文件的小窍门
  6. 修改value_Python | 快速修改或命名N个文件夹名称,你会吗?
  7. [MSSQL]COALESCE与ISNULL函数
  8. Qt学习之路_6(Qt局域网聊天软件)
  9. ubuntu 12.04 安装Docker 实战
  10. Atitit 变量类型系统 目录 1. 通用类型系统 (Common Type System) 1 1.1. CTS 的类型[编辑] 1 2. CLR支持两种基本类型:值类型和引用类型。因此,还是把
  11. 西安80北京54,2000和WGS84互转C#程序
  12. 【搬运】各种知乎段子
  13. 图形推理的50大规律
  14. 原生JavaScript + Canvas实现图片局部放大器
  15. 计算机网站之TCP报文结构
  16. 鸿蒙天钟壁纸,鸿蒙2.0桌面小工具时钟,日历显示不出来
  17. linux环境下如何重装系统,详细教你linux电脑系统怎么安装
  18. Notification基本通知的两种写法
  19. sweetalert加载弹窗定时自动关闭
  20. matlab spline三次样条插值x,Spline(三次样条插值)

热门文章

  1. BOS打开单据的时候出现:无法解决 equal to 运算中 “Chinese_PRC_CS_AS“ 和 “Chinese_PRC_CI_AS“ 之间的排序规则冲突。
  2. Android Studio 模拟器无法显示的情况 这篇文章可以说是很好的解决了我的问题~
  3. 数据结构课程设计预习报告
  4. 设计模式---中介者模式
  5. du:命令是对文件和目录磁盘使用的空间的查看
  6. 圆锥的体积为什么是圆柱的三分之一?
  7. 华为ensp模拟器实验:端口安全绑定MAC地址ip地址
  8. cv.putText()函数几种字体试验
  9. Hive--hive一种通用的上亿级别的去重方法
  10. 旁观电子商务——运费之争背后的价格战