MHA的介绍、部署及测试

MHA集群介绍
1.简介【 MHA ( Master High Availability )】

– 是一套优秀的作为 MySQL 高可用性环境下故障切换和主从提升的高可用软件。
– 目前在 MySQL 高可用方面是一个相对成熟的解决方案。
– 在 MySQL 故障切换过程中, MHA 能做到在 0~30 秒之内自动完成数据库的故障切换操作
– 并且在进行故障切换的过程中, MHA 能在最大程度上保证数据的一致性,以达到真正意义上的高可用。

2.MHA组成

MHA Manager (管理节点)
– 可以单独部署在一台独立的机器上管理多个 master-slave 集群,也可以部署在一台 slave 节点上。
MHA Node (数据节点)
– 运行在每台 MySQL 服务器上

3.MHA 工作过程
工作过程:MHA Manager 会定时探测集群中的 master 节点,当 master 出现故障时,它可以自动将最新数据的 slave 提升为新的 master ,然后将所有其他的 slave重新指向新的 master 。整个故障转移过程对应用程序完全透明。

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

4.拓扑结构
拓扑结构图
5.IP规划
IP规划
###########################################
###########################################

一、准备集群环境
(1)准备6台虚拟机,IP规划如下: #192.168.4.60(主节点) 主机名:master60
#192.168.4.61(主备) 主机名:master61
#192.168.4.62(主备) 主机名:master62
#192.168.4.63(从) 主机名:slave63
#192.168.4.64(从) 主机名:slave64
#192.168.4.65(manager管理服务器) 主机名:mha65
#VIP地址:192.168.4.100
(2)在所有主机上安装Perl依赖包(60-65)

#yum -y install mha-soft-student/perl-*.rpm				
 		

(3)在所有数据库服务器上安装mha-node包(60-64)

#yum -y install perl-DBD-mysql perl-DBI	
#rpm -ivh mha4mysql-node-0.56-0.el6.noarch.rpm

(4)在管理主机上安装mha_node和mha-manager包(仅仅65操作)

[root@mha65 mha-soft-student]#yum -y install perl-DBD-mysql perl-DBI	
[root@mha65 mha-soft-student]#rpm -ivh mha4mysql-node-0.56-0.el6.noarch.rpm
[root@mha65 mha-soft-student]# yum -y  install perl-ExtUtils-*   perl-CPAN-*	
[root@mha65 mha-soft-student]# tar -xf mha4mysql-manager-0.56.tar.gz	
[root@mha65 mha-soft-student]# cd mha4mysql-manager-0.56/ 	
[root@mgm56 mha4mysql-manager-0.56]#perl  Makefile.PL			
	Checking if your kit is complete...			Looks good(看到次字样的成功)	
[root@mgm56 mha4mysql-manager-0.56]#make && make install

二、配置ssh密钥对认证登录

(1)所有节点之间可以互相以ssh密钥对认证登录(60-64之间)
#ssh-keygen
#ssh-copy-id
[root@master60 ~]#ssh-keygen	
[root@master60 ~]# for i in 61 62 63 64				
> do				
>  ssh-copy-id 192.168.4.$i				
> done
#############################	
[root@master61 ~]#ssh-keygen	
[root@master61 ~]# for i in 60 62 63 64				
> do				
> ssh-copy-id 192.168.4.$i				
> done
 ###########################	
 [root@master62 ~]#ssh-keygen	
 [root@master62 ~]# for i in 60 61 63 64 				
> do 				
>ssh-copy-id 192.168.4.$i				
> done
> ############################	
[root@slave63 ~]#ssh-keygen	
[root@slave63 ~]# for i in 60 61 62 64				
> do 				
> ssh-copy-id 192.168.4.$i				
> done
 #############################	
[root@slave64 ~]#ssh-keygen	
[root@slave64 ~]# for i in 60 61 62 63				
> do				
> ssh-copy-id 192.168.4.$i				
> done
###################################
[root@mha65 ~]# ssh-keygen	
> [root@mha65 ~]# for i in 60 61 62 63 64 			
>  do			
> ssh-copy-id 192.168.4.$i			
>done

三、 部署集群环境
#配置主节点master60
#配置主备节点master61/master62 *
#配置从节点slave63/slave64 *
#配置管理节点mha65
#################################
#60主库 开半同步复制
#61从库(备用主库) 开半同步复制
#62从库(备用主库) 开半同步复制
#63从库 不做备用主库所以不用开半同步复制
#64从库 不做备用主库所以不用开半同步复制

(1)配置mha集群环境,安装数据库(60-64)

[root@room9pc01 software]# for i in 60 61 62 63 64                   		
>do					 
>scp -r mysql/ 192.168.4.$i:/root/					
>done

