MySQL-MMM高可用集群

  • MMM简介
  • mysql+atlas+mmm实例搭建
    • 四台mysql服务器安装mysql
    • 建立时间同步环境
    • 配置MySQL
      • 配置主MySQL
      • 配置从MySQL
    • 设置两个主MySQL的主主模式
      • 测试主主同步
    • 设置主从MySQL模式
      • 测试主从同步
    • 设置读写分离
      • 测试读写分离
    • 配置MySQL高可用群集MMM
      • 安装mysql-mmm
      • 授权monitor访问
      • 修改配置
    • 开启代理和监控服务
    • 测试集群

MMM简介

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

  • 双主复制,实现故障自动切换
  • 实现多个slave的read负载均衡
  • 备份数据

原理

  • 其原理是将真实数据库节点的IP(RIP)映射为虚拟IP(VIP)集,在这个虚拟的IP集中,有一个专用于write的IP,多个用于read的IP,这个用于write的VIP映射着数据库集群中的两台master的真实IP(RIP),以此来实现故障转移(Failover)的切换,其他read的VIP可以用来均衡read(balance)。

MMM高可用架构说明

  • mmm_mon 监控进程,负责所有的监控工作,决定和处理所有节点角色活动。此脚本需要在监控机上运行

  • mmm_agent 运行在每个mysql服务器上的代理进程,完成监控的探针工作和执行简单的远程服务设置,此脚本需要在被监管机上运行

  • mmm_control 一个简单的脚本,提供管理mmm_mond进程的命令

  • mysql_mmm的监管端会提供多个虚拟IP(VIP),包括一个可写VIP,多个可读VIP,通过监管的管理,这些IP会绑定在可用mysql之上,当某一台mysql宕机时,监管会将VIP迁移至其他mysql

  • 在整个监管过程中,需要在MySQL中添加相关的授权用户,以便让MySQL可以支持监理机的维护。授权的用户包括一个mmm_monitor用户和一个mmm_agent用户,如果想使用MMM的备份工具则还需要添加一个mmm_tools用户

mysql+atlas+mmm实例搭建

四台mysql服务器安装mysql

安装脚本

#!/bin/bash
tar xf /root/mysql-5.7.25-el7-x86_64.tar.gz  -C /usr/local/
cd /usr/local
mv mysql-5.7.25-el7-x86_64  mysqlid mysql &>/dev/null
if [ $? -ne 0 ];thengroupadd mysqluseradd -M -s /sbin/nologin mysql -g mysql
fichown -R mysql.mysql /usr/local/mysqlconfig() {rm -rf /etc/my.cnf
cat > /etc/my.cnf <<-EOF
[mysqld]
user=mysql
basedir=/usr/local/mysql
datadir=/usr/local/mysql/data
server_id=1
port=3306
socket=/tmp/mysql.sock
[mysql]
socket=/tmp/mysql.sock
prompt=mysql [\\\d]>
EOF
}configecho 'export PATH=$PATH:/usr/local/mysql/bin' >> /etc/profile
source /etc/profileyum install -y libaio numactl &>/dev/null
mysqld --initialize-insecure  --user=mysql --basedir=/usr/local/mysql --datadir=/usr/local/mysql/data &>/dev/null
if [ $? -ne 0 ];thenecho '初始化错误,请检查依赖'exit 2
elseecho '初始化成功!'
fisys() {cat >/etc/systemd/system/mysqld.service <<-EOF
[Unit]
Description=MySQL Server
After=network.target
After=syslog.target
[Install]
WantedBy=multi-user.target
[Service]
User=mysql
Group=mysql
ExecStart=/usr/local/mysql/bin/mysqld --defaults-file=/etc/my.cnf
LimitNOFILE = 5000
EOF
}syssystemctl daemon-reload
systemctl start mysqld
pgrep mysql &>/dev/null
if [ $? -ne 0 ];thenecho 'mysql启动失败,请检查配置文件或查看日志'exit 3
fimysqladmin -uroot  password '123' &>/dev/null
if [ $? -ne 0 ];thenecho '请手动source /etc/profile 之后更改密码和登录mysql'
fi
mysql -uroot -p123

