- 相关概念(知识回顾)
集群分类:
LB:LVS ,Nginx,HAproxy
HA:Keepalived (主 备 vip)
HPC:专业领域
2.MHA介绍
2.1 MHA简介
MHA全称Master High Availability
由日本DeNA公司youshimaton开发
是一套优秀的实现MySQL高可用的解决方案
数据库的自动故障切换操作能做到在0~30秒之内
MHA能确保在故障切换过程中最大程度保证数据的一致性,以达到真正意义上的高可用。
2.2 MHA组成
MHA Manager (管理节点)
- 管理所有数据库服务器
- 可以单独部署在一台独立的机器上
- 也可以吧部署在某台数据库服务器上
MHA Node(数据节点)
- 存储数据的mysql服务器
- 运行在每台mysql服务器上
2.3 MHA工作过程
由Manager定时探测集群中的master节点,
当master出现故障时,自动将拥有最新数据的slave提升为新的master,然后将所有其他的slave重新指向新的master。
整个故障转移过程对应用程序完全透明。
3.环境准备
3.1 安装依赖包(192.168.4.51/52/53/57)
[student@room9pc01 ~]$ scp -r /linux-soft/03/mysql/mha-soft-student/root@192.168.4.51/52/53/57:/root
[root@mysql57 ~]# cd mha-soft-student/
[root@mysql57 mha-soft-student]# yum -y install perl-*
3.2 配置ssh密钥对认证登陆
- 配置所有数据库服务器之间彼此ssh免密登录
- 配置管理主机ssh免密登录所有数据库服务器
[root@mysql51 ~]# ssh-keygen
[root@mysql51 ~]# ssh-copy-id root@192.168.4.52
[root@mysql51 ~]# ssh-copy-id root@192.168.4.53
[root@mysql51 ~]# ssh root@192.168.4.52
[root@mysql51 ~]# ssh root@192.168.4.53
[root@mysql52 ~]# ssh-keygen
[root@mysql52 ~]# ssh-copy-id root@192.168.4.51
[root@mysql52 ~]# ssh-copy-id root@192.168.4.53
[root@mysql52 ~]# ssh root@192.168.4.51
[root@mysql52 ~]# ssh root@192.168.4.53
[root@mysql53 ~]# ssh-keygen
[root@mysql53 ~]# ssh-copy-id root@192.168.4.51
[root@mysql53 ~]# ssh-copy-id root@192.168.4.52
[root@mysql53 ~]# ssh root@192.168.4.51
[root@mysql53 ~]# ssh root@192.168.4.52
[root@mysql57 ~]# ssh-keygen
[root@mysql57 ~]# ssh-copy-id root@192.168.4.51
[root@mysql57 ~]# ssh-copy-id root@192.168.4.52
[root@mysql57 ~]# ssh-copy-id root@192.168.4.53
[root@mysql57 ~]# ssh root@192.168.4.51
[root@mysql57 ~]# ssh root@192.168.4.52
[root@mysql57 ~]# ssh root@192.168.4.53
3.3 配置一主多从同步结构
3.3.1 配置主库 51
[root@mysql51 ~]# vim /etc/my.cnf
[mysqld]
server_id=51
log_bin=master51
...
:wq
[root@mysql51 ~]# systemctl restart mysqld
[root@mysql51 ~]# mysql -uroot -p123qqq...A
mysql> grant replication slave on *.* to repluser@"%" identified by "123qqq...A";
mysql> show master status;
3.3.2 配置从库 52
[root@mysql52 ~]# vim /etc/my.cnf
[mysqld]
server_id=52
...
:wq
[root@mysql52 ~]# systemctl restart mysqld
[root@mysql52 ~]# mysql -uroot -p123qqq...A
mysql> change master to master_host="192.168.4.51",master_user="repluser",
master_password="123qqq...A",master_log_file="master51.000003",master_log_pos=154;
mysql> start slave;
mysql> show slave status\G;
3.3.3 配置从库 53
[root@mysql53 ~]# vim /etc/my.cnf
[mysqld]
server_id=53
...
:wq
[root@mysql53 ~]# systemctl restart mysqld
[root@mysql53 ~]# mysql -uroot -p123qqq...A
mysql> change master to master_host="192.168.4.51",master_user="repluser",
master_password="123qqq...A",master_log_file="master51.000003",master_log_pos=154;
mysql> start slave;
mysql> show slave status\G;
4.创建MHA集
4.1 配置管理主机
[root@mysql57 ~]# cd mha-soft-student/
[root@mysql57 mha-soft-student]# yum -y install
mha4mysql-node-0.56-0.el6.noarch.rpm
[root@mysql57 mha-soft-student]# tar -xf mha4mysql-manager-0.56.tar.gz
[root@mysql57 mha-soft-student]# cd mha4mysql-manager-0.56
[root@mysql57 mha4mysql-manager-0.56]# perl Makefile.PL
[root@mysql57 mha4mysql-manager-0.56]# yum list | grep -i ExtUtils
[root@mysql57 mha4mysql-manager-0.56]# yum -y install perl-ExtUtils*
[root@mysql57 mha4mysql-manager-0.56]# perl Makefile.P
[root@mysql57 mha4mysql-manager-0.56]# yum list | grep -i CPAN
[root@mysql57 mha4mysql-manager-0.56]# yum -y install perl-CPAN*
[root@mysql57 mha4mysql-manager-0.56]# perl Makefile.PL
[root@mysql57 mha4mysql-manager-0.56]# make
[root@mysql57 mha4mysql-manager-0.56]# make install
4.1.2 编写主配置文件
[root@mysql57 mha4mysql-manager-0.56]# mkdir /etc/mha
[root@mysql57 mha4mysql-manager-0.56]# cp samples/conf/app1.cnf /etc/mha/
[root@mysql57 ~]# vim /etc/mha/app1.cnf
[server default] #管理服务默认配置
manager_workdir=/etc/mha #工作目录
manager_log=/etc/mha/manager.log #日志文件
master_ip_failover_script=/etc/mha/master_ip_failover
#故障切换脚本
repl_user=repluser #主服务器数据同步授权用户
repl_password=123qqq...A #密码
ssh_user=root #访问ssh服务用户
ssh_port=22 #ssh服务端口
user=root #监控用户
password=123qqq...A #密码
[server1] #指定第一台数据库服务器
hostname=192.168.4.51 #服务器Ip地址
port=3306 #服务器端口
candidate_master=1 #竞选主库
[server2] #指定第二台数据库服务器
hostname=192.168.4.52
port=3306
candidate_master=1
[server3] #指定第三台数据库服务器
hostname=192.168.4.53
port=3306
candidate_master=1
4.1.3 创建故障切换脚本
[root@mysql57 ~]# cd mha-soft-student/
[root@mysql57 mha-soft-student]# cp master_ip_failover /etc/mha/
[root@mysql57 mha-soft-student]# chmod +x /etc/mha/master_ip_failover
[root@mysql57 mha-soft-student]# vim /etc/mha/master_ip_failover
my $vip = '192.168.4.100/24'; #定义vip地址 Virtual IP
my $key = "1"; #定义地址编号
my $ssh_start_vip = "/sbin/ifconfig eth0:$key $vip"; #绑定vip地址
my $ssh_stop_vip = "/sbin/ifconfig eth0:$key down"; #释放vip地址
...
:wq
4.1.4 在主服务器51 配置vip
[root@mysql51 ~]# ifconfig eth0:1 192.168.4.100 #在主库部署vip地址
[root@mysql51 ~]# ifconfig eth0:1 #查看vip地址
[root@mysql51 ~]# ifconfig eth0:1 down #删除vip地址
4.2 配置数据节点 192.168.4.51/52/53
4.2.1 安装mha_node软件(在所有数据库服务器上安装mha_node)
[root@mysql52 ~]# cd mha-soft-student/
[root@mysql52 mha-soft-student]# yum -y install mha4mysql-node-0.56-0.el6.noarch.rpm
4.2.2 用户授权
mysql> grant replication slave on *.* to repluser@"%" identified by "123qqq...A";
#数据同步用户
mysql> grant all on *.* to root@"%" identified by "123qqq...A"; #监控用户
4.2.3 启用半同步复制模式
[root@mysql51 ~]# vim /etc/my.cnf
[mysqld]
plugin-load="rpl_semi_sync_master=semisync_master.so;
rpl_semi_sync_slave=semisync_slave.so" #加载模块
rpl_semi_sync_master_enabled=1 #启用master模块
rpl_semi_sync_slave_enabled=1 #启用slave模块
relay_log_purge=0 #禁止自动删除中继日志文件
log_bin=master51
server_id=51
[root@mysql51 ~]# systemctl restart mysqld
[root@mysql52 ~]# vim /etc/my.cnf
[mysqld]
plugin-load="rpl_semi_sync_master=semisync_master.so;
rpl_semi_sync_slave=semisync_slave.so"
rpl_semi_sync_master_enabled=1
rpl_semi_sync_slave_enabled=1
relay_log_purge=0
server_id=52
log_bin=master52
[root@mysql52 ~]# systemctl restart mysqld
[root@mysql53 ~]# vim /etc/my.cnf
[mysqld]
server_id=53
plugin-load="rpl_semi_sync_master=semisync_master.so;
rpl_semi_sync_slave=semisync_slave.so"
rpl_semi_sync_master_enabled=1
rpl_semi_sync_slave_enabled=1
relay_log_purge=0
log_bin=master53
[root@mysql53 ~]# systemctl restart mysqld
5.测试配置 192.168.4.57
5.1 测试ssh配置
[root@mysql57 ~]# masterha_check_ssh --conf=/etc/mha/app1.cnf
5.2 测试主从同步配置
[root@mysql57 ~]# masterha_check_repl --conf=/etc/mha/app1.cnf
排错
5.3 启动服务
[root@mysql57 ~]# masterha_manager --conf=/etc/mha/app1.cnf \
--remove_dead_master_conf \ #删除宕机主库配置
--ignore_last_failover #忽略xxx.health文件
[root@mysql57 ~]# masterha_check_status --conf=/etc/mha/app1.cnf #查看状态
app1 (pid:1796) is running(0:PING_OK), master:192.168.4.51
[root@mysql57 ~]# masterha_stop --conf=/etc/mha/app1.cnf #停止服务
6.测试集群功能
6.1 客户端50 连接vip地址访问数据库服务,存取数据
]# mysql -h192.168.4.100 -uyaya55 -p123qqq...A
6.2 测试集群高可用功能
6.2.1 模拟主服务器故障
- 停止主服务器mysql服务
[root@mysql51 ~]# systemctl stop mysqld
[root@mysql57 ~]#masterha_manager --conf=/etc/mha/app1.cnf
--remove_dead_master_conf --ignore_last_failover
[root@mysql57 ~]# masterha_check_status --conf=/etc/mha/app1.cnf
- 在从服务器查看vip地址
]# ifconfig eth0:1
- 客户端连接vip地址,访问集群
[root@mysql50 ~]# mysql -h192.168.4.100 -uyaya55 -p123qqq...A
6.3 修复故障的数据库服务器
[root@mysql51 ~]# systemctl start mysqld
[root@mysql52 ~]# mysqldump -uroot -p123qqq...A --master-data db9 > db9.sql # 在主服务器mysql52 做完全备份
mysqldump: [Warning] Using a password on the command line interface can be insecure.
[root@mysql52 ~]# scp db9.sql root@192.168.4.51:/root/ # 拷贝备份文件给mysql51主机
[root@mysql51 ~]# mysql -uroot -p123qqq...A db9 < /root/db9.sql # mysql51主机使用备份文件恢复数据
mysql: [Warning] Using a password on the command line interface can be insecure.
[root@mysql51 ~]# grep master52 /root/db9.sql //查看日志名及偏移量
[root@mysql51 ~]# mysql -uroot -p123qqq...A
mysql>change master to master_host="192.168.4.52",master_user="repluser",
master_password="123qqq...A",master_log_file="master52.000001",master_log_pos=895;
mysql> start slave;
mysql> show slave status\G;
[root@mysql57 ~]# vim /etc/mha/app1.cnf
[server1 ]
hostname=192.168.4.51
port=3306
candidate_master=1
:wq
[root@mysql57 ~]# masterha_check_ssh --conf=/etc/mha/app1.cnf #测试SSH
[root@mysql57 ~]# masterha_check_repl --conf=/etc/mha/app1.cnf #测试主从同步
[root@mysql57 ~]# masterha_stop --conf=/etc/mha/app1.cnf #停止管理服务
[root@mysql57 ~]# masterha_manager --conf=/etc/mha/app1.cnf
--remove_dead_master_conf --ignore_last_failover #启动管理服务
[root@mysql57 ~]# masterha_check_status --conf=/etc/mha/app1.cnf
app1 (pid:15806) is running(0:PING_OK), master:192.168.4.52 #服务运行,监视服务器52
MHA 必须做的配置
必须要配置mysql主从同步
必须要指定vip地址
恢复主机时必须手动同步数据和手动配置主从结构 ,重新修改配置