声明: 本篇文章内容整理来源于互联网以及本人自己的梳理总结,目的是从零到一的搭建起来mysql mha高可用架构。

 

一、软件概述

MHA(Master High Availability)目前在MySQL高可用方面是一个相对成熟的解决方案,它由日本DeNA公司youshimaton(现就职于Facebook公司)开发,是一套优秀的作为MySQL高可用性环境下故障切换和主从提升的高可用软件。在MySQL故障切换过程中,MHA能做到在0~30秒之内自动完成数据库的故障切换操作,并且在进行故障切换的过程中,MHA能在最大程度上保证数据的一致性,以达到真正意义上的高可用。

该软件由两部分组成:MHA Manager(管理节点)和MHA Node(数据节点)。MHA Manager可以单独部署在一台独立的机器上管理多个master-slave集群,也可以部署在一台slave节点上。MHA Node运行在每台MySQL服务器上,MHA Manager会定时探测集群中的master节点,当master出现故障时,它可以自动将最新数据的slave提升为新的master,然后将所有其他的slave重新指向新的master。整个故障转移过程对应用程序完全透明。

在MHA自动故障切换过程中,MHA试图从宕机的主服务器上保存二进制日志,最大程度的保证数据的不丢失,但这并不总是可行的。例如,如果主服务器硬件故障或无法通过ssh访问,MHA没法保存二进制日志,只进行故障转移而丢失了最新的数据。使用MySQL 5.5的半同步复制,可以大大降低数据丢失的风险。MHA可以与半同步复制结合起来。如果只有一个slave已经收到了最新的二进制日志,MHA可以将最新的二进制日志应用于其他所有的slave服务器上,因此可以保证所有节点的数据一致性。

目前MHA主要支持一主多从的架构,要搭建MHA,要求一个复制集群中必须最少有三台数据库服务器,一主二从,即一台充当master,一台充当备用master,另外一台充当从库,因此至少需要三台服务器。

二、环境说明

2.1 系统环境

系统版本

CentOS release 6.5 (Final)

内核版本

2.6.32-431.el6.x86_64

      

 

 

 

2.2 软件版本  

Mysql选取最新的5.7版本,下载二进制包的方式部署

Android培训,安卓培训,手机开发培训,移动开发培训,云培训培训

2.角色说明

Android培训,安卓培训,手机开发培训,移动开发培训,云培训培训

2.目录约定

Android培训,安卓培训,手机开发培训,移动开发培训,云培训培训

 

三、Mysql安装部署

      官方下载地址: https://dev.mysql.com/downloads/mysql/

     3.准备安装包

  下载二进制安装包放置三台mysql服务器的/usr/local目录下面,软件包名称为:mysql-5.7.18-linux-glibc2.5-x86_64.tar.gz

     3.2 卸载系统lib 

1
2
3
# rpm -qa|grep mysql
mysql-libs-5.1.71-1.el6.x86_64
# rpm -e mysql-libs-5.1.71-1.el6.x86_64 -nodeps

      3.创建mysql用户 

1
2
3
# groupadd mysql
# useradd -r -g mysql mysql 
# 参数表示mysql用户是系统用户,不可用于登录系统。

   3.安装程序

   解压TAR包,更改所属的组和用户,并且创建软连接的方式

1
2
3
4
5
6
7
8
9
# pwd
/usr/local
# ls mysql-5.7.18-linux-glibc2.5-x86_64.tar.gz
mysql-5.7.18-linux-glibc2.5-x86_64.tar.gz
# tar -zxvf mysql-5.7.18-linux-glibc2.5-x86_64.tar.gz
# ln -s mysql-5.7.18-linux-glibc2.5-x86_64 mysql
# ll mysql
lrwxrwxrwx 1 root root 34 May 25 12:54 mysql -> mysql-5.7.18-linux-glibc2.5-x86_64
# chown -R mysql:mysql mysql-5.7.18-linux-glibc2.5-x86_64 

  3.5 初始化数据库  (!!!做完3.7再做此步骤吧)

