详解 MySQL 高可用群集,MMM搭建高可用

目录:

1·MMM 简介
2·MMM 各个角色说明
3·案例环境介绍
4·案例实施
5·总结



一:MMM 简介:

1)MMM 是什么:说得简单点,就是 MySQL 主主复制的管理器。之前的一篇文章讲述了 MySQL的主从复制 + 读写分离,其中原理都相同,有兴趣的朋友可以访问:MySQL主从复制 + 读写分离


2)还有就是,虽然是主主复制,但是在业务上的话,同一时间值额能对一个主进行写入,另一台就是备选。它可以实现故障切换,还可以实现多个 Slave 读 的负载均衡。可以自动或者手动切换主服务器,因为可以 虚拟VIP 的漂移。


3)但是 MMM 无法完全保证数据的一致性,所以它的应用场景应该是一些要求数据一致性不是很高,但是又要保证业务的可用性。


4)它的监管也需要让 MySQL 授权,以便让 MySQL 可以支持监理机的维护,授权的用户有:mmm_monitor 、mmm_agent ,如果要使用备份工具还需要添加 mmm_tools 用户的授权。


二:MMM 高可用架构角色说明:

1)mmm_mon:它是一个监控进程,负责所有的监控。决定和处理所有的角色活动,它需要在监管机上运行


2)mmm_agent : 它运行在每个MySQL 服务器上的代理进程,完成监控的探针工作和执行简单的远端服务设置。它也需要在被监管的机子上运行


3)mmm_control:一个简单的脚本,它提供 mmm_mond 进程命令


4)mysql-mmm 的监管端会提供多个虚拟 IP(VIP),包括一个可写和多个可读的 VIP,通过监管的管理,这些 IP 会绑定在可用的 MySQL 上,当一个主机宕机后,监管会将VIP迁移到其他的MySQL上。



MMM 高可用架构,如下图:


三: 案例环境介绍:

1·在这里需要声明下,mariadb 和 MySQL 是一样的,只是现在 MySQL 被oracle公司 收购后有些东西开始逐渐收费,所以这篇文章都是用 mariadb ,他和MySQL是一模一样的。


2·CenOS 默认没有mysql-mmm包,这里需要下载 epel 源,所以需要每台主机需要保持在线状态


3·这次环境使用五台服务器模拟搭建,环境表如下所示


主机 操作系统 IP 地址 主要软件
mysql-m1 主服务器 CentOS 7.4 192.168.106.154 epel-release源
mysql-m2 主服务器 CentOS 7.4 192.168.106.155 epel-release源
mysql-m3 从服务器 CentOS 7.4 192.168.106.156 epel-release源
mysql-m4 从服务器 CentOS 7.4 192.168.106.157 epel-release源
mysql-monitor 监控 CentOS 7.4 192.168.106.132 epel-release源、mysql-mmm

四:案例实施开始:

1·配置aliyun源,安装 epel-release 源,五台主机都需要安装,可同时进行

[[email protected] ~]# wget -O /etc/yum.repos.d/CentOS-Base.repo http://mirrors.aliyun.com/repo/Centos-7.repo ---- (配置阿里云yum源)



2·安装 epel-release 源,五台主机都需要安装

[[email protected] ~]# yum -y install epel-release



3·清除缓存,建立数据源

[[email protected] ~]# yum clean all && yum makecache



4·安装mariadb-server(服务端)、mariadb (客户端),五台主机都需要装,监控机 也可以用来当客户端使用
[[email protected] ~]# yum -y install mariadb-server mariadb
[[email protected] ~]# systemctl stop firewalld -----(关闭防火墙)
[[email protected] ~]# setenforce 0



5)修改五台主机 mariadb 的主配置文件

[[email protected] ~]# vim /etc/my.cnf -----(修改内容如下)
[mysqld]
log_error=/var/lib/mysql/mysql.err
log=/var/lib/mysql/mysql_log.log
log_slow_queries=/var/lib/mysql_slow_queris.log
binlog-ignore-db=mysql,information_schema
character_set_server=utf8
log_bin=mysql_bin
server_id=1
log_slave_updates=true
sync_binlog=1
auto_increment_increment=2
auto_increment_offset=1
[mysqld_safe]
log-error=/var/log/mariadb/mariadb.log
pid-file=/var/run/mariadb/mariadb.pid



6)以上配置需要主从服务器都修改

[[email protected] ~]# scp /etc/my.cnf [email protected]:/etc/ ----(发送给另一台主机,并且覆盖源文件)
[[email protected] ~]# scp /etc/my.cnf [email protected]:/etc/
[[email protected] ~]# scp /etc/my.cnf [email protected]:/etc/