建立时间同步环境

在主节点上搭建时间同步服务器安装NTP(关闭防火墙/selinux)
yum -y install ntp配置NTP
vim /etc/ntp.conf # local clock
server 127.127.1.0      # 本地时间供给源
fudge  127.127.1.0 stratum 8    # 设置时区为+08区重启服务并设置为开机启动
systemctl enable ntpd --now在主备选和从节点上进行时间同步
yum -y install ntpdate
ntpdate 192.168.188.71

配置MySQL

配置主MySQL

主MySQL
vim /etc/my.cnf
[mysqld]
server_id = 1      # 每台服务器设置为不同id
log_bin = master-bin   # 开启二进制日志
log-slave-updates = true   # 宕机后启用备用库
auto_increment_increment = 2   # 两台主MySQL设置相同数
auto_increment_offset = 1  # 两台主MySQL设置为不同数备选主MySQL
[mysqld]
server_id = 2
log_bin = master-bin
log-slave-updates = true
auto_increment_increment = 2   # 两台主MySQL设置相同数
auto_increment_offset = 2      # 两台主MySQL设置为不同数systemctl restart mysqld

补充:
mysql中有自增长字段,在做数据库的主主同步时需要设置自增长的两个相关配置:auto_increment_offsetauto_increment_increment

  • auto_increment_offset表示自增长字段从那个数开始,他的取值范围是1 … 65535
  • auto_increment_increment表示自增长字段每次递增的量,其默认值是1,取值范围是1 … 65535
  • 在主主同步配置时,需要将两台服务器的auto_increment_increment增长量都配置为2
  • 而要把auto_increment_offset分别配置为1和2.

这样才可以避免两台服务器同时做更新时自增长字段的值之间发生冲突。

配置从MySQL

从MySQL1
vim /etc/my.cnf
[mysqld]
server_id = 3
relay-log = relay-log-bin
relay-log-index = slave-relay-bin.index
log-slave-updates = true从MySQL2
[mysqld]
server_id = 4
relay-log = relay-log-bin
relay-log-index = slave-relay-bin.index
log-slave-updates = truesystemctl restart mysqld

设置两个主MySQL的主主模式

两台服务器都需要做

mysql -uroot -p123首先确定二进制日志是否开启
show variables like 'log_bin';
+---------------+-------+
| Variable_name | Value |
+---------------+-------+
| log_bin       | ON    |
+---------------+-------+
1 row in set (0.00 sec)添加授权访问用户
GRANT REPLICATION SLAVE ON *.* TO 'maomao'@'192.168.188.%' IDENTIFIED BY '123';刷新授权
FLUSH PRIVILEGES;获取日志名及偏移量
show master status;
+-------------------+----------+--------------+------------------+-------------------+
| File              | Position | Binlog_Do_DB | Binlog_Ignore_DB | Executed_Gtid_Set |
+-------------------+----------+--------------+------------------+-------------------+
| master-bin.000001 |      613 |              |                  |                   |
+-------------------+----------+--------------+------------------+-------------------+主MySQL
change master to master_host='192.168.188.72',master_user='maomao',master_password='123',master_log_file='master-bin.000001',master_log_pos=613;start slave;主备选MySQL
change master to master_host='192.168.188.71',master_user='maomao',master_password='123',master_log_file='master-bin.000001',master_log_pos=613;start slave;验证主从状态
show slave status\G;


主备选

查看同步状态Slave_IO和Slave_SQL为YES,说明猪猪同步成功

测试主主同步

分别在两台主服务器上创建不同的库 分别查看
create database zhu;create database niu;mysql [(none)]>show databases;
+--------------------+
| Database           |
+--------------------+
| information_schema |
| mysql              |
| niu                |
| performance_schema |
| sys                |
| zhu                |
+--------------------+
6 rows in set (0.00 sec)

设置主从MySQL模式

首先在主服务器上查看日志和节点
show master status;
得到master-bin.000001 和 Position是935在从服务器上配置同步(两台从机一样操作)
change master to master_host='192.168.188.71',master_user='maomao',master_password='123',master_log_file='master-bin.000001',master_log_pos=935;start slave;查看主从状态
show slave status\G;

