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 逻辑备份与恢复测试的相关总结
May 14 MySQL
正确使用MySQL INSERT INTO语句
May 26 MySQL
虚拟机linux端mysql数据库无法远程访问的解决办法
May 26 MySQL
MySQL 常见的数据表设计误区汇总
Jun 07 MySQL
MySQL8.0.18配置多主一从
Jun 21 MySQL
mysql事务对效率的影响分析总结
Oct 24 MySQL
mysql创建存储过程及函数详解
Dec 04 MySQL
以MySQL5.7为例了解一下执行计划
Apr 13 MySQL
Mysql 如何合理地统计一个数据库里的所有表的数据量
Apr 18 MySQL
解决Mysql报错 Table 'mysql.user' doesn't exist
May 06 MySQL
MySQL数据库 安全管理
May 06 MySQL
SQL语句中EXISTS的详细用法大全
Jun 25 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中与数组相关的函数
2007/03/22 PHP
利用PHP扩展vld查看PHP opcode操作步骤
2013/03/04 PHP
php实现商城购物车的思路和源码分析
2020/07/23 PHP
在html页面上拖放移动标签
2010/01/08 Javascript
js函数调用的方式
2014/05/06 Javascript
在父页面得到zTree已选中的节点的方法
2015/02/12 Javascript
js实现延时加载Flash的方法
2015/11/26 Javascript
微信小程序 扎金花简单实例
2017/02/21 Javascript
xmlplus组件设计系列之分隔框(DividedBox)(8)
2017/05/02 Javascript
微信通过页面(H5)直接打开本地app的解决方法
2017/09/09 Javascript
AngularJS实现的获取焦点及失去焦点时的表单验证功能示例
2017/10/25 Javascript
微信小程序登录换取token的教程
2018/05/31 Javascript
JS实现炫酷轮播图
2020/11/15 Javascript
python网络编程学习笔记(一)
2014/06/09 Python
python查看FTP是否能连接成功的方法
2015/07/30 Python
Python数据结构与算法之链表定义与用法实例详解【单链表、循环链表】
2017/09/28 Python
python+selenium实现163邮箱自动登陆的方法
2017/12/31 Python
python: line=f.readlines()消除line中\n的方法
2018/03/19 Python
Python正则表达式和元字符详解
2018/11/29 Python
使用Python OpenCV为CNN增加图像样本的实现
2019/06/10 Python
python傅里叶变换FFT绘制频谱图
2019/07/19 Python
Python Selenium参数配置方法解析
2020/01/19 Python
Jupyter notebook快速入门教程(推荐)
2020/05/18 Python
使用sublime text3搭建Python编辑环境的实现
2021/01/12 Python
Hotels.com拉丁美洲:从豪华酒店到经济型酒店的预定优惠和折扣
2019/12/09 全球购物
意大利买卖二手奢侈品网站:LAMPOO
2020/06/03 全球购物
Currentbody德国站:健康与美容技术专家
2020/04/05 全球购物
大学同学十年聚会感言
2014/02/21 职场文书
环保建议书作文
2014/03/12 职场文书
贸易跟单员英文求职信
2014/04/19 职场文书
医学专业毕业生求职信
2014/06/20 职场文书
学习十八届四中全会依法治国心得体会
2014/11/03 职场文书
关于职业道德的心得体会
2016/01/18 职场文书
2019银行竞聘书
2019/06/21 职场文书
学者《孟子》名人名言
2019/08/09 职场文书
用Python selenium实现淘宝抢单机器人
2021/06/18 Python