7)这里需要说明:每天主机的server-id 不能一样,所以我们需要进入配置文件 vim /etc/my.cnf 修改server-id 的值,在使用 SCP 时需要进行身份验证, 请输入对方正确的密码



8)重启服务,查看3306端口是否启动:

[[email protected] ~]# systemctl start mariadb -----(启动服务)
[[email protected] ~]# netstat -anpt | grep 3306 ----(查看3306端口)
tcp 0 0 0.0.0.0:3306 0.0.0.0:* LISTEN 2501/mysqld



9)开始配置主主复制,使两台主服务器之间能进行互相复制

MariaDB [(none)]> grant replication slave on . to ‘replication‘ @‘192.168.106.%‘ identified by ‘123456‘;
Query OK, 0 rows affected (0.00 sec) -----(在第一台主服务器上授权)


MariaDB [(none)]> grant replication slave on . to ‘replication‘ @‘192.168.106.%‘ identified by ‘123456‘;
Query OK, 0 rows affected (0.00 sec) -----(在第二台主服务器上授权)



10)在两台主服务器上指定 Master 的各种参数,使其能互相访问。

MariaDB [(none)]> show master status;
+------------------+----------+--------------+--------------------------+
| File | Position | Binlog_Do_DB | Binlog_Ignore_DB |
+------------------+----------+--------------+--------------------------+
| mysql_bin.000003 | 555 | | mysql,information_schema |
+------------------+----------+--------------+--------------------------+
1 row in set (0.00 sec)
在第一台主服务器上 show master status;
需要记录 二进制日志文件、和地址


MariaDB [(none)]> show master status;
+------------------+----------+--------------+--------------------------+
| File | Position | Binlog_Do_DB | Binlog_Ignore_DB |
+------------------+----------+--------------+--------------------------+
| mysql_bin.000003 | 555 | | mysql,information_schema |
+------------------+----------+--------------+--------------------------+
1 row in set (0.00 sec)
在第二台主服务器上 show master status;
需要记录 二进制日志文件、和地址


change master to master_host=‘192.168.106.154‘,master_user=‘replication‘,master_password=‘123456‘,master_log_file=‘mysql_bin.000003‘,master_log_pos=555; ----(在第一台主服务器上指定)



change master to master_host=‘192.168.106.154‘,master_user=‘replication‘,master_password=‘123456‘,master_log_file=‘mysql_bin.000003‘,master_log_pos=555; ----(在第二台主服务器上指定)



11)开启同步、查看同步状态,主服务器都需要开启同步。

MariaDB [(none)]> start slave;
MariaDB [(none)]> show slave status\G;
1. row
Slave_IO_State: Waiting for master to send event
Master_Host: 192.168.106.154
Master_User: replication
Master_Port: 3306
Connect_Retry: 60
Master_Log_File: mysql_bin.000003
Read_Master_Log_Pos: 647
Relay_Log_File: mariadb-relay-bin.000002
Relay_Log_Pos: 621
Relay_Master_Log_File: mysql_bin.000003
Slave_IO_Running: Yes
Slave_SQL_Running: Yes
-----两个YES说明同步成功



12)验证主主复制:

在m1 上创建一个库,在m2上查看是否复制。
MariaDB [(none)]> create database school;





13)安装 MySQL-mmm,在所有服务器上都需要安装。

[[email protected] ~]# yum -y install mysql-mmm ----(安装mmm 下所有的软件)



14)安装结束后,配置 mmm

[[email protected] ~]# vim /etc/mysql-mmm/mmm_common.conf ---(修改内容如下)


active_master_role writer

<host default>
cluster_interface ens33 ---(cenos7 的网卡名称为:ens33)
pid_path /run/mysql-mmm-agent.pid
bin_path /usr/libexec/mysql-mmm/
replication_user replication ---(之前授权用户)
replication_password 123123 ----(密码)
agent_user mmm_agent ---(用户名)
agent_password 123123 -----(密码)
</host>

<host db1>
ip 192.168.106.154 ------(m1 的IP地址)
mode master
peer db2
</host>

<host db2>
ip 192.168.106.155 -----(m2 的IP地址)
mode master
peer db1
</host>

<host db3>
ip 192.168.106.156 -----(m3 的IP地址)
mode slave
</host>

<host db4>
ip 192.168.106.157 ----(m4 的ip地址)
mode slave
</host>

<role writer>
hosts db1, db2
ips 192.168.106.200 ------ (这里需要填写 两台主服务器的共同的 VIP)
mode exclusive
</role>

<role reader>
hosts db3, db4 ----(修改数字,读取池子应该使 从服务器)
ips 192.168.106.210, 192.168.106.220 (这里需要分别填写两台从服务器VIP 地址,这里需要两个VIP 地址)
mode balanced
</role>