查看同步状态Slave_IO和Slave_SQL为YES,说明主从同步成功

测试主从同步

进入主服务器
show slave hosts;

主MySQL

主备选MySQL

新建一个测试库school
CREATE DATABASE IF NOT EXISTS `school`;
-- 创建一个school数据库
USE `school`;-- 创建学生表
DROP TABLE IF EXISTS `student`;
CREATE TABLE `student`(`studentno` INT(4) NOT NULL COMMENT '学号',`loginpwd` VARCHAR(20) DEFAULT NULL,`studentname` VARCHAR(20) DEFAULT NULL COMMENT '学生姓名',`gender` varchar(2) NOT NULL DEFAULT '女' COMMENT '性别',`gradeid` INT(11) DEFAULT NULL COMMENT '年级编号',`phone` VARCHAR(50) NOT NULL COMMENT '联系电话,允许为空',`address` VARCHAR(255) NOT NULL COMMENT '地址,允许为空',`borndate` DATETIME DEFAULT NULL COMMENT '出生时间',`email` VARCHAR (50) NOT NULL COMMENT '邮箱账号允许为空',`identitycard` VARCHAR(18) DEFAULT NULL COMMENT '身份证号',PRIMARY KEY (`studentno`),UNIQUE KEY `identitycard`(`identitycard`),KEY `email` (`email`)
)ENGINE=MYISAM DEFAULT CHARSET=utf8;INSERT INTO `student` (`studentno`,`loginpwd`,`studentname`,`gender`,`gradeid`,`phone`,`address`,`borndate`,`email`,`identitycard`)
VALUES
(1000,'123456','唐嘉','女',2,'13800001234','北京朝阳','1980-5-2','text123@qq.com','123456198001011298'),
(1001,'123456','刘美玲','女',1,'13800002222','广东深圳','1991-6-4','text111@qq.com','123456199001011191'),
(1002,'123456','潘辰','男',1,'13800002111','四川成都','1992-7-6','text222@qq.com','123456199001011333'),
(1003,'123456','小田','男',2,'13800002333','四川成都','1993-8-8','text333@qq.com','123456199001011555'),
(1004,'123456','胡杨','男',3,'13800002555','浙江杭州','1994-9-10','text444@qq.com','123456199001011777'),
(1005,'123456','猫猫','女',2,'13800002666','日本东京','1995-1-12','text555@qq.com','123456199001011888'),
(1006,'123456','飞飞','男',2,'13800002666','上海浦东','1997-7-12','text666@qq.com','123456199001011666');
在从机上查询
mysql [(none)]>select studentname from school.student;
+-------------+
| studentname |
+-------------+
| 唐嘉        |
| 刘美玲      |
| 潘辰        |
| 小田        |
| 胡杨        |
| 猫猫        |
| 飞飞        |
+-------------+
7 rows in set (0.00 sec)

设置读写分离

详情可以查看 Atlas读写分离
这时候需用用到192.168.188.75这台服务器

首先在四台MySQL上授权访问用户

