MySQL高可用之 MMM结构

一.MMM概述

1.MMM介绍

MMM(Master-Master replication manager for MySQL,MySQL主主复制管理器)

是一套支持双主故障切换和双主日常管理的脚本程序。MMM 使用 Perl 语言开发,主要用来监控和

管理 MySQL Master-Master (双主)复制,虽然叫做双主复制,但是业务上同一时刻只允许对一

个主进行写入,另一台备选主上提供部分读服务,以加速在主主切换时备选主的预热,可以说

MMM这套脚本程序一方面实现了故障切换的功能,另一方面其内部附加的工具脚本也可以实现多

个 Slave 的 read 负载均衡。

MMM提供了自动和手动两种方式移除一组服务器中复制延迟较高的服务器的虚拟ip,同时它还可

以备份数据,实现两节点之间的数据同步等。由于MMM无法完全保证数据的一致性,所以MMM适

用于对数据的一致性要求不是很高,但是又想最大程度地保证业务可用性的场景。

MMM是一套灵活的脚本程序,基于perl实现,用来对 mysql replication 进行监控和故障迁移,并

能管理 MySQL Master-Master 复制的配置。

2.MMM的架构

关于 MMM 高可用架构的说明如下:

(1)mmm_mon:监控进程,负责所有的监控工作,决定和处理所有节点角色活动。此脚本需要

在监控主机上运行。

(2)mmm_agent:运行在每个MySQL服务器上的代理进程,完成监控的探针工作和执行简单的

远端服务设置。此脚本需要在被监管机上运行。

(3)mmm_control:一个简单的脚本,提供管理 mmm_mon 进程的命令。

(4)mysql-mmm 的监管端会提供多个虚拟 IP(VIP),包括一个可写 VIP,多个可读 VIP,通过

监管的管理,这些 IP 会绑定在可用 MySQL 之上,当某一台 MySQL 宕机时,监管会将 VIP 迁移

至其他 MySQL。

在整个监管过程中,需要在 MySQL 中添加相关授权用户,以便让 MySQL 可以支持监控主机的维护。 授权的用户包括一个 mmm_monitor 用户和一个 mmm_agent 用户。

二.MMM 搭建

1.搭建前准备

准备四台安装有 MySQL 5.7版本数据库的虚拟机和一台做 moniter 服务器

master01(db1) 192.168.10.10 mysql5.7、mysql-mmm

master02(db2) 192.168.10.20 mysql5.7、mysql-mmm

slave01(db3) 192.168.10.30 mysql5.7、mysql-mmm

slave02(db4) 192.168.10.40 mysql5.7、mysql-mmm

monitor 192.168.10.50 mysql-mmm

2.初始化操作

systemctl stop firewalld 

setenforce 0

3.搭建 MySQL 多主多从模式

3.1修改 master 配置文件(第一台)

vim /etc/my.cnf      #添加[mysqld]下面的配置

......
[mysqld]

user = mysql

basedir = /usr/local/mysql

datadir = /usr/local/mysql/data

port = 3306

character_set_server=utf8

pid-file = /usr/local/mysql/mysqld.pid

socket = /usr/local/mysql/mysql.sock

server-id = 1                         #每台 Mysql 主机的 server-id 不能相同

log-error=/usr/local/mysql/data/mysql_error.log             #错误日志

general_log=ON                                              #通用查询日志

general_log_file=/usr/local/mysql/data/mysql_general.log

slow_query_log=ON                                           #慢查询日志

slow_query_log_file=mysql_slow_query.log

long_query_time=5

binlog-ignore-db=mysql,information_schema        #不需要同步的库名

log_bin=mysql_bin                      #开启二进制日志用于主从数据复制

log_slave_updates=true      #允许slave从master复制数据时可以写入到自己的二进制日志

sync_binlog=1                

#"双1设置",MySQL 在每写一次二进制日志时都会同步到磁盘中去    

innodb_flush_log_at_trx_commit=1     

#"双1设置",每次事务提交时MySQL都会把缓存的数据写入日志文件,并且刷到磁盘中去

auto_increment_increment=2               #自增字段一次递增多少

