MHA 的组件中主要有两个, 一个是 Manager 节点组件. 类似于一个监督者.
Node 节点组件则是安装于数据库节点, 其中一个作为 Master.
MHA 在主节点发生故障时需要进行主节点自动切换, 所以必不可少地需要管理员权限. 所以多个节点之间需要基于 ssh 秘钥认证.
MHA 的主要配置在于 manager.
准备三台机器统一安装 mysql-5.7 (1922.168.6.12,192.168.6.92,192.168.6.91)
创建用户
useradd -s /sbin/nologin -M mysql
创建数据目录
- mkdir -p /data/mysql
- chown -R mysql.mysql /data/mysql
初始化数据库 (5.7 版本注意初始化时的密码)
/usr/local/mysql/bin/mysqld --no-defaults --initialize --user=mysql --basedir=/usr/local/mysql/ --datadir=/data/mysql/
配置开机自启动
- cp support-files/mysql.server /etc/init.d/mysqld
- chmod +x /etc/init.d/mysqld
- chkconfig --add mysqld
- chkconfig --list
- /etc/init.d/mysqld start
修改初始密码:
/usr/local/mysql/bin/mysqladmin -uroot -p password '123456'
创建软连接
- ln -s /usr/local/mysql/bin/mysql /usr/bin/mysql
- ln -s /usr/local/mysql/bin/mysqlbinlog /usr/bin/mysqlbinlog
第一步: 修改 / etc/my.cnf 配置文件 (三台节点的 server-id 不同)
master 节点
- [mysqld]
- basedir=/usr/local/mysql
- datadir=/data/mysql
- socket=/tmp/mysql.sock
- log-error=/var/log/mysql.log
- log-bin=/data/mysql/mysql-bin
binlog_format=row 开启行模式
secure-file-priv=/tmp 限制 mysqld 的导入 | 导出只能发生在 / tmp / 目录下
- server-id=12
- #GTID
gtid-mode=on 启用 gtid 类型, 否则就是普通的复制架构
enforce-gtid-consistency=true 强制 GTID 的一致性
log-slave-updates=1 slave 更新是否记入日志 (5.6 必须的)
sql_mode=NO_ENGINE_SUBSTITUTION,STRICT_TRANS_TABLES
slave 节点
- [mysqld]
- server-id=13
- basedir=/usr/local/mysql
- datadir=/data/mysql
- socket=/tmp/mysql.sock
- log-error=/var/log/mysql.log
- log-bin=/data/mysql/mysql-bin
- binlog_format=row
- secure-file-priv=/tmp
- sql_mode=NO_ENGINE_SUBSTITUTION,STRICT_TRANS_TABLES
- slave_parallel_workers = 16
- slave_parallel_type= logical_clock
- #GTID
- gtid-mode=on
- enforce-gtid-consistency=true
- log-slave-updates=1
开启半同步复制
master 节点安装插件
- INSTALL PLUGIN rpl_semi_sync_master SONAME 'semisync_master.so';
- # 半同步复制 (加到配置文件 my.cnf)
- rpl_semi_sync_master_enabled=1
- rpl_semi_sync_master_timeout=10000
slave 节点 安装插件 主从同步开启才能启动
- INSTALL PLUGIN rpl_semi_sync_slave SONAME 'semisync_slave.so';
- # 半同步复制 (加到配置文件 my.cnf)
- rpl_semi_sync_slave_enabled=1
注意: 修改完, 重启三个节点的数据库
第二步: 创建复制用户
主节点:
GRANT REPLICATION SLAVE ON *.* TO repl@'%' IDENTIFIED BY '123456';
从库开启复制:
- change master to master_host='192.168.6.12',master_user='repl',master_password='123456',MASTER_AUTO_POSITION=1;
- start slave;
第三步: 关闭 relaylog 自动删除
MySQL 数据库主从复制在缺省情况下从库的 relay logs 会在 SQL 线程执行完毕后被自动删除, 但是对于 MHA 场景下, 对于某些滞后从库的恢复依赖于其他从库的 relay log, 因此采取禁用自动删除功能以及定期清理的办法. 对于清理过多过大的 relay log 需要注意引起的复制延迟资源开销等. MHA 可通过 purge_relay_logs 脚本及配合 cronjob 来完成此项任务.
set global relay_log_purge = 0; 临时 (建议三个节点都做)
relay_log_purge = 0 永久, 在配置文件, 建议在三个节点都做
第四步: 安装各个节点 node 软件包
安装 mha node:
依赖包 perl-DBD-MySQL , 并在三个节点都安装 node 软件
- yum -y install perl-DBD-MySQL
- rpm -ivh mha4mysql-node-0.56-0.el6.noarch.rpm
主库中创建 mha 管理用户
grant all privileges on *.* to mha@'%' identified by '123456';
第五步: 部署 manger 节点 (从库 192.168.6.91 上部署)
- yum install -y perl-Config-Tiny epel-release perl-Log-Dispatch perl-Parallel-ForkManager perl-Time-HiRes
- rpm -ivh mha4mysql-manager-0.56-0.el6.noarch.rpm
创建必须目录
mkdir -p /etc/mha
mkdir -p /var/log/mha/app1 ----可以管理多套主从复制
创建配置文件
vim /etc/mha/app1.cnf -----serverdefault 可以独立
- [server default]
- manager_log=/var/log/mha/app1/manager.log
- manager_workdir=/var/log/mha/app1
- master_ip_failover_script=/usr/local/bin/master_ip_failover
- user=mha
- password=123456
- ping_interval=2
- repl_password=123456
- repl_user=repl
- ssh_user=root
- [server1]
- candidate_master=1
- check_repl_delay=0
- hostname=192.168.6.12
- port=3306
- [server2]
candidate_master=1 ----不管怎样都切到优先级高的主机, 一般在主机性能差异的时候用
check_repl_delay=0 ----不管优先级高的备选库, 数据延时多久都要往那切
- hostname=192.168.6.92
- port=3306
- [server3]
- hostname=192.168.6.91
- port=3306
检测互信
masterha_check_ssh --conf=/etc/mha/app1.cnf
测试复制是否正常
masterha_check_repl --conf=/etc/mha/app1.cnf
第六步: MHA 自带高可用
- vim /usr/local/bin/master_ip_failover
- my $vip = '192.168.6.166/24';
- my $key = '0';
- my $ssh_start_vip = "/sbin/ifconfig eth0:$key $vip";
- my $ssh_stop_vip = "/sbin/ifconfig eth0:$key down";
在主节点上做
ifconfig eth0:0 192.168.6.166/24
启动 mha
nohup masterha_manager --conf=/etc/mha/app1.cnf --remove_dead_master_conf --ignore_last_failover < /dev/null > /var/log/mha/app1/manager.log 2>&1 &
检查状态:
masterha_check_status --conf=/etc/mha/app1.cnf
来源: http://blog.51cto.com/13200489/2117087