MySQL系列之十四 MySQL的高可用实现


Posted in MySQL onJuly 02, 2021

一、MHA

​对主节点进行监控,可实现自动故障转移至其它从节点;通过提升某一从节点为新的主节点,基于主从复制实现,还需要客户端配合实现,目前MHA主要支持一主多从的架构,要搭建MHA,要求一个复制集群中必须最少有三台数据库服务器,一主二从,即一台充当master,一台充当备用master,另外一台充当从库。

1、MHA工作原理

  • 从宕机崩溃的master保存二进制日志事件(binlog events)
  • 识别含有最新更新的slave
  • 应用差异的中继日志(relay log)到其他的slave
  • 应用从master保存的二进制日志事件(binlog events)
  • 提升一个slave为新的master

2、MHA软件

MHA软件由两部分组成,Manager工具包和Node工具包;

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

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

Node工具包:这些工具通常由MHA Manager的脚本触发,无需人为操作

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

提示:为了尽可能的减少主库硬件损坏宕机造成的数据丢失,因此在配置MHA的同时建议配置成MySQL 5.5的半同步复制。

自定义扩展:

secondary_check_script:通过多条网络路由检测master的可用性master_ip_ailover_script:更新Application使用的masteripshutdown_script:强制关闭master节点report_script:发送报告init_conf_load_script:加载初始配置参数master_ip_online_change_script:更新master节点ip地址

下载地址:https://code.google.com/archive/p/mysql-master-ha/downloads

3、MHA的实现

MySQL系列之十四 MySQL的高可用实现

环境:基于秘钥认证,参考:https://www.cnblogs.com/L-dongf/p/9058265.html,时间必须同步,执行:ntpdate cn.pool.ntp.org

1)manager节点

[root@manager ~]# yum install mha4mysql-manager-0.56-0.el6.noarch.rpm mha4mysql-node-0.56-0.el6.noarch.rpm -y  #安装mha软件
[root@manager ~]# scp mha4mysql-node-0.56-0.el6.noarch.rpm 192.168.0.7:
[root@manager ~]# scp mha4mysql-node-0.56-0.el6.noarch.rpm 192.168.0.8:
[root@manager ~]# scp mha4mysql-node-0.56-0.el6.noarch.rpm 192.168.0.9:
[root@manager ~]# mkdir /etc/mha/
[root@manager ~]# vim /etc/mha/cluster1.cnf
[server default]
user=mhauser
password=mhapass
manager_workdir=/data/mastermha/cluster1/
manager_log=/data/mastermha/cluster1/manager.log
remote_workdir=/data/mastermha/cluster1/
ssh_user=root
repl_user=repluser
repl_password=replpass
ping_interval=1  #每秒检测一次
[server1]
hostname=192.168.0.7
candidate_master=1  #可以成为主节点
[server2]
hostname=192.168.0.8
candidate_master=1  #可以成为主节点
[server3]
hostname=192.168.0.9
[root@manager ~]# masterha_check_ssh --conf=/etc/mha/cluster1.cnf  #检查ssh秘钥环境
	All SSH connection tests passed successfully.
[root@manager ~]# masterha_check_repl --conf=/etc/mha/cluster1.cnf  #检查MySQL状态
	MySQL Replication Health is OK.
[root@manager ~]# yum install screen -y
[root@manager ~]# screen -S mha  #mha是工作在前台的进程,不能用终端实时检测
[root@manager ~]# masterha_manager --conf=/etc/mha/cluster1.cnf  #开始监测

2)master节点

[root@master ~]# yum install mha4mysql-node-0.56-0.el6.noarch.rpm -y  #安装node包
[root@master ~]# vim /etc/my.cnf
[mysqld]
server_id=1
log_bin
binlog_format=row
skip_name_resolve
[root@master ~]# systemctl start mariadb
MariaDB [(none)]> GRANT REPLICATION SLAVE ON *.* TO repluser@'192.168.0.%' IDENTIFIED BY 'replpass';  #创建主从复制账号,可能切换为主的节点都要创建此账号
MariaDB [(none)]> SHOW MASTER LOGS;
+--------------------+-----------+
| Log_name           | File_size |
+--------------------+-----------+
| mariadb-bin.000001 |       401 |
+--------------------+-----------+
MariaDB [(none)]> GRANT ALL ON *.* TO mhauser@'192.168.0.%' IDENTIFIED BY 'mhapass';  #创建mha的管理用户,确保所有节点都已经同步此账号