auto_increment_offset=1                  #自增字段的起始值

[mysqld]
user = mysql
basedir = /usr/local/mysql
datadir = /usr/local/mysql/data
port = 3306
character_set_server=utf8
pid-file = /usr/local/mysql/mysqld.pid
socket = /usr/local/mysql/mysql.sock
server-id = 1
log-error=/usr/local/mysql/data/mysql_error.log
general_log=ON
general_log_file=/usr/local/mysql/data/mysql_general.log
slow_query_log=ON
slow_query_log_file=mysql_slow_query.log
long_query_time=5
binlog-ignore-db=mysql,information_schema
log_bin=mysql_bin
log_slave_updates=true
sync_binlog=1
innodb_flush_log_at_trx_commit=1
auto_increment_increment=2
auto_increment_offset=1

3.2把配置文件复制到其它 3 台数据库服务器上并启动服务器

scp /etc/my.cnf root@192.168.80.20:/etc/

scp /etc/my.cnf root@192.168.80.30:/etc/

scp /etc/my.cnf root@192.168.80.40:/etc/

注意:每台装有数据库的虚拟机的配置文件中的 server_id 都要修改

修改好之后重启 MySQL 服务(四台全部重启)

systemctl restart mysqld

3.3配置主主复制,两台主服务器相互复制

grant replication slave on *.* to 'replication'@'192.168.10.%' identified by '123456';

#在两台主服务器上都执行授予从的权限,从服务器上不需要执行

show master status;

#在两台主服务器上查看,记录日志文件名称和同步点

(1)在 master上配置同步(第一台主)

change master to master_host='192.168.10.20', master_user='replication', master_password='123456', master_log_file='mysql_bin.000001', master_log_pos=460;

start slave;

show slave status\G

(2))在 master上配置同步(第二台主)

change master to master_host='192.168.10.10', master_user='replication', master_password='123456', master_log_file='mysql_bin.000001', master_log_pos=460;

start slave;

show slave status\G

要确保两台主服务器的 Slave_IO_Running 和 Slave_SQL_Running 后面接的都是 yes !!!

3.4配置主从复制,在两台从服务器上做

(1)在 slave 上做配置(第一台从)

change master to master_host='192.168.10.10', master_user='replication', master_password='123456', master_log_file='mysql_bin.000001', master_log_pos=460;

start slave;

show slave status\G

(2)在 slave 上做配置(第二台从)

change master to master_host='192.168.10.20', master_user='replication', master_password='123456', master_log_file='mysql_bin.000001', master_log_pos=460;

start slave;

show slave status\G

两台从服务器的 Slave_IO_Running 和 Slave_SQL_Running 后面接的也要都是 yes !!!

3.5测试主主、主从 同步情况

create database db_test;

show databases;

4.安装配置 MySQL-MMM

4.1在所有服务器上安装 MySQL-MMM

wget -O /etc/yum.repos.d/CentOS-Base.repo http://mirrors.aliyun.com/repo/Centos-7.repo

yum -y install epel-release

yum -y install mysql-mmm*

4.2在 master 上对 MySQL-MMM 进行配置(第一台主)

cd /etc/mysql-mmm/

vim mmm_common.conf

......                         #修改以下一些配置
<host default>
    cluster_interface       ens33
    ......
    replication_user        replication
    replication_password    123456
    agent_user              mmm_agent
    agent_password          123456

<host db1>
    ip      192.168.10.10
    mode    master
    peer    db1
</host>

<host db2>
    ip      192.168.10.20
    mode    master
    peer    db2
</host>

<host db3>
    ip      192.168.10.30
    mode    slave
</host>

<host db4>
    ip      192.168.10.40
    mode    slave
</host>

<role writer>
    hosts   db1, db2
    ips     192.168.10.100
    mode    exclusive           #只有一个 host 可以进行写操作模式
</role>

<role reader>
    hosts   db3, db4
    ips     192.168.10.101, 192.168.10.102
    mode    balanced            #多个 slave 主机可以进行读操作模式
</role>

4.3把配置文件复制到其它 4 台主机,所有主机该配置文件内容都是一样的

