nepaul / nepaul.github.io

Blogs: https://nepaul.me + Issues
https://nepaul.me
8 stars 1 forks source link

MySQL 高可用实践 #4

Closed nepaul closed 7 years ago

nepaul commented 8 years ago

基于 MySQL5.7, Semisynchronous Replication(MySQL 半同步复制), Keepalived, MHA 的 MySQL 高可用方案

MySQL, 用得最多最广泛的关系型数据库。 在生产环境中,难免遇到诸如 需要重启服务器或者 MySQL 服务莫名宕了 等问题。如何保证 MySQL 能够持续提供读写等服务,即 高可用性?

本文主要讲述如何从无到有构建一套简单的 MySQL 高可用方案,少概念原理,多实操。

概念及架构简介

来看一下 架构图

应用通过 VIP(虚拟路由,由 Keepalived 创建)访问 MySQL 集群。一主(图 M )二从(图 S1 和 S2),S2 作备用主库。一旦原 Master 节点出现故障,MHA 自动将主库切换到 S1,并且 S2 随之连接到新的 Master。MHA 同时通过 master_ip_failover_script 脚本停止原 Master 节点上的 Keepalived,路由自动切换到 新 Master。这时候外部应用实际访问的是 S1 了,不会出现 MySQL 突然无法使用的问题。

mysql-mha

机器规划

Host IP VIP Role Software
M 10.20.78.241 10.20.78.11 Master MySQL5.7 Keepalived MHA-Node
S1 10.20.78.243 备用 candidate_master (Slave) MySQL5.7 Keepalived MHA-Node
S2 10.20.78.245 - Slave MySQL5.7 MHA-Node
MHA-Manager 10.20.78.227 - MHA Manager MHA-Node MHA-Manger

M 出现故障后:

Host IP VIP Role
M 10.20.78.241 - stoped
S1 10.20.78.243 10.20.78.11 master
S2 10.20.78.245 - Slave
MHA-Manager 10.20.78.227 - MHA Manager(stoped)

集群的搭建

整个集群搭建安装分为 MySQL 半同步复制、MHA 和 VIP(Keepalived) 三大部分。几乎都是以命令的方式来展示。

在安装具体的软件之前,对所有机器 yum -y upgrade (这是一个很好的习惯)。

所有服务器上 安装 EPEL( MHA 依赖包需要):rpm -Uvh https://dl.fedoraproject.org/pub/epel/epel-release-latest-6.noarch.rpm

下面开始分别从 MySQL 的半同步复制、Keepalived(VIP) 和 MHA 三方面具体说明。

Semisynchronous Replication

MySQL 在 5.5 以上的版本支持 半同步 复制,并且需要已经配置好 主从复制。

安装 MySQL 5.7

// 安装
wget http://dev.mysql.com/get/mysql57-community-release-el6-7.noarch.rpm
yum localinstall mysql57-community-release-el6-7.noarch.rpm

// 检查是否安装成功
service mysqld start
service mysqld status
mysql --version

// 初始的安全配置
grep 'temporary password' /var/log/mysqld.log
mysql_secure_installation //根据提示操作, 包括设置 root 新密码等操作

// 开始使用
mysql -uroot -p

配置 MySQL 主从同步

Master 机器上的操作:

Slave 机器上的操作:

主从同步配置完成,检查状态

需要在 M 和 S1 两台服务器上安装配置

  • 安装, 最后一行编辑的 keepalived.conf 在这里
  wget http://www.keepalived.org/software/keepalived-1.2.20.tar.gz
  tar -zxvf keepalived-1.2.20.tar.gz 
  cd keepalived-1.2.20
   ./configure --prefix=/usr/local/keepalived
  make && make install
  cp /usr/local/keepalived/etc/rc.d/init.d/keepalived /etc/init.d/keepalived
  cp /usr/local/keepalived/sbin/keepalived /usr/sbin/
  cp /usr/local/keepalived/etc/sysconfig/keepalived /etc/sysconfig/
  mkdir -p /etc/keepalived/
  cp /usr/local/keepalived/etc/keepalived/keepalived.conf /etc/keepalived/keepalived.conf
  vim /etc/keepalived/keepalived.conf

MHA 由 Node 和 Manager 两部分组成,Node 安装在每一台 MySQL 服务器上,而 MHA-Manager 需要同时安装 Node 和 Manager.

三台 MySQL 服务上创建 MHA-Manger 需要的用户

CREATE USER 'mha_manager'@'172.16.%.%' IDENTIFIED BY 'Crasheye+!@#123';
GRANT ALL ON *.* TO 'mha_manager'@'172.16.%.%';

各节点间的SSH 公钥免密码登陆

MHA Manager 使用 SSH 连接到各个 MySQL 服务器,最新 Slave 节点上的MHA Node 也要用 SSH (scp) 把 relay log 文件发给各个从库节点

  mkdir ~/.ssh
  chmod 700 ~/.ssh
  ssh-keygen -t rsa
yum install perl-DBD-MySQL -y
rpm -Uvh https://mysql-master-ha.googlecode.com/files/mha4mysql-node-0.52-0.noarch.rpm  #需翻墙
MHA-Manager 结点

全部配置完毕,enjoy it!

Fail-Over 及 故障恢复

FAQ

  1. 配置 ssh 免密码登陆

    Q: Permission denied (publickey,gssapi-keyex,gssapi-with-mic).

    A: 查看 ssh 配置文件(vim /etc/ssh/sshd_config),确认一下参数为

    PasswordAuthentication yes
    RSAAuthentication yes
    PubkeyAuthentication yes
    1. 查看 mysql 所有 user: SELECT DISTINCT CONCAT('User: ''',user,'''@''',host,''';') AS query FROM mysql.user;
  2. MHA check rel 报错: Q: error][/usr/share/perl5/vendor_perl/MHA/MasterMonitor.pm, ln424] Error happened on checking configurations. Argument "1 # M-hM-/M-% MySQL M-fM-0M-8M-hM-?M-^\M-dM-8M-\rM-eM-^A..." isn't numeric in numeric ge (>=) at /usr/share/perl5/vendor_perl/MHA/ServerManager.pm line 1157. A: 很有可能是 mha 的配置文件中有中文,包括注释,去掉再试试
  3. 如何在 MySQL 间迁移数据 迁移指定某个数据库 数据源 MySQL 服务器:shell> mysqldump -uroot -p database_name > database_name.sql 目标源 MySQL 服务器:

     mysql> create database_name;
     mysql> use database_name;
     mysql> source database_name.sql;

    官方资料

    Links