设为首页 收藏本站
查看: 716|回复: 0

[经验分享] Mysql-MMM实现(Mysql双主多从高可用)

[复制链接]

尚未签到

发表于 2018-9-27 10:02:10 | 显示全部楼层 |阅读模式
  一.mysql-mmm实现mysql 高可用架构
  MMM 即Master-Master Replication Manager for MySQL(mysql 主主复制管理器)关于 mysql
  主主复制配置的监控、故障转移和管理的一套可伸缩的脚本套件(在任何时候只有一个
  节点可以被写入),这个套件也能对居于标准的主从配置的任意数量的从服务器进行读
  负载均衡,所以你可以用它来在一组居于复制的服务器启动虚拟 ip,除此之外,它还
  有实现数据备份、节点之间重新同步功能的脚本。
  MySQL 本身没有提供 replication failover 的解决方案,通过 MMM 方案能实现服务器的故障转移,从而实现 mysql 的高可用。MMM 项目来自 Google:http://code.google.com/p/mysql-master-master
  官方网站为:http://mysql-mmm.org
  mysql-mmm     主要功能由下面三个脚本提供
  mmm_mond     负责所有的监控工作的监控守护进程,决定节点的移除等等
  mmm_agentd   运行在 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 用户。
  部署开始,由于机器资源有限,这里的实验,slave 就用一台了。
  二.部署的前期工作
  1.环境描述
  vmvare 虚拟机:4 台

  系统版本:CentOS>  mysql版本:5.5.32
  mysql-mmm版本:
  4台虚拟机信息:
  MMM管理机:192.168.0.149  Monitor      test-A
  master1:192.168.0.150    server-id=1  test-B
  master2:192.168.0.160    server-id=3  test-D
  slave:192.168.0.151      server-id=2  test-C
  虚拟IP:
  10.0.0.13   write
  10.0.0.14   read
  10.0.0.15   read
  10.0.0.16   read
  Mysql-MMM 架构配置简介:
  1.master1, master2 两台安装 mysql,并做主主的配置
  2.slave1 上安装 mysql,并配置作为 master1 的从服务器。
  3.master1/2, slave1,Monitor 这四台都要安装 mysql-mmm,并配置:mmm_common.conf、
  mmm_agent.conf 以及 mmm_mon.conf 文件
  三、配置 mysql-master-1/2(主主同步),mysql-master-1 与 mysql-slave(主从同步)
  注:所有的mysql都是新安装的,所以没有任何数据,环境相同。
  1.1、 改my.cnf然后重启服务
  mysql-master-1:
  [mysqld]
  server-id       = 1
  log-bin=mysql-bin
  log-slave-updates
  auto_increment_offset=1
  auto_increment_increment=2
  mysql-master-2:
  [mysqld]
  server-id       = 3
  log-bin=mysql-bin
  log-bin=mysql-bin
  log-slave-updates
  auto_increment_offset=2
  auto_increment_increment=2
  1.2、 配置master1和master2 做主主同步
  master1 和 master2 都需要创建链接用户

  mysql> grant replication slave on *.* to 'rep'@'192.168.0.%'>  'test123';
  Query OK, 0 rows affected (0.02 sec)
  master1操作:
  mysql> show master status;
  +------------------+----------+--------------+---------------------------------------------+
  | File             | Position | Binlog_Do_DB | Binlog_Ignore_DB                            |
  +------------------+----------+--------------+---------------------------------------------+
  | mysql-bin.000006 |      107 |              | mysql,performance_schema,information_schema |
  +------------------+----------+--------------+---------------------------------------------+
  1 row in set (0.00 sec)
  master2操作:
  mysql>  change master to
  >  master_host='192.168.0.150',
  >  master_port=3306,
  >  master_user='rep',
  >  master_password='test123',
  >  master_log_file='mysql-bin.000006',
  >  master_log_pos=107;
  mysql> start slave;
  mysql> show slave status\G;
  *************************** 1. row ***************************
  Slave_IO_State: Waiting for master to send event
  Master_Host: 192.168.0.150
  Master_User: rep
  Master_Port: 3306
  Connect_Retry: 60
  Master_Log_File: mysql-bin.000006
  Read_Master_Log_Pos: 107

  >
  >
  >  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: 107

  >  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
  1 row in set (0.00 sec)
  ERROR:
  No query specified

  mysql> grant replication slave on *.* to 'rep'@'192.168.0.%'>  mysql> show master status;                                  +------------------+----------+--------------+------------------+
  | File             | Position | Binlog_Do_DB | Binlog_Ignore_DB |
  +------------------+----------+--------------+------------------+
  | mysql-bin.000003 |      107 |              |                  |
  +------------------+----------+--------------+------------------+
  1 row in set (0.00 sec)
  master1操作:
  mysql>  change master to
  >  master_host='192.168.0.160',
  >  master_port=3306,
  >  master_user='rep',
  >  master_password='test123',
  >  master_log_file='mysql-bin.000003',
  >  master_log_pos=107;
  mysql> start slave;
  mysql> show slave status\G;
  2.1、 slave修改my.cnf并重启服务
  vi /data/3307/my.cnf
  [mysqld]
  server-id = 2
  [root@test-C ~]# mysqladmin -uroot -p456 shutdown -S /data/3307/mysql.sock
  [root@test-C ~]# /application/mysql/bin/mysqld_safe --defaults-file=/data/3307/my.cnf &
  注:从上我用的是多实例
  2.2、  配置同步参数
  查看 master1 主库的记录点信息
  flush tables with read lock;     #锁表
  mysql> show master status;
  +------------------+----------+--------------+---------------------------------------------+
  | File             | Position | Binlog_Do_DB | Binlog_Ignore_DB                            |
  +------------------+----------+--------------+---------------------------------------------+
  | mysql-bin.000006 |      107 |              | mysql,performance_schema,information_schema |
  +------------------+----------+--------------+---------------------------------------------+
  1 row in set (0.00 sec)
  mysqldump -uroot --event -A -B >/tmp/master1.sql   # 备份主库
  unlock tables;   #解锁
  slave 从库进行操作:
  mysql -uroot  CHANGE MASTER TO
  -> MASTER_HOST='192.168.0.150',
  -> MASTER_PORT=3306,
  -> MASTER_USER='rep',
  -> MASTER_PASSWORD='test123',
  -> MASTER_LOG_FILE='mysql-bin.000006',
  -> MASTER_LOG_POS=107;
  Query OK, 0 rows affected (0.04 sec)
  mysql> start slave;
  Query OK, 0 rows affected (0.02 sec)
  mysql> show slave status\G;
  四、配置mysql-mmm
  4.1、 安装mysql-mmm
  注:需要在这四台 server 上都安装 mysql-mmm
  CentOS 软件仓库默认是不含这些软件的,必须要有epel这个包的支持。所以我们必须先安装epel。
  四台同时操作:
  cd tools
  wget http://dl.fedoraproject.org/pub/epel/6/i386/epel-release-6-8.noarch.rpm
  rpm -Uvh epel-release-6-8.noarch.rpm
  yum install -y mysql-mmm*
  4.2、 配置mmm代理和监控账号的权限
  现在环境已经配置好,我没有配置忽略 mysql库和 user表,所以只要在任意一台主库上执
  行下面的操作,其他的库就都有这俩账号了。

  mysql> GRANT REPLICATION CLIENT ON *.* TO 'mmm_monitor'@'192.168.0.%'>
  mysql> GRANT SUPER, REPLICATION CLIENT, PROCESS ON *.* TO 'mmm_agent'@'192.168.0.%'>  Query OK, 0 rows affected (0.00 sec)
  mysql> flush privileges;
  Query OK, 0 rows affected (0.06 sec)
  注:master1、master2、slave 是一样的
  mysql> select user,host from mysql.user;
  +-------------+-------------+
  | user        | host        |
  +-------------+-------------+
  | root        | 127.0.0.1   |
  | mmm_agent   | 192.168.0.% |
  | mmm_monitor | 192.168.0.% |
  | rep         | 192.168.0.% |
  | root        | ::1         |
  |             | localhost   |
  | root        | localhost   |
  |             | test-B      |
  | root        | test-B      |
  +-------------+-------------+
  8 rows in set (0.00 sec)
  4.3、 所有服务器均需配置/etc/mysql-mmm/mmm_common.conf
  vi /etc/mysql-mmm/mmm_common.conf
  active_master_role      writer
  
  cluster_interface       eth0
  pid_path                /var/run/mysql-mmm/mmm_agentd.pi
  d
  bin_path                /usr/libexec/mysql-mmm/
  replication_user        rep
  replication_password    test123
  agent_user              mmm_agent
  agent_password          test123
  
  
  ip      192.168.0.150
  mode    master
  peer    db2
  
  
  ip      192.168.0.160
  mode    master
  peer    db1
  
  
  ip      192.168.0.151
  mode    slave
  
  
  hosts   db1, db2
  ips     10.0.0.13
  mode    exclusive
  
  
  hosts   db1, db2, db3
  ips     10.0.0.14, 10.0.0.15, 10.0.0.16
  mode    balanced
  
  4.4、数据库主机配置/etc/mysql-mmm/mmm_agent.conf
  hostname      ip  my.cnf -serverid  dbname
  master1  192.168.0.150      1         db1
  master2  192.168.0.160      3         db2
  slave1   192.168.0.151      2         db3
  根据上表对三台 mysql服务器的/etc/mysql-mmm/mmm_agent.conf 配置文件进行修改
  例:
  [root@mysql-mmm-master1 tools]# vi /etc/mysql-mmm/mmm_agent.conf
  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
  4.5、 monitor主机配置/etc/mysql-mmm/mmm_mon.conf
  include mmm_common.conf
  
  ip                  127.0.0.1
  pid_path            /var/run/mysql-mmm/mmm_mond.pid
  bin_path            /usr/libexec/mysql-mmm
  status_path         /var/lib/mysql-mmm/mmm_mond.status
  ping_ips            192.168.0.150, 192.168.0.151, 192.16
  8.0.160
  auto_set_online     30
  # The kill_host_bin does not exist by default, though th
  e monitor will
  # throw a warning about it missing.  See the section 5.1
  0 "Kill Host
  # Functionality" in the PDF documentation.
  #
  # kill_host_bin     /usr/libexec/mysql-mmm/monitor/kill_
  host
  #
  
  
  monitor_user        mmm_monitor
  monitor_password    test123
  
  debug 0
  4.6、 启动mysql-mmm
  master-1,master-2,slave 启动代理:
  编辑/etc/default/mysql-mmm-agent 来开启
  [root@mysql-mmm-master2 tools]# vi /etc/default/mysql-mmm-agent
  # mysql-mmm-agent defaults
  ENABLED=1
  所有数据库主机启动 mmm-agent:
  /etc/init.d/mysql-mmm-agent start
  monitor 主机启动 mmm-monitor
  /etc/init.d/mysql-mmm-monitor start
  4.7、 mmm_control命令监控mysql 服务器状态
  [root@mysql-mmm-monitor ~]# mmm_control show
  db1(192.168.0.150) master/ONLINE. Roles: reader(10.0.0.15), writer(10.0.0.13)
  db2(192.168.0.160) master/ONLINE. Roles: reader(10.0.0.14)
  db3(192.168.0.151) slave/ONLINE. Roles: reader(10.0.0.16)
  4.8、 测试两个mysql服务器能否实现故障自动切换
  将db1的mysql服务停止
  [root@test-B ~]# /etc/init.d/mysqld stop
  Shutting down MySQL. SUCCESS!
  等待30秒在 mysql-mmm-monitor 服务器上进行监控查看
  [root@test-A ~]# mmm_control show
  db1(192.168.0.150) master/HARD_OFFLINE. Roles:
  db2(192.168.0.160) master/ONLINE. Roles: reader(10.0.0.14), writer(10.0.0.13)
  db3(192.168.0.151) slave/ONLINE. Roles: reader(10.0.0.15), reader(10.0.0.16)
  slave检查master_host 是否切换到了另一个主库地址:
  [root@test-C ~]# mysql -uroot -p -e "show slave status\G" -S /data/3307/mysql.sock
  Enter password:
  *************************** 1. row ***************************
  Slave_IO_State: Waiting for master to send event
  Master_Host: 192.168.0.160
  Master_User: rep
  Master_Port: 3306
  Connect_Retry: 60
  Master_Log_File: mysql-bin.000003
  Read_Master_Log_Pos: 537

  >
  >
  >  Slave_IO_Running: Yes
  Slave_SQL_Running: Yes
  Replicate_Do_DB:
  Replicate_Ignore_DB: mysql
  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: 537

  >  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: 3
  恢复master-1(db1)
  [root@test-B ~]# /etc/init.d/mysqld start
  Starting MySQL.. SUCCESS!
  monitor端检查恢复情况
  [root@test-A ~]# mmm_control show
  db1(192.168.0.150) master/ONLINE. Roles: reader(10.0.0.16)
  db2(192.168.0.160) master/ONLINE. Roles: reader(10.0.0.14), writer(10.0.0.13)
  db3(192.168.0.151) slave/ONLINE. Roles: reader(10.0.0.15)
  可以看到当 db1 恢复后就充当 slave 的角色了!只有当 db2 挂了以后db1 又会担当起主服务器的写入功能。
  4.9、 mmm_control命令介绍
  Valid commands are:
  help                              - show this message
  ping                              - ping monitor
  show                              - show status
  checks [|all [|all]] - show checks status
  set_online                  - set host  online
  set_offline                 - set host  offline
  mode                              - print current mode.
  set_active                        - switch into active mode.
  set_manual                        - switch into manual mode.
  set_passive                       - switch into passive mode.
  move_role [--force]   - move exclusive role  to host
  (Only use --force if you know what you are doing!)
  set_ip                  - set role with ip  to host
  五、配置过程中我遇到的一些问题和解决方法
  问题:
  配置过程中,到最后查看所有服务器状态,从服务器不在状态:
  [root@test-A ~]# mmm_control show
  [root@test-A ~]# mmm_control show
  db1(192.168.0.150) master/ONLINE. Roles: reader(10.0.0.15), writer(10.0.0.13)
  db2(192.168.0.160) master/ONLINE. Roles: reader(10.0.0.14), reader(10.0.0.16)
  db3(192.168.0.151) slave/HARD_OFFLINE. Roles:
  如上,解决方法:
  从服务器上的mysql,原来做测试时,用的多实例,mysql服务端口为3307。停掉从服务器上的主从,然后在配置文件中把端口改为3306,重启服务。重新做一下主从同步后,重新启动MMM的代理服务后,再次在MMM管理端查看所有服务器状态,已全部正常,如下:
  [root@test-A ~]# mmm_control show
  db1(192.168.0.150) master/ONLINE. Roles: reader(10.0.0.15), writer(10.0.0.13)
  db2(192.168.0.160) master/ONLINE. Roles: reader(10.0.0.14)
  db3(192.168.0.151) slave/ONLINE. Roles: reader(10.0.0.16)


运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-602656-1-1.html 上篇帖子: MySQL学习笔记之九:MySQL Replication 下篇帖子: 让MySQL支持Emoji表情 mysql 5.6
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表