15)远程发送mmm配置文件给所有主机:

[[email protected] ~]# scp /etc/mysql-mmm/mmm_common.conf [email protected]:/etc/mysql-mmm/


[[email protected] ~]# scp /etc/mysql-mmm/mmm_common.conf [email protected]:/etc/mysql-mmm/


[[email protected] ~]# scp /etc/mysql-mmm/mmm_common.conf [email protected]:/etc/mysql-mmm/


[[email protected] ~]# scp /etc/mysql-mmm/mmm_common.conf [email protected]:/etc/mysql-mmm/



16)配置监控服务器,最后一台服务器

[[email protected] ~]# vim /etc/mysql-mmm/mmm_mon.conf ---(修改内容如下)


<monitor>
ip 127.0.0.1
pid_path /run/mysql-mmm-monitor.pid
bin_path /usr/libexec/mysql-mmm
status_path /var/lib/mysql-mmm/mmm_mond.status
ping_ips 192.168.106.154,192.168.106.155,192.168.106.156,192.168.106.157 ---(需要监听主机IP地址)
auto_set_online 10 ---(上线时间调整为10秒)

# The kill_host_bin does not exist by default, though the monitor will
# throw a warning about it missing.  See the section 5.10 "Kill Host
# Functionality" in the PDF documentation.
#
# kill_host_bin     /usr/libexec/mysql-mmm/monitor/kill_host
#

</monitor>

<host default>
monitor_user mmm_monitor
monitor_password 123456 ---(用户密码)
</host>

[[email protected] ~]# systemctl start mysql-mmm-monitor.service ---(启动监控)



17)在所有数据库上为mmm_agen 、mmm_moniter t授权

MariaDB [(none)]> grant super, replication client, process on . to ‘mmm_agent‘@‘192.168.106.%‘ identified by ‘123456‘; ----(所有数据库都需要授权)


MariaDB [(none)]> grant replication client on . to ‘mmm_monitor‘@‘192.168.106.%‘ identified by ‘123456‘; ---(所有数据库都需要授权)



MariaDB [(none)]> flush privileges; ----(刷新数据库)



18)修改所有 文件,指向自己是 db 1、2、3、4。

[[email protected] ~]# vim /etc/mysql-mmm/mmm_agent.conf -----(修改内容如下)
this db1 ----(根据之前代理名称的规划进行逐一调整每台服务器)



19)在所在数据库服务器上启动mysql-mmm-agent

[[email protected] ~]# systemctl start mysql-mmm-agent.service
[[email protected] ~]# systemctl enable mysql-mmm-agent.service ---(设置开机自启)



20)在监控机 mmm_monitor 上查看四台服务器状态:

mmm_control show //查看各节点的情况:
db1(192.168.235.132) master/ONLINE. Roles:writer(192.168.106.200)
db2(192.168.235.191) master/ONLINE. Roles:
db3(192.168.235.177) slave/ONLINE. Roles:reader(192.168.106.210)
db4(192.168.235.181) slave/ONLINE. Roles:reader(192.168.106.220)


21)故障切换,停止m1 服务,再次查看监控状态。停止m3 再次查看状态。使用另一台mysql登陆m1写入数据,查看是否同步!


总结:

1·需要知道其中原理的可以看看上一篇文章MySQL 主从复制+读写分离
2·mysql-mmm 适用于对数据的一致性要求不是很高,但是又想最大程度的保证业务可用性的场景
3·在故障切换,和客户端写入数据时,可以看出后端的功能实现,都是走的真实IP,而客户端写入的时候或读取时都是走 VIP。

原文地址:http://blog.51cto.com/13746824/2173073

时间: 2024-11-05 18:40:10

详解 MySQL 高可用群集,MMM搭建高可用的相关文章

Mysql常用show命令,show variables like xxx 详解,mysql运行时参数

MySQL中有很多的基本命令,show命令也是其中之一,在很多使用者中对show命令的使用还容易产生混淆,本文汇集了show命令的众多用法. 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 a. show tables或show tables from database_name; -- 显示当前数据库中所有表的名称. b. show databases; -- 显示mysql中所有数据库的名称. c. show columns from table_n

MySQL存储过程详解 mysql 存储过程

MySQL存储过程详解  mysql 存储过程 (2010-12-13 10:59:38) 转载▼ 标签: it 分类: mysql mysql存储过程详解 1.      存储过程简介   我们常用的操作数据库语言SQL语句在执行的时候需要要先编译,然后执行,而存储过程(Stored Procedure)是一组为了完成特定功能的SQL语句集,经编译后存储在数据库中,用户通过指定存储过程的名字并给定参数(如果该存储过程带有参数)来调用执行它. 一个存储过程是一个可编程的函数,它在数据库中创建并保

