MHA+MySQL高可用
Master High Availability
MHA数据库高可用集群,是一套优秀的最为mysql高可用性环境下故障切换主从的软件,在故障切换的过程中,MHA能够做到在30s自动完成数据可的故障切换,并在切换的过程中最大程度保证数据的一致性,以达到真正意义上的高可用。
MHA的特点:
1.故障转移
MHA的工作流程:
当监控的集群中的主库宕机,会尝试获取主库中的二进制文件,获取到之后,找到已经同步最新数据的从库,将把该从库的中继日志同步给其他的从库,来同步数据,保证从库之间的数据一致性,之后再从库中找到一台,作为新的主库,同步获取到的二进制文件,其余的从库从这个新的主库中同步数据,保证主从服务的集群正常的运行。
部署MHA+MySQL数据库高可用
要搭建MHA,要求集群至少要有三个节点,即一主二从。MHA分为MHA-Manager(管理节点)和MHA-Node(数据节点)两部分
实验环境
MHA管理端:192.168.1.6(管理节点)
MySQL主:192.168.1.4(数据节点)
MySQL从:192.168.1.5(数据节点)
MySQL从:192.168.1.10(数据节点)
实验目的
当MySQL主从环境中,主宕机后,从自动升为主服务器
实验步骤
第一步
搭建MySQL主从
需要注意的一点:mysql主从复制的授权用户也需要三台都做,因为一旦有一台主宕机,就有一台从要代替主,所以还是需要有一个可以复制二进制日志的用户,三台用户名也必须一样
MySQL主的my.cnf配置文件
server-id=1
log-bin=master-bin
log-slave-updates=true
relay-log = relay-log-bin
MySQL从的my.cnf配置文件
为什么从的配置文件会有和主一样的log-bin,同授权原因一样,如果主宕机后,从变为主,也需要有二进制日志文件
一台server-id为2,一台server-id为3
server-id=2
log-bin=master-bin
log-slave-updates=true
relay-log=relay-log-bin
relay-log-index=slave-relay-bin.index
read-only=1 # 启动只读属性
relay-log-purge=0 # 高可用进行切换时,从升为主时,保留之前的中继日志
数据库授权mha用户,此用户将用作管理端管理mysql时使用的数据库用户
三台数据库分别登录数据库客户端,执行以下命令进行授权
grant all on *.* to 'mha'@'192.168.1.%' identified by '123.com';
再接着授权主从复制用户(三台数据库都做)
grant replication slave on *.* to 'slave'@'192.168.1.%' identified by '123.com';
查看MySQL主(192.168.1.4)的偏移量,用来从服务器复制使用
mysql>show master status;
+-------------------+----------+--------------+------------------+-------------------+
| File | Position | Binlog_Do_DB | Binlog_Ignore_DB | Executed_Gtid_Set |
+-------------------+----------+--------------+------------------+-------------------+
| master-bin.000001 | 329 | | | |
+-------------------+----------+--------------+------------------+-------------------+
1 row in set (0.00 sec)
分别在两台MySQL(192.168.1.5/192.168.1.10)从执行以下
change master to master_host='192.168.1.4',master_user='slave',master_password='123.comm',master_log_file='master-bin.000001',master_log_pos=329;
start slave;
show slave status\G # 出现以下则成功
Slave_IO_Running: Yes
Slave_SQL_Running: Yes
第二步
为了方便管理,四台服务器之间做免密登录
MHA管理端192.168.1.6
[root@localhost ~]# ssh-keygen
Generating public/private rsa key pair.
Enter file in which to save the key (/root/.ssh/id_rsa):
Enter passphrase (empty for no passphrase):
Enter same passphrase again:
Your identification has been saved in /root/.ssh/id_rsa.
Your public key has been saved in /root/.ssh/id_rsa.pub.
The key fingerprint is:
SHA256:uNeSnO2vW67XhgcBMf0xTaRwxP9uU+jk1qxjS7rRxtU root@localhost
The key's randomart image is:
+---[RSA 2048]----+
| oo.oo+o|
| ...o+..|
| . ..+ |
| . . . o|
| . S . .E|
| o = .oo.o|
| . * o oB=+.|
| . o oo=X.=|
| =*=*o=.|
+----[SHA256]-----+
# 传送时输入正确密码即可
[root@localhost ~]# ssh-copy-id root@192.168.1.4
[root@localhost ~]# ssh-copy-id root@192.168.1.5
[root@localhost ~]# ssh-copy-id root@192.168.1.10
MySQL主192.168.1.4
[root@localhost ~]# ssh-keygen
Generating public/private rsa key pair.
Enter file in which to save the key (/root/.ssh/id_rsa):
Enter passphrase (empty for no passphrase):
Enter same passphrase again:
Your identification has been saved in /root/.ssh/id_rsa.
Your public key has been saved in /root/.ssh/id_rsa.pub.
The key fingerprint is:
SHA256:7G6eELP5rlbtwUPQFcy9NjdJkF/f+Rrjcyh8xhRiaMY root@localhost.localdomain
The key's randomart image is:
+---[RSA 2048]----+
| . +o+o |
| . . o....|
| o . o.*|
| . E o ==+|
| o S* . o +o|
| *. = + .|
| +... + + = |
| .+... o O .|
| ..=* + o |
+----[SHA256]-----+
[root@localhost ~]# ssh-copy-id root@192.168.1.5
[root@localhost ~]# ssh-copy-id root@192.168.1.6
[root@localhost ~]# ssh-copy-id root@192.168.1.10
MySQL从192.168.1.5
[root@localhost ~]# ssh-keygen
Generating public/private rsa key pair.
Enter file in which to save the key (/root/.ssh/id_rsa):
Enter passphrase (empty for no passphrase):
Enter same passphrase again:
Your identification has been saved in /root/.ssh/id_rsa.
Your public key has been saved in /root/.ssh/id_rsa.pub.
The key fingerprint is:
SHA256:cWPJNZ6lpT5GVglSLtyRNgNqEfbTAYn151tMSKs8aVc root@localhost.localdomain
The key's randomart image is:
+---[RSA 2048]----+
| ++==Bo=. |
| ..*.X=%.o |
| + @.%o+ E|
| . + O = + |
| S X o o|
| o + o |
| . |
| |
| |
+----[SHA256]-----+
[root@localhost ~]# ssh-copy-id root@192.168.1.4
[root@localhost ~]# ssh-copy-id root@192.168.1.6
[root@localhost ~]# ssh-copy-id root@192.168.1.10
MySQL从192.168.1.10
[root@localhost ~]# ssh-keygen
Generating public/private rsa key pair.
Enter file in which to save the key (/root/.ssh/id_rsa):
Enter passphrase (empty for no passphrase):
Enter same passphrase again:
Your identification has been saved in /root/.ssh/id_rsa.
Your public key has been saved in /root/.ssh/id_rsa.pub.
The key fingerprint is:
SHA256:oIjFO/Abq9FJaxQYYaksNosbydjKKnaEdgMi4JVNvq8 root@localhost.localdomain
The key's randomart image is:
+---[RSA 2048]----+
|oo. +. |
|o= o.. |
|B = .. |
|=@ + ... |
|Xo& .. S |
|=O.@ . |
|++X . . |
|+* . . |
|* . E |
+----[SHA256]-----+
[root@localhost ~]# ssh-copy-id root@192.168.1.4
[root@localhost ~]# ssh-copy-id root@192.168.1.5
[root@localhost ~]# ssh-copy-id root@192.168.1.6
第三步
将每台服务器都安装被管理节点
四台操作一致
[root@localhost ~]# rpm -ivh epel-release-latest-7.noarch.rpm
使用网络yum安装依赖关系,这里需要使用网络yum
yum -y install perl-DBD-mysql perl-DBI
[root@localhost ~]# rpm -ivh mha4mysql-node-0.56-0.el6.noarch.rpm
第四步
在MHA管理端(192.168.1.6)安装管理包
在没有mysql的主机上进行安装以下包
yum -y install perl-Config-Tiny perl-Log-Dispatch perl-Parallel-ForkManager
rpm -ivh mha4mysql-manager-0.56-0.el6.noarch.rpm
编写配置文件
[root@localhost ~]# vim /etc/masterha_default.cnf
[server default] # 全局配置
user=mha # 经过数据库授权的给管理节点的管理用户
password=123.com # 经过数据库授权的给管理节点的管理用户的密码
repl_user=slave # 主从复制使用的用户
repl_password=123.com # 主从复制使用的用户密码
ssh_user=root # 管理节点与节点之间使用的ssh用户
master_binlog_dir=/usr/local/mysql/data # mysql主存放二进制日志的目录
remote_workdir=/data/login # 当获取到mysql主的二进制日志是存放在本机的此目录
ping_interval=2 # 管理节点与mysql主的通讯时间(秒),超过时间,则认为mysql主宕机了
shutdown_script="" # 当mysql主宕机时执行的脚本,可以为空
编写管理节点的配置文件
[root@localhost ~]# mkdir /etc/mha
[root@localhost ~]# vim /etc/mha/app1.cnf
[server default] # 全局配置
manager_workdir=/var/lib/manager # 工作目录
manager_log=/var/log/manager/manager.log # 日志目录,manager需要创建
[server1] # 节点配置
hostname=192.168.1.4
port=3306
ssh_port=22
[server2]
hostname=192.168.1.5
port=3306
ssh_port=22
candidate_master=1 # 表示mysql主宕机后,有server2的节点来接替主
[server3]
hostname=192.168.1.10
port=3306
ssh_port=22
创建目录
mkdir /var/log/manager
测试manager与数据库节点之间的ssh通讯是否正常
[root@localhost ~]# masterha_check_ssh --global-conf=/etc/masterha_default.cnf --conf=/etc/mha/app1.cnf
# 最后显示ok
检测节点之间的主从复制是否正常
[root@localhost ~]# masterha_check_repl --global-conf=/etc/masterha_default.cnf --conf=/etc/mha/app1.cnf
# 最后显示ok
启动MHA管理端,处于监控的状态
[root@localhost ~]# masterha_manager --global-conf=/etc/masterha_default.cnf --conf=/etc/mha/app1.cnf
# 阻塞状态
验证:
MySQL主192.168.1.4
systemctl stop mysqld
将主的mysql服务模拟故障后,监控的管理端会使用mha用户开始选举另一个主,来接替,down掉的主再上线,就是独立的mysql
在变成主库的从上创建库来验证,其他从库是否复制到