3)slave节点

[root@slave ~]# yum install mha4mysql-node-0.56-0.el6.noarch.rpm -y
[root@slave ~]# vim /etc/my.cnf
[mysqld]
read_only=1
log_bin
binlog_format=row
server_id=2
relay_log_purge=0
skip_name_resolve=1
[root@slave ~]# systemctl start mariadb
MariaDB [(none)]> GRANT REPLICATION SLAVE ON *.* TO repluser@'192.168.0.%' IDENTIFIED BY 'replpass';
MariaDB [(none)]> CHANGE MASTER TO
    -> MASTER_HOST='192.168.0.7',  #此时主节点为0.7
    -> MASTER_USER='repluser',
    -> MASTER_PASSWORD='replpass',
    -> MASTER_PORT=3306,
    -> MASTER_LOG_FILE='mariadb-bin.000001',
    -> MASTER_LOG_POS=401,
    -> MASTER_CONNECT_RETRY=10;
MariaDB [(none)]> START SLAVE;

4)slave2节点

[root@slave2 ~]# yum install mha4mysql-node-0.56-0.el6.noarch.rpm -y
[root@slave2 ~]# vim /etc/my.cnf
[mysqld]
server_id=3
read_only=1
relay_log_purge=0
skip_name_resolve=1
[root@slave2 ~]# systemctl start mariadb
MariaDB [(none)]> CHANGE MASTER TO
    -> MASTER_HOST='192.168.0.7',
    -> MASTER_USER='repluser',
    -> MASTER_PASSWORD='replpass',
    -> MASTER_PORT=3306,
    -> MASTER_LOG_FILE='mariadb-bin.000001',
    -> MASTER_LOG_POS=401,
    -> MASTER_CONNECT_RETRY=10;
MariaDB [(none)]> START SLAVE;

4)测试

当master的服务停止:[root@master ~]# systemctl stop mariadb

在slave2上执行:MariaDB [(none)]> SHOW SLAVE STATUS\G命令,看到Master_Server_Id: 2

说明:切换成功

4、MHA监控重新上线

将故障的master修复后重新上线,手动配置成为现在主节点的从
[root@master ~]# systemctl start mariadb
MariaDB [(none)]> CHANGE MASTER TO
    -> MASTER_HOST='192.168.0.8',  #此时的主为0.8
    -> MASTER_USER='repluser',
    -> MASTER_PASSWORD='replpass',
    -> MASTER_PORT=3306,
    -> MASTER_LOG_FILE='mariadb-bin.000001',
    -> MASTER_LOG_POS=482,
    -> MASTER_CONNECT_RETRY=10;
MariaDB [(none)]> START SLAVE;
管理节点:
[root@manager ~]# screen -S mha
[root@manager ~]# masterha_manager --conf=/etc/mha/cluster1.cnf  #重新开启监测

二、Galera Cluster

​Galera Cluster:集成了Galera插件的MySQL集群,是一种新型的,数据不共享的,高度冗余的高可用方案,目前Galera Cluster有两个版本,分别是Percona Xtradb Cluster及MariaDB Cluster,Galera本身是具有多主特性的,即采用multi-master的集群架构,是一个既稳健,又在数据一致性、完整性及高性能方面有出色表现的高可用解决方案

MySQL系列之十四 MySQL的高可用实现

​三个节点组成了一个集群,与普通的主从架构不同,它们都可以作为主节点,三个节点是对等的,称为multi-master架构,当有客户端要写入或者读取数据时,连接哪个实例都是一样的,读到的数据是相同的,写入某一个节点之后,集群自己会将新数据同步到其它节点上面,这种架构不共享任何数据,是一种高冗余架构