详解mysql复制机制--异步复制,半同步复制和并行复制

详解MySQL复制机制--异步复制,半同步复制和并行复制 **# 异步复制 异步复制是MySQL自带的最原始的复制方式,主库和备库成功建立复制关系后,在备库上会有一个IO线程去主库拉取binlog,并将binlogx到本地,就是下图中Relaylog,然后备库会开启另外一个SQL线程取回放Relay log,通过这种方式达到Master-Slave数据同步的目的. 通常情况下,slave是只读的,可以承担一部分读流量,而且可以根据实际需要,添加一个或者多个slave,这样在一定程度上可以缓解主库

详解mysql中的Using与On的用法

多用才可以体会各个关键字的用法啊... 原文来自[http://bbs.php100.com/read-htm-tid-148469.html] 在用Join进行多表联合查询时,我们通常使用On来建立两个表的关系.其实还有一个更方便的关键字,那就是Using.那么这两个关键字在使用上有啥区别呢?往下看.假设有如下两张表:    mysql> select * from pets; +---------+---------+--------+-----------+ | pets_id | ani

【文章阅读】详解MySQL数据类型

详解MySQL数据类型 - 五月的仓颉 - 博客园 http://www.cnblogs.com/xrq730/p/8446246.html 注:对于MySQL的数据类型做了详细的讲解,这是我看过的最全面最有深度的文章. 原文地址:https://www.cnblogs.com/buwuliao/p/8810060.html

详解 MySql InnoDB 中的三种行锁(记录锁、间隙锁与临键锁)

详解 MySql InnoDB 中的三种行锁(记录锁.间隙锁与临键锁) 前言 InnoDB 通过 MVCC 和 NEXT-KEY Locks,解决了在可重复读的事务隔离级别下出现幻读的问题.MVCC 我先挖个坑,日后再细讲,这篇文章我们主要来谈谈那些可爱的锁. 什么是幻读? 幻读是在可重复读的事务隔离级别下会出现的一种问题,简单来说,可重复读保证了当前事务不会读取到其他事务已提交的 UPDATE 操作.但同时,也会导致当前事务无法感知到来自其他事务中的 INSERT 或 DELETE 操作,这就

MySQL高可用群集--MMM高可用架构

为什么要使用MySQL高可用群集 在实际生产环境中,当普通的MySQL主从复制和读写分离不能满足实际需求时,就需要考虑MySQL的高可用群集,出于安全角度考虑,当数据访问量过大带来主服务器负载增大,当出现主服务器宕机一个时,保证数据服务不会中断的情况下,从服务器会自动寻找另一主服务器,而从服务器也会像主服务器一样,当其中一个宕机时,依旧可以保证服务不会中断. MMM高可用架构 什么是MMM? MMM(Master-Master replication manager for MySQL)是一套支

MMM搭建高可用mysql集群

简介 MMM(Master-Master replication manager for MySQL)是一套支持双主故障切换和双主日常管理的脚本程序.MMM使用Perl语言开发,主要用来监控和管理MySQL Master-Master(双主)复制,虽然叫做双主复制,但是业务上同一时刻只允许对一个主进行写入,另一台备选主上提供部分读服务,以加速在主主切换时刻备选主的预热,可以说MMM这套脚本程序一方面实现了故障切换的功能,另一方面其内部附加的工具脚本也可以实现多个slave的read负载均衡. M

MySQL存储过程详解 mysql 存储过程(转:http://blog.sina.com.cn/s/blog_52d20fbf0100ofd5.html)

转:http://blog.sina.com.cn/s/blog_52d20fbf0100ofd5.html mysql存储过程详解 1.      存储过程简介   我们常用的操作数据库语言SQL语句在执行的时候需要要先编译,然后执行,而存储过程(Stored Procedure)是一组为了完成特定功能的SQL语句集,经编译后存储在数据库中,用户通过指定存储过程的名字并给定参数(如果该存储过程带有参数)来调用执行它. 一个存储过程是一个可编程的函数,它在数据库中创建并保存.它可以有SQL语句和

MySQL存储过程详解 mysql 存储过程(二)

mysql存储过程详解1.      存储过程简介我们常用的操作数据库语言SQL语句在执行的时候需要要先编译,然后执行,而存储过程(Stored Procedure)是一组为了完成特定功能的SQL语句集,经编译后存储在数据库中,用户通过指定存储过程的名字并给定参数(如果该存储过程带有参数)来调用执行它.一个存储过程是一个可编程的函数,它在数据库中创建并保存.它可以有SQL语句和一些特殊的控制结构组成.当希望在不同的应用程序或平台上执行相同的函数,或者封装特定功能时,存储过程是非常有用的.数据库中