3M 高可用架构

一、MMM

1. MMM的概述

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

2. MMM的应用场景

MMM提供了自动和手动两种方式移除一组服务器中复制延迟较高的服务器的虚拟ip,同时它还可以备份数据,实现两节点之间的数据同步等。由于MMM无法完全保证数据的一致性,所以MMM适用于对数据的一致性要求不是很高的,但是又想最大程度地保证业务可用性的场景。对于那些对数据的一致性要求很高的业务,非常不建议采用MMM这种高可用架构。

3. MMM的特点

● MMM是一套灵活的脚本程序
● 基于perl语言实现
● 用来对mysql replication进行监控和故障迁移
● 管理MySQL Master-Master复制的配置

4. 关于MMM高可用架构的说明


● mmm_mon:监控进程,负责所有的监控工作,决定和处理所有节点角色活动。此脚本需要在监管机上运行。
● mmm_agent:运行在每个MySQL服务器上的代理进程,完成监控的探针工作和执行简单的远端服务设置。此脚本需要在被监管机上运行。
● mmm_control:一个简单的脚本,提供管理mmm_mond进程的命令。
● mysql-mmm的监管端会提供多个虚拟IP(VIP),包括一个可写VIP,多个可读VIP,通过监管的管理,这些IP会绑定在可用MySQL之上,当某一台MySQL宕机时,监管会将VIP迁移至其他MySQL。

5. 用户及授权

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

二、案例环境

1. 服务器配置

服务器 主机名 操作系统 IP地址 主要软件
Master1服务器 master1 CentOS 7.4 192.168.122.10 MySQL 5.7、MySQL-MMM
Master2服务器 master2 CentOS 7.4 192.168.122.11 MySQL 5.7、MySQL-MMM
Slave1服务器 slave1 CentOS 7.4 192.168.122.100 MySQL 5.7、MySQL-MMM
Slave2服务器 slave2 CentOS 7.4 192.168.122.101 MySQL 5.7、MySQL-MMM
Monitor服务器 monitor CentOS 7.4 192.168.122.12 MySQL-MMM

2. 服务器环境


  systemctl stop firewalld
  systemctl disable firewalld
  setenforce 0

3. 修改主机名称

Master1服务器(192.168.122.10)

[root@localhost ~]# hostnamectl set-hostname master1

Master2服务器(192.168.122.11)

[root@localhost ~]# hostnamectl set-hostname master2

Slave1服务器(192.168.122.100)

[root@localhost ~]# hostnamectl set-hostname slave1

Slave2服务器(192.168.122.101)

[root@localhost ~]# hostnamectl set-hostname slave2

Monitor服务器(192.168.122.12)

[root@localhost ~]# hostnamectl set-hostname monitor

三、案例实施

1. 搭建MySQL多主多从架构

1.1 master1、master2、slave1、slave2节点上安装mysql5.7

