数据库应用——MySQL集群

本文详细介绍了MySQL集群的用途,包括负载均衡、高可用性和远程灾备。阐述了MySQL集群的无共享架构和数据一致性保障机制。通过实例演示了一主一从、一主一从自动和双主双从的配置过程,涉及主从同步、GTID、服务器ID等关键配置,并进行了数据同步测试,确保集群的正确运行。
摘要由CSDN通过智能技术生成

MySQL复制技术

使用集群的目的是?

  • 负载均衡:解决高并发
  • 高可用HA:服务可用性
  • 远程灾备:数据有效性

什么是MySQL集群?

  • MySQL集群是一个无共享的(shared-nothing)、分布式节点架构的存储方案,其目的是提供容错性和高性能。
  • 数据更新使用读已提交隔离级别(read-committedisolation)来保证所有节点数据的一致性,使用两阶段提交机制(two-phasedcommit)保证所有节点都有相同的数据(如果任何一个写操作失败,则更新失败)
  • 无共享的对等节点使得某台服务器上的更新操作在其他服务器上立即可见。传播更新使用一种复杂的通信机制,这一机制专用来提供跨网络的高吞吐量。
  • 通过多个MySQL服务器分配负载,从而最大程序地达到高性能,通过在不同位置存储数据保证高可用性和冗余。

在这里插入图片描述在这里插入图片描述
概念

  • 在主库上把数据更改(DDL DML DCL)记录到二进制日志(Binary Log)中
  • 备库I/O线程将主库上的日志复制到自己的中继日志(Relay Log)中
  • 备库SQL线程读取中继日志中的事件,将其重放到备库数据库之上

集群案例

一、集群环境准备

  • 五台全新服务器-互相通信
  • 全新安装MySQL57-分别安装 每一台数据库都有自己独立的编号独一无二
  • 配置域名解析

其中Mycat 为下一个实验的域名解析与本次实验无关

五台服务器分别为:

  • mysql0.sixeleven.com 192.168.100.254
  • mysql1.sixeleven.com 192.168.100.253
  • mysql2.sixeleven.com 192.168.100.252
  • mysql3.sixeleven.com 192.168.100.251
  • mycat 192.168.100.250
  • 域名解析可以使用hosts文件形式,也可以使用DNS解析

mysql0和mysql1 为master

mysql2和mysql3 为slave

#使用Xshell的发送键到所有会话功能
[root@mysql0 ~]# vim /etc/hosts
192.168.100.254 mysql0.sixeleven.com
192.168.100.253 mysql1.sixeleven.com
192.168.100.252 mysql2.sixeleven.com
192.168.100.251 mysql3.sixeleven.com
192.168.100.250 mycat

二、一主一从(M-S)手动

2.1 主服务器配置

master1 192.168.100.254

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

在这里插入图片描述

二、主服务器开启二进制日志

[root@mysql0 ~]# vim /etc/my.cnf
[mysqld]
log_bin
server-id=1                                 #开启二进制文件并标识为 1 号服务器
[root@mysql0 ~]# systemctl restart mysqld   #配置完成后重启服务器并检查是否开启成功

三、创建复制用户

[root@mysql0 ~]# mysql -uroot -p'Pakho@611'
mysql> grant replication slave,replication client on *.* to 'rep'@'192.168.100.%' identified by 'Pakho@0403';
#该动作并不是集群中必要的动作,是一次授权行为,该账户仅用于集群同步时使用
#replication:复制
mysql> \q
Bye

四、备份数据库中的数据

[root@mysql0 ~]# mysqldump -p'Pakho@611' --all-databases --single-transaction --master-data=2 --flush-logs > `date +%F`-mysql-all.sql

详解参考 MySQL备份

五、将备份文件拷贝至从主服务器

master2 192.168.100.253

[root@mysql0 ~]# scp -r 2021-06-05-mysql-all.sql mysql1.sixeleven.com:/tmp

六、观察二进制日志分割点

[root@mysql1 ~]# vim /tmp/2021-06-05-mysql-all.sql
...
 22 -- CHANGE MASTER TO MASTER_LOG_FILE='mysql0-bin.000002', MASTER_LOG_POS=154;
...

七、更新主服务器数据(验证主从同步使用)

[root@mysql0 ~]# mysql -uroot -p'Pakho@611'
mysql> insert into master1db.master1tab values (33333);
mysql> insert into master1db.master1tab values (44444);

在这里插入图片描述

2.2 从服务器配置

