Mysql高可用架构——MHA

MHA(Master High Availability)什么是数据库的高可用性呢??数据库主机中我们会有做成主从关系的或者其他关系型数据库,如果主挂了,不会影响数据的访问,假如是一主三从架构,主库挂了,但主库能被从库ssh上去的情况下,MHA从三个从库中选择同步最接近的作为新主,然后新主和s2,s3都ssh到原主上通过binlog补上还没有同步的数据,io_thread读取到binlog位置,传到save_binary_logs,然后回放,达到s1,s2,s3和原主一致。

我们就用四台主机来模拟生产环境中的配置。

MHA 172.18.254.136
Master 172.18.254.175
Slave1 172.18.254.176
Slave2 172.18.254.103

首先来配置主从关系

在Master上配置

1,安装mariadb并启动服务

[root@localhost张大帅哥 ~]# yum install -y mariadb-server
[root@localhost张大帅哥 ~]# systemctl start mariadb.service

2,配置配置文件

[root@localhost张大帅哥 ~]# vim /etc/my.cnf
    
[mysqld]
server_id=1    #指定为主
datadir=/mariadb/data    #数据文件位置
log_bin=/mariadb/logbin/log_bin    二进制文件位置
innodb_file_per_table
binlog_format=row
skip_name_resolve
socket=/var/lib/mysql/mysql.sock

3,创建数据库文件目录并更改权限

[root@localhost张大帅哥 ~]# mkdir -p /mariadb/{data,logbin}
[root@localhost张大帅哥 ~]# chown mysql.mysql -R /mariadb/

4,重启数据库,并写授权用户

[root@localhost张大帅哥 ~]# systemctl restart mariadb.service 
[root@localhost张大帅哥 ~]# mysqlMariaDB [(none)]> show master status;
+----------------+----------+--------------+------------------+
| File           | Position | Binlog_Do_DB | Binlog_Ignore_DB |
+----------------+----------+--------------+------------------+
| log_bin.000003 |      245 |              |                  |
+----------------+----------+--------------+------------------+
1 row in set (0.00 sec)

MariaDB [(none)]> grant replication slave on *.* to repluser@'172.18.254.%' identified by 'centos';

5,生成秘钥实现免密登录

[root@localhost张大帅哥 ~]# cd .ssh/
[root@localhost张大帅哥 .ssh]# ssh-keygen
[root@localhost张大帅哥 .ssh]# ssh-copy-id -i id_rsa.pub [email protected]:/root/.ssh/
[root@localhost张大帅哥 .ssh]# ssh-copy-id -i id_rsa.pub [email protected]:/root/.ssh/
[root@localhost张大帅哥 .ssh]# ssh-copy-id -i id_rsa.pub [email protected]:/root/.ssh/

6,关闭ssh连接时的应答

[root@localhost张大帅哥 ~]# vim /etc/ssh/ssh_config 
   StrictHostKeyChecking no

7,关闭防火墙和selinux

[root@localhost张大帅哥 ~]# systemctl stop firewalld.service 
[root@localhost张大帅哥 ~]# setenforce 0

在Slave1上配置

1,同上第一步,安装启动数据库

2,编辑配置文件

[root@localhost张大帅哥 ~]# vim /etc/my.cnf
[mysqld]
server_id=2
datadir=/mariadb/data
log_bin=/mariadb/logbin/log_bin
read_only=1
socket=/var/lib/mysql/mysql.sock
relay_log_purge=0
skip_name_resolve=1

3,同上第三步,创建目录并更改权限

4,重启数据库,指定自己的主(那一长串可用help change master to来查看然后复制出来修改)

[root@localhost张大帅哥 ~]# systemctl restart mariadb.service
[root@localhost张大帅哥 ~]# mysql

MariaDB [(none)]> CHANGE MASTER TO   MASTER_HOST='172.18.254.175',   MASTER_USER='repluser',   MASTER_PASSWORD='centos',   MASTER_PORT=3306,   MASTER_LOG_FILE='log_bin.000003',   MASTER_LOG_POS=245,   MASTER_CONNECT_RETRY=10;

MariaDB [(none)]> start slave;
Query OK, 0 rows affected, 1 warning (0.00 sec)

5,同上面第5步,生成密钥并拷给另外三台机器

6,同上面第6步,关闭连接时的应答

7,也同上

在Slave2上配置

跟在Slave1上的配置一摸一样,在这里不再重写一遍

在MHA上配置

1,配置数据库,不过配置文件不用指定主从

配置文件

[root@localhost张大帅哥 ~]# vim /etc/my.cnf

[mysqld]
datadir=/mariadb/data
log_bin=/mariadb/logbin/log_bin
innodb_file_per_table
socket=/var/lib/mysql/mysql.sock

2,创建MHA管理账号,连接数据库,之后创建用户

MariaDB [(none)]> grant all on *.* to mhauser@'172.18.254.%' identified by 'centos';

3,安装MHA管理节点包,和MHA节点(上面三台机器需要安装MHA节点包)

MHA节点管理包    mha4mysql-manager-0.56-0.el6.noarch.rpm

节点包  mha4mysql-node-0.56-0.el6.noarch.rpm

可百度下载最新版。

4,创建目录并编辑管理端配置文件

[root@localhost张大帅哥 ~]# mkdir /etc/mha/
[root@localhost张大帅哥 ~]# vim /etc/mha/app1.conf 

[server default]
user=mhauser
password=centos
manager_workdir=/data/mastermha/app1/
manager_log=/data/mastermha/app1/manager.log
master_binlog_dir=/mariadb/logbin
remote_workdir=/data/mastermha/app1/
ssh_user=root
repl_user=repluser
repl_password=centos
ping_interval=1

[server1]
hostname=172.18.254.175
candidate_master=1
[server2]
hostname=172.18.254.176
candidate_master=1
[server3]
hostname=172.18.254.103

5,验证SSH连接及MHA管理

[root@localhost张大帅哥 ~]# masterha_check_ssh --conf=/etc/mha/app1.conf
[root@localhost张大帅哥 ~]# masterha_check_repl --conf=/etc/mha/app1.conf

可能会出现错误

解决:在Master上创建mhauser用户

6,运行MHA

[root@localhost张大帅哥 ~]#  nohup masterha_manager --conf=/etc/mha/app1.conf > mharun.log &

测试

模拟故障:直接停掉主Master的mysql服务,可看到主的切换。

模拟修复故障:启动主的mysql服务

这时候主什么也不算,不算主也不算从,也就是不在这个集群中了,我们可以

[root@localhost张大帅哥 ~]# vim /etc/my.cnf
#增加以下两行
read_only=ON
relay_log_purge=0
[root@localhost张大帅哥 ~]# systemctl restart mariadb.service

把Master作为从再次加入到集群中

[root@localhost张大帅哥 ~]# systemctl restart mariadb.service

Master [(none)]> CHANGE MASTER TO
    ->   MASTER_HOST='172.18.254.176',
    ->   MASTER_USER='repluser',
    ->   MASTER_PASSWORD='centos',
    ->   MASTER_PORT=3306,
    ->   MASTER_LOG_FILE='bin_log.000003',
    ->   MASTER_LOG_POS=245,
    ->   MASTER_CONNECT_RETRY=10;
Query OK, 0 rows affected (0.05 sec)

Master [(none)]> start slave;
Query OK, 0 rows affected (0.00 sec)

至此,模拟完成

注:这些机器的时间必须一致,可以安装ntp-server和ntpclient来使时间一致

猜你喜欢

转载自blog.csdn.net/professorman/article/details/83115963