zoukankan      html  css  js  c++  java
  • 高可用之MMM架构


    主从复制原理:

    • 3个线程:
      • 主库的binlog传到从库的relaylog里–>IO线程完成;
      • 主库的dump线程把主库binlog抓出来,送给IO线程;
      • 从库的SQL线程把relaylog应用到从库。
    • 2个延迟:
      • 传输延迟:解决方案 - > semi 复制(半同步复制)
      • 应用延迟:解决方案 -> 并行、分库分表

    延迟复制

    mysql(需5.6以上版本)延迟复制:让从库延迟某段时间才应用relaylog
    不是限制传输延迟
    防止:主库误操作,从库也跟着误操作,这种情况是大灾难。

    怎么实现延迟复制?

    通过设置slave上的 master to master_delay参数实现。
    具体操作:

    > stop salve;
    > change master to master_delay = 600;
    > start slave;
    > show slave status G
    
    
    #查看sql_delay的值为600,表示设置成功

    注释:

    • SQL_delay:一个非负整数,表示秒数,slave滞后多少秒于master。
    • SQL_Remaining_Delay:当slave_sql_running_statue
      等待,知道master_delay秒后,master执行的事件。此字段包含一个整数,表示有多少秒左右的延迟,在其他时候,这个字段是NULL.

    MMM处理复制延迟的一些方式:

    环境介绍:

    • master1与master2是MM结构,与一台monitor做成mysql-mmm

    潜在问题:

    • 1,复制延迟会导致master2下线,此时,所有的vip都会转移到master1上面.请求量过大,直接导致master1宕机;
    • 2,在master2上进行备份,短时间内频繁锁表,导致master2变成抖动状态. 解决办法:

    让master2不因复制延迟下线,在monitor端增大延迟参数,将max_backlog设置为86400秒.

        check_period  5
        trap_period   10
        timeout       2
        restart_after 10000
        max_backlog   86400

    这样设置之后,需要nagios添加check_mysql_all脚本进行配合,监控复制延迟,如果影响线上,根据压力情况,可人工执行set_offline下线处理.

    疑问:如果master2复制延迟,此时,master1宕机,会不会造成数据混乱,或丢失master2的relay-log数据?
    先说明不会丢数据,下面有完成的测试过程.
    mysql-mmm在处理写库宕机的问题时,会等待从库的复制执行完后,才会进行写vip的切换.

    mmm处理复制延迟的一些方式
    http://blog.chinaunix.net/uid-16844903-id-3042635.html
    锁表模拟延迟
    FLUSH TABLES WITH READ LOCK;

    mysqladmin -uroot -prootroot shutdown

    双主结构里面

    log_slave_update参数

    关闭时影响如下:

    • ①M2上的更新不会被传递到slave
    • ②M1的写角色切换到M2以后,slave不能从M1获取到M1传递过来的对应的日志

    如果这个参数打开,可以认为:M1的所有操作对应的日志在M2上都有。
    slave切换到M2以后,可以继续在M2上追跑在M1上没有跑完的日志。
    slave和M1延迟了1万个日志,这1万个日志在M2上肯定都有,因为log_slave_updates参数被打开!
    slave切换到M2以后,可以继续追跑这些日志。

    log_slave_update打开的2种情况

    • ①级联复制
    • ②双主:为了保证两边master的binlog的一致性。
    Normally, a slave does not log to its own binary log any updates that are received from a master server. This option tells the slave to log the updates performed by its SQL thread to its own binary log. For this option to have any effect, the slave must also be started with the --log-bin [2039] option to enable binary logging. Prior to MySQL 5.5, the server would not start when using the --log-slave-updates [2004] option without also starting the server with the --log-bin [2039] option, and would fail with an error; in MySQL 5.6, only a warning is generated. (Bug #44663) --log-slave-updates [2004] is used when you want to chain replication servers. For example, you might want to set up replication servers using this arrangement:
    A -> B -> C
    
        Here, A serves as the master for the slave B, and B serves as the master for the slave C. For this to work, B must be both a master and a slave. You must start both A and B with --log-bin [2039] to enable binary logging, and B with the --log-slave-updates [2004] option so that updates received from A are logged by B to its binary log.

    图解 MMM

    • 双主,互为主从,但只有一个是做读写用的。另一个做读用;
    • 可有多个slave,连接到做读写的master;
    • 有1个monitor来监控两个master的状态。

    这里写图片描述

    • 好处:当master1故障时,可以手工把master2提升为读写主,然后手工使slave重新连接到新的读写主。

    注意:单独拿一个服务器做monitor比较浪费,所以,一般是把其中一个slave做monitor!!不要把master作monitor!!

    为什么要有monitor? –> 解决双主的脑裂问题。
    即:没有monitor的话,当master找不到别的时,会认为自己是主,会导致混乱。

    MMM的延迟问题

    • (1)应用延迟问题:
      • 切换写主的时候,会挂起,一直到应用完毕relaylog1。 所以,平时要注意M2的应用延迟。 怎么解决?①并行 ②把M2的读去掉
    • (2)传输延迟(一般都是网络的事儿)
      • 可以采用 半同步复制 的方式来解决。 没有传输延迟就没有数据丢失。

    注意:互为主从的时候,M1传给M2的binlog不会再被M2传回来!!
    这是通过serverid来实现的。


    MMM架构的搭建

    这里写图片描述

    1、双主复制的搭建

    1、搭建主从复制
    2、在主上执行如下命令

    > CHANGE MASTER TO master_host = '192.168.56.101', master_port=3306, master_user='root',master_password='rootroot', master_log_file='mysqlserver.000007', master_log_pos=120;
    >  start slave;
      mysqlserver.000007', master_log_pos=120,这两个值随便从M2上show master status得到就行
      在从上执行:
      show master status G
    我要成为你的“从",非常简单
    server_id,三个节点不能一样
    log_slave_updates参数
    

    在每一个服务器上建立如下用户,默认在M1建立以后,会自动同步到所有的服务器上

    > grant replication client on *.* to 'mmm_monitor'@'192.168.56.%' identified by 'mmm_monitor';
    > grant super,replication client,process on *.* to 'mmm_agent'@'192.168.56.%' identified by 'mmm_agent';
    > grant replication slave on *.* to 'repl'@'192.168.56.%' identified by 'repl';
    > grant replication slave on *.* to 'root'@'192.168.56.%' identified by 'rootroot';

    测试连通性
    测试用户建立的是否得当
    在每一台服务器上

        mysql -uroot -prootroot -h192.168.56.219
        mysql -uroot -prootroot -h192.168.56.101
        mysql -uroot -prootroot -h192.168.56.102
    
        mysql -urepl -prepl -h192.168.56.219
        mysql -urepl -prepl -h192.168.56.101
        mysql -urepl -prepl -h192.168.56.102
    
        mysql -ummm_agent -pmmm_agent -h192.168.56.219
        mysql -ummm_agent -pmmm_agent -h192.168.56.101
        mysql -ummm_agent -pmmm_agent -h192.168.56.102

    如果测试不通过,查询mysql.user这个表

    2、安装mmm的步骤,三台服务器都需要做

    1、安装perl模块

    可以选用网络在线安装的方式,注意一定要选用国内的服务器,最好的就是163

    # perl -MCPAN -e shell  #输yes,回车,然后执行:
    >o config init  #重新配置cpan。先出no(我要手工配置),然后一路回车
    会碰到提示这个文件 /root/.cpan/sources/MIRRORED.BY
    >o config commit    #保存刚才配置的命令。会生成一个cpan的默认配置文件
    
    install YAML
    install Algorithm::Diff
    install Class::Singleton
    install DBI
    install DBD::mysql

    安装这个模块以前,mysql如果是手工编译安装的,需要做如下工作,另外开一个窗口

        /usr/local/mysql/lib    #将这个目录写到 /etc/ld.so.conf.d 目录下的任何一个文件内!
        [root@mysql_mon ld.so.conf.d]# cat mysql-x86_64.conf 
        /usr/lib64/mysql
        /usr/local/mysql/lib
        [root@mysql_mon ld.so.conf.d]# pwd
        /etc/ld.so.conf.d
        #ldconfig
    install File::Temp
    install Log::Dispatch
    install Log::Log4perl
    install Mail::Send
    install Net::ARP
    force install Net::Ping #仅安装,不去连接到国外进行网络测试
    install Proc::Daemon
    install Thread::Queue
    install Time::HiRes

    3、安装mmm,mysql-mmm-2.2.1.tar,三台服务器上都需要做

        tar xvf
        make install

    4、配置mmm

    每一个服务器/etc/hosts
    每一个服务器/etc/mysql-mmm/mmm_common.conf
    每一个服务器/etc/mysql-mmm/mmm_agent.conf
    monitor服务器/etc/mysql-mmm/mmm_mon.conf

    5、启动mmm、观察mmm状态

    每一个服务器启动agent

    /etc/init.d/mysql-mmm-agent start

    monitor服务器启动monitor

    /etc/init.d/mysql-mmm-monitor start

    6、切换测试mmm

    /etc/init.d/mysql-mmm-monitor start
    /etc/init.d/mysql-mmm-agent start

    各个服务器的数据库需要自己启动,slave也需要自己启动

    • mysqld_safe –defaults-file=/etc/my.cnf & start slave;

    配置文件

    1、主从配置文件

    注意server_id必须不同
    下面的一些参数也需要修改一下

    • log_slave_updates=1 #开启主主同步
    • auto_increment_increment=1 #用于主主复制,防止出现重复值
    • auto_increment_offset=2 #避免两台服务器同时做更新时自增长字段的值之间发生冲突

    2、mmm配置文件

    3、有一个文件auto.cnf文件,里面配置的是server_uuid,可以删掉,MySQL重启的时候会自动重建,生成一个新的uuid

    如果采用克隆的方式建立的服务器,uuid会冲突,解决方案就是删除上面的auot.cnf文件

    4、修改ip地址可以采用ip addr的方式

    5、注意,NetworkManager这个服务如果停止的话,很可能系统的网卡都不会启动

    6、最好不要采用克隆的方式建立从服务器,问题还是蛮多的


    MMM安装注意事项

    1、perl模块必须安装齐全

    否则启动mmm会失败,提示相关的.pm文件找不到,缺什么.pm,就是缺少相关的模块

    2、主从配置的时候,最好在从上通过mysql -uroot -prootroot -hmasterIP的方式来测试连通性

    select * from mysql.user G

    3、建立用户的一些命令

    grant replication client on *.* to 'mmm_monitor'@'192.168.56.%' identified by 'mmm_monitor';
    grant super,replication client,process on *.* to 'mmm_agent'@'192.168.56.%' identified by 'mmm_agent';
    grant replication slave on *.* to 'repl'@'192.168.56.%' identified by 'repl';
    grant replication slave on *.* to 'root'@'192.168.56.%' identified by 'rootroot';
    
    grant replication slave on *.* to 'root'@'192.168.56.219' identified by 'rootroot';
    grant replication slave on *.* to 'root'@'192.168.56.%' identified by 'rootroot';
    grant replication client on *.* to 'mmm_monitor'@'192.168.56%' identified by 'mmm_monitor';
    grant super,replication client,process on *.* to 'mmm_agent'@'192.168.56.%' identified by 'mmm_agent';
    grant super,replication client,process on *.* to 'mmm_agent'@'mysqlserver' identified by 'mmm_agent';

    MMM两个重要的监控日志

    tail -100f /var/log/mysql-mmm/mmm_agentd.log
    tail -100f /var/log/mysql-mmm/mmm_mond.log

    max_backlog 设置大了后,可以容忍大的延迟。


    安装MMM的 13个问题

    1.perl包少装一些可以么?
    答:不可以。
    2.两台master可以不在一个网段么?
    答:不可以,虚ip是不变的,虚ip和双master一定要同一网段。
    3.从库如何设置master_host?选择vip会不会更好?
    答:我也有过这样的疑惑,实际测试中发现,mmm比我们智能的多,他会跟据master的binlog,pos自动切主。
    4.可以将多个slave分别连到不同的master上么?
    答:不可以,记住mmm虽然是双主,但为了保证一致性,只有一个可写,也可以理解整个体系只有一台master,这样mmm对从库进行切主时更方便。
    5.我可以对slave做级联么?
    答:可以,和正常的没区别。
    6.如何设置read_only参数?
    答:初始化时全部指定read_only=on, mmm会识别主库并将read_only关闭。
    7.如何设置log_slave_update参数?
    答:简单粗暴的做法是关闭,防止切master后造成双写的问题。
    7.怎么应对mmm_mond监控进程单点问题?
    答:暂时没有好的办法,开多个mmm_mond只会造成混乱,就像ZF是的,你说国际接轨,他和你说国情,你说国情,他要你和国际接轨。话说回来,谁有perl开发功力,可以尝试下。
    8.什么是flapping?
    答:就是说vip来回漂移,master在offline和online之间来回变化。可以取消prefer选项,并设置auto_set_online=n,在n秒之内不参与选择。
    9.当前master挂掉,binlog没有传到另外一台master怎么办?
    答:如果担心突然宕机造成数据丢失,可以考虑用goole插件,semi-sync(半同步复制),percona版本mysql己经集成,直接可以使用。
    10、当Master1发生故障,导致DB不可用时,VIP会自动漂移到Master2上,以实现高可用。但出现了一个问题,由于ARP老化时间过长,导致漂移过去的VIP不可用,也无法ping通。也就是说,MySQL-MMM没有考虑到ARP老化时间过长的情况而采取强刷ARP的方式。
    11、经典文章
    http://code.openark.org/blog/mysql/problems-with-mmm-for-mysql
    Problems with MMM for MySQL
    http://www.cnblogs.com/zeromyth/p/3772422.html
    12、潜在问题:
    1,复制延迟会导致master2下线,此时,所有的vip都会转移到master1上面.请求量过大,直接导致master1宕机;
    2,在master2上进行备份,短时间内频繁锁表,导致master2变成抖动状态.
    13、如果master2复制延迟,此时,master1宕机,会不会造成数据混乱,或丢失master2的relay-log数据?


    使用cpan注意的问题

    perl -MCPAN -e shell
    yes
    o conf commit

    生成了一个cpan的默认配置文件

    perl -MCPAN -e shell
    o conf init
    no

    一路回车

    /root/.cpan/sources/MIRRORED.BY

    核心就是配置cpan使用163作为我们的perl模块的安装源

    o conf commit
    
    2016/05/25 16:03:54 ERROR Check 'rep_backlog' on 'mysql' has failed for 10 seconds! Message: ERROR: Backlog is too big
    2016/05/25 16:03:56 FATAL State of host 'mysql' changed from ONLINE to REPLICATION_DELAY
    2016/05/25 16:03:56  INFO Removing all roles from host 'mysql':
    2016/05/25 16:03:56  INFO     Removed role 'reader(192.168.56.221)' from host 'mysql'
    2016/05/25 16:03:56  INFO Orphaned role 'reader(192.168.56.221)' has been assigned to 'mysql_mon'
    
    <check default>
            check_period  5
            trap_period     10
            timeout            2
            restart_after     10000
            max_backlog   300
    </check>
    
    2016/05/25 16:47:00 ERROR Check 'rep_backlog' on 'mysql' has failed for 10 seconds! Message: ERROR: Backlog is too big
    2016/05/25 16:47:02 FATAL State of host 'mysql' changed from ONLINE to REPLICATION_DELAY
    2016/05/25 16:47:02  INFO Removing all roles from host 'mysql':
    2016/05/25 16:47:02  INFO     Removed role 'reader(192.168.56.221)' from host 'mysql'
    2016/05/25 16:47:02  INFO Orphaned role 'reader(192.168.56.221)' has been assigned to 'mysql_mon'
  • 相关阅读:
    OGG_GoldenGate数据控制进程Manager(案例)
    OGG_GoldenGate安装和环境搭建(案例)
    OGG_Oracle GoldenGate简介(概念)
    DBA_Oracle Erp R12系统文件结构(概念)
    PLSQL_统计信息系列10_统计信息过旧导致程序出现性能问题
    PLSQL_统计信息系列09_统计信息在不同数据库中迁移
    Hadoop2源码分析-准备篇
    高可用Hadoop平台-答疑篇
    高可用Hadoop平台-实战尾声篇
    高可用Hadoop平台-实战
  • 原文地址:https://www.cnblogs.com/lpeng94/p/12546452.html
Copyright © 2011-2022 走看看