本文主要围绕 MHA 和 Galera Cluster 来讲述两种方案在 MySQL 中是怎样实现高可用的.
1. 几种常见的高可用模式
MMM: Multi-Master Replication Manager for MySQL,MySQL 主主复制管理器是一套灵活的脚本程序, 基于 perl 实现, 用来对 MySQL replication 进行监控和故障迁移, 并能管理 MySQL Master-Master 复制的配置(同一时间只有一个节点是可写的)
官网: http://www.mysql-mmm.org
https://code.google.com/archive/p/mysql-master-master/downloads
MHA: Master High Availability, 对主节点进行监控, 可实现自动故障转移至其它从节点; 通过提升某一从节点为新的主节点, 基于主从复制实现, 还需要客户端配合实现, 目前 MHA 主要支持一主多从的架构, 要搭建 MHA, 要求一个复制集群中必须最少有三台数据库服务器, 一主二从, 即一台充当 master, 一台充当备用 master, 另外一台充当从库, 出于机器成本的考虑, 淘宝进行了改造, 目前淘宝 TMHA 已经支持一主一从
官网: https://code.google.com/archive/p/mysql-master-ha/
Galera Cluster:wsrep(MySQL extended with the Write Set Replication)通过 wsrep 协议在全局实现复制; 任何一节点都可读写, 不需要主从复制, 实现多主读写
MHA 集群架构
2.MHA
MHA 工作原理
从宕机崩溃的 master 保存二进制日志事件(binlog events)
识别含有最新更新的 slave
应用差异的中继日志 (relay log) 到其他的 slave
应用从 master 保存的二进制日志事件(binlog events)
提升一个 slave 为新的 master
使其他的 slave 连接新的 master 进行复制
MHA
MHA 软件由两部分组成, Manager 工具包和 Node 工具包
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 信息
MHA Node 工具包: 这些工具通常由 MHA Manager 的脚本触发, 无需人为操作)主要包括以下几个工具:
save_binary_logs 保存和复制 master 的二进制日志
apply_diff_relay_logs 识别差异的中继日志事件并将其差异的事件应用于其他的 slave
filter_mysqlbinlog 去除不必要的 ROLLBACK 事件(MHA 已不再使用此工具)
purge_relay_logs 清除中继日志(不会阻塞 SQL 线程)
注意: 为了尽可能的减少主库硬件损坏宕机造成的数据丢失, 因此在配置 MHA 的同时建议配置成 MySQL 5.5 的半同步复制
MHA 自定义扩展:
secondary_check_script: 通过多条网络路由检测 master 的可用性
master_ip_ailover_script: 更新 Application 使用的 masterip
shutdown_script: 强制关闭 master 节点
report_script: 发送报告
init_conf_load_script: 加载初始配置参数
master_ip_online_change_script: 更新 master 节点 ip 地址
配置文件:
global 配置, 为各 application 提供默认配置
application 配置: 为每个主从复制集群
实现 MHA
在管理节点上安装两个包:
启用 epel 源
- mha4mysql-manager
- mha4mysql-node
在被管理节点安装:
yum install mha4mysql-node
实现 MHA
在管理节点建立配置文件
- VIM /etc/mastermha/app1.cnf
- [server default]
- user=mhauser
- password=magedu
- manager_workdir=/data/mastermha/app1/
- manager_log=/data/mastermha/app1/manager.log
- remote_workdir=/data/mastermha/app1/
- ssh_user=root
- repl_user=repluser
- repl_password=magedu
- ping_interval=1
- [server1]
- hostname=192.168.8.17
- candidate_master=1
- [server2]
- hostname=192.168.8.27
- candidate_master=1
- [server3]
- hostname=192.168.8.37
实现 Master
- VIM /etc/my.cnf
- [mysqld]
- log-bin
- server_id=1
skip_name_resolve=1 MHA 必须设
MySQL>show master logs
MySQL>grant replication slave on *.* to repluser@'192.168.8.%' identified by 'magedu'; 用于从服务器复制
MySQL>grant all on *.* to mhauser@'192.168.8.%'identified by'magedu'; 管理账号
实现 slave
- VIM /etc/my.cnf
- [mysqld]
server_id=2 不同节点此值各不相同
- log-bin
- read_only
- relay_log_purge=0
- skip_name_resolve=1
- MySQL>CHANGE MASTER TO MASTER_HOST='MASTER_IP',
- MASTER_USER='repluser', MASTER_PASSWORD='magedu',
- MASTER_LOG_FILE='mariadb-bin.000001', MASTER_LOG_POS=245;
实现 MHA
在所有节点实现相互之间 SSH key 验证 注意时间的同步
Mha 验证和启动
- masterha_check_ssh --conf=/etc/mastermha/app1.cnf
- masterha_check_repl --conf=/etc/mastermha/app1.cnf
- masterha_manager --conf=/etc/mastermha/app1.cnf
排错日志:
- /data/mastermha/app1/manager.log
- 3.Galera Cluster
Galera Cluster: 集成了 Galera 插件的 MySQL 集群, 是一种新型的, 数据不共享的, 高度冗余的高可用方案, 目前 Galera Cluster 有两个版本, 分别是 Percona Xtradb Cluster 及 MariaDB Cluster,Galera 本身是具有多主特性的, 即采用 multi-master 的集群架构, 是一个既稳健, 又在数据一致性, 完整性及高性能方面有出色表现的高可用解决方案
右图图示: 三个节点组成了一个集群, 与普通的主
从架构不同, 它们都可以作为主节点, 三个节点是对等的, 称为 multi-master 架构, 当有客户端要写入或者读取数据时, 连接哪个实例都是一样的, 读到的数据是相同的, 写入某一个节点之后, 集群自己会将新数据同步到其它节点上面, 这种架构不共享任何数据, 是一种高冗余架构
Galera Cluster 特点
多主架构: 真正的多点读写的集群, 在任何时候读写数据, 都是最新的
同步复制: 集群不同节点之间数据同步, 没有延迟, 在数据库挂掉之后, 数据不会丢失
并发复制: 从节点 APPLY 数据时, 支持并行执行, 更好的性能
故障切换: 在出现数据库故障时, 因支持多点写入, 切换容易
热插拔: 在服务期间, 如果数据库挂了, 只要监控程序发现的够快, 不可服务时间就会非常少. 在节点故障期间, 节点本身对集群的影响非常小
自动节点克隆: 在新增节点, 或者停机维护时, 增量数据或者基础数据不需要人工手动备份提供, Galera Cluster 会自动拉取在线节点数据, 最终集群会变为一致
对应用透明: 集群的维护, 对应用程序是透明的
Galera Cluster 工作过程
Galera Cluster 官方文档:
Galera Cluster 包括两个组件
- Galera replication library (galera-3)
- WSREP:MySQL extended with the Write Set Replication
WSREP 复制实现:
percona-cluster
MariaDB-Cluster mariadb 集群专业版
注意: 都至少需要三个节点, 不能安装 mariadb-server
MySQL 复制
yum install MariaDB-Galera-server 需要官方 yum 源
- VIM /etc/my.cnf.d/server.cnf
- [galera]
- wsrep_provider = /usr/lib64/galera/libgalera_smm.so
- wsrep_cluster_address="gcomm://192.168.8.7,192.168.8.17,192.168.8.27"
- binlog_format=row
- default_storage_engine=InnoDB
- innodb_autoinc_lock_mode=2
- bind-address=0.0.0.0
下面配置可选项
wsrep_cluster_name = 'mycluster'默认 my_wsrep_cluster
- wsrep_node_name = 'node1'
- wsrep_node_address = '192.168.8.7'
MySQL 复制
首次启动时, 需要初始化集群, 在其中一个节点上执行命令
/etc/init.d/MySQL start --wsrep-new-cluster
而后正常启动其它节点
service MySQL start
查看集群中相关系统变量和状态变量
- SHOW VARIABLES LIKE 'wsrep_%';
- SHOW STATUS LIKE 'wsrep_%';
- SHOW STATUS LIKE 'wsrep_cluster_size';
来源: http://www.bubuko.com/infodetail-2816741.html