刷下列脚本,过程忽略


  #!/bin/bash
  systemctl stop firewalld
  systemctl disable firewalld
  setenforce 0
   
  #--------mysql--------
   
  #安装依赖包
   
  yum -y install gcc gcc-c++ ncurses ncurses-devel bison cmake
   
  #配置软件模块
   
  cd /opt/
  tar zxvf mysql-5.7.17.tar.gz
  tar zxvf boost_1_59_0.tar.gz
  mv boost_1_59_0 /usr/local/boost
   
  cd /opt/mysql-5.7.17/
  cmake \
  -DCMAKE_INSTALL_PREFIX=/usr/local/mysql \
  -DMYSQL_UNIX_ADDR=/usr/local/mysql/mysql.sock \
  -DSYSCONFDIR=/etc \
  -DSYSTEMD_PID_DIR=/usr/local/mysql \
  -DDEFAULT_CHARSET=utf8 \
  -DDEFAULT_COLLATION=utf8_general_ci \
  -DWITH_EXTRA_CHARSETS=all \
  -DWITH_INNOBASE_STORAGE_ENGINE=1 \
  -DWITH_ARCHIVE_STORAGE_ENGINE=1 \
  -DWITH_BLACKHOLE_STORAGE_ENGINE=1 \
  -DWITH_PERFSCHEMA_STORAGE_ENGINE=1 \
  -DMYSQL_DATADIR=/usr/local/mysql/data \
  -DWITH_BOOST=/usr/local/boost \
  -DWITH_SYSTEMD=1
   
   
  #编译安装
   
  make -j 2 && make install
   
  #创建mysql用户
   
  useradd -M -s /sbin/nologin mysql
   
  #修改mysql 配置文件
   
  echo '[client]
  port = 3306
  default-character-set=utf8
  socket=/usr/local/mysql/mysql.sock
   
  [mysql]
  port = 3306
  default-character-set=utf8
  socket = /usr/local/mysql/mysql.sock
  auto-rehash
   
  [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
  bind-address = 0.0.0.0
  skip-name-resolve
  max_connections=2048
  default-storage-engine=INNODB
  max_allowed_packet=16M
  server-id = 1
   
  sql_mode=NO_ENGINE_SUBSTITUTION,STRICT_TRANS_TABLES,NO_AUTO_CREATE_USER,NO_AUTO_VALUE_ON_ZERO,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,PIPES_AS_CONCAT,ANSI_QUOTES' > /etc/my.cnf
   
   
  #更改mysql安装目录和配置文件的属主属组
   
  chown -R mysql:mysql /usr/local/mysql/
  chown mysql:mysql /etc/my.cnf
   
  #设置路径环境变量
   
  echo 'export PATH=/usr/local/mysql/bin:/usr/local/mysql/lib:$PATH' >> /etc/profile
  source /etc/profile
   
  #初始化数据库
   
  cd /usr/local/mysql/bin/
  ./mysqld \
  --initialize-insecure \
  --user=mysql \
  --basedir=/usr/local/mysql \
  --datadir=/usr/local/mysql/data
   
  #添加mysqld系统服务
   
  cp /usr/local/mysql/usr/lib/systemd/system/mysqld.service /usr/lib/systemd/system/
  systemctl daemon-reload
  systemctl start mysqld.service
  systemctl enable mysqld
   
  yum -y install expect
  mima () {
  passwd=$1
  /usr/bin/expect <<-EOF
  spawn mysqladmin -u root -p password $passwd
  expect "Enter password:"
  send "\r"
  expect eof
  EOF
  }
  mima "123456"
   
  dl () {
  /usr/bin/expect <<-EOF
  spawn mysql -u root -p
  expect "Enter password:" {send "123456\r"}
  expect "mysql>" {send "grant all privileges on *.* to 'root'@'%' identified by '123456';\r"}
  expect "mysql>" {send "quit\r"}
  expect eof
  EOF
  }
  dl

1.2 修改master1配置文件

Master1服务器(192.168.122.10)


  [root@master1 ~]# vim /etc/my.cnf
   
  ......
  [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
  #自增字段的起始值
   
  [root@master1 ~]# systemctl restart mysqld

1.3 把配置文件复制到其他3台数据库服务器并重启mysql服务器

注意:配置文件中的server-id不可相同,需要修改。


  [root@master1 ~]# scp /etc/my.cnf root@192.168.122.11:/etc/
  [root@master1 ~]# scp /etc/my.cnf root@192.168.122.100:/etc/
  [root@master1 ~]# scp /etc/my.cnf root@192.168.122.101:/etc/

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

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

Master1服务器(192.168.122.10)


  [root@master1 ~]# mysql -u root -p
  Enter password:
   
  mysql> grant replication slave on *.* to 'replication'@'192.168.122.%' identified by '123456';
  Query OK, 0 rows affected, 1 warning (0.00 sec)

Master2服务器(192.168.122.11)


  [root@master2 ~]# mysql -u root -p
  Enter password:
   
  mysql> grant replication slave on *.* to 'replication'@'192.168.122.%' identified by '123456';
  Query OK, 0 rows affected, 1 warning (0.00 sec)
1.4.2 在两台主服务器上查看

Master1服务器(192.168.122.10)


  mysql> show master status;
  +------------------+----------+--------------+--------------------------+-------------------+
  | File | Position | Binlog_Do_DB | Binlog_Ignore_DB | Executed_Gtid_Set |
  +------------------+----------+--------------+--------------------------+-------------------+
  | mysql_bin.000001 | 154 | | mysql,information_schema | |
  +------------------+----------+--------------+--------------------------+-------------------+
  1 row in set (0.00 sec)

Master2服务器(192.168.122.11)


  mysql> show master status;
  +------------------+----------+--------------+--------------------------+-------------------+
  | File | Position | Binlog_Do_DB | Binlog_Ignore_DB | Executed_Gtid_Set |
  +------------------+----------+--------------+--------------------------+-------------------+
  | mysql_bin.000001 | 154 | | mysql,information_schema | |
  +------------------+----------+--------------+--------------------------+-------------------+
  1 row in set (0.00 sec)
1.4.3 在master1上配置同步

Master1服务器(192.168.122.10)


  mysql> change master to
  -> master_host='192.168.122.11',
  -> master_user='replication',
  -> master_password='123456',
  -> master_log_file='mysql_bin.000001',
  -> master_log_pos=154;
  Query OK, 0 rows affected, 2 warnings (0.00 sec)
   
  mysql> start slave;
  Query OK, 0 rows affected (0.00 sec)
   
  mysql> show slave status\G
  *************************** 1. row ***************************
  Slave_IO_State: Waiting for master to send event
  Master_Host: 192.168.122.11
  Master_User: replication
  Master_Port: 3306
  Connect_Retry: 60
  Master_Log_File: mysql_bin.000001
  Read_Master_Log_Pos: 154
  Relay_Log_File: master1-relay-bin.000002
  Relay_Log_Pos: 320
  Relay_Master_Log_File: mysql_bin.000001
  Slave_IO_Running: Yes
  Slave_SQL_Running: Yes
  Replicate_Do_DB:
  Replicate_Ignore_DB:
  Replicate_Do_Table:
  Replicate_Ignore_Table:
  Replicate_Wild_Do_Table:
  Replicate_Wild_Ignore_Table:
  Last_Errno: 0
  Last_Error:
  Skip_Counter: 0
  Exec_Master_Log_Pos: 154
  Relay_Log_Space: 529
  Until_Condition: None
  Until_Log_File:
  Until_Log_Pos: 0
  Master_SSL_Allowed: No
  Master_SSL_CA_File:
  Master_SSL_CA_Path:
  Master_SSL_Cert:
  Master_SSL_Cipher:
  Master_SSL_Key:
  Seconds_Behind_Master: 0
  Master_SSL_Verify_Server_Cert: No
  Last_IO_Errno: 0
  Last_IO_Error:
  Last_SQL_Errno: 0
  Last_SQL_Error:
  Replicate_Ignore_Server_Ids:
  Master_Server_Id: 2
  Master_UUID: 51f017b7-0fe5-11ec-a583-000c299463f1
  Master_Info_File: /usr/local/mysql/data/master.info
  SQL_Delay: 0
  SQL_Remaining_Delay: NULL
  Slave_SQL_Running_State: Slave has read all relay log; waiting for more updates
  Master_Retry_Count: 86400
  Master_Bind:
  Last_IO_Error_Timestamp:
  Last_SQL_Error_Timestamp:
  Master_SSL_Crl:
  Master_SSL_Crlpath:
  Retrieved_Gtid_Set:
  Executed_Gtid_Set:
  Auto_Position: 0
  Replicate_Rewrite_DB:
  Channel_Name:
  Master_TLS_Version:
  1 row in set (0.00 sec)
1.4.4 在master2上配置同步

Master2服务器(192.168.122.11)


  mysql> change master to
  -> master_host='192.168.122.10',
  -> master_user='replication',
  -> master_password='123456',
  -> master_log_file='mysql_bin.000001',
  -> master_log_pos=154;
  Query OK, 0 rows affected, 2 warnings (0.02 sec)
   
  mysql> start slave;
  Query OK, 0 rows affected (0.00 sec)
   
  mysql> show slave status\G
  *************************** 1. row ***************************
  Slave_IO_State: Waiting for master to send event
  Master_Host: 192.168.122.10
  Master_User: replication
  Master_Port: 3306
  Connect_Retry: 60
  Master_Log_File: mysql_bin.000001
  Read_Master_Log_Pos: 154
  Relay_Log_File: master2-relay-bin.000002
  Relay_Log_Pos: 320
  Relay_Master_Log_File: mysql_bin.000001
  Slave_IO_Running: Yes
  Slave_SQL_Running: Yes
  Replicate_Do_DB:
  Replicate_Ignore_DB:
  Replicate_Do_Table:
  Replicate_Ignore_Table:
  Replicate_Wild_Do_Table:
  Replicate_Wild_Ignore_Table:
  Last_Errno: 0
  Last_Error:
  Skip_Counter: 0
  Exec_Master_Log_Pos: 154
  Relay_Log_Space: 529
  Until_Condition: None
  Until_Log_File:
  Until_Log_Pos: 0
  Master_SSL_Allowed: No
  Master_SSL_CA_File:
  Master_SSL_CA_Path:
  Master_SSL_Cert:
  Master_SSL_Cipher:
  Master_SSL_Key:
  Seconds_Behind_Master: 0
  Master_SSL_Verify_Server_Cert: No
  Last_IO_Errno: 0
  Last_IO_Error:
  Last_SQL_Errno: 0
  Last_SQL_Error:
  Replicate_Ignore_Server_Ids:
  Master_Server_Id: 1
  Master_UUID: 7587444a-0fe5-11ec-ac87-000c2959bebe
  Master_Info_File: /usr/local/mysql/data/master.info
  SQL_Delay: 0
  SQL_Remaining_Delay: NULL
  Slave_SQL_Running_State: Slave has read all relay log; waiting for more updates
  Master_Retry_Count: 86400
  Master_Bind:
  Last_IO_Error_Timestamp:
  Last_SQL_Error_Timestamp:
  Master_SSL_Crl:
  Master_SSL_Crlpath:
  Retrieved_Gtid_Set:
  Executed_Gtid_Set:
  Auto_Position: 0
  Replicate_Rewrite_DB:
  Channel_Name:
  Master_TLS_Version:
  1 row in set (0.00 sec)

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

Slave1服务器(192.168.122.100)


  [root@slave1 ~]# mysql -u root -p
  Enter password:
   
  mysql> change master to
  -> master_host='192.168.122.10',
  -> master_user='replication',
  -> master_password='123456',
  -> master_log_file='mysql_bin.000001',
  -> master_log_pos=154;
  Query OK, 0 rows affected, 2 warnings (0.01 sec)
   
  mysql> start slave;
  Query OK, 0 rows affected (0.00 sec)
   
  mysql> show slave status\G
  *************************** 1. row ***************************
  Slave_IO_State: Waiting for master to send event
  Master_Host: 192.168.122.10
  Master_User: replication
  Master_Port: 3306
  Connect_Retry: 60
  Master_Log_File: mysql_bin.000001
  Read_Master_Log_Pos: 154
  Relay_Log_File: slave1-relay-bin.000002
  Relay_Log_Pos: 320
  Relay_Master_Log_File: mysql_bin.000001
  Slave_IO_Running: Yes
  Slave_SQL_Running: Yes
  Replicate_Do_DB:
  Replicate_Ignore_DB:
  Replicate_Do_Table:
  Replicate_Ignore_Table:
  Replicate_Wild_Do_Table:
  Replicate_Wild_Ignore_Table:
  Last_Errno: 0
  Last_Error:
  Skip_Counter: 0
  Exec_Master_Log_Pos: 154
  Relay_Log_Space: 528
  Until_Condition: None
  Until_Log_File:
  Until_Log_Pos: 0
  Master_SSL_Allowed: No
  Master_SSL_CA_File:
  Master_SSL_CA_Path:
  Master_SSL_Cert:
  Master_SSL_Cipher:
  Master_SSL_Key:
  Seconds_Behind_Master: 0
  Master_SSL_Verify_Server_Cert: No
  Last_IO_Errno: 0
  Last_IO_Error:
  Last_SQL_Errno: 0
  Last_SQL_Error:
  Replicate_Ignore_Server_Ids:
  Master_Server_Id: 1
  Master_UUID: 7587444a-0fe5-11ec-ac87-000c2959bebe
  Master_Info_File: /usr/local/mysql/data/master.info
  SQL_Delay: 0
  SQL_Remaining_Delay: NULL
  Slave_SQL_Running_State: Slave has read all relay log; waiting for more updates
  Master_Retry_Count: 86400
  Master_Bind:
  Last_IO_Error_Timestamp:
  Last_SQL_Error_Timestamp:
  Master_SSL_Crl:
  Master_SSL_Crlpath:
  Retrieved_Gtid_Set:
  Executed_Gtid_Set:
  Auto_Position: 0
  Replicate_Rewrite_DB:
  Channel_Name:
  Master_TLS_Version:
  1 row in set (0.00 sec)

Slave2服务器(192.168.122.101)


  [root@slave2 ~]# mysql -u root -p
  Enter password:
   
  mysql> change master to
  -> master_host='192.168.122.10',
  -> master_user='replication',
  -> master_password='123456',
  -> master_log_file='mysql_bin.000001',
  -> master_log_pos=154;
  Query OK, 0 rows affected, 2 warnings (0.01 sec)
   
  mysql> start slave;
  Query OK, 0 rows affected (0.00 sec)
   
  mysql> show slave status\G
  *************************** 1. row ***************************
  Slave_IO_State: Waiting for master to send event
  Master_Host: 192.168.122.10
  Master_User: replication
  Master_Port: 3306
  Connect_Retry: 60
  Master_Log_File: mysql_bin.000001
  Read_Master_Log_Pos: 154
  Relay_Log_File: slave2-relay-bin.000002
  Relay_Log_Pos: 320
  Relay_Master_Log_File: mysql_bin.000001
  Slave_IO_Running: Yes
  Slave_SQL_Running: Yes
  Replicate_Do_DB:
  Replicate_Ignore_DB:
  Replicate_Do_Table:
  Replicate_Ignore_Table:
  Replicate_Wild_Do_Table:
  Replicate_Wild_Ignore_Table:
  Last_Errno: 0
  Last_Error:
  Skip_Counter: 0
  Exec_Master_Log_Pos: 154
  Relay_Log_Space: 528
  Until_Condition: None
  Until_Log_File:
  Until_Log_Pos: 0
  Master_SSL_Allowed: No
  Master_SSL_CA_File:
  Master_SSL_CA_Path:
  Master_SSL_Cert:
  Master_SSL_Cipher:
  Master_SSL_Key:
  Seconds_Behind_Master: 0
  Master_SSL_Verify_Server_Cert: No
  Last_IO_Errno: 0
  Last_IO_Error:
  Last_SQL_Errno: 0
  Last_SQL_Error:
  Replicate_Ignore_Server_Ids:
  Master_Server_Id: 1
  Master_UUID: 7587444a-0fe5-11ec-ac87-000c2959bebe
  Master_Info_File: /usr/local/mysql/data/master.info
  SQL_Delay: 0
  SQL_Remaining_Delay: NULL
  Slave_SQL_Running_State: Slave has read all relay log; waiting for more updates
  Master_Retry_Count: 86400
  Master_Bind:
  Last_IO_Error_Timestamp:
  Last_SQL_Error_Timestamp:
  Master_SSL_Crl:
  Master_SSL_Crlpath:
  Retrieved_Gtid_Set:
  Executed_Gtid_Set:
  Auto_Position: 0
  Replicate_Rewrite_DB:
  Channel_Name:
  Master_TLS_Version:
  1 row in set (0.00 sec)

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

Master1服务器(192.168.122.10)


  mysql> create database test;
  Query OK, 1 row affected (0.00 sec)
   
  mysql> show databases;
  +--------------------+
  | Database |
  +--------------------+
  | information_schema |
  | mysql |
  | performance_schema |
  | sys |
  | test |
  +--------------------+
  5 rows in set (0.00 sec)

Master2服务器(192.168.122.11)


  mysql> show databases;
  +--------------------+
  | Database |
  +--------------------+
  | information_schema |
  | mysql |
  | performance_schema |
  | sys |
  | test |
  +--------------------+
  5 rows in set (0.00 sec)

Slave1服务器(192.168.122.100)


  mysql> show databases;
  +--------------------+
  | Database |
  +--------------------+
  | information_schema |
  | mysql |
  | performance_schema |
  | sys |
  | test |
  +--------------------+
  5 rows in set (0.00 sec)

Slave2服务器(192.168.122.101)


  mysql> show databases;
  +--------------------+
  | Database |
  +--------------------+
  | information_schema |
  | mysql |
  | performance_schema |
  | sys |
  | test |
  +--------------------+
  5 rows in set (0.00 sec)

2. 安装配置MySQL-MMM

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

Master1服务器(192.168.122.10)


  [root@master1 ~]# yum -y install epel-release
  [root@master1 ~]# yum -y install mysql-mmm*

Master2服务器(192.168.122.11)


  [root@master2 ~]# yum -y install epel-release
  [root@master2 ~]# yum -y install mysql-mmm*

Slave1服务器(192.168.122.100)


  [root@slave1 ~]# yum -y install epel-release
  [root@slave1 ~]# yum -y install mysql-mmm*

Slave2服务器(192.168.122.101)


  [root@slave2 ~]# yum -y install epel-release
  [root@slave2 ~]# yum -y install mysql-mmm*

Monitor服务器(192.168.122.12)


  [root@monitor ~]# yum -y install epel-release
  [root@monitor ~]# yum -y install mysql-mmm*

注:若本地仓库中无以上软件,需先为各服务器配置在线源仓库。

2.2 阿里云源仓库配置方法


  wget -O /etc/yum.repos.d/CentOS-Base.repo https://mirrors.aliyun.com/repo/Centos-7.repo
  #将阿里云镜像下载到/etc/yum.repos.d/目录下
  yum clean all && yum makecache
  #清理缓存并且生成新的缓存

2.3 在master1上对MySQL-MMM进行配置

Master1服务器(192.168.122.10)


  [root@master1 ~]# cd /etc/mysql-mmm/
  [root@master1 mysql-mmm]# cp mmm_common.conf mmm_common.conf.bak
  #修改配置文件前,先备份
  [root@master1 mysql-mmm]# vim mmm_common.conf
   
  active_master_role writer
   
  <host default>
  cluster_interface ens33
  pid_path /run/mysql-mmm-agent.pid
  bin_path /usr/libexec/mysql-mmm/
  replication_user replication
  ##指定主主、主从复制用户,要与前面一致
  replication_password 123456
  agent_user mmm_agent
  ##指定monitor代理进程的用户名
  agent_password 123456
  </host>
   
  <host db1>
  ip 192.168.122.10
  mode master
  peer db2
  ##peer设置同级数据库
  </host>
   
  <host db2>
  ip 192.168.122.11
  mode master
  peer db1
  </host>
   
  <host db3>
  ip 192.168.122.100
  mode slave
  </host>
   
  <host db4>
  ip 192.168.122.101
  mode slave
  </host>
   
  <role writer>
  hosts db1, db2
  ips 192.168.122.200
  ##设定写VIP
  mode exclusive
  #只有一个 host 可以进行写操作模式
  </role>
   
  <role reader>
  hosts db3, db4
  ips 192.168.122.201, 192.168.122.202
  ##设定读VIP
  mode balanced
  ##多个 slave 主机可以进行读操作模式
  </role>

2.4 把配置文件复制到其他4台主机

所有主机该配置文件内容都是相同的
Master1服务器(192.168.122.10)


  [root@master1 mysql-mmm]# scp mmm_common.conf root@192.168.122.11:/etc/mysql-mmm/
  [root@master1 mysql-mmm]# scp mmm_common.conf root@192.168.122.100:/etc/mysql-mmm/
  [root@master1 mysql-mmm]# scp mmm_common.conf root@192.168.122.101:/etc/mysql-mmm/
  [root@master1 mysql-mmm]# scp mmm_common.conf root@192.168.122.12:/etc/mysql-mmm/

注:因为scp将直接覆盖原配置文件,所以建议先将配置文件做好备份

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

Master1服务器(192.168.122.10)


  [root@master1 ~]# vim /etc/mysql-mmm/mmm_agent.conf
   
  include mmm_common.conf
  this db1
  ##根据不同的主机分别修改为db1/db2/db3/db4,默认配置为db1,因此master1无需修改

Master2服务器(192.168.122.11)


  [root@master2 ~]# vim /etc/mysql-mmm/mmm_agent.conf
   
  include mmm_common.conf
  this db2

Slave1服务器(192.168.122.100)


  [root@slave ~]# vim /etc/mysql-mmm/mmm_agent.conf
   
  include mmm_common.conf
  this db3

Slave2服务器(192.168.122.101)


  [root@slave2 ~]# vim /etc/mysql-mmm/mmm_agent.conf
   
  include mmm_common.conf
  this db4

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

Monitor服务器(192.168.122.12)


  [root@monitor ~]# vim /etc/mysql-mmm/mmm_mon.conf
   
  include mmm_common.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.122.10,192.168.122.11,192.168.122.100,192.168.122.101
  ##指定所有数据库服务器的IP
  auto_set_online 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
  ##指定mmm_monitor的用户名
  monitor_password 123456
  ##指定mmm_monitor的密码
  </host>
   
  debug 0

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

Master1服务器(192.168.122.10)


  [root@master1 ~]# mysql -u root -p
  Enter password:
   
  mysql> grant super, replication client, process on *.* to 'mmm_agent'@'192.168.80.%' identified by '123456';
  Query OK, 0 rows affected, 1 warning (0.01 sec)

Master2服务器(192.168.122.11)


  [root@master2 ~]# mysql -u root -p
  Enter password:
   
  mysql> grant super, replication client, process on *.* to 'mmm_agent'@'192.168.80.%' identified by '123456';
  Query OK, 0 rows affected, 1 warning (0.00 sec)
   

Slave1服务器(192.168.122.100)


  [root@slave1 ~]# mysql -u root -p
  Enter password:
   
  mysql> grant super, replication client, process on *.* to 'mmm_agent'@'192.168.80.%' identified by '123456';
  Query OK, 0 rows affected, 1 warning (0.00 sec)

Slave2服务器(192.168.122.101)


  [root@slave2 ~]# mysql -u root -p
  Enter password:
   
  mysql> grant super, replication client, process on *.* to 'mmm_agent'@'192.168.80.%' identified by '123456';
  Query OK, 0 rows affected, 1 warning (0.00 sec)

注:

权限 功能
process 显示或杀死属于其他用户的服务线程
super 允许用户终止任何查询;修改全局变量的SET语句;使用CHANGE MASTER,PURGE MASTER LOGS
replication client 查询主服务器、从服务器状态

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

Master1服务器(192.168.122.10)


  mysql> grant replication client on *.* to 'mmm_monitor'@'192.168.80.%' identified by '123456';
  Query OK, 0 rows affected, 1 warning (0.01 sec)
   
  mysql> flush privileges;
  Query OK, 0 rows affected (0.01 sec)

Master2服务器(192.168.122.11)


  mysql> grant replication client on *.* to 'mmm_monitor'@'192.168.80.%' identified by '123456';
  Query OK, 0 rows affected, 1 warning (0.01 sec)
   
  mysql> flush privileges;
  Query OK, 0 rows affected (0.01 sec)

Slave1服务器(192.168.122.100)


  mysql> grant replication client on *.* to 'mmm_monitor'@'192.168.80.%' identified by '123456';
  Query OK, 0 rows affected, 1 warning (0.01 sec)
   
  mysql> flush privileges;
  Query OK, 0 rows affected (0.01 sec)

Slave2服务器(192.168.122.101)

复制
  mysql> grant replication client on *.* to 'mmm_monitor'@'192.168.80.%' identified by '123456';
  Query OK, 0 rows affected, 1 warning (0.01 sec)
   
  mysql> flush privileges;
  Query OK, 0 rows affected (0.01 sec)

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

Master1服务器(192.168.122.10)


  [root@master1 ~]# systemctl start mysql-mmm-agent.service
  [root@master1 ~]# systemctl enable mysql-mmm-agent.service
  Created symlink from /etc/systemd/system/multi-user.target.wants/mysql-mmm-agent.service to /usr/lib/systemd/system/mysql-mmm-agent.service.

Master2服务器(192.168.122.11)


  [root@master2 ~]# systemctl start mysql-mmm-agent.service
  [root@master2 ~]# systemctl enable mysql-mmm-agent.service
  Created symlink from /etc/systemd/system/multi-user.target.wants/mysql-mmm-agent.service to /usr/lib/systemd/system/mysql-mmm-agent.service.

Slave1服务器(192.168.122.100)


  [root@slave1 ~]# systemctl start mysql-mmm-agent.service
  [root@slave1 ~]# systemctl enable mysql-mmm-agent.service
  Created symlink from /etc/systemd/system/multi-user.target.wants/mysql-mmm-agent.service to /usr/lib/systemd/system/mysql-mmm-agent.service.

Slave2服务器(192.168.122.101)


  [root@slave2 ~]# systemctl start mysql-mmm-agent.service
  [root@slave2 ~]# systemctl enable mysql-mmm-agent.service
  Created symlink from /etc/systemd/system/multi-user.target.wants/mysql-mmm-agent.service to /usr/lib/systemd/system/mysql-mmm-agent.service.
   

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

Monitor服务器(192.168.122.12)

复制[root@monitor ~]# systemctl start mysql-mmm-monitor.service

2.10 在monitor服务器上测试群集

2.10.1 查看各节点的情况

Monitor服务器(192.168.122.12)


  [root@monitor ~]# mmm_control show
  db1(192.168.122.10) master/ONLINE. Roles: writer(192.168.122.200)
  db2(192.168.122.11) master/ONLINE. Roles:
  db3(192.168.122.100) slave/ONLINE. Roles: reader(192.168.122.202)
  db4(192.168.122.101) slave/ONLINE. Roles: reader(192.168.122.201)
2.10.2 检测监控功能是否完善

Monitor服务器(192.168.122.12)


  [root@monitor ~]# mmm_control checks all
  db4 ping [last change: 2021/09/08 02:05:52] OK
  db4 mysql [last change: 2021/09/08 02:10:38] OK
  db4 rep_threads [last change: 2021/09/08 02:25:20] OK
  db4 rep_backlog [last change: 2021/09/08 02:10:38] OK: Backlog is null
  db2 ping [last change: 2021/09/08 02:05:52] OK
  db2 mysql [last change: 2021/09/08 02:10:38] OK
  db2 rep_threads [last change: 2021/09/08 02:25:20] OK
  db2 rep_backlog [last change: 2021/09/08 02:10:38] OK: Backlog is null
  db3 ping [last change: 2021/09/08 02:05:52] OK
  db3 mysql [last change: 2021/09/08 02:10:38] OK
  db3 rep_threads [last change: 2021/09/08 02:25:20] OK
  db3 rep_backlog [last change: 2021/09/08 02:10:38] OK: Backlog is null
  db1 ping [last change: 2021/09/08 02:05:52] OK
  db1 mysql [last change: 2021/09/08 02:10:38] OK
  db1 rep_threads [last change: 2021/09/08 02:25:20] OK
  db1 rep_backlog [last change: 2021/09/08 02:10:38] OK: Backlog is null
2.10.3 指定绑定VIP的主机

Monitor服务器(192.168.122.12)


  [root@monitor ~]# mmm_control move_role writer db2
  OK: Role 'writer' has been moved from 'db1' to 'db2'. Now you can wait some time and check new roles info!
  [root@monitor ~]# mmm_control show
  db1(192.168.122.10) master/ONLINE. Roles:
  db2(192.168.122.11) master/ONLINE. Roles: writer(192.168.122.200)
  db3(192.168.122.100) slave/ONLINE. Roles: reader(192.168.122.202)
  db4(192.168.122.101) slave/ONLINE. Roles: reader(192.168.122.201)
   
  [root@monitor ~]# mmm_control move_role writer db1
  OK: Role 'writer' has been moved from 'db2' to 'db1'. Now you can wait some time and check new roles info!
  [root@monitor ~]# mmm_control show
  db1(192.168.122.10) master/ONLINE. Roles: writer(192.168.122.200)
  db2(192.168.122.11) master/ONLINE. Roles:
  db3(192.168.122.100) slave/ONLINE. Roles: reader(192.168.122.202)
  db4(192.168.122.101) slave/ONLINE. Roles: reader(192.168.122.201)

3. 故障测试

3.1 模拟master宕机以及恢复

3.1.1 停止master1的mysql服务

Master1服务器(192.168.122.10)

复制[root@master1 ~]# systemctl stop mysqld
3.1.2 查看VIP漂移情况

Monitor服务器(192.168.122.12)


  [root@monitor ~]# mmm_control show
  db1(192.168.122.10) master/HARD_OFFLINE. Roles:
  db2(192.168.122.11) master/ONLINE. Roles: writer(192.168.122.200)
  db3(192.168.122.100) slave/ONLINE. Roles: reader(192.168.122.202)
  db4(192.168.122.101) slave/ONLINE. Roles: reader(192.168.122.201)

VIP成功漂移至master2,且master1显示HARD_OFFLINE

3.1.3 重启master1的mysql服务

Master1服务器(192.168.122.10)

复制[root@master1 ~]# systemctl start mysqld
3.1.4 查看master1是否恢复

Monitor服务器(192.168.122.12)


  [root@monitor ~]# mmm_control show
  db1(192.168.122.10) master/AWAITING_RECOVERY. Roles:
  db2(192.168.122.11) master/ONLINE. Roles: writer(192.168.122.200)
  db3(192.168.122.100) slave/ONLINE. Roles: reader(192.168.122.202)
  db4(192.168.122.101) slave/ONLINE. Roles: reader(192.168.122.201)

显示等待恢复,等待数秒后重新查看,发现Master1在线,但未能获得VIP


  [root@monitor ~]# mmm_control show
  db1(192.168.122.10) master/ONLINE. Roles:
  db2(192.168.122.11) master/ONLINE. Roles: writer(192.168.122.200)
  db3(192.168.122.100) slave/ONLINE. Roles: reader(192.168.122.202)
  db4(192.168.122.101) slave/ONLINE. Roles: reader(192.168.122.201)

3.2 模拟从服务器宕机以及恢复

3.2.1 停止slave1的mysql服务

Slave1服务器(192.168.122.100)

复制[root@slave1 ~]# systemctl stop mysqld
3.2.2 查看VIP漂移情况

Monitor服务器(192.168.122.12)


  [root@monitor ~]# mmm_control show
  db1(192.168.122.10) master/ONLINE. Roles:
  db2(192.168.122.11) master/ONLINE. Roles: writer(192.168.122.200)
  db3(192.168.122.100) slave/HARD_OFFLINE. Roles:
  db4(192.168.122.101) slave/ONLINE. Roles: reader(192.168.122.201), reader(192.168.122.202)

slave1所对应的的VIP对slave2成功接管

3.2.3 重启slave1的mysql服务

Slave1服务器(192.168.122.100)

复制[root@slave1 ~]# systemctl start mysqld
3.2.4 查看slave1是否恢复

  [root@monitor ~]# mmm_control show
  db1(192.168.122.10) master/ONLINE. Roles:
  db2(192.168.122.11) master/ONLINE. Roles: writer(192.168.122.200)
  db3(192.168.122.100) slave/AWAITING_RECOVERY. Roles:
  db4(192.168.122.101) slave/ONLINE. Roles: reader(192.168.122.201), reader(192.168.122.202)
   
  [root@monitor ~]# mmm_control show
  db1(192.168.122.10) master/ONLINE. Roles:
  db2(192.168.122.11) master/ONLINE. Roles: writer(192.168.122.200)
  db3(192.168.122.100) slave/ONLINE. Roles:
  db4(192.168.122.101) slave/ONLINE. Roles: reader(192.168.122.201), reader(192.168.122.202)
   
  [root@monitor ~]# mmm_control show
  db1(192.168.122.10) master/ONLINE. Roles:
  db2(192.168.122.11) master/ONLINE. Roles: writer(192.168.122.200)
  db3(192.168.122.100) slave/ONLINE. Roles: reader(192.168.122.202)
  db4(192.168.122.101) slave/ONLINE. Roles: reader(192.168.122.201)

在短暂的交接后,slave1重新获取到VIP,继续工作

3.3 客户端测试

3.3.1 在master1服务器上为monitor服务器地址授权登录

Master1服务器(192.168.122.10)


  [root@master1 ~]# mysql -u root -p
  Enter password:
   
  mysql> grant all on *.* to 'test'@'192.168.122.12' identified by '123456';
  Query OK, 0 rows affected, 1 warning (0.00 sec)
   
  mysql> flush privileges;
  Query OK, 0 rows affected (0.00 sec)
3.3.2 在monitor服务器上使用VIP登录

Monitor服务器(192.168.122.12)


  [root@monitor ~]# yum install -y mariadb-server mariadb
  [root@monitor ~]# systemctl start mariadb.service
  [root@monitor ~]# mysql -u test -p -h 192.168.122.200
  Enter password:
  ##登录成功
  MySQL [(none)]>
3.3.3 客户端创建数据,测试同步情况

Monitor服务器(192.168.122.12)


  MySQL [(none)]> create database client_test;
  Query OK, 1 row affected (0.00 sec)
   
  MySQL [(none)]> show databases;
  +--------------------+
  | Database |
  +--------------------+
  | information_schema |
  | client_test |
  | mysql |
  | performance_schema |
  | sys |
  | test |
  +--------------------+
  6 rows in set (0.00 sec)

Master1服务器(192.168.122.10)


  mysql> show databases;
  +--------------------+
  | Database |
  +--------------------+
  | information_schema |
  | client_test |
  | mysql |
  | performance_schema |
  | sys |
  | test |
  +--------------------+
  6 rows in set (0.00 sec)

Master2服务器(192.168.122.11)


  mysql> show databases;
  +--------------------+
  | Database |
  +--------------------+
  | information_schema |
  | client_test |
  | mysql |
  | performance_schema |
  | sys |
  | test |
  +--------------------+
  6 rows in set (0.00 sec)

Slave1服务器(192.168.122.100)


  mysql> show databases;
  +--------------------+
  | Database |
  +--------------------+
  | information_schema |
  | client_test |
  | mysql |
  | performance_schema |
  | sys |
  | test |
  +--------------------+
  6 rows in set (0.00 sec)

Slave2服务器(192.168.122.101)


  mysql> show databases;
  +--------------------+
  | Database |
  +--------------------+
  | information_schema |
  | client_test |
  | mysql |
  | performance_schema |
  | sys |
  | test |
  +--------------------+
  6 rows in set (0.00 sec)
 
 

3M 高可用架构----拓展的更多相关文章

  1. MySQL 高可用架构之MMM

    简介 MMM(Master-Master replication manager for MySQL)是一套支持双主故障切换和双主日常管理的脚本程序.MMM使用Perl语言开发,主要用来监控和管理My ...

  2. 【转】单表60亿记录等大数据场景的MySQL优化和运维之道 | 高可用架构

    此文是根据杨尚刚在[QCON高可用架构群]中,针对MySQL在单表海量记录等场景下,业界广泛关注的MySQL问题的经验分享整理而成,转发请注明出处. 杨尚刚,美图公司数据库高级DBA,负责美图后端数据 ...

  3. MySQL数据库的优化(下)MySQL数据库的高可用架构方案

    MySQL数据库的优化(下)MySQL数据库的高可用架构方案 2011-03-09 08:53 抚琴煮酒 51CTO 字号:T | T 在上一篇MySQL数据库的优化中,我们跟随笔者学习了单机MySQ ...

  4. 数据库高可用架构(MySQL、Oracle、MongoDB、Redis)

    一.MySQL MySQL小型高可用架构 方案:MySQL双主.主从 + Keepalived主从自动切换   服务器资源:两台PC Server 优点:架构简单,节省资源 缺点:无法线性扩展,主从失 ...

  5. 【亲述】Uber容错设计与多机房容灾方案 - 高可用架构系列

    此文是根据赵磊在[QCON高可用架构群]中的分享内容整理而成.转载请事先联系赵磊及相关编辑. 赵磊,Uber高级工程师,08年上海交通大学毕业,曾就职于微软,后加入Facebook主要负责Messen ...

  6. Redis Sentinel高可用架构

    Redis目前高可用的架构非常多,比如keepalived+redis,redis cluster,twemproxy,codis,这些架构各有优劣,今天暂且不说这些架构,今天主要说说redis se ...

  7. [MongoDB] 高可用架构方案

    一.缘由: 众所周知,Mongodb是在高速发展期,一些特性架构难免会发生变化.这里就总结下,我目前所知道的Mongodb 的高可用架构都有哪些.目前Mongodb版本3.2. 二.结构介绍: 1.R ...

  8. 分布式架构高可用架构篇_07_MySQL主从复制的配置(CentOS-6.7+MySQL-5.6)

    参考: 龙果学院http://www.roncoo.com/share.html?hamc=hLPG8QsaaWVOl2Z76wpJHp3JBbZZF%2Bywm5vEfPp9LbLkAjAnB%2B ...

  9. [转]数据库高可用架构(MySQL、Oracle、MongoDB、Redis)

    一.MySQL   MySQL小型高可用架构 方案:MySQL双主.主从 + Keepalived主从自动切换 服务器资源:两台PC Server 优点:架构简单,节省资源 缺点:无法线性扩展,主从失 ...

随机推荐

  1. MongoDB常用命令(2)

    1.创建数据库 use testdb 2.创建集合 db.t_member.insert({name:"zhaomin",age:23}) 3.查询 db.t_member.fin ...

  2. MongoDB性能诊断工具

    1. mongostat * dirty 超过20%时阻塞新请求 * used 超过95%时阻塞新请求 * qrw 排队的请求 * conn 连接数量 mongostat:用于了解MongoDB运行状 ...

  3. ASP.NET+MVC入门踩坑笔记 (一) 创建项目 项目配置运行 以及简单的Api搭建

    哈喽各位 我又回来了! 前段时间研究了下ASP.NET,刚开始也是随便找网上的各种教程来看,但是鉴于本人技术有限,还是走了相当长的一段弯路的.所以我写下了这篇文章.希望各位刚刚入坑的ASP.NET开发 ...

  4. 您应该知道的35个绝对重要的Linux命令

    https://mp.weixin.qq.com/s?__biz=MzU3NTgyODQ1Nw==&mid=2247499293&idx=2&sn=1353b78d6ad01d ...

  5. 深入研究 synchronized 同步锁 作用于 静态方法 和 非静态方法 的 区别

    1.前言 众所周知, synchronized 是同步锁 ,虽然在底层又细分了无锁.偏向锁.轻量级锁.自旋锁 以及重量级锁 机制, 这些底层锁知道一下原理即可 ,[想要 了解 这篇 博文 有 解释 : ...

  6. SSR远程密码修改

    第一:输入passwd 第二:填入旧密码 ,随后会有新密码设置 第三:回车两次就行了.

  7. springboot应用中使用CommandLineRunner

    在springboot应用中,存在这样的使用场景,在springboot ioc容器创建好之后根据业务需求先执行一些操作,springboot提供了两个接口可以实现该功能: CommandLineRu ...

  8. 【vps】Centos 7安装python3.8.5

    [vps]Centos 7安装python3.8.5 前言 由于服务器的搬迁,从香港搬到了大陆,原来的香港服务器即将到期,所以趁着大陆服务器在备案的时候,将新服务器的配置先配置一下.这篇文章就是分享C ...

  9. Solon Web 开发,十一、国际化

    Solon Web 开发 一.开始 二.开发知识准备 三.打包与运行 四.请求上下文 五.数据访问.事务与缓存应用 六.过滤器.处理.拦截器 七.视图模板与Mvc注解 八.校验.及定制与扩展 九.跨域 ...

  10. 【刷题-LeetCode】122 Best Time to Buy and Sell Stock II

    Best Time to Buy and Sell Stock II Say you have an array for which the ith element is the price of a ...