MySQL——MySQL集群

Posted Pakho`

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了MySQL——MySQL集群相关的知识,希望对你有一定的参考价值。

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)';

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

以上是关于MySQL——MySQL集群的主要内容,如果未能解决你的问题,请参考以下文章

如何利用redis来进行分布式集群系统的限流设计

从mysql的片段中加载ListView

eggjs中egg-mysql不支持mysql集群,代码修改为支持集群

eggjs中egg-mysql不支持mysql集群,代码修改为支持集群

连接MySQL出现错误:ERROR 1045 (28000): Access denied for user ‘root‘@‘localhost‘ (using password: YES)(代码片段

关于mysql驱动版本报错解决,Cause: com.mysql.jdbc.exceptions.jdbc4Unknown system variable ‘query_cache_size(代码片段