Linux:MYSQL(十五)-高可用MHA实战

MySQL高可用

  • MMM: 年久失修用的少了
    Multi-Master Replication Manager for MySQL,Mysql主主复制管理器是一套灵活的脚本程序,基于perl实现,用来对mysql replication进行监控和故障迁移,并能管理mysql Master-Master复制的配置(同一时间只有一个节点是可写的)
    官网:http://www.mysql-mmm.org
    https://code.google.com/archive/p/mysql-master-master/downloads

  • MHA:逐渐减少
    Master High Availability,对主节点进行监控,可实现自动故障转移至其它从节点;通过提升某一从节点为新的主节点,基于主从复制实现,还需要客户端配合实现,目前MHA主要支持一主多从的架构,要搭建MHA,要求一个复制集群中必须最少有三台数据库服务器,一主二从,即一台充当master,一台充当备用master,另外一台充当从库,出于机器成本的考虑,淘宝进行了改造,目前淘宝TMHA已经支持一主一从
    官网:https://code.google.com/archive/p/mysql-master-ha/

  • Galera Cluster:新项目用这个
    wsrep(MySQL extended with the Write Set Replication)
    通过wsrep协议在全局实现复制;任何一节点都可读写,不需要主从复制,实现多主读写

MHA

MHA工作原理

1 从宕机崩溃的master保存二进制日志事件(binlog events)
2 识别含有最新更新的slave
3 应用差异的中继日志(relay log)到其他的slave
4 应用从master保存的二进制日志事件(binlog events)
5 提升一个slave为新的master
6 使其他的slave连接新的master进行复制

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

在管理节点上安装两个包:

mha4mysql-manager
mha4mysql-node
在被管理节点安装:
mha4mysql-node

在管理节点建立配置文件

vim /etc/mastermha/app1.cnf
[server default]
user=mhauser
password=magedu
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=magedu
ping_interval=1
[server1]
hostname=192.168.8.17
candidate_master=1
[server2]
hostname=192.168.8.27
candidate_master=1
[server3]
hostname=192.168.8.37

实现Master

vim /etc/my.cnf
[mysqld]
log_bin
server_id=1
skip_name_resolve=1
mysql>show master logs
mysql>grant replication slave on *.* to repluser@'192.168.32.%' identified by 'centos';
mysql>grant all on *.* to mhauser@'192.168.32.%’identified by 'centos';

实现slave

vim /etc/my.cnf
[mysqld]
server_id=2 
log_bin
read_only
relay_log_purge=0
skip_name_resolve=1

mysql>CHANGE MASTER TO MASTER_HOST='MASTER_IP',
MASTER_USER='repluser',
MASTER_PASSWORD='centos',
MASTER_PORT=3306,
MASTER_LOG_FILE='mariadb-bin.000001',
MASTER_LOG_POS=245;

在所有节点实现相互之间ssh key验证

MHA验证和启动

检查配置文件SSH连接
masterha_check_ssh --conf=/etc/mha/app1.cnf 
检查复制程序
masterha_check_repl --conf=/etc/mha/app1.cnf
启动mha
masterha_manager --conf=/etc/mha/app1.cnf

排错日志:

/data/mastermha/app1/manager.log

实战

一、准备IP和主机名

192.168.32.7  master
192.168.32.17 slave1
192.168.32.27 slave2
192.168.32.37 mha

二、确定四台机器时间一样

三、随便找一台机器生成公钥,并拷贝到每台机器一份(我这里用192.168.32.7生成)

192.168.32.7:

ssh-keygen
cd .ssh
ls
ssh-cpoy-id 192.168.32.7 拷贝自己机器上一份

scp -rp .ssh 192.168.32.17:/root/ 拷贝.ssh目录到17
scp -rp .ssh 192.168.32.27:/root/ 拷贝.ssh目录到27
scp -rp .ssh 192.168.32.37:/root/ 拷贝.ssh目录到37

ssh 192.168.32.17 连接到17测试
ssh 192.168.32.27 连接到27测试
ssh 192.168.32.37 连接到37测试

