当前位置: 首页 > news >正文

mysql集群技术

一、Mysql 在服务器中的部署方法 

mysql5.7的版本是比较多的

官网:http://www.mysql.com

1.1、在Linux下部署mysql 

安装:rhel7.9(两个) 

mysql-node1:172.25.254.10

mysql-node2:172.25.254.20

1.1.1、安装依赖性

[root@mysql-node1 ~]# dnf install cmake gcc-c++ openssl-devel ncurses-devel.x86_64 libtirpc-devel-1.3.3-8.el9_4.x86_64.rpm rpcgen.x86_64 

1.1.2、下载并解压源码包 

wget https://downloads.mysql.com/archives/get/p/23/file/mysql-boost-5.7.44.tar.gz[root@mysql-node1 ~]# wget https://downloads.mysql.com/archives/get/p/23/file/mysql-boost-5.7.44.tar.gz

可以通过这个链接下载,或者直接Windows上下载后上传

[root@mysql-node1 ~]# tar zxf mysql-boost-5.7.44.tar.gz

[root@mysql-node1 ~]# cd /root/mysql-5.7.44 

1.1.3、源码编译安装mysql 

[root@mysql-node1 mysql-5.7.44]# cmake -DCMAKE_INSTALL_PREFIX=/usr/local/mysql -DMYSQL_DATADIR=/data/mysql -DMYSQL_UNIX_ADDR=/data/mysql/mysql.sock -DWITH_INNOBASE_STORAGE_ENGINE=1 -DWITH_EXTRA_CHARSETS=all -DDEFAULT_CHARSET=utf8mb4 -DDEFAULT_COLLATION=utf8mb4_unicode_ci -DWITH_BOOST=/root/mysql-5.7.44/boost/boost_1_59_0/

[root@mysql-node1 mysql-5.7.44]# make -j2         #-j2 表示有几个 核心就跑几个进程(这个肯会久一点)