特性:

  • 多主架构:真正的多点读写的集群,在任何时候读写数据,都是最新的;
  • 同步复制:集群不同节点之间数据同步,没有延迟,在数据库挂掉之后,数据不会丢失;
  • 并发复制:从节点APPLY数据时,支持并行执行,更好的性能;
  • 故障切换:在出现数据库故障时,因支持多点写入,切换容易;
  • 热插拔:在服务期间,如果数据库挂了,只要监控程序发现的够快,不可服务时间就会非常少。在节点故障期间,节点本身对集群的影响非常小;
  • 自动节点克隆:在新增节点,或者停机维护时,增量数据或者基础数据不需要人工手动备份提供,Galera Cluster会自动拉取在线节点数据,最终集群会变为一致;

工作原理:

MySQL系列之十四 MySQL的高可用实现

参考官方文档:

http://galeracluster.com/documentation-webpages/galera-documentation.pdf

http://galeracluster.com/documentation-webpages/index.html

https://mariadb.com/kb/en/mariadb/getting-started-with-mariadb-galera-cluster/

至少需要三台节点,不能安装 mariadb-server 包,需要安装特定的软件包

Galera Cluster的实现

清华开源镜像源:https://mirrors.tuna.tsinghua.edu.cn/mariadb/mariadb-5.5.60/yum/centos7-amd64/

# vim /etc/yum.repos.d/mariadb_galera_server.repo
[mariadb]
name=mariadb_galera_server.repo
baseurl=https://mirrors.tuna.tsinghua.edu.cn/mariadb/mariadb-5.5.60/yum/centos7-amd64/
gpgcheck=0
# yum install MariaDB-Galera-server -y

​1)mysql-1

[root@mysql-1 ~]# vim /etc/my.cnf.d/server.cnf
[galera]
wsrep_provider=/usr/lib64/galera/libgalera_smm.so
wsrep_cluster_address="gcomm://192.168.0.7,192.168.0.8,192.168.0.9" #将所有IP都定义在此
binlog_format=row
default_storage_engine=InnoDB
innodb_autoinc_lock_mode=2
bind-address=0.0.0.0
wsrep_cluster_name='my_wsrep_cluster'
wsrep_node_name='node1'
wsrep_node_address='192.168.0.7'

​2)mysql-2

[root@mysql-2 ~]# vim /etc/my.cnf.d/server.cnf
[galera]
wsrep_provider=/usr/lib64/galera/libgalera_smm.so
wsrep_cluster_address="gcomm://192.168.0.7,192.168.0.8,192.168.0.9"
binlog_format=row
default_storage_engine=InnoDB
innodb_autoinc_lock_mode=2
bind-address=0.0.0.0
wsrep_cluster_name='my_wsrep_cluster'
wsrep_node_name='node2'
wsrep_node_address='192.168.0.8'

​3)mysql-3

[root@mysql-3 ~]# vim /etc/my.cnf.d/server.cnf
[galera]
wsrep_provider=/usr/lib64/galera/libgalera_smm.so
wsrep_cluster_address="gcomm://192.168.0.7,192.168.0.8,192.168.0.9"
binlog_format=row
default_storage_engine=InnoDB
innodb_autoinc_lock_mode=2
bind-address=0.0.0.0
wsrep_cluster_name='my_wsrep_cluster'
wsrep_node_name='node3'
wsrep_node_address='192.168.0.9'

​4)启动

[root@mysql-1 ~]# /etc/init.d/mysql start --wsrep-new-cluster #第一台启动加此参数
[root@mysql-2 ~]# /etc/init.d/mysql start #后续服务直接启动即可
[root@mysql-3 ~]# /etc/init.d/mysql start

​5)测试

​在任何一个节点上操作数据库,其他节点同步操作;如果发生同时操作同条记录,则只有一台节点操作成功。

​6)查看工作状态

MariaDB [(none)]> SHOW VARIABLES LIKE 'wsrep_%'\G
MariaDB [(none)]> SHOW STATUS LIKE 'wsrep_%'\G
MariaDB [(none)]> SHOW STATUS LIKE 'wsrep_cluster_size';
+--------------------+-------+
| Variable_name      | Value |
+--------------------+-------+
| wsrep_cluster_size | 3     |  #集群中有三台节点在线
+--------------------+-------+

到此这篇关于MySQL系列之十四 MySQL的高可用实现的文章就介绍到这了,更多相关MySQL的高可用实现内容请搜索三水点靠木以前的文章或继续浏览下面的相关文章希望大家以后多多支持三水点靠木!