四、在master上配置

192.168.32.7:

vim /etc/my.cnf
[mysqld]
server_id=1
innodb_file_per_table
log_bin
skip_name_resolve

五、启动数据库

systemctl start mariadb

六、创建账号(复制账号,管理账号),查看master位置

192.168.32.7:

mysql>
	grant replication slave on *.* to repluser@'192.168.32.%' identified by 'centos';
	grant all on *.* to mhauser@'192.168.32.%' identified by 'centos';

	show master logs;
	'mariadb-bin.000002'  245

七、在slave1,slave2上配置

192.168.32.17:

vim /etc/my.cnf
[mysqld]
server_id=2 
log_bin
read_only
relay_log_purge=0
skip_name_resolve
192.168.32.27:

vim /etc/my.cnf
[mysqld]
server_id=3 
log_bin
read_only
relay_log_purge=0
skip_name_resolve

八、在slave上配置主从

192.168.32.17:
192.168.32.27:

mysql>
	CHANGE MASTER TO MASTER_HOST='192.168.32.7',
MASTER_USER='repluser',
MASTER_PASSWORD='centos',
MASTER_PORT=3306,
MASTER_LOG_FILE='mariadb-bin.000001',
MASTER_LOG_POS=245;

SHOW SLAVE STATUS\G;

九、连接成功后测试是否能够同步

192.168.32.7:
mysql < hellodb_innodb.sql

192.168.32.17:
192.168.32.27:
mysql> show databases;

十、mha脚本安装

192.168.32.37:

epel  安装启动epel源
rz 导入需要安装的两个包
 mha4mysql-manager-0.56-0.el6.noarch.rpm
 mha4mysql-node-0.56-0.el6.noarch.rpm 

yum install mha4mysql-manager-0.56-0.el6.noarch.rpm mha4mysql-node-0.56-0.el6.noarch.rpm 
192.168.32.7:
192.168.32.17:
192.168.32.27:
epel  启动epel源
rz 导入需要安装的node包
 mha4mysql-node-0.56-0.el6.noarch.rpm 

十一、在管理节点建立配置文件

192.168.32.37:

mkdir /etc/mha
vim /etc/mha/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.32.7
candidate_master=1
[server2]
hostname=192.168.32.17
candidate_master=1
[server3]
hostname=192.168.32.27

十二、检查配置文件并启动

192.168.32.37:

检查配置文件SSH连接
masterha_check_ssh --conf=/etc/mha/app1.cnf 
检查复制程序
masterha_check_repl --conf=/etc/mha/app1.cnf
启动mha
masterha_manager --conf=/etc/mha/app1.cnf

注意:前台执行,不要ctrl+c

十三、测试确保复制成功

192.168.32.7: 

mysql>
use hellodb
select * from teachers;
insert teachers values(5,'liuying',31,'f');
select * from teachers;

192.168.32.17: 
192.168.32.27:

mysql>
use hellodb
select * from teachers;

十四、模拟正在复制中,突然宕机场景

192.168.32.7:

mysql>use hellod
mysql>delimiter $$
mysql>create procedure pro_testlog()
	begin
	declare i int;
	set i = 1;
	while i < 100000
	do insert into testlog(name,age) values (concat'wang',i),i);
	set i = i +1;
	end while;
	end$$
mysql>delimiter ;
mysql> call pro_testlog;
快速切换到从服务器看一眼
192.168.32.17:

mysql>select * from hellodb.testlog;
打开另一个主服务器192.168.32.7窗口,杀掉进程
192.168.32.7(2):

killall mysqld

十五、把提升为主的192.168.32.17配置文件中去掉read_only

192.168.32.17:

vim /etc/my.cnf
read_only  去掉配置文件中,下次重启生效,本次提升已经自动关闭

十六、添加一条记录测试新主是否可以复制

192.168.32.17:

mysql>use hellodb
	insert teacher values(6,'dushan',30,m)

192.168.32.27:
mysql>select * from hellodb.teachers;	
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值