DBA08 - MHA集群概述、部署MHA集群 测试配置
一、MHA集群概述
1.1 MHA介绍
1.1.1 MHA 简介
• MHA ( Master High Availability )
– 是一套优秀的作为 MySQL 高可用性环境下故障切换和
主从提升的高可用软件。
– 目前在 MySQL 高可用方面是一个相对成熟的解决方案。
– 在 MySQL 故障切换过程中, MHA 能做到在 0~30 秒
之内自动完成数据库的故障切换操作
– 并且在进行故障切换的过程中, MHA 能在最大程度上
保证数据的一致性,以达到真正意义上的高可用。
1.1.2 MHA组成
- MHA Manager (管理节点)
– 可以单独部署在一*立的机器上管理多个 master-slave 集群,也可以部署在一台 slave 节点上。
- MHA Node (数据节点)
– 运行在每台 MySQL 服务器上。
1.2 MHA工作过程
1.2.1 MHA 集群架构
1.2.2 MHA 工作过程
• MHA Manager 会定时探测集群中的 master 节点,
当 master 出现故障时,它可以自动将最新数据的 sl
ave 提升为新的 master ,然后将所有其他的 slave
重新指向新的 master 。整个故障转移过程对应用程
序完全透明。
– ( 1 )从宕机崩溃的 master 保存二进制日志事件( binlog events)
– ( 2 )识别含有最新更新的 slave
– ( 3 )应用差异的中继日志( relay log )到其他的 slave
– ( 4 )应用从 master 保存的二进制日志事件( binlog events )
– ( 5 )提升一个 slave 为新的 master ;
– ( 6 )使其他的 slave 连接新的 master 进行复制;
二、部署mysql高可用集群
2.1 集群概述
部署MySQL集群 (MHA + mysql一主多从)
集群:使用多台服务器提供相同的服务
集群类型:LB(负载均衡集群) HA(高可用集群) HPC(高计算集群)
2.2 集群拓扑结构
2.2.1 拓扑图
- 采用五个MHA数据节点,一个MHA管理节点
2.2.2 IP规划
角色 | IP 地址 | 主机名 |
Master 数据库服务器 | 192.168.4.51 | master51 |
备用 1 master 数据库服务器 | 192.168.4.52 | master52 |
备用 2 master 数据库服务器 | 192.168.4.53 | master53 |
第 1 台 slave 服务器 | 192.168.4.54 | slave54 |
第 2 台 slave 服务器 | 192.168.4.55 | slave55 |
Mha_manager 服务器 | 192.168.4.56 | mgm56 |
VIP 地址 | 192.168.4.100 |
51-55 是数据库服务器 (只保留初始的4个库) 56 管理主机(不需要运行数据库服务)
把软件包拷贝到所有的主机里 51-56
]# scp -r mha-soft 192.168.4.5X:/root/
3.2 准备集群环境
3.2.1 配置主从同步
51 主库 开半同步复制
52 从库(备用主库) 开半同步复制
53 从库(备用主库) 开半同步复制
54 从库 不做备用主库所以不用开半同步复制
55 从库 不做备用主库所以不用开半同步复制
1.master51配置
host51 ] # 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
-
-
server_id=51
-
log-bin=master51
-
binlog-format=“mixed”
[aaa@qq.com ~]# systemctl restart mysqld
[aaa@qq.com ~]# ls /var/lib/mysql/master51.* //host51的mysql目录下有做为主库的两个文件
/var/lib/mysql/master51.000001 /var/lib/mysql/master51.index
[aaa@qq.com ~]# mysql -uroot -p123456
mysql> grant replication slave on *.* to aaa@qq.com”%” identified by “123456”;
在52 , 53 机器上也要授权repluser用户,使其他从库能来同步数据
Query OK, 0 rows affected, 1 warning (10.04 sec)
mysql> set global relay_log_purge=off; //不让中继日志删除,默认情况下SQL线程执行完一条中继日志就会删除中继日志信息
Query OK, 0 rows affected (0.15 sec)
或:在配置文件中的永久配置: relay_log_purge=0
mysql> show master status;
+—————–+———-+————–+——————+——————-+
| File | Position | Binlog_Do_DB | Binlog_Ignore_DB | Executed_Gtid_Set |
+—————–+———-+————–+——————+——————-+
| master51.000001 | 441 | | | |
+—————–+———-+————–+——————+——————-+
mysql> quit;
2.备用主库master52的配置
]# 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
-
-
server_id=52
-
log-bin=master52
-
binlog-format="mixed"
]# systemctl restart mysqld
[aaa@qq.com ~]# ls /var/lib/mysql/master52.*
/var/lib/mysql/master52.000001 /var/lib/mysql/master52.index
[aaa@qq.com ~]# mysql -uroot -p123456
mysql> set global relay_log_purge=off;
Query OK, 0 rows affected (0.13 sec)
mysql> change master to
-> master_host=”192.168.4.51”,
-> master_user=”repluser”,
-> master_password=”123456”,
-> master_log_file=”master51.000001”,
-> master_log_pos=441;
Query OK, 0 rows affected, 2 warnings (0.04 sec)
mysql> start slave;
Query OK, 0 rows affected (0.01 sec)
[aaa@qq.com ~]# mysql -uroot -p123456 -e “show slave status\G” | grep -i YES
mysql: [Warning] Using a password on the command line interface can be insecure.
Slave_IO_Running: Yes
Slave_SQL_Running: Yes
3.备用主库master53的配置
]# 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
-
-
server_id=53
-
log-bin=master53
-
binlog-format="mixed"
[aaa@qq.com ~]# systemctl restart mysqld
[aaa@qq.com ~]# ls /var/lib/mysql/master53.*
/var/lib/mysql/master53.000001 /var/lib/mysql/master53.index
[aaa@qq.com ~]#
[aaa@qq.com ~]# mysql -uroot -p123456
mysql> set global relay_log_purge=off;
Query OK, 0 rows affected (0.14 sec)
mysql> change master to master_host=”192.168.4.51”,master_user=”repluser”,master_password=”123456”,
-> master_log_file=”master51.000001”,master_log_pos=441;
Query OK, 0 rows affected, 2 warnings (0.05 sec)
mysql> start slave;
Query OK, 0 rows affected (0.00 sec)
[aaa@qq.com ~]# mysql -uroot -p123456 -e “show slave status\G” | grep -i yes
mysql: [Warning] Using a password on the command line interface can be insecure.
Slave_IO_Running: Yes
Slave_SQL_Running: Yes
4.配置从服务器54
[aaa@qq.com ~]# vim /etc/my.cnf
-
[mysqld]
-
server_id=54
[aaa@qq.com ~]# systemctl restart mysqld
[aaa@qq.com ~]# mysql -uroot -p123456
mysql> change master to master_host=”192.168.4.51”,master_user=”repluser”,master_password=”123456”,
-> master_log_file=”master51.000001”,master_log_pos=441;
Query OK, 0 rows affected, 2 warnings (0.09 sec)
mysql> start slave;
Query OK, 0 rows affected (0.00 sec)
mysql> quit;
Bye
[aaa@qq.com ~]# mysql -uroot -p123456 -e “show slave status\G” | grep -i yes
mysql: [Warning] Using a password on the command line interface can be insecure.
Slave_IO_Running: Yes
Slave_SQL_Running: Yes
5.配置从服务器55
[aaa@qq.com ~]# vim /etc/my.cnf
-
[mysqld]
-
server_id=55
[aaa@qq.com ~]# systemctl restart mysqld
[aaa@qq.com ~]# mysql -uroot -p123456
mysql> change master to master_host=”192.168.4.51”,master_user=”repluser”,master_password=”123456”,
-> master_log_file=”master51.000001”,master_log_pos=441;
Query OK, 0 rows affected, 2 warnings (0.09 sec)
mysql> start slave;
Query OK, 0 rows affected (0.00 sec)
mysql> quit;
Bye
[aaa@qq.com ~]# mysql -uroot -p123456 -e “show slave status\G” | grep -i yes
mysql: [Warning] Using a password on the command line interface can be insecure.
Slave_IO_Running: Yes
Slave_SQL_Running: Yes
3.2.2 在客户端测试主从同步配置
1.在主库51上添加访问数据的授权用户
[aaa@qq.com ~]# mysql -uroot -p123456
mysql> grant all on gamedb.* to aaa@qq.com”%” identified by “123456”;
2.在客户端主机连接主库51 建库表记录
mysql> create database gamedb;
Query OK, 1 row affected (0.01 sec)
mysql> create table gamedb.t1 (id int);
Query OK, 0 rows affected (0.04 sec)
mysql> insert into gamedb.t1 values(999);
Query OK, 1 row affected (0.15 sec)
mysql> insert into gamedb.t1 values(999);
Query OK, 1 row affected (0.05 sec)
mysql> select * from gamedb.t1;
+——+
| id |
+——+
| 999 |
| 999 |
+——+
2 rows in set (0.00 sec)
mysql>
3.在客户端使用授权用户连接从库52-55,也能看到同样的库表及记录
[aaa@qq.com ~]# mysql -h从库IP地址 -uadmin -p123456
mysql> select * from gamedb.t1;
+——+
| id |
+——+
| 999 |
| 999 |
+——+
3.2.3 配置ssh秘钥对认证登陆
1.所有数据库服务器(51-55)之间可以root无密码ssh登陆
[aaa@qq.com ~]# ssh-******
336 ssh-copy-id aaa@qq.com
337 ssh-copy-id aaa@qq.com
338 ssh-copy-id aaa@qq.com
339 ssh-copy-id aaa@qq.com
[aaa@qq.com ~]# ssh-******
159 ssh-copy-id aaa@qq.com
160 ssh-copy-id aaa@qq.com
161 ssh-copy-id aaa@qq.com
162 ssh-copy-id aaa@qq.com
[aaa@qq.com ~]# ssh-******
61 ssh-copy-id aaa@qq.com
62 ssh-copy-id aaa@qq.com
63 ssh-copy-id aaa@qq.com
64 ssh-copy-id aaa@qq.com
[aaa@qq.com ~]# ssh-******
61 ssh-copy-id aaa@qq.com
62 ssh-copy-id aaa@qq.com
63 ssh-copy-id aaa@qq.com
64 ssh-copy-id aaa@qq.com
[aaa@qq.com ~]# ssh-******
178 ssh-copy-id aaa@qq.com
179 ssh-copy-id aaa@qq.com
180 ssh-copy-id aaa@qq.com
181 ssh-copy-id aaa@qq.com
2.管理主机56 可以无密码ssh登陆所有数据库服务器
[aaa@qq.com ~]# ssh-keygenssh-******
88 ssh-copy-id aaa@qq.com
89 ssh-copy-id aaa@qq.com
90 ssh-copy-id aaa@qq.com
91 ssh-copy-id aaa@qq.com
92 ssh-copy-id aaa@qq.com
3.2.4 所有主机上都要安装软件依赖的perl软件包
host51~56 ]#cd mha-soft
host51~56 ]# ls perl-*.rpm
perl-Config-Tiny-2.14-7.el7.noarch.rpm
perl-Mail-Sender-0.8.23-1.el7.noarch.rpm
perl-MIME-Types-1.38-2.el7.noarch.rpm
perl-Email-Date-Format-1.002-15.el7.noarch.rpm
perl-Mail-Sendmail-0.79-21.el7.art.noarch.rpm
perl-Parallel-ForkManager-1.18-2.el7.noarch.rpm
perl-Log-Dispatch-2.41-1.el7.1.noarch.rpm
perl-MIME-Lite-3.030-1.el7.noarch.rpm
51~56 share]# yum -y install perl-*.rpm
3.3 配置高可用集群
3.3.1 配置数据节点服务器
1.安装mha_node软件
51~55]#yum -y install perl-DBD-mysql
]#rpm -ivh mha4mysql-node-0.56-0.el6.noarch.rpm //安装数据节点的软件
3.3.2 配置管理主机
1.安装软件包:mha_node 和 mha_manager56
]# yum -y install perl-DBD-mysql
]# rpm -ivh mha4mysql-node-0.56-0.el6.noarch.rpm //安装数据节点的软件
]#yum -y install perl-ExtUtils-*
]#yum -y install perl-CPAN-*
]#tar -zxvf mha4mysql-manager-0.56.tar.gz
]#cd mha4mysql-manager-0.56
]#perl Makefile.PL
]#make
]#make install
2.创建管理命令
把命令拷贝的$PATH路径下
[aaa@qq.com ~ ] # cd /root/mha-soft-student/mha4mysql-manager-0.56/
[aaa@qq.com mha4mysql-manager-0.56]# cp -r bin /root/
[aaa@qq.com mha4mysql-manager-0.56]# ls /root/bin/
3.编写主配置文件 app1.cnf
mkdir /etc/mha_manager
[aaa@qq.com_56 mha_manager]# cp /root/mha-soft-student/mha4mysql-manager-0.56/samples/conf/app1.cnf ./
vim /etc/mha_manager/app1.cnf
4.根据配置文件的设置
4.1 在数据库服务器上创建监控用户[监控数据库是否存活]
51~55 mysql>grant all on *.* to aaa@qq.com’%’ identified by “123qqq…A”;
select user,host from mysql.user where user=”root”;
56]# mysql -h192.168.4.51 -uroot -p123qqq…A
4.2 在本机创建故障切换脚本, 并修改脚本 指定vip 部署的网络接口名
]#cd mha-soft-student
]# cp master_ip_failover /etc/mha_manager/master_ip_failover
编辑脚本(部分)
]# chmod +x /etc/mha_manager/master_ip_failover
vim /etc/mha_manager/master_ip_failover
my key = “1”;
my key ssh_stop_vip = "/sbin/ifconfig eth0:$key down”;
5.测试主配置文件 app1.cnf
测试ssh服务 masterha_check_ssh –conf=/etc/mha_manager/app1.cnf
测试主从同步 masterha_check_repl –conf=/etc/mha_manager/app1.cnf
6.手动把规定的vip地址部署在当主库 51 上
方式一:
]# cp ifcfg-eth0 ifcfg-eth0:1 网卡文件模板:ifcfg-eth0
DEVICE=eth0:1
IPADDR=192.168.4.100
]# systemctl restart network
方式二:
] ifconfig eth0:1 192.168.4.100/24
]#/sbin/ifconfig eth0:1
]#/sbin/ifconfig eth0
7.启动管理服务 并查看状态
tty1 56]# masterha_manager –conf=/etc/mha_manager/app1.cnf –remove_dead_master_conf –ignore_last_failover
tty1 56]# masterha_check_status –conf=–conf=/etc/mha_manager/app1.cnf
三、测试集群
3.1 访问集群存储数据
50]# mysql -h vip地址 -uuser8 -p123qqq…A
MySQL> select @@hostname;
3.2 测试高可用
把当前主库51 的数据库服务停止,但客户端访问数据库连接不会断,查看主机名显示的是52主机的主机名;在52本机查看VIP地址也能够查看到。主库51的配置在管理主机56的app1.cnf文件里查看不到了。
所有从库服务器都会把 主库的Ip地址自动指向192.168.4.52
四、把主机添加到集群里
51]# 启动数据库服务,并指定当前主库信息
56]# 在主配置文件app1.cnf里添加 主51的信息 ,并启动管理服务
把坏掉的主机51 添加到集群里。
51:把自己配置为当前主库的从库
]# systemctl start mysqld
mysql>change master to master_host=”192.168.4.52”, master_user=”repluser”, master_password=”123qqq…A”, master_log_file=”master52.000002”, master_log_pos=955;
mysql> start slave;
56: 把主机51的信息添加到主配置文件app1.cnf ,并启动管理服务
]# vim /etc/mha_manager/app1.cnf
[server1]
candidate_master=1
hostname=192.168.4.51
tty1 ]#masterha_manager –conf=/etc/mha_manager/app1.cnf
–remove_dead_master_conf –ignore_last_failover
tty2 56]# masterha_check_status –conf=/etc/mha_manager/app1.cnf