1.环境准备
主机 | IP | 身份 |
---|---|---|
db01 | 10.0.0.51 | master |
db02 | 10.0.0.52 | slave |
db03 | 10.0.0.53 | slave,manager |
2.做主从
1)配置三台机器
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
[root@db01 ~]# cat /etc/my.cnf [mysqld] server_id=1 log_bin=mysql-bin [root@db02 ~]# cat /etc/my.cnf [mysqld] server_id=2 log_bin=mysql-bin [root@db03 ~]# cat /etc/my.cnf [mysqld] server_id=3 log_bin=mysql-bin |
2)授权主从用户
1 2 3 4 5 6 |
mysql> show master status; +------------------+----------+ | File | Position | +------------------+----------+ | mysql-bin.000004 | 120 | +------------------+----------+ |
4)从库执行同步
1 2 3 4 5 6 7 8 9 10 11 |
#执行同步语句 change master to master_host='172.16.1.51', master_user='rep', master_password='123', master_log_file='mysql-bin.000004', master_log_pos=120; #启动线程 mysql> start slave; Query OK, 0 rows affected (0.01 sec) |
3.部署MHA之前的操作
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 |
1.检查主从状态 2.所有数据库配置关闭自动删除relay-log的功能 #主库: mysql> set GLOBAL relay_log_purge=0; Query OK, 0 rows affected (0.00 sec) [root@db01 ~]# vim /etc/my.cnf [mysqld] relay_log_purge=0 #从库 [root@db02 ~]# vim /etc/my.cnf [mysqld] relay_log_purge=0 [root@db03 ~]# vim /etc/my.cnf [mysqld] relay_log_purge=0 3.配置从库只读 set global read_only=1; 4.检查三台机器server_id必须全都不相同 5.从库也要创建主从用户 grant replication slave on *.* to rep@'172.16.1.%' identified by '123'; 6.开启从库保存binlog [root@db01 ~]# vim /etc/my.cnf [mysqld] log_slave_updates [root@db02 ~]# vim /etc/my.cnf [mysqld] log_slave_updates [root@db03 ~]# vim /etc/my.cnf [mysqld] log_slave_updates #重启从库 [root@db02 ~]# systemctl restart mysqld [root@db03 ~]# systemctl restart mysqld |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 |
#三台机器配置文件 #主库 [root@db01 ~]# vim /etc/my.cnf [mysqld] server_id=1 innodb_data_file_path=ibdata1:76M;ibdata2:12M:autoextend log_bin=mysql-bin relay_log_purge=0 log_slave_updates skip-name-resolve #从库1 [root@db02 ~]# vim /etc/my.cnf [mysqld] server_id=2 log_bin=mysql-bin ##开启binlog relay_log_purge=0 #关闭自动删除relay-log的功能 log_slave_updates #从库保存binlog skip-name-resolve #禁止反向解析 #从库2 [root@db03 ~]# vim /etc/my.cnf [mysqld] server_id=3 log_bin=mysql-bin #开启binlog relay_log_purge=0 #关闭自动删除relay-log的功能 log_slave_updates #从库保存binlog skip-name-resolve #禁止反向解析 |
4.部署MHA
1)安装依赖(所有机器)
1 2 3 |
[root@db01 ~]# yum install perl-DBD-MySQL -y [root@db02 ~]# yum install perl-DBD-MySQL -y [root@db03 ~]# yum install perl-DBD-MySQL -y |
2)安装manager节点依赖(db03)
1 |
[root@db03 ~]# yum install -y perl-Config-Tiny epel-release perl-Log-Dispatch perl-Parallel-ForkManager perl-Time-HiRes |
3)安装node节点(所有机器)
1 2 3 4 5 6 7 8 9 |
#上传node代码包 [root@db01 ~]# rz mha4mysql-node-0.56-0.el6.noarch.rpm [root@db02 ~]# rz mha4mysql-node-0.56-0.el6.noarch.rpm [root@db03 ~]# rz mha4mysql-node-0.56-0.el6.noarch.rpm #安装 [root@db01 ~]# yum localinstall -y mha4mysql-node-0.56-0.el6.noarch.rpm [root@db02 ~]# yum localinstall -y mha4mysql-node-0.56-0.el6.noarch.rpm [root@db03 ~]# yum localinstall -y mha4mysql-node-0.56-0.el6.noarch.rpm |
4)部署manager节点(db03)
1 2 3 4 5 |
#上传代码包 [root@db03 ~]# rz mha4mysql-manager-0.56-0.el6.noarch.rpm #安装 [root@db03 ~]# yum localinstall -y mha4mysql-manager-0.56-0.el6.noarch.rpm |
5)添加一个MHA管理数据库的用户(所有机器)
1 2 3 |
#所有数据库都要添加 mysql> grant all on *.* to mha@'172.16.1.%' identified by 'mha'; Query OK, 0 rows affected (0.01 sec) |
6)配置软连接
1 2 3 |
#如果不能直接执行数据库命令的时候,如果不创建命令软连接,检测mha复制情况的时候会报错 [root@db03 ~]# ln -s /application/mysql/bin/mysqlbinlog /usr/bin/mysqlbinlog [root@db03 ~]# ln -s /application/mysql/bin/mysql /usr/bin/mysql |
7)编写MHA配置文件(db03)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 |
#创建存放配置文件的目录 [root@db03 ~]# mkdir /service/mha -p #编辑配置文件 [root@db03 ~]# vim /service/mha/app1.cnf #注释 [root@db01 ~]# cat /service/mha/app1.cnf #默认配置 [server default] #自定义日志文件 manager_log=/service/mha/manager #自定义工作目路 manager_workdir=/service/mha/app1 #主库的binlog目录 master_binlog_dir=/usr/local/mysql/data #MHA管理数据库的用户 user=mha #MHA管理数据库的用户密码 password=mha #检测主库存活的间隔时间 ping_interval=2 #主从复制的用户 repl_user=rep #主从复制的密码 repl_password=123 #指定ssh免密的用户 ssh_user=root #指定主机 [server1] hostname=172.16.1.51 port=3306 [server2] #candidate_master=1 #check_repl_delay=0 hostname=172.16.1.52 port=3306 [server3] hostname=172.16.1.53 port=3306 candidate_master=1 #默认情况下如果一个slave落后master 100M的relay logs的话,MHA将不会选择该slave作为一个新的master,因为对于这个slave的恢复需要花费很长时间,通过设置check_repl_delay=0,MHA触发切换在选择一个新的master的时候将会忽略复制延时,这个参数对于设置了candidate_master=1的主机非常有用,因为这个候选主在切换的过程中一定是新的master check_repl_delay=0 |
8)创建工作目录
1 |
[root@db03 ~]# mkdir /service/mha/app1 |
9)配置服务器免密
1 2 3 4 5 6 7 8 9 |
#创建秘钥对 [root@db01 ~]# ssh-keygen -t dsa -P '' -f ~/.ssh/id_dsa >/dev/null 2>&1 [root@db02 ~]# ssh-keygen -t dsa -P '' -f ~/.ssh/id_dsa >/dev/null 2>&1 [root@db03 ~]# ssh-keygen -t dsa -P '' -f ~/.ssh/id_dsa >/dev/null 2>&1 #发送公钥,包括自己 [root@db01 ~]# ssh-copy-id -i /root/.ssh/id_dsa.pub root@172.16.1.51 [root@db02 ~]# ssh-copy-id -i /root/.ssh/id_dsa.pub root@172.16.1.52 [root@db03 ~]# ssh-copy-id -i /root/.ssh/id_dsa.pub root@172.16.1.53 |
10)启动前检测
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 |
1.检查ssh免密 [root@db03 ~]# masterha_check_ssh --conf=/service/mha/app1.cnf 2.检查主从状态 [root@db03 ~]# masterha_check_repl --conf=/service/mha/app1.cnf #如果报错,可能是没有配置反向解析 #配置反向解析 [root@db01 ~]# vim /etc/my.cnf [mysqld] skip-name-resolve #禁止反向解析 [root@db02 ~]# vim /etc/my.cnf [mysqld] skip-name-resolve #禁止反向解析 [root@db03 ~]# vim /etc/my.cnf [mysqld] skip-name-resolve #禁止反向解析 |
11)启动MHA
1 2 3 4 5 6 7 8 9 10 11 12 13 |
[root@db03 ~]# nohup masterha_manager --conf=/service/mha/app1.cnf --remove_dead_master_conf --ignore_last_failover < /dev/null > /service/mha/app1/manager.log 2>&1 & nohup #后台启动 masterha_manager #MHA启动程序 --conf=/service/mha/app1.cnf #指定配置文件 --remove_dead_master_conf #移除死掉的主节点配置 --ignore_last_failover #忽略最后一次切换 < /dev/null > /service/mha/app1/manager.log 2>&1 & #把日志写入到指定文件 #安全机制 1.完成一次切换后,会生成一个锁文件 2.再次进行切换时,会检查锁文件 3.如果锁文件存在,则不能进行切换,8小时后才能进行再次切换 |
12)查看日志测试切换
1 2 3 4 5 |
#监控日志 [root@db03 ~]# tail -f /service/mha/manager #停掉主库 [root@db01 ~]# systemctl stop mysqld |