############在这里以60为例进行操作,其他(61/62/63/64)主机与60的操作一样	
[root@master60 mysql]#tar -xf mysql-5.7.17.tar  #解包	
[root@master60 mysql]#yum -y install perl-JSON  #安装Perl语言解释器	
[root@master60 mysql]#yum -y install mysql-community-*.rpm  #安装MySQL社区开源版	
[root@master60 mysql]# rpm -qa | grep -i mysql					
		mysql-community-server-5.7.17-1.el7.x86_64					
		mysql-community-test-5.7.17-1.el7.x86_64					
		perl-DBD-MySQL-4.023-6.el7.x86_64					
		mysql-community-common-5.7.17-1.el7.x86_64					
		mysql-community-client-5.7.17-1.el7.x86_64					
		mysql-community-devel-5.7.17-1.el7.x86_64					
		mysql-community-embedded-devel-5.7.17-1.el7.x86_64					
		mysql-community-libs-compat-5.7.17-1.el7.x86_64					
		mysql-community-minimal-debuginfo-5.7.17-1.el7.x86_64					
		mha4mysql-node-0.56-0.el6.noarch					
		mysql-community-libs-5.7.17-1.el7.x86_64					
		mysql-community-embedded-5.7.17-1.el7.x86_64					
		mysql-community-embedded-compat-5.7.17-1.el7.x86_64
###########启动服务并检查端口
[root@master60 mysql]# systemctl restart mysqld	
[root@master60 mysql]# netstat -ntulp  | grep 3306					
		tcp6  0  0 :::3306  :::*  LISTEN  1060/mysqld  
###########登录服务器修改密码	
[root@master60 ~]# cat /var/log/mysqld.log | grep -i password		
		2019-05-31T00:34:24.806847Z 1 [Note] A temporary password is generated for root@localhost: ZW6:#s?lMFyj
[root@master60 ~]# mysql -u root -p "ZW6:#s?lMFyj"
		mysql> alter user root@"localhost" identified by "123qqq...A";(命令行临时修改密码策略)				
		mysql> set global validate_password_length=6;#密码长度					     			
		mysql> set global validate_password_policy=0;#密码级别低									
		mysql> update mysql.user set authentication_string=password("123456")  where user="root" and host="localhost";  #修改root用户登录密码为123456
		mysql> flush  privileges;#刷新
		(配置文件永久修改)				
		vim /etc/my.cnf					
		[mysqld]						
		validate_password_length=6						
		validate_password_policy=0
###########################################################
 (2)master60数据库服务器配置文件
 #############开启binlog
 [root@master60] #vim /etc/my.cnf		
	 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开启半同步插件		
 	server_id=51 #指定server_id		
 	log-bin=master51 #开启binlog日志		
	 binlog-format="mixed" #binlog日志格式	
 [root@master60 ~]#systemctl restart mysqld后登陆服务器			
	 mysql> set global relay_log_purge=off;#不自动删除本机的中继日志文件			
	 mysql> grant replication slave on *.* to repluser@"%" identified by "123456";#添加主从同步复制用户
####################master61(主备)配置
[root@master61 ~]# vim /etc/my.cnf			
	[mysqld]			
	validate_password_length=6			
	validate_password_policy=0			
	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			
	server_id=61			
	log-bin=maste61			
	binlog-format="mixed" 	
	[root@master61]#systemctl restart mysqld后登陆服务器			
		mysql> set global  relay_log_purge=off;			
		mysql> change master to master_host="192.168.4.60",    				-
		> master_user="repluser",    				
		>  master_password="123456",    				
		> master_log_file="maste60.000001",    				
		> master_log_pos=154;			
		> mysql> start slave;			
		> mysql> show slave status\G;
####################master62(主备配置)
[root@master61 ~]# vim /etc/my.cnf				
		[mysqld]				
		validate_password_length=6				
		validate_password_policy=0				
		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				
		server_id=62				
		log-bin=maste62				
		binlog-format="mixed" 			
[root@master62]#systemctl restart mysqld后登陆服务器			
		mysql> set global  relay_log_purge=off;				
		mysql> change master to master_host="192.168.4.60",	    				
			-> master_user="repluser",	    				
			-> master_password="123456",	    				
			-> master_log_file="maste60.000001",	    				
			-> master_log_pos=154;				
		mysql> start slave;				
		mysql> show slave status\G;
###################slave63从配置			
[root@slave63]#vim /etc/my.cnf				
	server_id=63				
mysql> change master to				   
	 -> master_host="192.168.4.60",				   
	 -> master_user="repluser",				   
	 -> master_password="123456",				  
	 -> master_log_file="maste60.000001",				  
	 -> master_log_pos=154;				
 mysql> start slave;				
 mysql> show slave status\G;

###################slave64从配置			
[root@slave63]#vim /etc/my.cnf				
	server_id=63				
mysql> change master to				    
	-> master_host="192.168.4.60",				   
	-> master_user="repluser",				   
	-> master_password="123456",				      
        -> master_log_file="maste60.000001",				   
	-> master_log_pos=154;				
   mysql> start slave;				
   mysql> show slave status\G;
