MySQL主从复制: MHA
2016-04-28 19:56
656 查看
MySQL主从复制: MHA
大纲前言
MHA的架构
环境部署
实验步骤
总结
前言
上篇文章我们实现了MySQL的主从复制, 但是我们之前就说过, 主从复制是有很多问题的, 我们这篇文章为大家介绍一如何使用
MHA来实现
MySQL复制集群的高可用
MHA的架构
MHA (Master HA) 实现MySQL主从复制主节点高可用 , 主要实现了Automated master monitoring and failover 自主监控和故障转移Interactive (manual) Master Failover 手动故障转移
Non-interactive master failover 非交互式故障转移
Online switching master to a different host 在线切换到新主机
项目地址 Google CodeMHA服务有两种角色, 完成相应的功能MHA Master(管理节点)
MHA Slave(数据节点)MHA Manager通常单独部署在单台主机上 , 用来管理多个Master/Slave集群, 每个集群通常被称为Application
MHA Slave通常部署在单台MySQL服务器上, 通过监控和具有解析和清理log功能的脚本来加快故障转移
MySQL主节点故障时, 按下面的步骤进行转移
MHA的各组件Manager节点的组件masterha_check_ssh: MHA依赖的SSH环境检测工具
masterha_repl: MySQL复制环境检测工具
masterha_manager: MHA 服务主程序
masterha_check_status: MySQL master节点可用性检测工具
masterha_conf_host: 添加或删除配置的节点
masterha_stop: 关闭MHA服务的工具
Node节点的组件save_binary_logs: 保存和复制master的二进制日志
apply_diff_relay_logs: 识别差异的中继日志应用于于其他slave
filter_mysqbinlog: 去除不必要的ROLLBACK事件(MHA已经移除这个工具)
purge_relay_logs: 清除中继日志(不会阻塞SQL线程)
自定义扩展组件secondary_check_script: 通过多条网络路由检测master可用性
master_ip_failover_script: 更新application使用的masterip
shutdown_script: 强制关闭master节点
report_script: 发送报告
init_conf_load_script: 加载初始配置参数
master_ip_online_change_script: 更新master节点ip地址
环境部署
实验环境节点 | IP | 功用 |
---|---|---|
node1 | 172.16.1.2 | Master Node |
node2 | 172.16.1.3 | Slave Node/Master Node |
node3 | 172.16.1.4 | Slave Node |
node4 | 172.16.1.5 | Manager Node |
软件版本MHA下载地址
软件 | 版本 |
---|---|
MySQL | 5.1 |
MHA_Manager | 0.56 |
MHA_Node | 0.54 |
实验步骤
安装配置mysql[root@node1 ~]# yum install mysql-server -y [root@node2 ~]# yum install mysql-server -y [root@node3 ~]# yum install mysql-server -y [root@node4 ~]# yum install mysql-server -ymysql_master_node配置文件这里不对配置进行过多解释,有兴趣可以看我上篇文章
[mysqld] datadir=/var/lib/mysql socket=/var/lib/mysql/mysql.sock innodb_file_per_table = 1 log-bin=master-log log-bin-index=1 server_id=1 user=mysql # Disabling symbolic-links is recommended to prevent assorted security risks symbolic-links=0 [mysqld_safe] log-error=/var/log/mysqld.log pid-file=/var/run/mysqld/mysqld.pidmaster_slave_node配置文件我们这里只展示一个节点的配置文件
[mysqld] datadir=/var/lib/mysql socket=/var/lib/mysql/mysql.sock innodb_file_per_table = 1 log-bin = master-log log-bin-index = 1 relay-log = relay-log read_only = 1 server_id=2 #每个从服务器要使用不同的 user=mysql # Disabling symbolic-links is recommended to prevent assorted security risks symbolic-links=0 [mysqld_safe] log-error=/var/log/mysqld.log pid-file=/var/run/mysqld/mysqld.pid配置主从MySQL Master节点配置我们需要创建一个super权限的用户给MHA_Manager管理来控制各节点
mysql> SHOW MASTER STATUS; #一定要在创建用户前查看并记下POS数值 +-------------------+----------+--------------+------------------+ | File | Position | Binlog_Do_DB | Binlog_Ignore_DB | +-------------------+----------+--------------+------------------+ | master-log.000003 | 106 | | | +-------------------+----------+--------------+------------------+ 1 row in set (0.00 sec) mysql> GRANT REPLICATION SLAVE, REPLICATION CLIENT ON *.* TO 'rpuser'@'%' IDENTIFIED BY 'passwd'; Query OK, 0 rows affected (0.00 sec) ENTFIED BY 'passwd'' at line 1mysql> GRANT ALL ON *.* TO 'mhauser'@'%' IDENTIFIED BY 'passwd'; Query OK, 0 rows affected (0.00 sec) mysql> FLUSH PRIVILEGES; Query OK, 0 rows affected (0.00 sec)MySQL Slave节点配置
mysql> CHANGE MASTER TO -> MASTER_HOST='172.16.1.2', -> MASTER_USER='rpuser', -> MASTER_PASSWORD='passwd', -> MASTER_LOG_FILE='master-log.000003', -> MASTER_LOG_POS=106; Query OK, 0 rows affected (0.03 sec) mysql> START SLAVE; #启动slave Query OK, 0 rows affected (0.00 sec) mysql> SHOW SLAVE STATUS\G; #查看slave-IO和slave-SQL是否为YES Master_Host: 172.16.1.2 Master_User: rpuser Master_Port: 3306 Connect_Retry: 60 Master_Log_File: master-log.000003 Read_Master_Log_Pos: 476 Relay_Log_File: relay-log.000002 Relay_Log_Pos: 622 Relay_Master_Log_File: master-log.000003 Slave_IO_Running: Yes Slave_SQL_Running: Yes配置MHA配置前提我们需要配置每一台主机之间能够互信每台主机互信配置我们这里使用一个非常简便的方法来实现
生成密钥后, 复制到各节点主机 [root@node4 ~]# ssh-keygen -P '' -t rsa -f /root/.ssh/id_rsa #在node4生成密钥 [root@node4 ~]# cat /root/.ssh/id_rsa.pub > /root/.ssh/authorized_keys [root@node4 ~]# scp /root/.ssh/{id_rsa,authorized_keys} node1.anyisalin.com:/root/.ssh/ [root@node4 ~]# scp /root/.ssh/{id_rsa,authorized_keys} node2.anyisalin.com:/root/.ssh/ [root@node4 ~]# scp /root/.ssh/{id_rsa,authorized_keys} node3.anyisalin.com:/root/.ssh/安装MHA
[root@node4 ~]# yum localinstall mha4mysql-manager-0.56-0.el6.noarch.rpm mha4mysql-node-0.54-0.el6.noarch.rpm #在manager节点上安装这两个包 #在各个node节点安装mha_node [root@node2 ~]# yum localinstall mha4mysql-node-0.54-0.el6.noarch.rpm [root@node3 ~]# yum localinstall mha4mysql-node-0.54-0.el6.noarch.rpm [root@node4 ~]# yum localinstall mha4mysql-node-0.54-0.el6.noarch.rpm创建配置文件
[root@node4 ~]# vim /etc/mha.cnf [server default] user=mhauser password=passwd manager_workdir=/data/masterha/app1 manager_log=/data/masterha/app1/manager.log remote_workdir=/data/masterha/app1 ssh_user=root repl_user=rpuser repl_password=passwd ping_interval=1 [server1] hostname=172.16.1.2 candidate_master=1 [server2] hostname=172.16.1.3 candidate_master=1 [server3] hostname=172.16.1.4检查环境启动Masterha前使用自带的检测工具检查一下环境
[root@node4 ~]# masterha_check_ssh --conf=/etc/mha.cnf #检查ssh, --conf指定配置文件 #最后出现以下字段代表成功 Thu Apr 28 19:02:05 2016 - [info] All SSH connection tests passed successfully. [root@node4 ~]# masterha_check_repl --conf=/etc/mha.cnf #检查主从复制 #最后出现以下字段代表成功 MySQL Replication Health is OK.启动MHA
nohup masterha_manager --conf=/etc/mha.cnf &> /data/masterha/app1/manager.log & # 指定配置文件并且放进程在后台运、剥离与终端的关系测试故障转移
[root@node4 ~]# masterha_check_status --conf /etc/mha.cnf #当前主节点为node1 mha (pid:2573) is running(0:PING_OK), master:172.16.1.2 [root@node1 ~]# service mysqld stop #手动停止主节点 [root@node3 ~]# mysql mysql> SHOW SLAVE STATUS\G; Slave_IO_State: Waiting for master to send event Master_Host: 172.16.1.3 #已经转换为node2 Master_User: rpuser Master_Port: 3306 Connect_Retry: 60 Master_Log_File: master-log.000006 Read_Master_Log_Pos: 106 Relay_Log_File: relay-log.000004 Relay_Log_Pos: 252 Relay_Master_Log_File: master-log.000006 [root@node2 ~]# mysql mysql> SHOW GLOBAL VARIABLES LIKE '%read_only%'; #查看, read_only被MHA关闭了 +---------------+-------+ | Variable_name | Value | +---------------+-------+ | read_only | OFF | +---------------+-------+ 1 row in set (0.00 sec)
总结
其实我们这套架构不够完整, 如果要投入生产环境使用还需要提供一个自动切换VIP的脚本, 前端使用MySQL专用的读写分离器进行调度, 但是由于时间原因. 这里又不做更多的叙述了, 大家能够知道基本用法相比那些也就是小意思作者水平很低, 如果有错误及时指出, 如果你觉得本文写的好请点一波赞~(≧▽≦)/~作者: AnyISaIln QQ: 1449472454
感谢: MageEdu
相关文章推荐
- MySQL中的integer 数据类型
- MySQL存储过程
- mysql中int、bigint、smallint 和 tinyint的区别与长度
- mysql load data 导出、导入 csv
- source命令执行SQL脚本文件
- MySQL创建用户及权限控制
- MySQL管理数据表
- linux下mysql添加用户
- mysql procedure
- mysql触发器
- MySQL 备份和恢复策略
- mac下安装mysql(转载)
- mysql 修改编码 Linux/Mac/Unix/通用(杜绝修改后无法启动的情况!)
- MySQL数据的导出、导入(mysql内部命令:mysqldump、mysql)
- mysql数据行转列
- Linux下修改MySQL编码的方法
- MySQL Server 日志
- MySQL 安全事宜
- MySQL 备份与恢复