zoukankan      html  css  js  c++  java
  • MHA 高可用集群搭建(二)

    MHA 高可用集群搭建
    安装scp远程控制
    http://www.cnblogs.com/kevingrace/p/5662839.html

    yum install openssh-clients

    mysql5.7
    运行环境:centos6.5
    1 主机部署

    manager:192.168.133.141
    test1: 192.168.133.138
    test2:192.168.133.139 (为master1的备用)
    test3: 192.168.133.140

    test1为主,test2和test3为备,当test1 down的情况下,主自动移动到test2上。
    为了节约经费,将manger可以设置到test3中(此处不设置)。
    在三台虚拟机上配置账号:
    1管理账号:mha_repo 密码123456
    2主从同步账号:backup 密码:backup
    生成环境下采用脚本的形式来管理虚拟ip,而不是用keepalive完成,容易发生脑裂。


    首先用ssh-keygen实现四台主机之间相互免密钥登录
    安装MHAmha4mysql-node,mha4mysql-manager 软件包
    建立test1,test2,test3 之间主从复制
    管理机manager上配置MHA文件
    masterha_check_ssh工具验证ssh信任登录是否成功
    masterha_check_repl工具验证mysql复制是否成功,这一步坑比较多,前面的必须配置好主从
    启动MHA manager,并监控日志文件
    测试test1(156)宕机后,是否会自动切换


    第一步:首先用ssh-keygen实现四台主机之间相互免密钥登录
    先在一台中创建公钥和私钥,然后创建authorized_keys,设定/root/.ssh的权限是700,
    scp公钥到其他服务器上,然后拷贝公钥到authorized_keys.

    平时两两交互的做法(熟悉下免密匙登录两台)
    举例说明:
    1 在这台服务器上[test1]
    ssh-keygen -t rsa
    scp id_rsa.pub root@192.168.133.139:/root/.ssh/
    scp id_rsa.pub root@192.168.133.139:/root/.ssh/
    scp id_rsa.pub root@192.168.133.140:/root/.ssh/

    在另一台服务器上的操作:
    cd /root/.ssh
    touch authorized_keys
    cat id_rsa.pub >>authorized_keys
    chmod 600 authorized_keys
    chmod 700 /root/.ssh/


    第一部分:免密匙登录
    在三台主机上操作
    在每台服务器上操作ssh-keygen -t rsa 创建公钥和私钥,
    然后 ssh-copy-id 每台服务器ip
    没有 authorized就创建

    ssh-keygen -t rsa
    ssh-copy-id 192.168.133.151
    ssh-copy-id 192.168.133.152
    ssh-copy-id 192.168.133.153

    ******************************************************************************************
    ((((((((((((((((((((((((((((((((99(((((((
    )))))))))))))))))))))))))))))))))))))))))
    ************************************************************************************

    第二步:建立test1,test2,test3之间主从复制
    test1主
    test2是test1的从,也是主备
    test3是test1的从

    注意:创建在三台服务器上用于主从的账号和mha的监控账号
    两台从库只读模式,在命令行执行,不要在配置文件中添加,因为两台从库随时成主
    还需要设置从库relay log 的清理模式



    test1
    vi /etc/my.cnf(其他是省略,主要的)
    server_id = 1
    log-bin=mysql-bin
    log-slave-updates
    expire_logs_days = 10

    test2
    vi /etc/my.cnf
    server_id = 2
    log-bin=mysql-bin
    log-slave-updates
    expire_logs_days = 10


    test3
    vi /etc/my.cnf
    server_id = 3
    log-bin=mysql-bin
    log-slave-updates
    expire_logs_days = 10
    read_only=1

    主从同步master开启重要选项:server-id和log-bin
    egrep "log-bin|server-id" /etc/my.cnf

    在test1、test2上创建主从同步的账号。test2是备用,这个也需要建立授权用户
    在test2和test3上都要授权repl用户和密码。这里的repl会在repl_user用到。

    [test1和test2]
    mysql -uroot -p123456
    grant replication slave on *.* to 'repl'@'192.168.133.%' identified by '123456';
    flush privileges;
    show master status G;


    [master2和slave2]
    change master to
    master_host='192.168.133.151'
    master_user='repl',
    master_password='repl',
    master_port=3306
    master_log_file='mysql-bin.000003',
    master_log_pos=603;

    start slave;
    show slave status G;

    主从不能同步的解决办法
    1 网络不通
    2 密码不对:mysql重新授权远程用户登录,重设密码
    3 pos不对:偏移量show master status
    4 ID问题:sever-id 必须id不同
    5 防火墙策略,SELinux
    先stop slave,
    设置完成后再重新start slave

    搭建主从的注意事项:
    配置主从同步是注意要数据库服务器一致,假如主上的数据多,则要备份

    在主test1上备份完整数据
    mysqldump -uroot -p123456 --master-data=2 --single-transaction -R --triggers -A > all.sql
    --master-data=2代表备份时刻记录master的Binlog位置和Position,
    --single-transaction意思是获取一致性快照,
    -R意思是备份存储过程和函数,
    --triggres的意思是备份触发器,
    -A代表备份所有的库。
    更多信息请自行mysqldump --help查看。

    在主上创建复制用户
    grant replication slave on *.* to 'repl'@'192.168.2.%' identified by '123456';
    flush privileges;

    查看主库备份时的binlog名称和位置,MASTER_LOG_FILE和MASTER_LOG_POS
    head -n 30 all.sql | grep 'CHANGE MASTER TO'

    把备份复制到另外两条服务器
    scp all.sql ip:/root/all.sql

    分别在两台服务器上导入备份,执行复制相关命令
    mysql -uroot -p123456 < ./all.sql
    stop slave;
    CHANGE MASTER TO MASTER_HOST='192.168.2.128',MASTER_USER='repl', MASTER_PASSWORD='123456',MASTER_LOG_FILE='mysql-bin.000004',MASTER_LOG_POS=245;
    start slave;
    show slave statusG
    Slave_IO_State: Waiting for master to send event
    Master_Host: 192.168.2.128
    Master_User: repl
    Master_Port: 3306
    Connect_Retry: 60
    Master_Log_File: mysql-bin.000004
    Read_Master_Log_Pos: 472
    Relay_Log_File: localhost-relay-bin.000002
    Relay_Log_Pos: 480
    Relay_Master_Log_File: mysql-bin.000004
    Slave_IO_Running: Yes
    Slave_SQL_Running: Yes

    同理,使两台slave status一致。

    在master2上配置
    mysql -uroot -p123456 -e 'set global read_only=1' (设置在两个从库中只能读,不能写)
    mysql -uroot -p123456 -e 'set global relay_log_purge=0'(手动清理,设置relay log 的清除方式)
    在slave2上配置
    mysql -uroot -p123456 -e 'set global read_only=1'
    mysql -uroot -p123456 -e 'set global relay_log_purge=0'(手动清理)


    B.安装MHAmha4mysql-node,mha4mysql-manager 软件包

    1所有节点上安装mha node所要的perl模块
    [test1,test2,test3]
    rpm -ivh http://download.fedoraproject.org/pub/epel/6/i386/epel-release-6-8.noarch.rpm

    2 在所有节点上安装mha node
    yum install perl-ExtUtils-CBuilder perl-ExtUtils-MakeMaker
    yum install -y perl-CPAN
    必须安装上面两个包,如果不安装的话,会在perl Makefile.PL的时候报错
    wget https://download.mariadb.com/MHA/mha4mysql-node-0.56.tar.gz
    tar zxf mha4mysql-node-0.56.tar.gz
    cd mha4mysql-node-0.56
    perl Makefile.PL
    make && make install

    3 安装MHA Manger(manger上安装)

    安装MHA Manger依赖的perl模块
    yum install perl-DBD-MySQL perl-Config-Tiny perl-Log-Dispatch
    perl-Parallel-ForkManager perl-Time-HiRes -y
    wget https://downloads.mariadb.com/MHA/mha4mysql-manager-0.56.tar.gz
    tar zxf mha4mysql-manager-0.56.tar.gz
    cd mha4mysql-manager-0.56
    perl Makefile.PL
    make && make install

    ***********************************************************************************************
    ***********************************************************************************************
    安装完MHA Manager后,在/usr/local/bin目录下生成以下脚本
    ll /usr/local/bin/
    masterha_check_repl 检查MySQL复制状况
    masterha_check_ssh 检查MHA的SSH配置状况
    masterha_check_status 检测当前MHA运行状态
    masterha_conf_host 添加或删除配置的server信息
    masterha_manager 启动MHA
    masterha_stop 停止MHA
    masterha_master_monitor 检测master是否宕机
    masterha_master_switch 控制故障转移(自动或者手动)
    masterha_secondary_check 多种线路检测master是否存活

    ***************************************************************************************************
    ***************************************************************************************************
    在../mha4mysql-manager-0.56/samples/scripts下还有以下脚本,需要将其复制到/usr/local/bin

    cd samples/scripts/
    master_ip_failover //自动切换时VIP管理脚本,不是必须,如果我们使用keepalived的,我们可以自己编写脚本完成对vip的管理,比如监控mysql,如果mysql异常,我们停止keepalived就行,这样vip就会自动漂移
    master_ip_online_change //在线切换时VIP脚本,不是必须,同样可以可以自行编写简单的shell完成
    power_manager //故障发生后关闭master脚本,不是必须
    send_report //故障切换发送报警脚本,不是必须,可自行编写简单的shell完成

    cp ./* /usr/local/bin/

    *****************************************************************************************
    *******************************************************************************************
    创建mha管理用的复制账号
    每台数据库节点(test1、test2、test3)上都要创建账号mha_rep,(可以是root)
    在这里以其中master1为例。
    mysql -uroot -p123456
    grant all privileges on *.* to 'mha_rep'@'192.168.133.%' identified by '123456';
    flush privileges;
    >select host,user from user; 从user表中查找host和user

    创建mha的工作目录,创建相关文件(管理节点manager)

    mkdir -p /etc/masterha
    cp samples/conf/app1.cnf /etc/masterha/


    修改manager端也就是test1的mha配置文件
    cat /etc/masterha/app1.cnf
    [server default]
    user=mha_rep #MHA管理mysql的用户名,该账号是在test1,test2,test3中都要创建的
    password=123456 #MHA管理mysql的密码
    manager_workdir=/var/log/masterha/app1 #MHA的工作目录
    manager_log=/var/log/masterha/app1/manager.log #MHA的日志路径
    master_binlog_dir=/usr/local/mysql/data 该路径是mysql的data路径
    ssh_user=root #免秘钥登陆的用户名
    repl_user=repl #主从复制账号,用来在主从之间同步数据
    repl_password=123456
    ping_interval=1 #ping间隔时间,用来检查master是否正常
    remote_workdir=/tmp
    report_script=/usr/local/bin/send_report //设置发生切换后发送的报警的脚本
    secondary_check_script= /usr/local/bin/masterha_secondary_check -s test2 -s test1 --user=backup --master_host=test1 --master_ip=192.168.2.138 --master_port=3306
    一旦MHA到test1的监控之间出现问题,MHA Manager将会尝试从test2登录到test1
    shutdown_script=""
    #设置故障发生后关闭故障主机脚本(该脚本的主要作用是关闭主机放在发生脑裂,这里没有使用)
    master_ip_failover_script= /usr/local/bin/master_ip_failover
    #设置自动failover时候的切换脚本
    master_ip_online_change_script= /usr/local/bin/master_ip_online_change
    #设置手动切换时候的切换脚本
    [server1]
    hostname=192.168.253.241
    port=3306
    master_binlog_dir=/data/mysql/data/ 设置master保存binlog的位置,以便MHA可以找到master的日志
    [server2]
    hostname=192.168.253.242
    port=3306
    candidate_master=1
    # 设置为候选master,如果设置该参数以后,
    #发生主从切换以后将会将此从库提升为主库,即使这个主库不是集群中事件最新的slave
    check_repl_delay=0
    #默认情况下如果一个slave落后master 100M的relay logs的话,
    #MHA将不会选择该slave作为一个新的master,
    #因为对于这个slave的恢复需要花费很长时间,
    #通过设置check_repl_delay=0,MHA触发切换在选择一个新的master的时候将会忽略复制延时,
    #这个参数对于设置了candidate_master=1的主机非常有用,
    #因为这个候选主在切换的过程中一定是新的master
    master_binlog_dir=/data/mysql/data/
    [server3]
    hostname=192.168.253.243
    port=3306
    #no_master=1 #设置na_master=1,使服务器不能成为master
    master_binlog_dir=/data/mysql/data/

    设置relay log的清除方式(在master2,slave2节点上)
    mysql -uroot -p -e 'set global relay_log_purge=0'

    ###################################################################################
    MHA在发生切换的过程中,从库的恢复过程中依赖于relay log的相关信息,
    所以这里要将relay log的自动清除设置为OFF,采用手动清除relay log的方式。
    在默认情况下,从服务器上的中继日志会在SQL线程执行完毕后被自动删除。
    但是在MHA环境中,这些中继日志在恢复其他从服务器时可能会被用到,
    因此需要禁用中继日志的自动删除功能。定期清除中继日志需要考虑到复制延时的问题。
    在ext3的文件系统下,删除大的文件需要一定的时间,会导致严重的复制延时。
    为了避免复制延时,需要暂时为中继日志创建硬链接,
    因为在linux系统中通过硬链接删除大文件速度会很快。
    (在mysql数据库中,删除大表时,通常也采用建立硬链接的方式)

    MHA节点中包含了pure_relay_logs命令工具,它可以为中继日志创建硬链接,
    执行SET GLOBAL relay_log_purge=1,等待几秒钟以便SQL线程切换到新的中继日志,
    再执行SET GLOBAL relay_log_purge=0。
    ###################################################################################
    以上manger配置完毕

    **********************************************************************************
    &&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&
    ***********************************************************************************


    设置定期清理relay脚本(两台slave服务器)
    cd /root/
    cat purge_relay_log.sh
    #!/bin/bash
    user=root
    passwd=123456
    port=3306
    后面三个路径更改
    log_dir='/data/masterha/log'
    work_dir='/data'
    purge='/usr/local/bin/purge_relay_logs'

    if [ ! -d $log_dir ]
    then
    mkdir $log_dir -p
    fi

    $purge --user=$user --password=$passwd
    --disable_relay_log_purge
    --port=$port --workdir=$work_dir >> $log_dir/purge_relay_logs.log 2>&1
    #######################################
    crontab -l
    0 4 * * * /bin/bash /root/purge_relay_log.sh


    purge_relay_logs脚本删除中继日志不会阻塞SQL线程,手动执行看看情况。
    /usr/local/bin/purge_relay_logs --user=root --password=123456 --port=3306 -disable_relay_log_purge --workdir=/data/

    @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
    @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@

    每次测试和实际环境下都要测试下

    检查ssh是否畅通
    masterha_check_ssh --conf=/etc/masterha/app1.cnf
    检查整个复制环境状况
    masterha_check_repl --conf=/etc/masterha/app1.cnf
    肯定会报错。
    MySQL Replication Health is NOT OK
    原因是通过root用户远程连接节点的mysql不通

    Failover两种方式:一种是虚拟IP地址,一种是全局配置文件。
    MHA并没有限定使用哪一种方式,而是让用户自己选择,
    虚拟IP地址的方式会牵扯到其它的软件,比如keepalive软件,
    而且还要修改脚本master_ip_failover。
    vi master_ip_failover 其中有个vip,设置vip

    报错信息:
    Can't exec "mysqlbinlog": No such file or directory at
    /usr/local/share/perl5/MHA/BinlogManager.pm line 99.
    mysqlbinlog version not found!

    Testing mysql connection and privileges..sh: mysql: command not found

    解决方法如下,添加软连接(所有节点)
    type mysqlbinlog
    ln -s /usr/local/mysql/bin/mysqlbinlog /usr/local/bin/mysqlbinlog
    ln -s /usr/local/mysql/bin/mysql /usr/local/bin/mysql
    先暂时注释master_ip_failover_script= /usr/local/bin/master_ip_failover


    masterha_check_repl --conf=/etc/masterha/app1.cnf
    通过master_check_status脚本查看Manager的状态:
    masterha_check_status --conf=/etc/masterha/app1.cnf
    开启MHA Manager监控
    nohup masterha_manager --conf=/etc/masterha/app1.cnf --remove_dead_master_conf --ignore_last_failover < /dev/null > /var/log/masterha/app1/manager.log 2>&1 &

    [1] 30867


    启动参数介绍:
    --remove_dead_master_conf该参数代表当发生主从切换后,老的主库的ip将会从配置文件中移除。
    --manger_log 日志存放位置
    --ignore_last_failover
    在缺省情况下,如果MHA检测到连续发生宕机,
    且两次宕机间隔不足8小时的话,则不会进行Failover,
    之所以这样限制是为了避免ping-pong效应。
    该参数代表忽略上次MHA触发切换产生的文件,
    默认情况下,MHA发生切换后会在日志目录,
    也就是上面我设置的/data产生app1.failover.complete文件,
    下次再次切换的时候如果发现该目录下存在该文件将不允许触发切换,
    除非在第一次切换后收到删除该文件,为了方便,这里设置为--ignore_last_failove

    关闭MHA Manage监控
    masterha_stop --conf=/etc/masterha/app1.cnf

    添加vip
    {test1}
    /usr/local/bin/master_ip_failover
    在test1下,
    #/sbin/ifconfig eth0:1 192.168.133.100/24 这个配置虚拟ip的,不要和服务器一样。

    测试mha是否正常工作
    将主库master1停止,观察vip是否漂移到对应从库,该从库是否提升到master
    另一台从库是否将主库ip提升为主库的从

    检查ssh是否畅通
    masterha_check_ssh --conf=/etc/masterha/app1.cnf
    检查mysql主从复制是否成功
    masterha_check_repl --conf=/etc/masterha/app1.cnf


    四、mha实验模拟
    在每次做mha实验的时候,我们都最好先执行如下命令做检测
    masterha_check_ssh --conf=/etc/masterha/app1.cnf
    masterha_check_repl --conf=/etc/masterha/app1.cnf

    #确定两条命令的返回结果都是无异常的,然后启动mha服务

    2、在manager端启动mha服务并时刻监控日志文件的输出变化
    nohup masterha_manager --conf=/etc/masterha/app1.cnf > /tmp/mha_manager.log 2>&1 &
    ps -ef |grep masterha |grep -v 'grep'
    root 2840 2470 2 10:53 pts/0 00:00:00 perl /usr/local/bin/masterha_manager --co

    测试master宕机后,时候会自动切换
    测试前查看slave01,slave02的主从同步情况
    mysql -uroot -p123456 -e 'show slave statusG' |egrep 'Slave_IO_Running:|Slave_SQL_Running:'
    mysql -uroot -p123456 -e 'show slave statusG' |egrep 'Slave_IO_Running:|Slave_SQL_Running:'

    停止master的mysql服务
    service mysqld stop

    我们查看slave02的主从同步信息
    mysql -uroot -p123456 -e 'show slave statusG' |egrep 'Master_Host|Slave_IO_Running:|Slave_SQL_Running
    Master_Host: 192.168.253.242 #表明已经转移新的ip
    Slave_IO_Running: Yes #表示主从ok

    4、恢复master服务
    rm -rf /usr/local/mha/mha.failover.complete
    service mysqld start
    在manager的日子文件中找到主从同步的sql语句
    grep MASTER_HOST /usr/local/mha/manager.log
    #在master上启动主从同步,密码为backup
    mysql> change master to
    master_host='192.168.253.242',
    master_user='backup',
    master_password='backup',
    master_port=3306,
    master_log_file='mysql-bin.000004',
    master_log_pos=700;

    在master和slave02上执行,检查主从同步是否都正常,这里以master为例,slave02同理
    mysql -uroot -p123456 -e 'show slave statusG' |egrep 'Master_Host|Slave_IO_Running:|Slave_SQL_Running:'

    再次启动MHA的manager服务,并停止slave01
    nohup masterha_manager --conf=/usr/local/mha/mha.cnf > /tmp/mha_manager.log 2>&1 &

    关闭slave01的mysql服务
    service mysqld stop
    tail -f /usr/local/mha/manager.log

    在slave02上查看主从同步情况
    mysql -uroot -p123456 -e 'show slave statusG' |egrep 'Master_Host|Slave_IO_Running:|Slave_SQL_Running:'

    恢复slave01服务
    rm -rf /usr/local/mha/mha.failover.complete
    service mysqld start
    在manager的日子文件中找到主从同步的sql语句
    grep MASTER_HOST /usr/local/mha/manager.log

    在slave01上启动主从同步,密码为backup
    mysql> change master to
    -> master_host='192.168.253.241',
    master_user='backup',
    master_password='backup',
    master_port=3306,
    master_log_file='mysql-bin.000005',
    master_log_pos=120;
    Query OK, 0 rows affected, 2 warnings (0.61 sec)

    mysql> start slave;

    在slave01和slave02上执行,检查主从同步是否都正常,这里以slave01为例,slave02同理
    mysql -uroot -p123456 -e
    'show slave statusG'
    |egrep 'Master_Host|Slave_IO_Running:|Slave_SQL_Running:'

    再次启动MHA的manager服务
    nohup masterha_manager --conf=/usr/local/mha/mha.cnf > /tmp/mha_manager.log 2>&1 &

    通过vip实现mysql的高可用

    repl报错请参考
    http://www.cnblogs.com/polestar/p/5371080.html#3936049


  • 相关阅读:
    java设计模式
    漏桶算法工具类
    http请求requestUtils
    去掉字符串中特殊符号造成的空格
    java 分布式id生成算法
    java枚举
    java 32个Java面试必考点
    配置tomcat下war包可以自压缩
    tomcat (选号)公司tomcat无页面解决
    docker 12 docker容器数据卷
  • 原文地址:https://www.cnblogs.com/fengzhongzhuzu/p/8848588.html
Copyright © 2011-2022 走看看