[root@mysql-node1 mysql-5.7.44# make install

注:当cmake出错后如果想重新检测,删除 mysql-5.7.44 中 CMakeCache.txt即可

1.1.4、部署mysql

两个都需要做这些配置 

1、创建用户,建立用户目录,给权限

[root@mysql ~]# useradd -s /sbin/nologin -M mysql
[root@mysql ~]# mkdir -p /data/mysql
[root@mysql ~]# chown mysql.mysql /data/mysql/

2、生成配置文件
[root@mysql local]# vim /etc/my.cnf

[mysqld]
datadir=/data/mysql
socket=/data/mysql/mysql.sock
symbolic-links=0
 

3、配置环境变量
[root@mysql local]# vim ~/.bash_profile
[root@mysql local]# source ~/.bash_profile

4、生成启动脚本

[root@mysql ~]# cd /usr/local/mysql/support-files/
[root@mysql support-files]# ls
magic  mysqld_multi.server  mysql-log-rotate  mysql.server
[root@mysql support-files]# cp mysql.server /etc/init.d/mysqld

5、数据库的数据初始化
[root@mysql local]# mysqld --user=mysql --initialize
这个生成的文件一定记住里面的初始密码。

6、启动
[root@mysql support-files]# /etc/init.d/mysqld start
Starting MySQL.Logging to '/data/mysql/mysql.timingzpy.org.err'.
. SUCCESS!

开机自启
[root@mysql support-files]# yum install chkconfig -y
[root@mysql support-files]# chkconfig mysqld on

7、用初始密码登录,看看密码是否复制正确
[root@mysql ~]# mysql -uroot -pwy23>#hE=?.X

现在进来必须改一次密码

也就是做一次mysql的安全初始化
[root@mysql ~]# mysql_secure_installation

这个里面的选择可以根据自己的需求去选择

这样就算配置完成了。

测试:

二、mysql的组从复制

我这里用172.25.254.10的服务器做主,172.25.254.20的做从 

2.1、配置master

[root@mysql-node1 ~]# vim /etc/my.cnf

[mysqld]
datadir=/data/mysql
socket=/data/mysql/mysql.sock
symbolic-links=0
server-id=10                #编写ID来区分这两个MySQL

log-bin=mysql-bin                #开启二进制日志
[root@mysql-node1 ~]# /etc/init.d/mysqld restart        #重启,使文件生效

这个二进制日志会生成在 /data/mysql/里面

这个日志的作用是记录我们的动作,然后将这个动作复制给20 ,然后就在20 也可以看见了


[root@mysql-node1 ~]# mysql -uroot -p123456 -e "select @@server_id"        #查看id

进入MySQL,配置用户权限

[root@mysql-node1 ~]# mysql -p123456

#生成专门用来做复制的用 户,此用户是用于slave端做认证用

mysql> create user 're'@'%' identified by 'zpy';

#对这个用户进行授权

mysql> grant replication slave on *.* to re@'%';
#查看master的状态

mysql> show master status;

2.2、配置slave

[root@mysql-node2 ~]# vim /etc/my.cnf

[mysqld]
datadir=/data/mysql
socket=/data/mysql/mysql.sock
symbolic-links=0
server-id=20

#因为不需要将动作复制给别人,所以可以不开日志功能
[root@mysql-node2 ~]# /etc/init.d/mysqld restart

进入mysql,同步10的数据

[root@mysql-node2 ~]# mysql -p123456

mysql> change master to master_host='172.25.254.10',master_user='re',master_password='zpy',master_log_file='mysql-bin.000001',master_log_pos=154;
Query OK, 0 rows affected, 2 warnings (0.01 sec)
 

开启主从复制

mysql> start slave;
Query OK, 0 rows affected (0.01 sec)
 

查看

测试:

在mysql-node1上:

mysql> create database zpy;

mysql> create table zpy.userlist (
    -> username varchar(20) not null,
    -> password varchar(20) not null
    -> );

mysql> insert into zpy.userlist values ('zpy','123');

在mysql-node2上可以直接查看到和mysql-node1上一样的数据

 但在node2上添加数据,node1上看不到。会造成数据不一致。所以20上不能写入数据。

node2上:

node1上:

2.3、当有数据时添加slave2 

可以直接从前面的服务器中将安装好的MySQL发送过来就可以了

[root@mysql-node2 local]# rsync -al -r mysql/ root@172.25.254.30:/usr/local/mysql/
root@172.25.254.30's password:
后再做上面的配置

[root@mysql-node3 local]# useradd -s /sbin/nologin -M mysql
[root@mysql-node3 local]# mkdir /data/mysql -p
[root@mysql-node3 local]# chown mysql.mysql -R /data/mysql
[root@mysql-node3 local]# cd /usr/local/mysql/support-files/
[root@mysql-node3 support-files]# cp mysql.server /etc/init.d/mysqld
[root@mysql-node3 support-files]# vim /etc/my.cnf

[mysqld]
datadir=/data/mysql
socket=/data/mysql/mysql.sock
symbolic-links=0
server-id=30
[root@mysql-node3 support-files]# vim ~/.bash_profile
[root@mysql-node3 support-files]# source ~/.bash_profile
[root@mysql-node3 ~]# mysqld --user=mysql --initialize

[root@mysql-node3 ~]# /etc/init.d/mysqld start

[root@mysql-node3 ~]# yum install chkconfig -y
[root@mysql-node3 ~]# chkconfig mysqld on

[root@mysql-node3 ~]# mysql -uroot -p
[root@mysql-node3 ~]# mysql_secure_installation
[root@mysql-node3 ~]# mysql -uroot -p123456

#从master节点备份数据 

 [root@mysql-node1 ~]# mysqldump -uroot -p123456 zpy > zpy.sql

[root@mysql-node1 ~]# rsync -al zpy.sql root@172.25.254.30:/mnt/

 #利用master节点中备份出来的zpy.sql在slave2中拉平数据

[root@mysql-node3 mnt]# mysql -uroot -p123456 zpy < zpy.sql
[root@mysql-node3 mnt]# mysql -uroot -p123456

mysql> change master to master_host='172.25.254.10',master_user='re',master_password='zpy',master_log_file='mysql-bin.000005',master_log_pos=154;
Query OK, 0 rows affected, 2 warnings (0.02 sec)

开启

mysql> start slave;

mysql> show slave status\G;

测试:

2.4、延迟复制

在node3上做:

联机设置延迟复制时,需要先停止sql_thread线程

mysql> stop slave sql_thread;

mysql> change master to master_delay=60;

mysql> start slave sql_thread;

mysql> show slave status;

对比:

测试:

如果node1误删了数据

node3任然是之前的数据,60s后才同步

2.5、慢查询日志

在node1上做,其他slave上也就都有了

 [mysqld]
datadir=/data/mysql
socket=/data/mysql/mysql.sock
symbolic-links=0
server-id=10
log-bin=mysql-bin

slow_query_log=on                #慢查询

但是这个需要重启生效,但数据库不能重启。

如果想要立即生效就需要

mysql> set global slow_query_log=ON;
查询时间超过10S就算慢查询

mysql> show variables like "long%";
+-----------------+-----------+
| Variable_name   | Value     |
+-----------------+-----------+
| long_query_time | 10.000000 |
+-----------------+-----------+
1 row in set (0.01 sec)

慢查询日志开启

mysql> SHOW VARIABLES like "slow%";
+---------------------+----------------------------------+
| Variable_name       | Value                            |
+---------------------+----------------------------------+
| slow_launch_time    | 2                                |
| slow_query_log      | ON                               |
| slow_query_log_file | /data/mysql/mysql-node1-slow.log |
+---------------------+----------------------------------+
3 rows in set (0.00 sec)

测试慢查询 

mysql> select sleep (10);
+------------+
| sleep (10) |
+------------+
|          0 |
+------------+
1 row in set (10.00 sec)

慢查询日志

2.6、mysql的并行复制

比如腾讯充q币,结果一查没有到账的话是不行的,所以需要做并行复制。  

因为node3上做了延迟复制,所以我现在在node2上做

[root@mysql-node2 ~]# vim /etc/my.cnf

[mysqld]
datadir=/data/mysql
socket=/data/mysql/mysql.sock
symbolic-links=0
server-id=20
super_read_only=on
gtid_mode=ON
enforce-gtid-consistency=ON
slave-parallel-type=LOGICAL_CLOCK                #基于组提交
slave-parallel-workers=6                #开启线程数量
master_info_repository=TABLE                #master信息在表中记录,默认记录
relay_log_info_repository=TABLE                #回放日志信息在表中记录,默认记录
relay_log_recovery=ON                #日志回放恢复功能开启

[root@mysql-node2 ~]# /etc/init.d/mysqld restart
Shutting down MySQL.. SUCCESS!
Starting MySQL.. SUCCESS!

 此时sql线程转化为协调线程,6个worker负责处理sql协调线程发送过来的处理请求

2.7、原理刨析 

三个线程 实际上主从同步的原理就是基于 binlog 进行数据同步的。在主从复制过程中,会基于3 个线程来操作, 一个主库线程,两个从库线程。

  • 二进制日志转储线程(Binlog dump thread)是一个主库线程。当从库线程连接的时候, 主库可以 将二进制日志发送给从库,当主库读取事件(Event)的时候,会在 Binlog 上加锁,读取完成之 后,再将锁释放掉。
  • 从库 I/O 线程会连接到主库,向主库发送请求更新 Binlog。这时从库的 I/O 线程就可以读取到主库 的二进制日志转储线程发送的 Binlog 更新部分,并且拷贝到本地的中继日志 (Relay log)。
  • 从库 SQL 线程会读取从库中的中继日志,并且执行日志中的事件,将从库中的数据与主库保持同 步。

复制三步骤 步骤

  1. Master将写操作记录到二进制日志(binlog)。
  2. Slave将Master的binary log events拷贝到它的中继日志(relay log);
  3. Slave重做中继日志中的事件,将改变应用到自己的数据库中。 MySQL复制是异步的且串行化 的,而且重启后从接入点开始复制。 

2.8、架构缺陷

  • 主从架构采用的是异步机制
  • master发日志和存入磁盘是分开的动作。
  • master更新完成后直接发送二进制日志到slave,但是slaves是否真正保存了数据master端不会检测,也就是slave有没有收到,master是不关心的。

所以可能

当master端到slave端的网络出现问题时或者master端直接挂掉,二进制日志可能根本没有到达slave master出现问题slave端接管master,这个过程中数据就丢失了

三、半同步模式

3.1、半同步模式原理

  1. 用户线程写入完成后master中的dump会把日志推送到slave端
  2. slave中的io线程接收后保存到relaylog中继日志
  3. 保存完成后slave向master端返回ack
  4. 在未接受到slave的ack时master端时不做提交的,一直处于等待当收到ack后提交到存储引擎
  5. 在5.6版本中用到的时after_commit模式,after_commit模式时先提交在等待ack返回后输出ok

3.2、gtid模式

当激活GITD之后 当master出现问题后,slave2和master的数据最接近,会被作为新的master slave1指向新的master,但是他不会去检测新的master的pos id,只需要继续读取自己gtid_next即可

[root@mysql-node1 ~]# mysqlbinlog -vv /data/mysql/mysql-bin.000006

设置gtid

#在master端和slave端开启gtid模式

[root@mysql-node1 ~]# vim /etc/my.cnf

[mysqld]
datadir=/data/mysql
socket=/data/mysql/mysql.sock
symbolic-links=0
server-id=10
gtid_mode=ON
enforce-gtid-consistency=ON
log-bin=mysql-bin
[root@mysql-node1 ~]# /etc/init.d/mysqld restart

node2/node3:

[root@mysql-node2 ~]# vim /etc/my.cnf

[mysqld]
datadir=/data/mysql
socket=/data/mysql/mysql.sock
symbolic-links=0
server-id=20
gtid_mode=ON
enforce-gtid-consistency=ON
[root@mysql-node2 ~]# /etc/init.d/mysqld restart
#停止slave端(node2,node3)

mysql> stop slave;
Query OK, 0 rows affected (0.00 sec)
 

#开启slave端的gtid(node2,node3)

mysql> change master to master_host='172.25.254.10',master_user='re',master_password='zpy',master_auto_position=1;
mysql> start slave;

3.3、启用半同步模式

在master端配置启用半同步模式

[root@mysql-node1 ~]# vim /etc/my.cnf

[mysqld]
datadir=/data/mysql
socket=/data/mysql/mysql.sock
symbolic-links=0
server-id=10
gtid_mode=ON
enforce-gtid-consistency=ON
log-bin=mysql-bin
rpl_semi_sync_master_enabled=1        #开启半同步功能


[root@mysql-node1 ~]# mysql -p123456

#安装半同步插件
mysql> INSTALL PLUGIN rpl_semi_sync_master SONAME 'semisync_master.so';

#查看插件情况
mysql> SELECT PLUGIN_NAME, PLUGIN_STATUS
    -> FROM INFORMATION_SCHEMA.PLUGINS
    -> WHERE PLUGIN_NAME LIKE '%semi%';

#打开半同步功能
mysql> SET GLOBAL rpl_semi_sync_master_enabled = 1;

#查看半同步功能状态
mysql> SHOW VARIABLES LIKE 'rpl_semi_sync%';


mysql> SHOW STATUS LIKE 'Rpl_semi_sync%';

mysql> show plugins

在slave端开启半同步功能(node2,node3)

 [root@mysql-node2 ~]# vim /etc/my.cnf

[mysqld]
datadir=/data/mysql
socket=/data/mysql/mysql.sock
symbolic-links=0
server-id=10
gtid_mode=ON
enforce-gtid-consistency=ON
rpl_semi_sync_master_enabled=1        #开启半同步功能
[root@mysql-node2 ~]# mysql -p123456

#安装半同步插件

mysql> INSTALL PLUGIN rpl_semi_sync_slave SONAME 'semisync_slave.so';

#打开半同步功能
mysql> SET GLOBAL rpl_semi_sync_slave_enabled =1;

#重启io线程,半同步才能生效
mysql> STOP SLAVE IO_THREAD;
mysql> START SLAVE IO_THREAD;

#查看半同步功能状态
mysql> SHOW VARIABLES LIKE 'rpl_semi_sync%';

mysql> SHOW STATUS LIKE 'Rpl_semi_sync%';

测试:

在master端写入数据

 模拟故障:

#在slave端(node2,node3)

mysql> STOP SLAVE IO_THREAD;
Query OK, 0 rows affected (0.00 sec)

#在master端插入数据

#10秒超时

四、mysql高可用之组复制 (MGR)

4.1组复制流程

4.2 组复制单主和多主模式

4.3.实现mysql组复制

在做一下操作之前,首先做好域名解析

需要配置的虚拟机都要做全部的域名解析,每个虚拟的域名对应好,不然最后会报错。

如果域名错误,最后面select出来,状态不对,为RECOVERING。不可写入,也读取不到。需要将域名改对再重新初始化。

1、编辑主配置文件: 

node1,2,3:

[root@mysql-node1 ~]# vim /etc/my.cnf

[mysqld]
datadir=/data/mysql
socket=/data/mysql/mysql.sock
symbolic-links=0
server-id=10                #在node1上写10,node2上写20,node3上写30
gtid_mode=ON
enforce-gtid-consistency=ON
log_bin=binlog
disabled_storage_engines="MyISAM,BLACKHOLE,FEDERATED,ARCHIVE,MEMORY"
master_info_repository=TABLE
relay_log_info_repository=TABLE
binlog_checksum=NONE
log_slave_updates=ON
binlog_format=ROW
plugin_load_add='group_replication.so'
transaction_write_set_extraction=XXHASH64
group_replication_group_name="aaaaaaaa-aaaa-aaaa-aaaa-aaaaaaaaaaaa"
group_replication_start_on_boot=off
group_replication_local_address="172.25.254.10:33061"        #这条同上,其他一样
group_replication_group_seeds="172.25.254.10:33061,172.25.254.20:33061,172.25.254.30:33061"
group_replication_ip_whitelist="172.25.254.0/24,127.0.0.1/8"
group_replication_bootstrap_group=off
group_replication_single_primary_mode=OFF
group_replication_enforce_update_everywhere_checks=ON
group_replication_allow_local_disjoint_gtids_join=1

 2、初始化

[root@mysql-node2 ~]# /etc/init.d/mysqld stop
[root@mysql-node2 ~]# rm -rf /data/mysql/*
[root@mysql-node2 ~]#  mysqld --user=mysql --initialize
[root@mysql-node2 ~]# /etc/init.d/mysqld start

再用初始化密码登录
[root@mysql-node2 ~]# mysql -uroot -p')ihlpkjQ+1VQ'

改密码
mysql> alter user root@localhost identified by 'zpy';
就完成了

3、配置sql 

进入MySQL

node1上:

mysql> alter user root@localhost identified by 'zpy';

mysql> SET SQL_LOG_BIN=0;

mysql> create user repl@'%' identified by 'zpy';

mysql> grant replication slave on *.* to repl@'%';

mysql> flush privileges;

mysql> set sql_log_bin=1;

mysql> change master to master_user='repl',master_password='zpy'for channel 'gr     oup_relication_recovery';

mysql> set global group_replication_bootstrap_group=ON;

mysql> START GROUP_REPLICATION;

mysql> set global group_replication_bootstrap_group=OFF;
node2,node3上

mysql> alter user root@localhost identified by 'zpy';

mysql> SET SQL_LOG_BIN=0;

mysql> create user repl@'%' identified by 'zpy';

mysql> grant replication slave on *.* to repl@'%';

mysql> set sql_log_bin=1;

mysql> change master to master_user='repl',master_password='zpy'for channel 'gr     oup_relication_recovery';

mysql> START GROUP_REPLICATION;

mysql> SELECT * FROM performance_schema.replication_group_members;
+---------------------------+--------------------------------------+---------------------------+---------+--------------+
| CHANNEL_NAME              | MEMBER_ID                            | MEMBER_HOST               | MEMBORT | MEMBER_STATE |
+---------------------------+--------------------------------------+---------------------------+---------+--------------+
| group_replication_applier | 6d0214fa-62eb-11ef-8c74-000c2988e711 | mysql-node2.timingzpy.org |     306 | ONLINE       |
| group_replication_applier | 7588c1a4-62ec-11ef-9da5-000c290fa332 | mysql-node3.timingzpy.org |     306 | ONLINE       |
| group_replication_applier | d63c4d01-62ea-11ef-97ec-000c2960190a | mysql-node1.timingzpy.org |     306 | ONLINE       |
+---------------------------+--------------------------------------+---------------------------+---------+--------------+
3 rows in set (0.01 sec)

测试:

在每个节点都可以完成读写

 

五 mysql-router(mysql路由)

在node1上安装软件

我是直接上传然后安装的

[root@mysql-node1 ~]# ls
anaconda-ks.cfg       Music                                          Pictures
Desktop               mysql-5.7.44                                   Public
Documents             mysql-boost-5.7.44.tar.gz                      Templates
Downloads             mysql-router-community-8.4.0-1.el7.x86_64.rpm  Videos
initial-setup-ks.cfg  passwd                                         zpy.sql
[root@mysql-node1 ~]# rpm -ivh mysql-router-community-8.4.0-1.el7.x86_64.rpm

查看文件

[root@mysql-node1 ~]# rpm -ql mysql-router-community

配置mysql-router

添加

[routing:ro]
bind_address = 0.0.0.0
bind_port = 7001
destinations = 172.25.254.10:3306,172.25.254.20:3306,172.25.254.30:3306
routing_strategy = round-robin

测试:

在node2,node3上创建远程连接用户

mysql> create user repl@'%' identified by 'zpy';

mysql> grant all on repl.* to repl@'%';

在node1上远程连接

[root@mysql-node1 ~]#  mysql -urepl -pzpy -h 172.25.254.10 -P 7001

进入查看id,后退出,再进入再查看id,就不一样了。就是实现了负载均衡,轮训调度

六、mysql高可用之MHA

6.1、MHA概述

6.2、MHA部署实施

6.2.1、搭建主从架构

#在master节点中

[root@mysql-node1 ~]# cat /etc/my.cnf

[mysqld]
datadir=/data/mysql
socket=/data/mysql/mysql.sock
symbolic-links=0
server-id=10
log-bin=mysql-bin
gtid_mode=ON
log_slave_updates=ON
enforce-gtid-consistency=ON

后初始化

进入MySQL

mysql> CREATE USER 'repl'@'%' IDENTIFIED BY 'zpy';

mysql> GRANT REPLICATION SLAVE ON *.* TO repl@'%';

mysql> INSTALL PLUGIN rpl_semi_sync_master SONAME 'semisync_master.so';

mysql> SET GLOBAL rpl_semi_sync_master_enabled = 1;

#在slave1和slave2中

[root@mysql-node1 ~]# cat /etc/my.cnf

[mysqld]
datadir=/data/mysql
socket=/data/mysql/mysql.sock
symbolic-links=0
server-id=10
log-bin=mysql-bin
gtid_mode=ON
log_slave_updates=ON
enforce-gtid-consistency=ON

后初始化

进入MySQL

mysql> CHANGE MASTER TO MASTER_HOST='172.25.254.10', MASTER_USER='repl', MASTER_PASSWORD='lee', MASTER_AUTO_POSITION=1;

mysql> start slave;

mysql> INSTALL PLUGIN rpl_semi_sync_master SONAME 'semisync_master.so';

mysql> SET GLOBAL rpl_semi_sync_master_enabled = 1;

mysql> STOP SLAVE IO_THREAD;

mysql> START SLAVE IO_THREAD;

mysql> SHOW STATUS LIKE 'Rpl_semi_sync%';
+----------------------------+-------+
| Variable_name              | Value |
+----------------------------+-------+
| Rpl_semi_sync_slave_status | ON    |
+----------------------------+-------+

6.2.2、安装MHA所需要的软件

#在MHA中

[root@mysql-mha ~]# unzip MHA-7.zip 

[root@mysql-mha MHA-7]# yum install *.rpm -y

[root@mysql-mha MHA-7]# scp mha4mysql-node-0.58-0.el7.centos.noarch.rpm root@172.25.254.10:/mnt

[root@mysql-mha MHA-7]# scp mha4mysql-node-0.58-0.el7.centos.noarch.rpm root@172.25.254.20:/mnt

[root@mysql-mha MHA-7]# scp mha4mysql-node-0.58-0.el7.centos.noarch.rpm root@172.25.254.30:/mnt

#在sql-node中

[root@mysql-node10 ~]# yum install /mnt/mha4mysql-node-0.58- 0.el7.centos.noarch.rpm -y

[root@mysql-node20 ~]# yum install /mnt/mha4mysql-node-0.58- 0.el7.centos.noarch.rpm -y

[root@mysql-node30 ~]# yum install /mnt/mha4mysql-node-0.58- 0.el7.centos.noarch.rpm -y 

6.2.3、在软件中包含的工具包介绍 

1.Manager工具包主要包括以下几个工具:

  • masterha_check_ssh #检查MHA的SSH配置状况
  • masterha_check_repl #检查MySQL复制状况
  • masterha_manger #启动MHA
  • masterha_check_status #检测当前MHA运行状态
  • masterha_master_monitor #检测master是否宕机
  • masterha_master_switch #控制故障转移(自动或者手动)
  • masterha_conf_host #添加或删除配置的server信息 

2.Node工具包 (通常由masterHA主机直接调用,无需人为执行)

  • save_binary_logs #保存和复制master的二进制日志
  • apply_diff_relay_logs #识别差异的中继日志事件并将其差异的事件应用于其他的slave
  • filter_mysqlbinlog #去除不必要的ROLLBACK事件(MHA已不再使用这个工具)
  • purge_relay_logs #清除中继日志(不会阻塞SQL线程)

6.2.4、配置MHA 的管理环境

1、生成配置目录和配置文件 

因为我们当前只有一套主从,所以我们只需要写一个配置文件即可

rpm包中没有为我们准备配置文件的模板

可以解压源码包后在samples中找到配置文件的模板文件 

#生成配置文件

[root@mysql-mha ~]# mkdir /etc/masterha

[root@mysql-mha MHA-7]# tar zxf mha4mysql-manager-0.58.tar.gz

[root@mysql-mha MHA-7]# cd mha4mysql-manager-0.58/samples/conf/

[root@mysql-mha conf]# cat masterha_default.cnf app1.cnf > /etc/masterha/app1.cnf 

#编辑配置文件

[root@mysql-mha ~]# vim /etc/masterha/app1.cnf

[server default]
user=root                #mysql管理员用户,因为需要做自动化配置
password=zpy                #mysql密码
ssh_user=root                #ssh远程登陆用户
repl_user=repl                #mysql主从复制中负责认证的用户
repl_password=zpy                #mysql主从复制中负责认证的用户密码
master_binlog_dir= /data/mysql                #二进制日志目录
remote_workdir=/tmp                #远程工作目录

#此参数使为了提供冗余检测,方式是mha主机网络自身的问题无法连接数据库节点,应为集群之外的主机
secondary_check_script= masterha_secondary_check -s 172.25.254.10 -s 172.25.254.11
ping_interval=3                #每隔3秒检测一次

#发生故障后调用的脚本,用来迁移vip
# master_ip_failover_script= /script/masterha/master_ip_failover

#电源管理脚本
# shutdown_script= /script/masterha/power_manager

#当发生故障后用此脚本发邮件或者告警通知
# report_script= /script/masterha/send_report
# master_ip_online_change_script= /script/masterha/master_ip_online_change
[server default]
manager_workdir=/etc/masterha                #mha工作目录
manager_log=/etc/masterha/manager.log                #mha日志

[server1]
hostname=172.25.254.10
candidate_master=1                #可能作为master的主机
check_repl_delay=0                #通过设置check_repl_delay=0

                                                #MHA触发切换在选择一个新的master的时候将会忽略复制延时

                                                #这个参数对于设置了candidate_master=1的主机非常有用

                                                #因为这个候选主在切换的过程中一定是新的master

[server2]
hostname=172.25.254.20
candidate_master=1                #可能作为master的主机
check_repl_delay=0

[server3]
hostname=172.25.254.30
no_master=1                            #不会作为master的主机

2、检测配置:

#检测网络及ssh免密

[root@mysql-mha ~]# masterha_check_ssh --conf=/etc/masterha/app1.cnf

#检测数据主从复制情况

#在数据节点master端

mysql> GRANT ALL ON *.* TO root@'%' identified by 'zpy'; #允许root远程登陆

#执行检测

[root@mysql-mha ~]# masterha_check_repl --conf=/etc/masterha/app1.cnf

6.2.5、MHA的故障切换

MHA的故障切换过程,共包括以下的步骤:

  • 配置文件检查阶段,这个阶段会检查整个集群配置文件配置
  • 宕机的master处理,这个阶段包括虚拟ip摘除操作,主机关机操作
  • 复制dead master和最新slave相差的relay log,并保存到MHA Manger具体的目录下
  • 识别含有最新更新的slave
  • 应用从master保存的二进制日志事件(binlog events)
  • 提升一个slave为新的master进行复制 7.使其他的slave连接新的master进行复制
6.2.5.1、手动切换

1、master未出现故障手动切换

#在master数据节点还在正常工作情况下

[root@mysql-mha ~]# masterha_master_switch \

--conf=/etc/masterha/app1.cnf \ #指定配置文件

--master_state=alive \ #指定master节点状态

--new_master_host=172.25.254.20 \ #指定新master节点

--new_master_port=3306 \ #执行新master节点端口

--orig_master_is_new_slave \ #原始master会变成新的slave

--running_updates_limit=10000 #切换的超时时间

检测:

 切换后需在前master里重新加入主从

mysql>  CHANGE MASTER TO MASTER_HOST='172.25.254.20', MASTER_USER='repl',MASTER_PASSWORD='zpy', MAS               TER_AUTO_POSITION=1;

mysql> start slave;

2、master故障手动切换

#模拟master故障

[root@mysql-node2 ~]# /etc/init.d/mysqld stop

#在MHA-master中做故障切换

[root@mysql-mha masterha]# masterha_master_switch --master_state=dead -- conf=/etc/masterha/app1.cnf --dead_master_host=172.25.254.20-- dead_master_port=3306 --new_master_host=172.25.254.10 --new_master_port=3306 -- ignore_last_failover

检测:

恢复故障mysql节点

[root@mysql-node2 ~]# mysql -p

mysql> CHANGE MASTER TO MASTER_HOST='172.25.254.10', MASTER_USER='repl', MASTER_PASSWORD='zpy', MASTER_AUTO_POSITION=1;

mysql> start slave;

6.2.5.2、自动切换

#删掉切换锁文件

[root@mysql-mha masterha]# rm -fr app1.failover.complete

#监控程序通过指定配置文件监控master状态,当master出问题后自动切换并退出避免重复做故障切换

[root@mysql-mha masterha]# masterha_manager --conf=/etc/masterha/app1.cnf

 检测:

#模拟master故障

[root@mysql-node1 ~]# /etc/init.d/mysqld stop

这时候那个监测自己就停止了。

就切换成功了

恢复故障节点

[root@mysql-node1 ~]# mysql -p

mysql> CHANGE MASTER TO MASTER_HOST='172.25.254.20', MASTER_USER='repl', MASTER_PASSWORD='zpy', MASTER_AUTO_POSITION=1;

mysql> start slave;

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • 数据结构(邓俊辉)学习笔记】优先级队列 08——左式堆:结构
  • I get HttpClient.Timeout Error in C# OpenAI library
  • 游戏开发面试题
  • Vue3组件通讯六种方式
  • 进程终止 等待 替换
  • 2024了,Neo4j能显示节点图片吗?
  • [深度学习] 时间序列分析工具TSLiB库使用指北
  • 【二叉树】OJ题目
  • Android 架构模式之 MVVM
  • AWS CodeCommit 停服,欢迎大家使用极狐GitLab!
  • Scrapy入门学习
  • Windows IPv6漏洞CVE-2024-38063
  • spring boot 集成es使用
  • (十三)Flink SQL
  • 海南省政协主席李荣灿调研宇乐乐影业
  • @angular/forms 源码解析之双向绑定
  • android百种动画侧滑库、步骤视图、TextView效果、社交、搜房、K线图等源码
  • Apache Spark Streaming 使用实例
  • canvas实际项目操作,包含:线条,圆形,扇形,图片绘制,图片圆角遮罩,矩形,弧形文字...
  • IDEA 插件开发入门教程
  • Java程序员幽默爆笑锦集
  • leetcode386. Lexicographical Numbers
  • Python3爬取英雄联盟英雄皮肤大图
  • 检测对象或数组
  • 简单数学运算程序(不定期更新)
  • 利用jquery编写加法运算验证码
  • mysql 慢查询分析工具:pt-query-digest 在mac 上的安装使用 ...
  • (2)STL算法之元素计数
  • (pt可视化)利用torch的make_grid进行张量可视化
  • (八)光盘的挂载与解挂、挂载CentOS镜像、rpm安装软件详细学习笔记
  • (附源码)ssm高校志愿者服务系统 毕业设计 011648
  • (每日一问)操作系统:常见的 Linux 指令详解
  • (十)Flink Table API 和 SQL 基本概念
  • (四)JPA - JQPL 实现增删改查
  • .net core控制台应用程序初识
  • .Net Remoting(分离服务程序实现) - Part.3
  • .NET/C# 推荐一个我设计的缓存类型(适合缓存反射等耗性能的操作,附用法)
  • .Net各种迷惑命名解释
  • .NET面试题(二)
  • .net生成的类,跨工程调用显示注释
  • @configuration注解_2w字长文给你讲透了配置类为什么要添加 @Configuration注解
  • @data注解_SpringBoot 使用WebSocket打造在线聊天室(基于注解)
  • @DependsOn:解析 Spring 中的依赖关系之艺术
  • [C语言]——内存函数
  • [Datawhale AI夏令营 2024 第四期] 从零入门大模型微调之旅的总结
  • [Git][分支设计规范]详细讲解
  • [hdu 4552] 怪盗基德的挑战书
  • [HDU]2161Primes
  • [LeetCode] Copy List with Random Pointer 拷贝带有随机指针的链表
  • [leetcode]Clone Graph
  • [MAC OS] 常用工具
  • [oeasy]python001_先跑起来_python_三大系统选择_windows_mac_linux
  • [Oh My C++ Diary]怎样用cmd运行exe控制台程序
  • [one_demo_13]ArrayList去除重复的元素
  • [orleans2.1]这是你没玩过的船新版本