zoukankan      html  css  js  c++  java
  • MHA搭建

    一、MHA搭建

    clipboard.png

    三台服务器:

    主:221

    从:222

    从:220,兼职作为manager

    除了manager以外所有的节点都是node

    node+manager两种类型

    1、基础环境准备:

    准备好三台linux Redhat 6.5机器

    规划好IP地址、配置hosts文件解析主机名

    vim /etc/hosts

    172.16.88.220 master

    172.16.88.221 bakmas

    172.16.88.222 slave

    配置好本地yum源

    关闭iptables 和selinux

    三台安装一样版本的mysql数据库-5.7.14rpm和xtrabackup工具2.4.4

    2、搭建主从

    在主上创建复制用户并授权:

    mysql> grant replication slave,replication client on *.* to
    'repl'@'172.16.88.%' identified by 'repl';

    对主库做全备,并应用,传输到2个从库上

    在各个从库上进行恢复,并授权

    启动后设置主从关系,开启从库,检查主从状态

    修改配置文件vim /etc/my.cnf

    log-bin=server

    binlog_format=roe

    binlog_rows_query_log_events=on

    server_id=1/2/3

    重启主库

    service mysqld restart

    查看节点文件

    [root@master ~]# cd /usr/local/mysql/data/

    [root@master data]# ll

    total 122920

    -rw-r----- 1 mysql mysql 56 May 1 12:23 auto.cnf

    -rw-r----- 1 mysql mysql 330 May 1 15:48 ib_buffer_pool

    -rw-r----- 1 mysql mysql 12582912 May 1 15:55 ibdata1

    -rw-r----- 1 mysql mysql 50331648 May 1 15:55 ib_logfile0

    -rw-r----- 1 mysql mysql 50331648 May 1 12:23 ib_logfile1

    -rw-r----- 1 mysql mysql 12582912 May 1 15:55 ibtmp1

    drwxr-x--- 2 mysql mysql 4096 May 1 12:23 mysql

    -rw-rw---- 1 root root 6 May 1 15:55 mysqld_safe.pid

    drwxr-x--- 2 mysql mysql 4096 May 1 12:23 performance_schema

    -rw-r----- 1 mysql mysql 154 May 1 15:55 server.000001

    -rw-r----- 1 mysql mysql 16 May 1 15:55 server.index

    drwxr-x--- 2 mysql mysql 12288 May 1 12:23 sys

    确定主从关系

    mysql> ? change master to

    CHANGE MASTER TO

    MASTER_HOST='172.16.88.220',

    MASTER_USER='repl',

    MASTER_PASSWORD='repl',

    MASTER_PORT=3306,

    MASTER_LOG_FILE='server.000001',

    MASTER_LOG_POS=154,

    MASTER_CONNECT_RETRY=10;

    mysql> start slave;

    查看主从状态

    从:

    mysql> show slave statusG

    *************************** 1. row
    ***************************

    Slave_IO_State: Waiting for master to send event

    Master_Host: 172.16.88.220

    Master_User: repl

    Master_Port: 3306

    Connect_Retry: 10

    Master_Log_File: server.000001

    Read_Master_Log_Pos: 154

    Relay_Log_File: bakmas-relay-bin.000003

    Relay_Log_Pos: 317

    Relay_Master_Log_File: server.000001

    Slave_IO_Running: Yes

    Slave_SQL_Running: Yes

    主:

    mysql> show processlist;

    clipboard.png

    主从库安装node节点软件

    [root@master mha_file]# rpm -ivh mha4mysql-node-0.54-0.el6.noarch.rpm

    备主机器安装所有软件

    rpm localinstall ./*.rpm

    查看/usr/bin有没有生成脚本

    [root@bakmas mha_file]# cd /usr/bin/

    [root@bakmas bin]# ll |grep "_logs"

    -rwxr-xr-x 1 root root 15977 Dec 1 2012 apply_diff_relay_logs

    -rwxr-xr-x 1 root root 7401 Dec 1 2012 purge_relay_logs

    -rwxr-xr-x 1 root root 7263 Dec 1 2012 save_binary_logs

    3、配置免密

    三台都需要

    主库:

    生成rsa秘钥:

    [root@master ~]# ssh-keygen -t rsa

    [root@master ~]# cd .ssh/

    [root@master .ssh]# ll

    total 8

    -rw------- 1 root root 1675 May 1 16:45 id_rsa//私钥

    -rw-r--r-- 1 root root 393 May 1 16:45 id_rsa.pub//公钥

    将生成的公钥追加到认证文件中:

    cat /root/.ssh/id_rsa.pub >> authorized_keys

    修改ssh文件夹和公钥的权限:

    chmod 700 /root/.ssh

    chmod 600 authorized_keys

    将公钥传输到其他2个机器上:

    ssh-copy-id -i id_rsa.pub root@slave

    ssh-copy-id -i id_rsa.pub root@bakmas

    slave:

    ssh-copy-id -i id_rsa.pub root@master

    ssh-copy-id -i id_rsa.pub root@bakmas

    bakmas:

    ssh-copy-id -i id_rsa.pub root@master

    ssh-copy-id -i id_rsa.pub root@slave

    验证三台机器间无密码登录任何一台机器

    4、配置监控用户

    在master上创建mha监控用户,这样2个从上自动有该用户

    mysql> grant all privileges on *.* to 'mha_bakmas'@'172.16.88.%' identified
    by 'mha_bakmas';

    测试是否成功:

    mysql -umha_bakmas -pmha_bakmas -hmaster -P3306

    5、配置MHA

    在mha-manager上执行:

    1、创建mha的工作目录

    mkdir -p /etc/masterha

    修改相关配置文件app1.cnf

    [server default]

    manager_workdir=/var/log/masterha/app1

    manager_log=/var/log/masterha/app1/manager.log

    master_binlog_dir=/var/lib/mysql/data

    master_ip_failover_script=/usr/bin/master_ip_failover //失败切换

    master_ip_online_change_script=/usr/bin/master_ip_online_change //主动切换

    user=mha_monitor //manager 使用这个账号连接各个数据库

    password=mha_monitor //manager 使用这个账号密码连接各个数据库

    ping_interval=1 //manager 每隔 1 秒钟,探测一下各个节点

    remote_workdir=/tmp //指定远端目录

    repl_user=repl //各个节点之间的复制账号和密码

    repl_password=repl

    ssh_user=root

    [server1]

    hostname=192.168.10.50

    #candidate_master=1

    port=3306

    [server2]

    hostname=192.168.10.51

    candidate_master=1 //指定2节点优先成为主,假设没有这个选项,默认使用最新的 slave
    成为主

    check_repl_delay=0 //关闭延迟监测

    port=3306

    [server3]

    hostname=192.168.10.52

    port=3306

    填充:

    [server default]

    manager_workdir=/var/log/masterha/app1

    manager_log=/var/log/masterha/app1/manager.log

    master_binlog_dir=/var/lib/mysql/data

    master_ip_failover_script=/usr/bin/master_ip_failover

    master_ip_online_change_script=/usr/bin/master_ip_online_change

    user=mha_bakmas

    password=mha_bakmas

    ping_interval=1

    remote_workdir=/tmp

    repl_user=repl

    repl_password=repl

    ssh_user=root

    [server1]

    hostname=172.16.88.220

    port=3306

    [server2]

    hostname=172.16.88.221

    candidate_master=1

    check_repl_delay=0

    port=3306

    [server3]

    hostname=172.16.88.222

    port=3306

    2、在从库上关闭自动purge

    在2个从节点,设置relay_log_purge=0,不自动清除relay_log,可以利用自带的purge_relay_log脚本实现定时任务自动清理relay
    log

    [root@bakmas ~]# vim /etc/my.cnf

    relay_log_purge=off

    read_only=on

    3、修改脚本

    主库上:

    在主库设置虚拟ip

    [root@master etc]# ifconfig eth0:1 172.16.88.224/24

    bakmas(监控机)上:

    master_ip_failover

    master_ip_online_change

    将脚本放到/usr/bin

    修改虚拟地址

    [root@bakmas bin]# vim /usr/bin/master_ip_failover

    my $vip = '172.16.88.224/24'; # Virtual IP

    [root@bakmas bin]# vim /usr/bin/master_ip_online_change

    vip=`echo '172.16.88.224/24'` # Virtual IP

    manager需要使用这两个脚本,在新的主上启动漂移ip

    将这两个中的所有地址改成漂移ip地址就行了

    这两个脚本在manager节点上

    4、改完之后加上权限

    [root@bakmas bin]# chmod +x master_ip_*

    上面配置好以后,就可以在 manager 上面执行相关的脚本进行测试

    上面的配置就是告诉 manager,我这个集群的基本信息

    5、mha检查ssh免密登录:

    masterha_check_ssh --conf=/etc/masterha/app1.cnf

    6、mha检查复制

    masterha_check_repl --conf=/etc/masterha/app1.cnf

    7、mha状态检查

    masterha_check_status --conf=/etc/masterha/app1.cnf

    8、启动 manager:

    nohup masterha_manager --conf=/etc/masterha/app1.cnf --remove_dead_master
    --ignore_last_failover < /dev/null > /var/log/masterha/app1/manager.log 2>&1
    &

    建议:在启动manager以前,启动好主从

    另开窗口查看监控日志: tail -f /var/log/masterha/app1/manager.log

    再次查看监控状态:

    masterha_check_status --conf=/etc/masterha/app1.cnf

    如何关闭manager监控:

    masterha_stop --conf=/etc/masterha/app1.cnf

    一主两从

    搭建两次从服务器

    不建议使用半同步复制

    注意几个点:

    1、从库都该成read-only模式

    2、从库的relay log自动删除功能要关闭

    3、三个数据库的server_id必须不一致

    log-bin = mysql-bin //要求所有可能成为主库的节点开启二进制日志

    relay_log_purge = 0 //要求所有可能成为主库的节点都要配置此项

    read_only = 1 //MHA 要求所有 slave 节点配置为 read_only = 1

    server-id = 2 //注意主从节点的 server-id 不同

    5、安装node和manager软件,这个属于mha软件

    安装的时候,需要依赖很多的per软件和Perl库,因此可能会比较麻烦

    去下载已经安装好的虚拟机

    6、配置互信(配置SSH免密登录)

    节点之间可以互相执行命令、拷贝数据,这些都不需要密码。

    配置完成互信以后,一定要进行测试。

    二、MHA在线|故障切换测试

    1、手工在线测试

    检查master_ip_online_change脚本中所有虚拟ip是否修改完成。

    在线切换步骤:

    1、手工停掉mha监控

    masterha_stop --conf=/etc/masterha/app1.cnf

    2、执行在线切换

    masterha_master_switch --conf=/etc/masterha/app1.cnf --master_state=alive
    --new_master_host=172.16.88.220 --new_master_port=3306
    --orig_master_is_new_slave --running_updates_limit=10000

    yes,yes

    3、其中参数的意思:

    --orig_master_is_new_slave 切换时加上此参数是将原 master 变为 slave
    节点,如果不加此参数,原来的 master 将不启动。

    --running_updates_limit=10000,故障切换时,候选 master 如果有延迟的话,mha
    切换不能成功,加上此参数表示延迟在此时间范围内都可切换(单位为
    s),但是切换的时间长短是由 recover 时 relay 日志的大小决定。

    在备主和监控机上查看是否完成切换:show processlist;

    4、启动MHA manager:

    nohup masterha_manager --conf=/etc/masterha/app1.cnf --remove_dead_master
    --ignore_last_failover < /dev/null > /var/log/masterha/app1/manager.log
    2>&1 &

    masterha_check_status --conf=/etc/masterha/app1.cnf

    2、故障切换测试

    直接在主库上进行failover,杀掉mysqld进程

    mysql> shutdown;

    Query OK, 0 rows affected (0.01 sec)

    mysql> show processlist;

    ERROR 2006 (HY000): MySQL server has gone away

    No connection. Trying to reconnect...

    ERROR 2002 (HY000): Can't connect to local MySQL server through socket
    '/var/lib/mysql/mysql.sock' (2)

    ERROR:

    Can't connect to the server

    这时候会自动完成222故障切换,vip的漂移,但是manager进程会自动关闭

    注意:

    1、MHA里有2个角色,一个是manager节点,一个是node节点,要实现这个MHA,最好是不少于3台机器,一主2从,1台是主,一台当备用master,另一台从机当监控机,一旦主库宕机,备主开始充当主库提供服务,如果旧主上线也不会在成为master了,除非修复完整后强制做主库。

    2、一旦发生切换,manager进程将会退出,无法进行再次测试,需要将故障数据库加入到MHA环境中。

    宕掉的主库需要进行恢复操作:

    常情况下,旧主在修复完整后,可能想把旧主作为新主的slave,这时可以借助当时自动切换时刻的MHA日志来完成对旧主的修复。

    3、在manager上查看当时的change master 信息:

    # cat /var/log/masterha/app1/manager.log |grep -i "All other slaves should
    start"

    Fri Dec 30 18:09:35 2016 - [info] All other slaves should start replication

    from here. Statement should be: CHANGE MASTER TO MASTER_HOST='192.168.10.51',

    MASTER_PORT=3306, MASTER_LOG_FILE='mha-server.000001', MASTER_LOG_POS=154,

    MASTER_USER='repl', MASTER_PASSWORD='xxx';

    获取上述信息后,在旧主上执行change master to操作,重新设置为新主的从库:

    启动从库,查看主从状态

    无论什么测试,在切换完成后,注意检查vip的位置,主从的状态信息是否正常,read_only和relay_log_purge的值,要和真实的架构状态对应起来,并且记得在配置文件中进行相应的修改

    4、修复好的旧主并没有加入到MHA监控环境中,需要手工加入:

    masterha_conf_host --command=add --conf=/etc/masterha/app1.cnf
    --hostname=172.16.88.220 --block=server1 --params="no_master=1;ignore_fail=1"

    或者是直接手工编辑app1.cnf配置文件添加上该信息,再次检查复制环境:

    masterha_check_repl --conf=/etc/masterha/app1.cnf

    5、Requirements and Limitations

    1 这一部分做简要翻译,安装MHA的依赖和限制

    2 SSH public key认证

    3 仅支持Liunx操作系统

    4 只有一台master能被设置成readonly=0,其他设置为只读

    5如果是Master1 -> Master2->
    Slave3这样的三级复制框架,在配置文件中只需要设置master1和master2这样的二级复制结构,并设置multi_tier_slave=1来支持三级复制结构。

    6 MHA仅支持mysql 5.0及以后的版本

    7 mysqlbinlog必须是3.3及以上版本

    8 log-bin必须在每一个可称为master的mysql服务器上设置

    9 所有mysql服务器的复制过滤规则必须一致

    10 必须在能成为master的服务器上设置复制账户

    11所有Mysql服务器上必须设置relay_log_purge=1,使得能够保存一段时间的relay log

    12 基于语句的复制时,不要使用load datainfile命令

  • 相关阅读:
    7zip在DOS命令行用法总结
    WinRAR在DOS下压缩/解压缩的使用方法
    Linux关闭防火墙命令
    将java的jar包,打包为rpm 安装包
    spring mvc 基于注解 配置默认 handlermapping
    Spring + Spring MVC + MyBatis 整合
    Android开发环境搭建全程演示(jdk+eclipse+android sdk)
    使用Spring MVC表单标签
    context:component scan配置策略
    Spring AutoWiring Beans with @Autowired annotation
  • 原文地址:https://www.cnblogs.com/qluzzh/p/11072194.html
Copyright © 2011-2022 走看看