scp mmm_common.conf root@192.168.10.20:/etc/mysql-mmm/

scp mmm_common.conf root@192.168.10.30:/etc/mysql-mmm/

scp mmm_common.conf root@192.168.10.40:/etc/mysql-mmm/

scp mmm_common.conf root@192.168.10.50:/etc/mysql-mmm/

4.4修改所有数据库服务器的代理配置文件 mmm_agent.conf

vim /etc/mysql-mmm/mmm_agent.conf


include mmm_common.conf
.......................

this db1				#根据不同的主机分别修改为 db1,db2,db3,db4

4.5在 monitor 监控服务器上修改监控配置文件 mmm_mon.conf

vim /etc/mysql-mmm/mmm_mon.conf

include mmm_common.conf
<monitor>
.....
    ping_ips     192.168.10.10,192.168.10.20,192.168.10.30,192.168.10.40    
                                            #指定所有数据库服务器的 IP
	auto_set_online		10				    #指定自动上线时间
</monitor>

<host default>
    monitor_user        mmm_monitor	     	#指定 mmm_monitor 的用户名
    monitor_password    123456              #指定 mmm_monitor 的密码
</host>

5.在数据库上进行授权操作

5.1在所有数据库上为 mmm_agent(代理进程)授权

grant replication client on *.* to 'mmm_monitor'@'192.168.10.%' identified by '123456';

5.2在所有数据库上为 mmm_moniter(监控进程)授权

grant replication client on *.* to 'mmm_monitor'@'192.168.10.%' identified by '123456';

flush privileges;

6.启动服务并进行测试

6.1在所有数据库服务器上启动 mysql-mmm-agent

systemctl start mysql-mmm-agent.service

systemctl enable mysql-mmm-agent.service

6.2在 monitor 服务器上启动 mysql-mmm-monitor

systemctl start mysql-mmm-monitor.service

6.3在 monitor 服务器上测试群集

(1)查看各节点的情况

mmm_control show

(2)检测监控功能是否都完善,需要各种OK

mmm_control checks all

(3)指定绑定 VIP 的主机

mmm_control move_role writer db2

(4)故障测试

mmm_control move_role writer db1

(5)停止 master 确认 VIP 是否移动到 master02 上

systemctl stop mysqld

mmm_control show

注意:master01 主服务器恢复服务后,不会抢占

(6)停止一台从服务器,另一台将接管两个虚拟IP,以保证业务不停止

systemctl stop mysqld

mmm_control show

7.客户端测试

7.1在 master 服务器上为 monitor 服务器地址授权登录(第一台)

grant all on *.* to 'testdba'@'192.168.10.50' identified by '123456';

flush privileges;

7.2在 monitor 服务器上使用 VIP 登录

yum install -y mariadb-server mariadb

systemctl start mariadb.service

mysql -utestdba -p -h 192.168.10.100 

                         #密码123456

7.3创建数据,测试同步情况

create database testdba;
相关推荐
tatasix37 分钟前
MySQL UPDATE语句执行链路解析
数据库·mysql
南城花随雪。1 小时前
硬盘(HDD)与固态硬盘(SSD)详细解读
数据库
儿时可乖了1 小时前
使用 Java 操作 SQLite 数据库
java·数据库·sqlite
懒是一种态度1 小时前
Golang 调用 mongodb 的函数
数据库·mongodb·golang
天海华兮1 小时前
mysql 去重 补全 取出重复 变量 函数 和存储过程
数据库·mysql
gma9992 小时前
Etcd 框架
数据库·etcd
爱吃青椒不爱吃西红柿‍️2 小时前
华为ASP与CSP是什么?
服务器·前端·数据库
Yz98762 小时前
hive的存储格式
大数据·数据库·数据仓库·hive·hadoop·数据库开发
武子康3 小时前
大数据-231 离线数仓 - DWS 层、ADS 层的创建 Hive 执行脚本
java·大数据·数据仓库·hive·hadoop·mysql
黑色叉腰丶大魔王3 小时前
《MySQL 数据库备份与恢复》
mysql