一、测试rep账户是否可用

[root@mysql1 ~]# mysql -urep -p'Pakho@0403' -h mysql0.sixeleven.com  #-h指登陆点

二、启动服务器序号

[root@mysql1 ~]# vim /etc/my.cnf
[mysqld]
server-id=2                                 #服务器ID为2号
[root@mysql1 ~]# systemctl restart mysqld
[root@mysql1 ~]# mysql -uroot -p'Pakho@611' #测试服务器是否修改正确,能否正常登陆   

三、手动同步数据

mysql> set sql_log_bin=1;                    #暂停日志二进制
mysql> source /tmp/2021-06-05-mysql-all.sql; #读取数据至服务器

四、设置对应主服务器

mysql> change master to master_host='mysql0.sixeleven.com'#改变主服务器
	-> master_user='rep',                                 #拷贝时所使用的用户
	-> master_password='Pakho@0403',                      #rep账号的密码
	-> master_log_file='mysql0-bin.000002',               #从哪儿拷贝,参考备份文件22行
	-> master_log_pos=154;                                #从第154条记录开始拷贝

五、启动从设备

mysql> start slave;                                       #启动从服务器

六、测试

在主服务器上更新数据,在从服务器上查看,发现数据已同步更新

七、查看启动状态(IO-YES/SQL-YES)

master2 192.168.100.253

mysql> show slave status\G

在这里插入图片描述

三、一主一从(M-S)自动

前面步骤与手动基本相同

3.1 解决实验1的环境

192.168.100.253

[root@mysql1 ~]# systemctl stop mysqld
[root@mysql1 ~]# rm -rf /var/lib/mysql/*
[root@mysql1 ~]# systemctl start mysqld
[root@mysql1 ~]# grep password /var/log/mysqld.log
[root@mysql1 ~]# mysqladmin -uroot -p'dyHZF4qllf-H' password 'Pakho@611'

3.2 主服务器配置

192.168.100.254

一、启动二进制日志,服务器ID,GTID

[root@mysql0 ~]# vim /etc/my.cnf
[mysqld]
log_bin
server-id=1                                #基于刚才的两行添加如下配置
gtid_mode=ON                               #GTID开启
enforce_gtid_consistency=1                 #开启自动协商ID
[root@mysql0 ~]# systemctl restart mysqld  #重启以使配置生效

二、授权复制用户rep(同上)

三、备份数据

环境清理 192.168.100.254

[root@mysql0 ~]# rm -rf 2021-06-05-mysql-all.sql  #清除上一实验备份的数据

环境清理 192.168.100.253

[root@mysql1 ~]# rm -rf /tmp/2021-06-05-mysql-all.sql
[root@mysql0 ~]# mysqldump -p'Pakho@611' --all-databases --single-transaction --master-data=2 --flush-logs > `date +%F-%H`-mysql-all.sql
[root@mysql0 ~]# scp -r 2021-06-05-10-mysql-all.sql  mysql1.sixeleven.com:/tmp

四、模拟数据变化

[root@mysql0 ~]# mysql -uroot -p'Pakho@611' -e 'insert into master1db.master1tab values(6666666666666666)'

3.3 从服务器配置

192.168.100.253

一、测试rep用户是否可用

[root@mysql1 ~]# mysql -urep -p'Pakho@0403' -h mysql0.sixeleven.com

二、启动二进制日志,服务器ID,GTID

[root@mysql1 ~]# vim /etc/my.cnf
[mysqld]
log_bin
server-id=2
gtid_mode=ON
enforce_gtid_consistency=1
[root@mysql1 ~]# systemctl restart mysqld

三、手动恢复数据

[root@mysql1 ~]# mysql -uroot -p'Pakho@611'
mysql> set sql_log_bin=0;
mysql> source /tmp/2021-06-05-10-mysql-all.sql

四、设置对应主服务器

mysql> change master to
    -> master_host='mysql0.sixeleven.com',
    -> master_user='rep',
    -> master_password='Pakho@0403',
    -> master_auto_position=1;                  #自动进行位置记录

五、启动从设备

mysql> start slave;                             #启动从服务器

六、查看启动状态

mysql> show slave status\G

在这里插入图片描述

四、双主双从(MM-SS)

4.1 双主服务器配置

前言

  • 前面的实验,主服务器单节点设置,假如主服务器故障会影响全局的写入事件,故设置双主
  • 目前已经设置 mysql0 为 mysql1 的主服务器
  • 只需要设置 mysql1 为 mysql0 的主服务器