添加授权访问用户
grant all on *.* to maomao@'192.168.188.%' identified by '123';刷新授权
FLUSH PRIVILEGES;
下载Atlas
wget https://github.com/Qihoo360/Atlas/releases/download/2.2.1/Atlas-2.2.1.el6.x86_64.rpm安装
rpm -ivh Atlas-2.2.1.el6.x86_64.rpm安装完成后会自动在/usr/local/mysql-proxy下生成四个文件加密密码
cd /usr/local/mysql-proxy/bin
[root@maomao bin]# ./encrypt 123
3yb5jEku5h4=配置atlas主配置文件
vim /usr/local/mysql-proxy/conf/test.cnf[mysql-proxy]#带#号的为非必需的配置项目
admin-username = atlas#管理接口的密码
admin-password = 123#Atlas后端连接的MySQL主库的IP和端口,可设置多项,用逗号分隔
proxy-backend-addresses = 192.168.188.71:3306,192.168.188.72:3306#Atlas后端连接的MySQL从库的IP和端口,@后面的数字代表权重,用来作负载均衡,若省略则默认为1,可设置多项,用逗号分隔
#proxy-read-only-backend-addresses = 127.0.0.1:3305@1
proxy-read-only-backend-addresses = 192.168.188.73:3306@1,192.168.188.74:3306@1pwds = maomao:3yb5jEku5h4=      # 此账号就是之前授权的账号#设置Atlas的运行方式,设为true时为守护进程方式,设为false时为前台方式,一般开发调试时设为false,线上运行时设为true,true后面不能有空格。
daemon = true#设置Atlas的运行方式,设为true时Atlas会启动两个进程,一个为monitor,一个为worker,monitor在worker意外退出后会自动将其重启,设为false时只有worker,没有monitor,一般开发调试时设为false,线上运行时设为true,true后面不能有空格。
keepalive = true#工作线程数,对Atlas的性能有很大影响,可根据情况适当设置
event-threads = 4#日志级别,分为message、warning、critical、error、debug五个级别
log-level = message#日志存放的路径
log-path = /usr/local/mysql-proxy/log#Atlas监听的工作接口IP和端口
proxy-address = 0.0.0.0:1234#Atlas监听的管理接口IP和端口
admin-address = 0.0.0.0:2345

配置无误后,启动Atlas软件

[root@maomao conf]# /usr/local/mysql-proxy/bin/mysql-proxyd test start
OK: MySQL-Proxy of test is started

测试读写分离

在Atlas 代理服务器上

yum -y install mysqlmysql -h127.0.0.1 -P2345 -umaomao -p123  # 这里用户和密码就是配置文件里面写的select * from help;      # 可以查看帮助select * from backends;     # 查看目前的主从复制

通过代理访问Mysql
mysql -h192.168.188.75 -P1234  -umaomao -p123   # 这里用户名和密码就是之前授权的账号进入数据库后可以查询到主MySQL的所有库和表
MySQL [(none)]> show databases;
+--------------------+
| Database           |
+--------------------+
| information_schema |
| ceshi              |
| mysql              |
| performance_schema |
| school             |
| sys                |
+--------------------+
6 rows in set (0.00 sec)还可以查看日志
tafil /usr/local/mysql-proxy/log/test.log
看到写操作都在Master,读操作都连接到Slave了

配置MySQL高可用群集MMM

安装mysql-mmm

需要使用epel源 注意所有的服务器节点都需要下载
wget -O /etc/yum.repos.d/epel.repo http://mirrors.aliyun.com/repo/epel-7.repo 在五台服务器上下载
yum install -y  mysql-mmm*

授权monitor访问

在四台MySQL服务器上授权monitor访问

grant replication client on *.* to 'mmm_monitor'@'192.168.188.%' identified by'monitor';grant super,replication client,process on *.* to 'mmm_agent'@'192.168.188.%' identified by'agent';FLUSH PRIVILEGES;

修改配置

在所有服务器上修改/etc/mysql-mmm/mmm_common.conf配置文件

vim /etc/mysql-mmm/mmm_common.confactive_master_role      writer<host default>cluster_interface       eth0     # 更改为自身主机网卡pid_path                /run/mysql-mmm-agent.pidbin_path                /usr/libexec/mysql-mmm/replication_user        maomao        # 用于主从,主主复制的用户(之前授权的账号)replication_password    123agent_user              mmm_agent  # 运行在每个mysql 的代理用户agent_password          agent     # 之前授权时候填的密码
</host><host db1>   # 主MYSQL服务器ip      192.168.188.71mode    master     # 主服务器peer    db2       # 邻居为db2
</host><host db2>   # # 主备选MYSQL服务器ip      192.168.188.72mode    master     # 主服务器peer    db1       # 邻居为db1
</host><host db3>ip      192.168.188.73mode    slave        # 从服务器
</host><host db4>ip      192.168.188.74mode    slave
</host><role writer>        # 可写的服务器hosts   db1, db2    # 第一台,第二台服务器ips     192.168.188.200      # 规划指定的虚拟地址mode    exclusive    # 独占模式
</role><role reader>        # 只读的服务器hosts   db3, db4    # 第三台,第四台服务器ips     192.168.188.201,192.168.188.202      # 分别指定的虚拟地址mode    balanced # 平衡模式
</role>最后将配置文件传给另外四台服务器
scp /etc/mysql-mmm/mmm_common.conf root@192.168.188.72:/root

