MySQL 的高可以有三种实现方式: 多主模式 (Multi Master MySQL),MHA(Master High Availability) 和 Galera Cluster:wresp
一, MHA
对主节点进行监控, 可实现自动故障转移至其它从节点; 通过提升某一从节点为新的主节点, 基于主从复制实现, 还需要客户端配合实现, 目前 MHA 主要支持一主多从的架构, 要搭建 MHA, 要求一个复制集群中必须最少有三台数据库服务器, 一主二从, 即一台充当 master, 一台充当备用 master, 另外一台充当从库.
1,MHA 工作原理
从宕机崩溃的 master 保存二进制日志事件(binlog events)
识别含有最新更新的 slave
应用差异的中继日志 (relay log) 到其他的 slave
应用从 master 保存的二进制日志事件(binlog events)
提升一个 slave 为新的 master
使其他的 slave 连接新的 master 进行复制
2,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 信息
Node 工具包: 这些工具通常由 MHA Manager 的脚本触发, 无需人为操作
save_binary_logs 保存和复制 master 的二进制日志
apply_diff_relay_logs 识别差异的中继日志事件并将其差异的事件应用于其他的 slave
filter_mysqlbinlog 去除不必要的 ROLLBACK 事件(MHA 已不再使用此工具)
purge_relay_logs 清除中继日志(不会阻塞 SQL 线程)
提示: 为了尽可能的减少主库硬件损坏宕机造成的数据丢失, 因此在配置 MHA 的同时建议配置成 MySQL 5.5 的半同步复制.
自定义扩展:
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 地址
下载地址: https://code.google.com/archive/p/mysql-master-ha/downloads
3,MHA 的实现
环境: 基于秘钥认证, 参考:
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 的集群架构, 是一个既稳健, 又在数据一致性, 完整性及高性能方面有出色表现的高可用解决方案
三个节点组成了一个集群, 与普通的主从架构不同, 它们都可以作为主节点, 三个节点是对等的, 称为 multi-master 架构, 当有客户端要写入或者读取数据时, 连接哪个实例都是一样的, 读到的数据是相同的, 写入某一个节点之后, 集群自己会将新数据同步到其它节点上面, 这种架构不共享任何数据, 是一种高冗余架构
特性:
多主架构: 真正的多点读写的集群, 在任何时候读写数据, 都是最新的;
同步复制: 集群不同节点之间数据同步, 没有延迟, 在数据库挂掉之后, 数据不会丢失;
并发复制: 从节点 APPLY 数据时, 支持并行执行, 更好的性能;
故障切换: 在出现数据库故障时, 因支持多点写入, 切换容易;
热插拔: 在服务期间, 如果数据库挂了, 只要监控程序发现的够快, 不可服务时间就会非常少. 在节点故障期间, 节点本身对集群的影响非常小;
自动节点克隆: 在新增节点, 或者停机维护时, 增量数据或者基础数据不需要人工手动备份提供, Galera Cluster 会自动拉取在线节点数据, 最终集群会变为一致;
对应用透明: 集群的维护, 对应用程序是透明的.
工作原理:
参考官方文档:
- 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 | #集群中有三台节点在线
- +--------------------+-------+
记录时间 2018.6.17 父亲节
来源: https://www.cnblogs.com/L-dongf/p/9192710.html