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 相关文章推荐
数据库的高级查询六:表连接查询:外连接(左外连接,右外连接,UNION关键字,连接中ON与WHERE的不同)
Apr 05 MySQL
mysql 带多个条件的查询方式
Jun 05 MySQL
MySQL中IF()、IFNULL()、NULLIF()、ISNULL()函数的使用详解
Jun 26 MySQL
mysql脏页是什么
Jul 26 MySQL
SQL实现LeetCode(175.联合两表)
Aug 04 MySQL
SQL实现LeetCode(176.第二高薪水)
Aug 04 MySQL
一文带你探究MySQL中的NULL
Nov 11 MySQL
Arthas排查Kubernetes中应用频繁挂掉重启异常
Feb 28 MySQL
MySQL插入数据与查询数据
Mar 25 MySQL
Mysql分析设计表主键为何不用uuid
Mar 31 MySQL
MySQL如何修改字段类型和字段长度
Jun 10 MySQL
mysql sock 文件解析及作用讲解
Jul 15 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
PHP4之真OO
2006/10/09 PHP
PHP语法速查表
2007/01/02 PHP
php获取网页请求状态程序示例
2014/06/17 PHP
常见PHP数据库解决方案分析介绍
2015/09/24 PHP
PHP 中使用explode()函数切割字符串为数组的示例
2017/05/06 PHP
自适应图片大小的弹出窗口
2006/07/27 Javascript
Jquery getJSON方法详细分析
2013/12/26 Javascript
javascript类型系统 Window对象学习笔记
2016/01/07 Javascript
轻松掌握JavaScript策略模式
2016/08/25 Javascript
微信小程序 数组(增,删,改,查)等操作实例详解
2017/01/05 Javascript
jquery.cookie.js的介绍与使用方法
2017/02/09 Javascript
js 函数式编程学习笔记
2017/03/25 Javascript
Vue cli+mui 区域滚动的实例代码
2018/01/25 Javascript
微信小程序封装分享与分销功能过程解析
2019/08/13 Javascript
JS实现网站吸顶条
2020/01/08 Javascript
Node.js API详解之 timer模块用法实例分析
2020/05/07 Javascript
Python实现过滤单个Android程序日志脚本分享
2015/01/16 Python
Python matplotlib画图实例之绘制拥有彩条的图表
2017/12/28 Python
python排序函数sort()与sorted()的区别
2018/09/18 Python
解决Python3.8用pip安装turtle-0.0.2出现错误问题
2020/02/11 Python
Python爬虫实现HTTP网络请求多种实现方式
2020/06/19 Python
Python字符串查找基本操作代码案例
2020/10/27 Python
前端canvas动画如何转成mp4视频的方法
2019/06/17 HTML / CSS
松下电器美国官方商店:Panasonic美国
2016/10/14 全球购物
压铸汽车模型收藏家:Diecastmodelswholesale.com
2016/12/21 全球购物
印度尼西亚最大的电商平台:Tokopedia(印尼版淘宝)
2017/12/02 全球购物
理肤泉俄罗斯官网:La Roche-Posay俄罗斯
2018/07/24 全球购物
Oracle快照(snapshot)
2015/03/13 面试题
工商技校毕业生自荐信
2013/11/15 职场文书
物业保安岗位职责
2014/07/02 职场文书
2015年办公室文员工作总结
2015/04/24 职场文书
2015年试用期工作总结范文
2015/05/28 职场文书
植树节新闻稿
2015/07/17 职场文书
学习十八大的感悟
2015/08/11 职场文书
2016年政治理论学习心得体会
2016/01/25 职场文书
职场新人刚入职工作总结该怎么写?
2019/05/15 职场文书