(3)配置管理主机mha65
	# cp bin/* /usr/local/bin/ 	
	#mkdir /etc/mha_manager    //创建工作目录	
	# cp samples/conf/app1.cnf  /etc/mha_manager   //建立样板文件
	vim /etc/mha_manager/app1.cnf 
	manager_workdir=/etc/mha_manager					manager_log=/etc/mha_manager/manager.log  #管理服务启动之后的日志文件			master_ip_failover_script=/usr/local/bin/master_ip_failover #管理服务主机发现故障时调用的脚本 	
			
	ssh_user=root   #所有主机之间互相ssh时登录的用户名			
	ssh_port=22   #  ssh时的端口号 
				
	repl_user=repluser  #主从同步的授权用户			
	repl_password=123456   
				
	user=root  #65去监视60/61/62/63/64主机时,连接数据库的用户			
	password=123456   
	 			
	[server1]			
	hostname=192.168.4.60			
	port=3306 	
			
	[server2]			
	hostname=192.168.4.61			
	port=3306			
	candidate_master=1   #设置为候选master 
				
	[server3]			
	hostname=192.168.4.62			
	port=3306			
	candidate_master=1   #设置为候选master 
				
	[server4]
	hostname=192.168.4.63			
	no_master=1   #不竞选master
	 			
	[server5]			
	hostname=192.168.4.64			
	no_master=1   #不竞选master
cp samples/scripts/master_ip_failover  usr/local/bin/        //创建故障切换的脚本
##############################
四 测试MHA集群	
#查看MHA集群状态		
#试节点之间的SSH登录	
#测试集群VIP的故障切换功能
######验证配置
(1)在主机61/62上检查是否有同步数据的用户repluser		
	61:grant replication on *.* to repluser@"%" identified by "123456";		
	62:grant replication on *.* to repluser@"%" identified by "123456";
(2)在60主机上做root的授权,其他的会同步(如果不做,在验证数据节点的主从同步配置时会处错误)
(3)验证数据节点的主从同步配置
	[root@mha65 bin]# masterha_check_ssh -conf=/etc/mha_manager/app1.cnf               
		 [info] All SSH connection tests passed successfully.(出现这个表示成功)
(4)验证数据节点的主从同步配置 (先把自动failover时候的切换脚本注释掉)
	[root@mha65 bin]#masterha_check_repl  --conf=/etc/mha_manager/app1.cnf	
		MySQL Replication Health is OK.(出现这个表示成功)
(5)启动管理服务MHA_Manager
	masterha_manager  --conf=/etc/mha_manager/app1.cnf --remove_dead_master_conf --ignore_last_failover				
		Fri May 31 15:06:18 2019 - [warning] Global configuration file /etc/masterha_default.cnf not found. Skipping.				
		Fri May 31 15:06:18 2019 - [info] Reading application default configuration from /etc/mha_manager/app1.cnf..				
		Fri May 31 15:06:18 2019 - [info] Reading server configuration from /etc/mha_manager/app1.cnf..
		
(6)另开一个终端,查看服务的运行状态
[root@mha65 bin]# masterha_check_status  --conf=/etc/mha_manager/app1.cnf			
	app1 (pid:4061) is running(0:PING_OK), master:192.168.4.60
(7)停止服务
[root@mha65 bin]# masterha_stop  --conf=/etc/mha_manager/app1.cnf			
	Stopped app1 successfully.



########测试故障转移
(1)在主库60上面配置VIP地址(首先要在主机(主)上添加一个VIP,然后当主的服务出现异常的时候,自动利用脚本把有故障的主的VIPdown掉,然后把VIP的权限给另外一个)
		[root@master60 ~]# ifconfig eth0:1 192.168.4.100/24
(2)在配置文件里面把自动failover时候的切换脚本去掉注释
(3)修改 master_ip_failover 脚本,设置如下内容:
	34 my $vip = '192.168.4.100/24';  		
	35 my $key = "1"; 		
	36 my $ssh_start_vip = "/sbin/ifconfig eth0:$key $vip"; 		
	37 my $ssh_stop_vip = "/sbin/ifconfig eth0:$key down";
(4)启动服务
	masterha_manager --conf=/etc/mha_manager/app1.cnf
######模拟故障测试
(1)停掉60的数据库服务,	
[root@mha65 bin]#  masterha_manager --conf=/etc/mha_manager/app1.cnf  --remove_dead_master_conf --ignore_last_failover		
	Fri May 31 15:21:45 2019 - [warning] Global configuration file /etc/masterha_default.cnf not found. Skipping.		
	Fri May 31 15:21:45 2019 - [info] Reading application default configuration from /etc/mha_manager/app1.cnf..		
	Fri May 31 15:21:45 2019 - [info] Reading server configuration from /etc/mha_manager/app1.cnf..		  Creating /var/tmp if not exists..    ok.		  Checking output directory is accessible or not..		   ok.		  Binlog found at /var/lib/mysql, up to maste60.000001		
	Fri May 31 15:22:13 2019 - [warning] Global configuration file /etc/masterha_default.cnf not found. Skipping.		
	Fri May 31 15:22:13 2019 - [info] Reading application default configuration from /etc/mha_manager/app1.cnf..		
	Fri May 31 15:22:13 2019 - [info] Reading server configuration from /etc/mha_manager/app1.cnf..
(2)检测发现VIP地址已经转移到了其他两台主备中的一台上,检查主库信息与从库信息,运行成功。
							```
		
	

有些地方还是不成熟,正在努力改进中ing.....
  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

河 静

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值