在四台MySQL服务器上修改/etc/mysql-mmm/mmm_agent.conf配置文件,修改为对应db

include mmm_common.conf# The 'this' variable refers to this server.  Proper operation requires
# that 'this' server (db1 by default), as well as all other servers, have the
# proper IP addresses set in mmm_common.conf.this db1       # 这里地方换成common.conf里面对应的db位置    如分别修改为db1,db2,db3,db4

在代理服务器上修改/etc/mysql-mmm/mmm_mon.conf 文件

<monitor>ip                    127.0.0.1pid_path           /run/mysql-mmm-monitor.pidbin_path            /usr/libexec/mysql-mmmstatus_path         /var/lib/mysql-mmm/mmm_mond.statusping_ips            192.168.188.71,192.168.188.72,192.168.188.73,192.168.188.74       # 主1主2从1从2的真实IP地址auto_set_online     60# 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     # mysql数据库授权用mmm_monito和密码monitor_password    monitor
</host>debug 0

开启代理和监控服务

主:systemctl start mysql-mmm-agent
备选主:systemctl start mysql-mmm-agent
从1:systemctl start mysql-mmm-agent
从2:systemctl start mysql-mmm-agent
监控:systemctl start mysql-mmm-monitor

在代理服务器上查看集群:

[root@maomao ~]# mmm_control showdb1(192.168.188.71) master/ONLINE. Roles: writer(192.168.188.200)db2(192.168.188.72) master/ONLINE. Roles: db3(192.168.188.73) slave/ONLINE. Roles: reader(192.168.188.202)db4(192.168.188.74) slave/ONLINE. Roles: reader(192.168.188.201)

测试集群

用虚拟IP连接数据库

在代理服务器上
[root@maomao ~]# mysql -h192.168.188.200 -umaomao -p123
mysql [(none)]>select @@server_id;
+-------------+
| @@server_id |
+-------------+
|           1 |
+-------------+
1 row in set (0.00 sec)

停止主mysql

systemctl stop mysqld在监控服务器
[root@maomao ~]# mmm_control showdb1(192.168.188.71) master/HARD_OFFLINE. Roles: db2(192.168.188.72) master/ONLINE. Roles: writer(192.168.188.200)db3(192.168.188.73) slave/ONLINE. Roles: reader(192.168.188.202)db4(192.168.188.74) slave/ONLINE. Roles: reader(192.168.188.201)

mysql [(none)]> select @@server_id;
+-------------+
| @@server_id |
+-------------+
|           2 |
+-------------+
1 row in set (0.00 sec)主服务器换成主备选MySQL的id 2 了

