主数据库宕机怎么办?MHA⾼可⽤帮你实现主从服务器⾃动切换(详细操作与
命令详解)
⼀、MHA简介
上⼀篇介绍了MySQL的主从复制、读写分离,实现主从服务器同步的架构,它存在单点故障的隐患,⼀旦主服务器出现故障,将⽆法进⾏写⼊,为了解决这个问题,可以考虑是否能够让从服务器切换⾓⾊,⾃动变为主服务器,继续提供服务呢?答案当然是可⾏的,这⾥就必须要⽤到MHA架构了。
MHA是⼀套优秀的MySQL⾼可⽤环境下故障切换和主从复制的软件;MySQL故障过程中,MHA能做到0-30秒内⾃动完成故障切换。
它由两部分组成,MHA Manager (管理节点)和 MHA Node(数据节点)
MHA Manager 可以单独部署在⼀台独⽴的机器上,管理多个 master-slave 集(Manger是单独⼀台监控master服务器健康状态的服务器。);也可以部署在⼀台 slave 节点上。MHA Node 运⾏在每台 MySQL 服务器上,MHA Manager 会定时探测集中的master 节点。当 master 出现故障时,它可以⾃动将最新数据的 slave 提升为新的 master,然后将所有其他的 slave 重新指向新的master。
MHA的特点:
mysql无法连接到服务器
⾃动故障切换过程中,MHA试图从宕机的主服务器上保存⼆进制⽇志,最⼤程度的保证数据不丢失
使⽤半同步复制,可以⼤⼤降低数据丢失的风险
⽬前MHA⽀持⼀主多从架构,最少三台服务器,即⼀主两从,⼀台为主备,也可以两台从的都做主备
⼆、案例实操
综上所述,我们⾄少需要四台主机,三台做主从复制(⼀主两从,两从中⼀台为主备,即主服务器宕机,这台主备成为新的主服务器),⼀台作为manager,检测管理数据库集。通过监控 MySQL 数据库,在故障时进⾏⾃动切换,不影响业务。
整体思路
1) 安装 MySQL 数据库
2) 配置 MySQL ⼀主两从
3) 安装 MHA 软件
4) 配置⽆密码认证,ssh免密登录
5) 配置 MySQL MHA ⾼可⽤
6) 模拟 master 故障切换
环境介绍
服务器 CentOS7.3(64 位) MHA-manager/192.168.247.160
管理节点,安装 manager 组件
服务器 CentOS7.3(64 位) Mysql1/192.168.247.130 Master 节点,安装 node 组件
服务器 CentOS7.3(64 位) Mysql2/192.168.247.140 Slave 节点,安装 node 组件
服务器 CentOS7.3(64 位) Mysql3/192.168.247.150 Slave 节点,安装 node 组件
2.1 在三台 MySQL 节点上分别安装数据库,MySQL 版本请使⽤ 5.6.36,cmake 版本请使⽤ 2.8.6。下⾯只在 Mysql1 上⾯做演⽰,安装过程如下。
2.1.1 安装编译依赖的环境
[root@Mysql1 ~]# yum -y install ncurses-devel gcc-c++ perl-Module-Install
2.1.2 安装 gmake 编译软件
[root@Mysql1 ~]# tar zxvf cmake-2.8.
[root@Mysql1 ~]# cd cmake-2.8.6
[root@Mysql1 cmake-2.8.6]# ./configure
[root@Mysql1 cmake-2.8.6]# gmake && gmake install
2.1.3 安装 MySQL 数据库
[root@Mysql1 ~]# tar -zxvf mysql-5.6.
[root@Mysql1 ~]# cd mysql-5.6.36
[root@Mysql1 mysql-5.6.36]# cmake -DCMAKE_INSTALL_PREFIX=/usr/local/mysql -DDEFAULT_CHARSET=utf8 -DDEFAULT_COLLATION=utf8_general _ci -DWITH_EXTRA_CHARSETS=all -DSYSCONFDIR=/etc
[root@Mysql1 mysql-5.6.36]# make && make install
[root@Mysql1 mysql-5.6.36]# cp support-files/my-defaultf /etc/myf
[root@Mysql1 mysql-5.6.36]# cp support-files/mysql.server /etc/rc.d/init.d/mysqld
[root@Mysql1 ~]# chmod +x /etc/rc.d/init.d/mysqld
[root@Mysql1 ~]# chkconfig --add mysqld
[root@Mysql1 ~]# echo "PATH=$PATH:/usr/local/mysql/bin">>/etc/profile
分数的补码如何计算[root@Mysql1 ~]# source /etc/profile
[root@Mysql1 ~]# groupadd mysql
[root@Mysql1 ~]# useradd -M -s /sbin/nologin mysql -g mysql
[root@Mysql1 ~]# chown -sql /usr/local/mysql
[root@Mysql1 ~]# mkdir -p /data/mysql
[root@Mysql1 ~]# /usr/local/mysql/scripts/mysql_install_db --basedir=/usr/local/mysql --datadir=/usr/local/mysql/data --user=mysql
2.2 配置主从同步
2.2.1 修改主配置⽂件/etc/myf ⽂件,三台服务器的 server-id 不能⼀样,另外两台写 2 和 3 即可!写⼊内容如下:
Mysql1:master
vi /etc/myf
[client]
port =3306
socket =/usr/local/mysql/mysql.sock
[mysql]
port =3306
socket =/usr/local/mysql/mysql.sock
[mysqld]
user = mysql
basedir =/usr/local/mysql
datadir =/usr/local/mysql/data
port =3306
pid-file =/usr/local/mysql/mysqld.pid
socket =/usr/local/mysql/mysql.sock
server-id =1
log_bin = master-bin
log-slave-updates = true
sql_mode=NO_ENGINE_SUBSTITUTION,STRICT_TRANS_TABLES,NO_AUTO_CREATE_USER,NO_AUTO_VALUE_ON_ZERO,NO_ZERO_IN_DATE,N O_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,PIPES_AS_CONCAT,ANSI_QUOTES
Mysql2:slave1
vi /etc/myf
height怎么读英语[client]
port =3306
socket =/usr/local/mysql/mysql.sock
[mysql]
port =3306
socket =/usr/local/mysql/mysql.sock
[mysqld]
user = mysql
basedir =/usr/local/mysql
datadir =/usr/local/mysql/data
port =3306
pid-file =/usr/local/mysql/mysqld.pid
socket =/usr/local/mysql/mysql.sock
server-id =2
log_bin = master-bin
relay-log = relay-log-bin
relay-log-index = slave-relay-bin.index
sql_mode=NO_ENGINE_SUBSTITUTION,STRICT_TRANS_TABLES,NO_AUTO_CREATE_USER,NO_AUTO_VALUE_ON_ZERO,NO_ZERO_IN_DATE,N O_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,PIPES_AS_CONCAT,ANSI_QUOTES
Mysql2:slave2
vi /etc/myf
[client]
port =3306
socket =/usr/local/mysql/mysql.sock
[mysql]
port =3306
socket =/usr/local/mysql/mysql.sock
[mysqld]
user = mysql
basedir =/usr/local/mysql
datadir =/usr/local/mysql/data
port =3306
pid-file =/usr/local/mysql/mysqld.pid
socket =/usr/local/mysql/mysql.sock
server-id =3
log_bin = master-bin
relay-log = relay-log-bin
relay-log-index = slave-relay-bin.index
sql_mode=NO_ENGINE_SUBSTITUTION,STRICT_TRANS_TABLES,NO_AUTO_CREATE_USER,NO_AUTO_VALUE_ON_ZERO,NO_ZERO_IN_DATE,N O_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,PIPES_AS_CONCAT,ANSI_QUOTES
2.2.2 Mysql1、Mysql2、Mysql3 分别做两个软链接,软链接是为 MHA服务的。
[root@Mysql1 ~]# ln -s /usr/local/mysql/bin/mysql /usr/sbin/
[root@Mysql1 ~]# ln -s /usr/local/mysql/bin/mysqlbinlog /usr/sbin/
2.2.3 Mysql1、Mysql2、Mysql3 启动 MySQL。**
[root@Mysql1 ~]# /usr/local/mysql/bin/mysqld_safe --user=mysql &
2.2.4 数据库的授权操作
在所有数据库节点上授权两个⽤户,⼀个是从库同步使⽤,另外⼀个是 manager 使⽤。
mysql> grant replication slave on *.* to 'myslave'@'192.168.247.%' identified by '123';
mysql> grant all privileges on *.* to 'mha'@'192.168.247.%' identified by 'manager';
mysql> flush privileges;
下⾯三条授权按理论是不⽤添加的,但是做案例实验环境时候通过 MHA 检查MySQL 主从有报错,报两个从库通过主机名连接不上主库,所以所有数据库加上下⾯的授权。(在/etc/hosts⾥做映射也可解决)
mysql> grant all privileges on *.* to 'mha'@'Mysql1' identified by 'manager';
mysql> grant all privileges on *.* to 'mha'@'Mysql2' identified by 'manager';
mysql> grant all privileges on *.* to 'mha'@'Mysql3' identified by 'manager';
2.2.5 从数据库实现同步
在 Mysql1 主机上查看⼆进制⽂件和同步点,
mysql> show master status;
+-------------------+----------+--------------+------------------+-------------------+
| File | Position | Binlog_Do_DB | Binlog_Ignore_DB | Executed_Gtid_Set |
+-------------------+----------+--------------+------------------+-------------------+
| master-bin.000001|1491||||
+-------------------+----------+--------------+------------------+-------------------+
1 row in set (0.00 sec)
接下来在 Mysql2 和 Mysql3 分别执⾏同步。
mysql> change master to
master_host='192.168.247.130',master_user='myslave',master_password='123',master_log_file='master-bin.000001',master_log_pos=1491;和上⼀章保持⼀致
mysql> start slave;
查看两个从数据库, IO 和 SQL 线程都是 yes 代表同步是否正常。
mysql> show slave status\G;
......
Slave_IO_Running: Yes
Slave_SQL_Running: Yes
......
必须设置两个从库为只读模式:
mysql> set global read_only=1;
用keil编写单片机程序在 Mysql1 主库插⼊两条数据,测试是否同步。到这⾥主从复制就完成了。
2.3 安装MHA软件
2.3.1 所有服务器上都安装 MHA 依赖的环境,⾸先安装 epel 源。
[root@MHA-manager ~]# yum install epel-release --nogpgcheck
[root@MHA-manager ~]# yum install -y perl-DBD-MySQL perl-Config-Tiny perl-Log-Dispatch perl-Parallel-ForkManager perl-ExtUtils-CBuilder perl-ExtUtils-MakeMaker perl-CPAN
2.3.2 安装node组件
MHA 软件包对于每个操作系统版本不⼀样,这⾥ CentOS7.3 必须选择 0.57 版本,
在所有服务器(四台主机)上必须先安装 node 组件,因为 manager 依赖 node 组件,
下⾯都是在 Mysql1 上操作演⽰安装 node 组件。
[root@Mysql1 ~]# tar zxvf mha4mysql-node-0.
[root@Mysql1 ~]# cd mha4mysql-node-0.57
[root@Mysql1 mha4mysql-node-0.57]# perl Makefile.PL
[root@Mysql1 mha4mysql-node-0.57]# make
[root@Mysql1 mha4mysql-node-0.57]# make install
2.3.3 安装manager组件
在 MHA-manager 上安装 manager 组件
[root@MHA-manager ~]# tar zxvf mha4MHA-manager-0.
[root@MHA-manager ~]# cd mha4MHA-manager-0.57
[root@MHA-manager mha4MHA-manager-0.57]# perl Makefile.PL
*** Module::AutoInstall version 1.06
*** Checking for
[Core Features]- DBI ...loaded.(1.627)
-
DBD::mysql ...loaded.(4.023)
- Time::HiRes ...loaded.(1.9725)
- Config::Tiny ...loaded.(2.14)
- Log::Dispatch ...loaded.(2.41)
- Parallel::ForkManager ...loaded.(7.18)
- MHA::NodeConst ...loaded.(0.57)*** Module::AutoInstall configuration finished. Checking if your kit Looks good
Writing Makefile for mha4mysql::manager
[root@MHA-manager mha4MHA-manager-0.57]# make
[root@MHA-manager mha4MHA-manager-0.57]# make install
manager 安装后在/usr/local/bin 下⾯会⽣成⼏个⼯具,主要包括以下⼏个:
手机datagridviewmasterha_check_ssh //检查 MHA 的 SSH 配置状况
masterha_check_repl //检查 MySQL 复制状况
masterha_manger //启动 manager的脚本
masterha_check_status //检测当前 MHA 运⾏状态
masterha_master_monitor //检测 master 是否宕机
masterha_master_switch //控制故障转移(⾃动或者⼿动)
masterha_conf_host //添加或删除配置的 server 信息
masterha_stop //关闭manager
node 安装后也会在/usr/local/bin 下⾯会⽣成⼏个脚本(这些⼯具通常由 MHAManager 的脚本触发,⽆需⼈为操作)主要如下:
save_binary_logs //保存和复制 master 的⼆进制⽇志
apply_diff_relay_logs //识别差异的中继⽇志事件并将其差异的事件应⽤于其他的 slave
filter_mysqlbinlog //去除不必要的 ROLLBACK 事件(MHA 已不再使⽤这个⼯具)
purge_relay_logs //清除中继⽇志(不会阻塞 SQL 线程)
2.4 配置⽆密码认证
在 manager 上配置到所有节点的⽆密码认证
[root@MHA-manager ~]# ssh-keygen -t rsa //⼀路按回车键
[root@MHA-manager ~]# ssh-copy-id 192.168.247.130
[root@MHA-manager ~]# ssh-copy-id 192.168.247.140
[root@MHA-manager ~]# ssh-copy-id 192.168.247.150
#验证能否登陆
[root@MHA-manager ~]# ssh root@192.168.247.130
[root@MHA-manager ~]# ssh root@192.168.247.140
[root@MHA-manager ~]# ssh root@192.168.247.150
在 Mysql1 上配置到其他数据库节点的⽆密码认证
[root@Mysql1 ~]# ssh-keygen -t rsa
[root@Mysql1 ~]# ssh-copy-id 192.168.247.140
[root@Mysql1 ~]# ssh-copy-id 192.168.247.150
#验证能否登陆
[root@MHA-manager ~]# ssh root@192.168.247.140
[root@MHA-manager ~]# ssh root@192.168.247.150
在 Mysql2 上配置到其他数据库节点的⽆密码认证
truncate记录日志吗
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论