设置mysql1 为mysql0的主服务器

一、在 mysql1 上进行授权

192.168.100.253

mysql> grant replication slave,replication client on *.* to 'rep'@'192.168.100.%' identified by 'Pakho@0403';
mysql> flush privileges;
#基于刚才实验的二进制日志以及GTID

二、设置 mysql0 的主服务器

192.168.100.254

[root@mysql0 ~]# mysql -uroot -p'Pakho@611'
mysql> change master to
    -> master_host='mysql1.sixeleven.com',
    -> master_user='rep',
    -> master_password='Pakho@0403',
    -> master_auto_position=1;               #master和slave自动对应二进制日志的位置
mysql> start slave;                          #启动从服务器
mysql> show slave status\G;                 

在这里插入图片描述
三、测试

测试一:mysql0插入数据,在mysql1上查看

#mysql0
mysql> insert into master1db.master1tab values (7777);

在这里插入图片描述

测试二:mysql1上插入数据,在mysql0上查看

#mysql1
mysql> insert into master1db.master1tab values (8888);

在这里插入图片描述
双方同步成功,双主设置完成!

4.2 双从服务器配置

一、同步现有数据库

mysql2.sixeleven.com 192.168.100.252
mysql3.sixeleven.com 192.168.100.251

[root@mysql0 ~]# mysqldump -p'Pakho@611' --all-databases --single-transaction --master-data=2 --flush-logs > mmss-mysql-all.sql
[root@mysql0 ~]# scp -r mmss-mysql-all.sql mysql2.sixeleven.com:/tmp
[root@mysql0 ~]# scp -r mmss-mysql-all.sql mysql3.sixeleven.com:/tmp

二、从服务器数据还原

slave

# mysql2
[root@mysql2 ~]# mysql -uroot -p'Pakho@611' </tmp/mmss-mysql-all.sql
# mysql3
[root@mysql3 ~]# mysql -uroot -p'Pakho@611' </tmp/mmss-mysql-all.sql

三、启动从服务器ID,GTID

从服务器没必要开启二进制日志

slave
mysql2 :192.168.100.252

[root@mysql2 ~]# vim /etc/my.cnf
[mysqld]
server-id=3
gtid_mode=ON
enforce_gtid_consistency=1
master-info-repository=TABLE      #将主服务器的信息存在表 更安全
relay-log-info-repository=TABLE   #把中继日志也存在表里 更安全
[root@mysql2 ~]# systemctl restart mysqld

mysql3 :192.168.100.251

[root@mysql3 ~]# vim /etc/my.cnf
[mysqld]
server-id=4
gtid_mode=ON
enforce_gtid_consistency=1
master-info-repository=TABLE
relay-log-info-repository=TABLE
[root@mysql3 ~]# systemctl restart mysqld

四、为从服务器设置主服务器

mysql2 :192.168.100.252

[root@mysql2 ~]# mysql -uroot -p'Pakho@611'
mysql> change master to
    -> master_host='mysql0.sixeleven.com',
    -> master_user='rep',
    -> master_password='Pakho@0403',
    -> master_auto_position=1
    -> for channel 'mysql0.sixeleven.com';  #第一通道
mysql> change master to
    -> master_host='mysql1.sixeleven.com',
    -> master_user='rep',
    -> master_password='Pakho@0403',
    -> master_auto_position=1
    -> for channel 'mysql1.sixeleven.com';  #第二通道
mysql> start slave;
mysql> show slave status\G

mysql3 :192.168.100.251

[root@mysql3 ~]# mysql -uroot -p'Pakho@611'
mysql> change master to
    -> master_host='mysql0.sixeleven.com',
    -> master_user='rep',
    -> master_password='Pakho@0403',
    -> master_auto_position=1
    -> for channel 'mysql0.sixeleven.com';
mysql> change master to
    -> master_host='mysql1.sixeleven.com',
    -> master_user='rep',
    -> master_password='Pakho@0403',
    -> master_auto_position=1
    -> for channel 'mysql1.sixeleven.com';
mysql> start slave;
mysql> show slave status\G

五、测试

mysql0 插入数据

[root@mysql0 ~]# mysql -uroot -p'Pakho@611' -e 'insert into master1db.master1tab values (20)';

mysql1 插入数据

[root@mysql1 ~]# mysql -uroot -p'Pakho@611' -e 'insert into master1db.master1tab values (21)';

插入数据后分别进入从服务器查看数据,实验完成!

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

611#

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值