数据库应用——MySQL+ATLAS+MMM高可用集群相关推荐

  1. Mysql数据库(十一)——MHA高可用集群部署及故障切换

    Mysql数据库(十一)--MHA高可用集群部署及故障切换 一.MHA概述 二.MHA的组成 三.MHA的特点 四.案例环境 1.服务器配置 2.思路 3.关闭防火墙和安全机制,并进行主从配置 4.配 ...

  2. 干货 | 数据不丢失?有它就够了——金仓KingbaseES高可用集群部署

    可用性是数据库的重要指标之一,高可用集群是保障数据不丢失.服务可用的主要措施之一.下面将从部署维度阐晰金仓数据库KingbaseES如何打造高可用集群. 高可用架构基础 实践中,通常让多个数据库服务器 ...

  3. 运维企业专题(11)RHCS高可用集群下MySql数据库与共享磁盘(单点写入、多点写入)的设置

    实验环境 主机名 IP 服务 server1 172.25.6.1 ricci,luci, iscsi,mysql-server server2 172.25.6.2 ricci,iscsi,mysq ...

  4. mysql高可用方案_MySQL高可用集群方案

    一.Mysql高可用解决方案 方案一:共享存储 一般共享存储采用比较多的是 SAN/NAS 方案. 方案二:操作系统实时数据块复制 这个方案的典型场景是 DRBD,DRBD架构(MySQL+DRBD+ ...

  5. mycat mysql好可用架构_想要学会MyCat高可用集群搭建,但是这些知识点却还玩不明白?...

    一.集群架构 1.MyCat实现读写分离架构 在我前面的文章, 我已经讲解过了通过MyCat来实现MySQL的读写分离, 从而完成MySQL集群的负载均衡 , 如下面的结构图: 但是以上架构存在问题 ...

  6. 零基础带你一步步搭建Nacos高可用集群(史上最详细,赛过教科书!)为此我准备了三台云服务器+云数据库

    容我先说一句:节日快乐!永远九岁的我们当然不能错过,奥里给!{容我先说一句:节日快乐!永远九岁的我们当然不能错过,奥里给!}容我先说一句:节日快乐!永远九岁的我们当然不能错过,奥里给! 如果你不懂jd ...

  7. nfs mysql_heatbeat-gui实现基于nfs的mysql高可用集群

    一.简述HA高可用集群 高可用集群就是当集群中的一个节点发生各种软硬件及人为故障时,集群中的其他节点能够自动接管故障节点的资源并向外提供服务.以实现减少业务中断时间,为用户提供更可靠,更高效的服务. ...

  8. mysql架构 视频_企业常见MySQL架构应用实战(高可用集群系统+调优经验)视频课程...

    第一章 MySQL企业常用架构应用实战(主从复制+性能调优) 1.企业级MySQL发行版Percona Server.MariaDB选型 2.常用MYSQL性能调优策略之系统级别调优(1) 3.常用M ...

  9. heartbeat+DRBD+mysql高可用集群实战

      heartbeat+DRBD+mysql高可用集群实战 四台主机 主机名                 IP地址             用途 dbm128                    ...

  10. 企业中MySQL高可用集群架构三部曲之MM+keepalived

    各位老铁们,老张与大家又见面了.看到各位在博客里面给我的留言和访问量的情况,我很是欣慰,也谢谢大家对我的认可.我写这些博客,就是想把自己对于MySQL数据库的一些看法和自己平时的实战经验分享出来,我们 ...

最新文章

  1. Windows中报错:Fatal error in launcher: Unable to create process using ‘“‘ 的解决方案
  2. 日常办公会用到的python模块-Python如何去实际提高工作的效率?也许这个会有用!...
  3. 2019年第十届蓝桥杯 - 省赛 - C/C++大学B组 - H. 等差数列
  4. bundle传递对象与Serializable、Parcelable接口理解和思考
  5. Apache——Introduction
  6. 前端学习(1494):表格案例--axios-搜索功能
  7. php图片上传不现实路径指向错误,上传图片提示这个错误怎么办?
  8. asp.net mvc 应用Bundle(捆绑和微小)压缩技术 启用 BundleConfig 配置web.config
  9. pycharm-python文件注释头
  10. MTK 驱动开发(15)---I2C
  11. python return的理解_python 浅析对return的理解
  12. 怎么快速搭建属于自己的博客
  13. 服务器link系统命令,可以使用命令(7)来查看网络接口的运行情况。输入该命令后,系统的输出信息如下。...
  14. java json传值到前台_json前后台传值
  15. 48. 减少 DNS 查找(9)
  16. Android基础控件EditText
  17. 241.为运算表达式设计优先级(力扣leetcode) 博主可答疑该问题
  18. php汉字转拼音 字库型
  19. 如何测试工业以太网线缆(利用FLUKE DSX-8000)?
  20. java导出图片到excel_POI:将图片导出到Excel

热门文章

  1. matlab保存pgm图形,matlab读写pgm文件
  2. 无线局域服务器架设方法,技巧:如何实现局域网架设BT服务器
  3. walking机器人入门教程-工具-命令管理器
  4. pyinstaller打包有pandas和numpy库过程中遇到的bug及处理
  5. 如何下载哔哩哔哩的视频
  6. 天才作文-不知道有没有人发过 很有才
  7. 一种高效查找树-radix的实现
  8. 【Seedlabs】Local DNS Attack Lab
  9. 分类问题中正负样本分布不均衡问题的解决方法
  10. android地图方位角,根据两点经纬度,计算距离、方位角