MySQL 相关文章推荐
mysql查询的控制语句图文详解
Apr 11 MySQL
为什么mysql字段要使用NOT NULL
May 13 MySQL
如何设计高效合理的MySQL查询语句
May 26 MySQL
MySQL 数据类型选择原则
May 27 MySQL
MySQL Router实现MySQL的读写分离的方法
May 27 MySQL
低版本Druid连接池+MySQL驱动8.0导致线程阻塞、性能受限
Jul 01 MySQL
MySQL 四种连接和多表查询详解
Jul 16 MySQL
详细聊聊关于Mysql联合查询的那些事儿
Oct 24 MySQL
以MySQL5.7为例了解一下执行计划
Apr 13 MySQL
mysql 8.0.27 绿色解压版安装教程及配置方法
Apr 20 MySQL
mysql字段为NULL索引是否会失效实例详解
May 30 MySQL
mysql数据库实现设置字段长度
Jun 10 MySQL
MySQL系列之十二 备份与恢复
Jul 02 #MySQL
MySQL系列之十一 日志记录
Jul 02 #MySQL
MySQL系列之十 MySQL事务隔离实现并发控制
MySQL系列之九 mysql查询缓存及索引
MySQL系列之八 MySQL服务器变量
Jul 02 #MySQL
MySQL系列之四 SQL语法
MySQL系列之七 MySQL存储引擎
Jul 02 #MySQL
You might like
PHP源代码数组统计count分析
2011/08/02 PHP
PHP通过session id 实现session共享和登录验证的代码
2012/06/03 PHP
php htmlspecialchars()与shtmlspecialchars()函数的深入分析
2013/06/05 PHP
PHP迭代器和迭代的实现与使用方法分析
2018/04/19 PHP
php 与 nginx 的处理方式及nginx与php-fpm通信的两种方式
2018/09/28 PHP
JavaScript DOM 学习第七章 表单的扩展
2010/02/19 Javascript
jQuery News Ticker 基于jQuery的即时新闻行情展示插件
2011/11/05 Javascript
Prototype源码浅析 String部分(一)之有关indexOf优化
2012/01/15 Javascript
jquery实现手机发送验证码的倒计时代码
2014/02/12 Javascript
js中setTimeout()与clearTimeout()用法实例浅析
2015/05/12 Javascript
javascript弹性运动效果简单实现方法
2016/01/08 Javascript
jQuery的 $.ajax防止重复提交的两种方法(推荐)
2016/10/14 Javascript
详解vue 模版组件的三种用法
2017/07/21 Javascript
详解node单线程实现高并发原理与node异步I/O
2017/09/21 Javascript
Angular17之Angular自定义指令详解
2018/01/21 Javascript
Node.js+Express+Mysql 实现增删改查
2019/04/03 Javascript
详解VUE调用本地json的使用方法
2019/05/15 Javascript
微信小程序引入VANT组件的方法步骤
2019/09/19 Javascript
iSlider手机端图片滑动切换插件使用详解
2019/12/24 Javascript
sharp.js安装过程中遇到的问题总结
2020/04/02 Javascript
vue在响应头response中获取自定义headers操作
2020/07/24 Javascript
vue使用video插件vue-video-player的示例
2020/10/03 Javascript
python中global用法实例分析
2015/04/30 Python
python发送告警邮件脚本
2018/09/17 Python
Python简直是万能的,这5大主要用途你一定要知道!(推荐)
2019/04/03 Python
基于Django静态资源部署404的解决方法
2019/07/28 Python
python 画3维轨迹图并进行比较的实例
2019/12/06 Python
python自动化测试三部曲之request+django实现接口测试
2020/10/07 Python
基于Django快速集成Echarts代码示例
2020/12/01 Python
Sneaker Studio匈牙利:购买运动鞋
2018/03/26 全球购物
罗技美国官网:Logitech美国
2020/01/22 全球购物
大学应届毕业生个人求职信
2013/09/23 职场文书
企业总经理岗位职责
2014/02/13 职场文书
年终奖发放方案
2014/06/02 职场文书
教师党的群众路线教育实践活动个人整改方案
2014/10/31 职场文书
选调生挂职锻炼工作总结
2015/10/23 职场文书