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 root@172.18.254.136:/root/.ssh/
[root@localhost张大帅哥 .ssh]# ssh-copy-id -i id_rsa.pub root@172.18.254.176:/root/.ssh/
[root@localhost张大帅哥 .ssh]# ssh-copy-id -i id_rsa.pub root@172.18.254.103:/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来使时间一致