1
2
3
4
5
6
7
8
9
10
11
12
13
# mkdir -pv /data/mysqldata  # 创建放置mysql的数据目录
mkdir: created directory `/data/mysqldata'
# chown -R mysql:mysql /data/mysqldata/
# pwd
/usr/local/mysql
# ./bin/mysqld --user=mysql --basedir=/usr/local/mysql/ --datadir=/data/mysqldata/ --initialize
# mysql 5.7使用mysqld进行数据库的初始化
2017-05-25T05:37:55.408516Z 0 [Warning] TIMESTAMP with implicit DEFAULT value is deprecated. Please use --explicit_defaults_for_timestamp server option (see documentation for more details).
2017-05-25T05:37:55.674238Z 0 [Warning] InnoDB: New log files created, LSN=45790
2017-05-25T05:37:55.721899Z 0 [Warning] InnoDB: Creating foreign key constraint system tables.
2017-05-25T05:37:55.780139Z 0 [Warning] No existing UUID has been found, so we assume that this is the first time that this server has been started. Generating a new UUID: 4dbe04ea-410c-11e7-82cb-000e1ebbacb0.
2017-05-25T05:37:55.780754Z 0 [Warning] Gtid table is not ready to be used. Table 'mysql.gtid_executed' cannot be opened.
2017-05-25T05:37:55.781792Z 1 [Note] A temporary password is generated for root@localhost: rtSOJ:hyx54y  #会初始化一个root密码

  3.修改启动脚本

1
2
3
4
5
6
# pwd
/usr/local/mysql
# cp -a ./support-files/mysql.server  /etc/init.d/mysqld
# vim /etc/init.d/mysqld
     basedir='/usr/local/mysql'
     datadir='/data/mysqldata'

  3.创建配置文件

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
# /etc/my.cnf
[mysqld]
 
basedir = /usr/local/mysql
datadir = /data/mysqldata
port = 3306
server_id = 86   # !!!每台服务器的id不一样,必须更改
socket = /tmp/mysql.sock
pid-file /data/mysqldata/mysql.pid
 
sql_mode=NO_ENGINE_SUBSTITUTION,STRICT_TRANS_TABLES
 
gtid_mode=on
enforce_gtid_consistency=on
log-bin=mysqlbin
log-slave-updates=1
binlog_format=row
log_error = /data/mysqldata/mysql-error.log
 
innodb_buffer_pool_size = 6G   #根据自己的内存大小进行更改,内存的70%~80%
innodb_log_buffer_size = 64M
innodb_max_dirty_pages_pct = 50
 
default-storage-engine = InnoDB
sync_binlog = 1
innodb_flush_log_at_trx_commit = 2
innodb_file_per_table = 1
innodb_data_file_path = ibdata1:1G:autoextend

  3.8 启动数据库

1
2
3
# /etc/init.d/mysqld start
Starting MySQL.Logging to '/data/mysqldata/mysql-error.log'.
..... SUCCESS!

  3.初始化密码

         mysql5.7会生成一个初始化密码 ,位置在:  /root/.mysql_secret ,在error日志中也有

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
# cat /root/.mysql_secret
# Password set for user 'root@localhost' at 2017-05-25 12:59:48
OU1qrvuT1t)?
 
# /usr/local/mysql/bin/mysql -uroot -p
Enter password:
Welcome to the MySQL monitor.  Commands end with ; or \g.
Your MySQL connection id is 3
Server version: 5.7.18
 
Copyright (c) 2000, 2017, Oracle and/or its affiliates. All rights reserved.
 
Oracle is a registered trademark of Oracle Corporation and/or its
affiliates. Other names may be trademarks of their respective
owners.
 
Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.
 
mysql> SET PASSWORD = PASSWORD('dbpass123');
Query OK, 0 rows affected, 1 warning (0.00 sec)
 
mysql> flush privileges;
Query OK, 0 rows affected (0.00 sec)

 

  3.10 设置开机启动

1
chkconfig --level 35 mysqld on

  

四、主从复制搭建

 Mysql复制在5.6.5之后有两种配置方式,一种是基于binlog文件中的POS值来进行配置,另外一种则是通过GTID的方式来进行复制。

 

4.GTID工作原理

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
1、全局事务标识:global transaction identifiers。
2、GTID是一个事务一一对应,并且全局唯一ID。
3、一个GTID在一个服务器上只执行一次,避免重复执行导致数据混乱或者主从不一致。
4、GTID用来代替传统复制方法,不再使用MASTER_LOG_FILE+MASTER_LOG_POS开启复制。而是使用MASTER_AUTO_POSTION=1的方式开始复制。
5、MySQL-5.6.5开始支持的,MySQL-5.6.10后开始完善。
6、在传统的slave端,binlog是不用开启的,但是在GTID中slave端的binlog是必须开启的,目的是记录执行过的GTID(强制)。
  
过程描述:
 
1、当一个事务在主库端执行并提交时,产生GTID,一同记录到binlog日志中。
2、binlog传输到slave,并存储到slave的relaylog后,读取这个GTID的这个值设置gtid_next变量,即告诉Slave,下一个要执行的GTID值。
3、sql线程从relay log中获取GTID,然后对比slave端的binlog是否有该GTID。
4、如果有记录,说明该GTID的事务已经执行,slave会忽略。
5、如果没有记录,slave就会执行该GTID事务,并记录该GTID到自身的binlog,在读取执行事务前会先检查其他session持有该GTID,确保不被重复执行。
6、在解析过程中会判断是否有主键,如果没有就用二级索引,如果没有就用全部扫描。

4.配置文件必须参数

1
2
3
4
5
6
7
8
9
[mysqld]
server_id = 86  #服务器id,每个mysql实例必须不一样,建议取ip最后段的值
 
gtid_mode=on             #开启gtid模式
enforce_gtid_consistency=on  #强制gtid一致性,开启后对于特定create table不被支持
 
log-bin=mysqlbin     # 开启binlog
log-slave-updates=1
binlog_format=row   # 强烈建议,其他格式可能造成数据不一致

  4.3 创建复制帐号

        在主库上创建复制帐号,授权从库使用帐号来进行复制

1
2
3
GRANT REPLICATION SLAVE ON *.* TO repluser@192.168.129.87 IDENTIFIED BY  'replpass';
GRANT REPLICATION SLAVE ON *.* TO repluser@192.168.129.88 IDENTIFIED BY  'replpass';
flush privileges;

  4.从库开启复制

1
2
3
4
5
6
# 在两个从库上执行:
CHANGE MASTER TO MASTER_HOST='192.168.129.86',   #  主库ip
MASTER_USER='repluser',                    #  复制帐号
MASTER_PASSWORD='replpass',              #  帐号密码
MASTER_AUTO_POSITION=1;
Start slave; 

             GTID复制官方地址:https://dev.mysql.com/doc/refman/5.6/en/replication-gtids-howto.html

 

4.5 查看复制状态

 在从库主机上使用 show slave status查看复制状态,当Slave_IO_RunningSlave_SQL_Running都是Yes的时候说明主从复制状态是正常的,此时可以在主库上操作数据,然后在从库上验证数据是否会同步过来。

 至此,mysql基于GTID的主从复制搭建完毕,下面就剩下mha软件的搭建了。

 

 五、mha搭建

 mha node角色需要部署在每台主机上面,mha manager只需要部署在mha控制节点89上。

      5.配置host文件

使用主机别名的方式更容易使配置简单,在每台机器的/etc/hosts文件中添加以下对应关系 

1
2
3
4
# add /etc/hosts
192.168.129.86  node86 master
192.168.129.87  node87 salve87
192.168.129.88  node88 salve88

   5.2 mha node节点部署

Mha是由perl语言开发,所以需要使用perl的依赖,推荐使用yum进行安装,此软件需要安装在每台服务器上.

            5.2.安装依赖

1
2
3
4
yum install -y perl-DBD-MySQL.x86_64 \
                     perl-DBI.x86_64 perl-ExtUtils-CBuilder \
                     perl-ExtUtils-MakeMaker perl-CPAN.x86_64 \
                     perl-Mail-Sender perl-Log-Dispatch   

        5.2.安装mha node

1
2
3
4
5
tar xf mha4mysql-node-0.56.tar.gz
cd mha4mysql-node-0.56
perl Makefile.PL
make
make install

  5.2.node主要工具

 Node工具包(这些工具通常由MHA Manager的脚本触发,无需人为操作)主要包括以下几个工具: 

1
2
3
4
save_binary_logs                保存和复制master的二进制日志
apply_diff_relay_logs            识别差异的中继日志事件并将其差异的事件应用于其他的slave
filter_mysqlbinlog               去除不必要的ROLLBACK事件(MHA已不再使用这个工具)
purge_relay_logs                清除中继日志(不会阻塞SQL线程)

 5.mha manager 节点部署(需要访问公网)

Mha manager控制节点单独一台服务器,部署在192.168.129.89服务器上。

由于已经安装mha node,所以相关依赖的perl模块已经安装,可以直接安装mha manager软件.

 5.3.1 安装mha manager

1
2
3
4
5
tar -zxvf mha4mysql-manager-0.56.tar.gz
cd mha4mysql-manager-0.56
perl Makefile.PL
make
make install

  

5.3.2 manager主要工具
1
2
3
4
5
6
7
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信息

  

5.4 配置ssh密钥登陆

需要配置SSH登陆无密码验证功能,因为mha切换的时候需要到主机上执行命令,各主机之间应当都是免密登陆。

需要注意的是不能禁止password登陆,否则会出现错误.

  Mha manager主机需要登陆到三台node节点主机,在192.168.129.89上执行:

 

1
2
3
4
5
# ssh-keygen    #一路回车
# cd ~/.ssh
# ssh-copy-id -i ./id_rsa.pub root@192.168.129.86
# ssh-copy-id -i ./id_rsa.pub root@192.168.129.87
# ssh-copy-id -i ./id_rsa.pub root@192.168.129.88

  

在192.168.129.86/87/88上生成密钥对,然后互相打通ssh密钥登陆 

1
2
3
4
5
6
7
8
9
86上执行命令:
# ssh-copy-id -i ./id_rsa.pub root@192.168.129.88
# ssh-copy-id -i ./id_rsa.pub root@192.168.129.87
87上执行命令:
# ssh-copy-id -i ./id_rsa.pub root@192.168.129.86
# ssh-copy-id -i ./id_rsa.pub root@192.168.129.88
88上执行命令:
# ssh-copy-id -i ./id_rsa.pub root@192.168.129.86
# ssh-copy-id -i ./id_rsa.pub root@192.168.129.87

   

5.5 设置从库只读

两台slave服务器设置read_only(从库对外提供读服务,只所以没有写进配置文件,是因为随时slave会提升为master 

1
2
# 设置只读的指令,需要在两个从库87/88上执行
# mysql -uroot -p -e 'set global read_only=1'

 5.创建监控帐号

1
2
3
# 在主库上执行
grant all privileges on *.* to 'mhamon'@'192.168.129.89' identified  by 'mhamonpass';
flush  privileges;

  

5.7 设置relaylog清理 

MHA在发生切换的过程中,从库的恢复过程中依赖于relay log的相关信息,所以这里要将relay log的自动清除设置为OFF

采用手动清除relay log的方式。在默认情况下,从服务器上的中继日志会在SQL线程执行完毕后被自动删除。 

1
2
# 设置关闭relay_log自动清理的指令,需要在两个从库87/88上执行
# mysql -uroot -p -e 'set global relay_log_purge=0'

  MHA环境中,这些中继日志在恢复其他从服务器时可能会被用到,因此需要禁用中继日志的自动删除功能。定期清除中继日志需要考虑到复制延时的问题。在ext3的文件系统下,删除大的文件需要一定的时间,会导致严重的复制延时。为了避免复制延时,需要暂时为中继日志创建硬链接,因为在linux系统中通过硬链接删除大文件速度会很快。(在mysql数据库中,删除大表时,通常也采用建立硬链接的方式)

 MHA节点中包含了pure_relay_logs命令工具,它可以为中继日志创建硬链接,执行SET GLOBAL relay_log_purge=1,等待几秒钟以便SQL线程切换到新的中继日志,再执行SET GLOBAL relay_log_purge=0.这是此工具的原理.

 可参照: http://blog.csdn.net/leshami/article/details/45688503

 原创作品,允许转载,转载时请务必以超链接形式标明文章 原始出处 、作者信息和本声明。否则将追究法律责任。 http://www.cnblogs.com/topicjie/

http://www.cnblogs.com/topicjie/p/7188533.html

网友评论