MySQL高可用之MHA,Galera Cluster
时间:2018-10-24 16:30 来源:51cto.com 作者:51cto.com
MySQL高可用的三种实现方式
MMM:Multi Master MySQL,多主模型,基于主从复制实现
MHA:Master HA,对主节点进行监控,可实现自动故障转移至其它从节点;通过提升某一从节点为新的主节点,基于主从复制实现,还需要客户端配合实现,目前MHA主要支持一主多从的架构,要搭建MHA,要求一个复制集群中必须最少有三台数据库服务器,一主二从,即一台充当master,一台充当备用master,另外一台充当从库,出于机器成本的考虑,淘宝进行了改造,目前淘宝TMHA已经支持一主一从。MHA官网:https://code.google.com/archive/p/mysql-master-ha/
Galera Cluster:wresp:通过wresp协议在全局实现复制;任何一节点都可读写,不需要主从复制,实现多主可读可写
MHA集群架构
MHA工作原理
1 从宕机崩溃的master保存二进制日志事件(binlog events)
2 识别含有最新更新的slave
3 应用差异的中继日志(relay log)到其他的slave
4 应用从master保存的二进制日志事件(binlog events)
5 提升一个slave为新的master
6 使其他的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信息
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地址
配置文件:
global配置,为各application提供默认配置
application配置:为每个主从复制集群
实验:实现MHA
环境准备:
1、准备四台主机:
manager: centos7.5 192.168.30.3
master: centos7.5 192.168.30.4
slave1: centos7.5 192.168.30.5
slave2: centos7.5 192.168.30.6
并在四台主机上都执行以下4个操作:
•关闭SELinux
•清空iptables,执行:iptables -F,iptables -X,iptables -Z
•时间同步,执行:ntpdate cn.pool.ntp.org
•在4台主机之间实现ssh基于密钥的认证,可参考之前的博客的ssh部分:http://blog.51cto.com/13695854/2120936
2、在MHA官网上下载软件包
登录MHA官网https://code.google.com/archive/p/mysql-master-ha/downloads(可能要搭×××),下载mha4mysql-manager-0.55-0.el6.noarch.rpm和mha4mysql-node-0.54-0.el6.noarch.rpm这两个rpm包
3、安装软件包
在管理节点manager安装两个包
yum install mha4mysql-manager-0.55-0.el6.noarch.rpm mha4mysql-node-0.54-0.el6.noarch.rpm
在被管理节点master、slave1、slave2安装一个包
yum install mha4mysql-node-0.54-0.el6.noarch.rpm
在manager节点:
4、建立配置文件
mkdir /etc/mastermha #mha配置文件的文件夹,可自己更改
vim /etc/mastermha/app1.cnf
[server default]
user=mhauser
password=centos
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=centos
ping_interval=1 #每秒检测一次
[server1]
hostname=192.168.30.4
candidate_master=1 #可以为主节点
[server2]
hostname=192.168.30.5
candidate_master=1 #可以为主节点
[server3]
hostname=192.168.30.6
在master节点:
5、修改MySQL配置文件
vim /etc/my.cnf
[mysqld]
server_id=1
log_bin
binlog_format=row
innodb_file_per_table
skip_name_resolve=1
systemctl restart mariadb #重启mysql服务使配置生效
6、添加用户帐户
查看二进制日志位置
mysql> show master logs;
添加有复制权限的用户帐户
mysql> grant replication slave on *.* to repluser@'192.168.30.%' identified by 'centos';
添加mha的用户帐户
mysql> grant all on *.* to mhauser@'192.168.30.%' identified by 'centos';
在slave1和slave2节点上:
7、修改MySQL配置文件
vim /etc/my.cnf
[mysqld]
server_id=2 #不同节点此值各不相同,本实验中slave1为2,slave2为3
log_bin
binlog_format=row
read_only=1
innodb_file_per_table
relay_log_purge=0
skip_name_resolve=1
systemctl restart mariadb #重启mysql服务使配置生效
8、使用有复制权限的用户账号连接至主服务器
mysql> CHANGE MASTER TO
MASTER_HOST='192.168.30.4', #此时的主节点为30.4
MASTER_USER='repluser',
MASTER_PASSWORD='centos',
MASTER_LOG_FILE='mariadb-bin.000001',
MASTER_LOG_POS=245,
MASTER_CONNECT_RETRY=10;
mysql> start slave; #启动复制线程
在manager节点上:
9、MHA验证和启动
masterha_check_ssh --conf=/etc/mastermha/app1.cnf #检测
masterha_check_repl --conf=/etc/mastermha/app1.cnf #检测
yum -y install screen
screen -S mha #mha是工作在前台的进程,不能用终端实时检测
masterha_manager --conf=/etc/mastermha/app1.cnf #启动mha
测试:
停止master的服务
[root@master ~]# systemctl stop mariadb
在slave2上执行:mysql> show slave status\G命令,看到Master_Host已经切换为 192.168.30.5,Master_Server_Id切换为2,说明切换成功
重新上线:
原主节点修好起来后,不会抢现主节点,但没有人管,可改作从
vim /etc/my.cnf
server_id=1
log_bin
binlog_format=row
read_only=1
innodb_file_per_table
relay_log_purge=0
skip_name_resolve=1
[root@master ~]# systemctl start mariadb
mysql> CHANGE MASTER TO
MASTER_HOST='192.168.30.5', #此时的主节点为30.5
MASTER_USER='repluser',
MASTER_PASSWORD='centos',
MASTER_LOG_FILE='mariadb-bin.000001',
MASTER_LOG_POS=245,
MASTER_CONNECT_RETRY=10;
mysql> start slave; #启动复制线程
至此,原来的主节点已改作从节点重新上线。
但现在,mha监控在切换时已停止,要想再开启mha监控的话,还需修改mha配置文件,然后再重新启用。
备注:
1、有错误可查看排错日志:/data/mastermha/app1/manager.log
2、MHA缺点:主服务器挂掉后,不负责改调度器,可用keepalived解决
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官方文档:
http://galeracluster.com/documentation-webpages/galera-documentation.pdf(300页)
http://galeracluster.com/documentation-webpages/index.html
https://mariadb.com/kb/en/mariadb/getting-started-with-mariadb-galera-cluster/
Galera Cluster包括两个组件
Galera replication library (galera-3)
WSREP:MySQL扩展Write Set Replication API
wresp复制实现:
percona-cluster
MariaDB-Cluster
注意:都至少需要三个节点,不能安装mariadb-server(需要下专门的galera版mariadb)
实验:实现Galera-Cluster
环境准备:
准备三台机器:
node1: centos7.5 192.168.30.3
node2: centos7.5 192.168.30.4
node3: centos7.5 192.168.30.5
1、给每台机器安装软件包
卸载原有的mariadb-server
yum -y remove mariadb-server
配置yum仓库
vim /etc/yum.repos.d/mariadb.repo
[mariadb]
name=MariaDB
baseurl=https://mirrors.tuna.tsinghua.edu.cn/mariadb/mariadb-5.5.60/yum/centos7-amd64/ #清华大学镜像站
gpgcheck=0
安装软件包,执行:
yum -y install MariaDB-Galera-server
2、每台机添加配置文件
vim /etc/my.cnf.d/server.cnf
[galera]
wsrep_provider=/usr/lib64/galera/libgalera_smm.so
wsrep_cluster_address="gcomm://192.168.30.3,192.168.30.4,192.168.30.5"
binlog_format=row
最重要的就是以上3行,下面3行可不写
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.30.3' #主机IP
node1:
node2:
node3:
3、启动
首次启动时,需要初始化集群,在其中一个节点上执行命令:
/etc/init.d/mysql start --wsrep-new-cluster
而后正常启动其它节点
service mysql start
查看集群中相关系统变量和状态变量:
mysql> SHOW VARIABLES LIKE 'wsrep_%';
mysql> SHOW STATUS LIKE 'wsrep_%';
mysql> SHOW STATUS LIKE 'wsrep_cluster_size';
4、测试
在任何一个节点上操作数据库,其他节点同步操作;如果发生同时操作同条记录,则只有一台节点操作成功。
例如:可用Ansible给三台机同时建相同的表,同时给一张auto_increment表插入行进行测试
复制的问题和解决方案
复制的问题和解决方案:
(1) 数据损坏或丢失
Master:MHA + semi repl
Slave: 重新复制
(2) 混合使用存储引擎
MyISAM:不支持事务
InnoDB:支持事务
(3) 不惟一的server id
重新复制
(4) 复制延迟
需要额外的监控工具的辅助
一从多主:mariadb10版后支持
多线程复制:对多个数据库复制
(责任编辑:IT)
MySQL高可用的三种实现方式 MMM:Multi Master MySQL,多主模型,基于主从复制实现 MHA:Master HA,对主节点进行监控,可实现自动故障转移至其它从节点;通过提升某一从节点为新的主节点,基于主从复制实现,还需要客户端配合实现,目前MHA主要支持一主多从的架构,要搭建MHA,要求一个复制集群中必须最少有三台数据库服务器,一主二从,即一台充当master,一台充当备用master,另外一台充当从库,出于机器成本的考虑,淘宝进行了改造,目前淘宝TMHA已经支持一主一从。MHA官网:https://code.google.com/archive/p/mysql-master-ha/ Galera Cluster:wresp:通过wresp协议在全局实现复制;任何一节点都可读写,不需要主从复制,实现多主可读可写
MHA集群架构
MHA工作原理 1 从宕机崩溃的master保存二进制日志事件(binlog events) 2 识别含有最新更新的slave 3 应用差异的中继日志(relay log)到其他的slave 4 应用从master保存的二进制日志事件(binlog events) 5 提升一个slave为新的master 6 使其他的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信息
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地址 配置文件: global配置,为各application提供默认配置 application配置:为每个主从复制集群
实验:实现MHA 环境准备: 1、准备四台主机: manager: centos7.5 192.168.30.3 master: centos7.5 192.168.30.4 slave1: centos7.5 192.168.30.5 slave2: centos7.5 192.168.30.6 并在四台主机上都执行以下4个操作: •关闭SELinux •清空iptables,执行:iptables -F,iptables -X,iptables -Z •时间同步,执行:ntpdate cn.pool.ntp.org •在4台主机之间实现ssh基于密钥的认证,可参考之前的博客的ssh部分:http://blog.51cto.com/13695854/2120936 2、在MHA官网上下载软件包 登录MHA官网https://code.google.com/archive/p/mysql-master-ha/downloads(可能要搭×××),下载mha4mysql-manager-0.55-0.el6.noarch.rpm和mha4mysql-node-0.54-0.el6.noarch.rpm这两个rpm包
3、安装软件包 在管理节点manager安装两个包 yum install mha4mysql-manager-0.55-0.el6.noarch.rpm mha4mysql-node-0.54-0.el6.noarch.rpm 在被管理节点master、slave1、slave2安装一个包 yum install mha4mysql-node-0.54-0.el6.noarch.rpm
在manager节点: 4、建立配置文件 mkdir /etc/mastermha #mha配置文件的文件夹,可自己更改 vim /etc/mastermha/app1.cnf [server default] user=mhauser password=centos 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=centos ping_interval=1 #每秒检测一次 [server1] hostname=192.168.30.4 candidate_master=1 #可以为主节点 [server2] hostname=192.168.30.5 candidate_master=1 #可以为主节点 [server3] hostname=192.168.30.6
在master节点: 5、修改MySQL配置文件 vim /etc/my.cnf [mysqld] server_id=1 log_bin binlog_format=row innodb_file_per_table skip_name_resolve=1
systemctl restart mariadb #重启mysql服务使配置生效 6、添加用户帐户 查看二进制日志位置 mysql> show master logs; 添加有复制权限的用户帐户 mysql> grant replication slave on *.* to repluser@'192.168.30.%' identified by 'centos'; 添加mha的用户帐户 mysql> grant all on *.* to mhauser@'192.168.30.%' identified by 'centos';
在slave1和slave2节点上: 7、修改MySQL配置文件 vim /etc/my.cnf [mysqld] server_id=2 #不同节点此值各不相同,本实验中slave1为2,slave2为3 log_bin binlog_format=row read_only=1 innodb_file_per_table relay_log_purge=0 skip_name_resolve=1 systemctl restart mariadb #重启mysql服务使配置生效
8、使用有复制权限的用户账号连接至主服务器 mysql> CHANGE MASTER TO MASTER_HOST='192.168.30.4', #此时的主节点为30.4 MASTER_USER='repluser', MASTER_PASSWORD='centos', MASTER_LOG_FILE='mariadb-bin.000001', MASTER_LOG_POS=245, MASTER_CONNECT_RETRY=10; mysql> start slave; #启动复制线程
在manager节点上: 9、MHA验证和启动 masterha_check_ssh --conf=/etc/mastermha/app1.cnf #检测 masterha_check_repl --conf=/etc/mastermha/app1.cnf #检测 yum -y install screen screen -S mha #mha是工作在前台的进程,不能用终端实时检测 masterha_manager --conf=/etc/mastermha/app1.cnf #启动mha
测试: 停止master的服务 [root@master ~]# systemctl stop mariadb 在slave2上执行:mysql> show slave status\G命令,看到Master_Host已经切换为 192.168.30.5,Master_Server_Id切换为2,说明切换成功
重新上线: 原主节点修好起来后,不会抢现主节点,但没有人管,可改作从 vim /etc/my.cnf server_id=1 log_bin binlog_format=row read_only=1 innodb_file_per_table relay_log_purge=0 skip_name_resolve=1 [root@master ~]# systemctl start mariadb mysql> CHANGE MASTER TO MASTER_HOST='192.168.30.5', #此时的主节点为30.5 MASTER_USER='repluser', MASTER_PASSWORD='centos', MASTER_LOG_FILE='mariadb-bin.000001', MASTER_LOG_POS=245, MASTER_CONNECT_RETRY=10; mysql> start slave; #启动复制线程 至此,原来的主节点已改作从节点重新上线。 但现在,mha监控在切换时已停止,要想再开启mha监控的话,还需修改mha配置文件,然后再重新启用。
备注: 1、有错误可查看排错日志:/data/mastermha/app1/manager.log 2、MHA缺点:主服务器挂掉后,不负责改调度器,可用keepalived解决
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官方文档: http://galeracluster.com/documentation-webpages/galera-documentation.pdf(300页) http://galeracluster.com/documentation-webpages/index.html https://mariadb.com/kb/en/mariadb/getting-started-with-mariadb-galera-cluster/ Galera Cluster包括两个组件 Galera replication library (galera-3) WSREP:MySQL扩展Write Set Replication API wresp复制实现: percona-cluster MariaDB-Cluster 注意:都至少需要三个节点,不能安装mariadb-server(需要下专门的galera版mariadb)
实验:实现Galera-Cluster 环境准备: 准备三台机器: node1: centos7.5 192.168.30.3 node2: centos7.5 192.168.30.4 node3: centos7.5 192.168.30.5
1、给每台机器安装软件包 卸载原有的mariadb-server yum -y remove mariadb-server 配置yum仓库 vim /etc/yum.repos.d/mariadb.repo [mariadb] name=MariaDB baseurl=https://mirrors.tuna.tsinghua.edu.cn/mariadb/mariadb-5.5.60/yum/centos7-amd64/ #清华大学镜像站 gpgcheck=0
安装软件包,执行: yum -y install MariaDB-Galera-server 2、每台机添加配置文件 vim /etc/my.cnf.d/server.cnf [galera] wsrep_provider=/usr/lib64/galera/libgalera_smm.so wsrep_cluster_address="gcomm://192.168.30.3,192.168.30.4,192.168.30.5" binlog_format=row 最重要的就是以上3行,下面3行可不写 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.30.3' #主机IP node1:
node2:
node3:
3、启动 首次启动时,需要初始化集群,在其中一个节点上执行命令: /etc/init.d/mysql start --wsrep-new-cluster 而后正常启动其它节点 service mysql start 查看集群中相关系统变量和状态变量: mysql> SHOW VARIABLES LIKE 'wsrep_%'; mysql> SHOW STATUS LIKE 'wsrep_%'; mysql> SHOW STATUS LIKE 'wsrep_cluster_size';
4、测试 在任何一个节点上操作数据库,其他节点同步操作;如果发生同时操作同条记录,则只有一台节点操作成功。 例如:可用Ansible给三台机同时建相同的表,同时给一张auto_increment表插入行进行测试
复制的问题和解决方案 复制的问题和解决方案: (1) 数据损坏或丢失 Master:MHA + semi repl Slave: 重新复制 (2) 混合使用存储引擎 MyISAM:不支持事务 InnoDB:支持事务 (3) 不惟一的server id 重新复制 (4) 复制延迟 需要额外的监控工具的辅助 一从多主:mariadb10版后支持
多线程复制:对多个数据库复制 |