美文网首页
mysql(十三)

mysql(十三)

作者: Freestyle_0f85 | 来源:发表于2019-12-16 14:29 被阅读0次

    MySQL环境准备

    主机名 wanIP lanIP 角色
    db01 10.0.0.51 172.16.1.51 主库,MHA客户端
    db02 10.0.0.52 172.16.1.52 从库,MHA客户端
    db03 10.0.0.53 172.16.1.53 从库,MHA客户端
    db04 10.0.0.54 172.16.1.54 从库,MHA客户端
    MHA-manager 10.0.0.53 172.16.1.53 MHA服务端
    1.停库
    [root@db01 ~]# /etc/init.d/mysqld stop
    2.删除data目录
    [root@db01 ~]# rm -fr /application/mysql/data
    3.初始化配置文件
    [root@db01 support-files]# cp my-default.cnf /etc/my.cnf
    cp: overwrite ‘/etc/my.cnf’? y
    4.初始化MySQL
    [root@db01 support-files]# cd /application/mysql/scripts/
    [root@db01 scripts]# ./mysql_install_db --user=mysql --basedir=/application/mysql --datadir=/application/mysql/data
    5.启动数据库
    [root@db01 scripts]# /etc/init.d/mysqld start
    

    MySQL高可用方案

    1.双主 + keepalived


    image.png

    2.MMM
    3.MHA
    4.MGR(半同步复制)

    MHA简介

    image

    松信嘉範: MySQL/Linux专家 2001年索尼公司入职 2001年开始使用oracle 2004年开始使用MySQL 2006年9月-2010年8月MySQL从事顾问 2010年-2012年 DeNA 2012年~至今 Facebook

    MHA原理

    当Master出现故障时,它可以自动将最新数据的Slave提升为新的Master,然后将所有其他的Slave重新指向新的Master。

    image.png

    MHA架构介绍

    image
    • 1.MHA是C/S结构的服务

    • 2.MHA的manager可以装在任何一台服务器上(尽量不要装在主库上)

    • 3.一个MHA可以管理多套MySQL集群(上百套)

    • 4.服务端:manager,客户端:node

    MHA的工具

    #MHA manager 服务端工具
    [root@db01 ~]# tar xf mha4mysql-manager-0.56.tar.gz
    [root@db01 ~]# cd /root/mha4mysql-manager-0.56/bin
    [root@db01 bin]# ll
    total 40
    -rwxr-xr-x 1 4984 users 1995 Apr  1  2014 masterha_check_repl
    -rwxr-xr-x 1 4984 users 1779 Apr  1  2014 masterha_check_ssh
    -rwxr-xr-x 1 4984 users 1865 Apr  1  2014 masterha_check_status
    -rwxr-xr-x 1 4984 users 3201 Apr  1  2014 masterha_conf_host
    -rwxr-xr-x 1 4984 users 2517 Apr  1  2014 masterha_manager
    -rwxr-xr-x 1 4984 users 2165 Apr  1  2014 masterha_master_monitor
    -rwxr-xr-x 1 4984 users 2373 Apr  1  2014 masterha_master_switch
    -rwxr-xr-x 1 4984 users 5171 Apr  1  2014 masterha_secondary_check
    -rwxr-xr-x 1 4984 users 1739 Apr  1  2014 masterha_stop
    
    image.png
    #MHA node客户端工具
    [root@db01 ~]# tar xf mha4mysql-node-0.56.tar.gz
    [root@db01 ~]# cd mha4mysql-node-0.56/bin/
    
    [root@db01 bin]# ll
    total 44
    -rwxr-xr-x 1 4984 users 16367 Apr  1  2014 apply_diff_relay_logs
    -rwxr-xr-x 1 4984 users  4807 Apr  1  2014 filter_mysqlbinlog
    -rwxr-xr-x 1 4984 users  8261 Apr  1  2014 purge_relay_logs
    -rwxr-xr-x 1 4984 users  7525 Apr  1  2014 save_binary_logs
    
    image.png

    MHA的优点总结

    1)Masterfailover and slave promotion can be done very quickly
    自动故障转移快 10 - 30 秒

    2)Mastercrash does not result in data inconsistency
    主库崩溃不存在数据一致性问题

    3)Noneed to modify current MySQL settings (MHA works with regular MySQL)
    不需要对当前mysql环境做重大修改

    4)Noneed to increase lots of servers
    不需要添加额外的服务器(仅一台manager就可管理上百个replication)

    5)Noperformance penalty
    性能优秀,可工作在半同步复制和异步复制,当监控mysql状态时,仅需要每隔N秒向master发送ping包(默认3秒),所以对性能无影响。你可以理解为MHA的性能和简单的主从复制框架性能一样。select ping

    6)Works with any storage engine
    只要replication支持的存储引擎,MHA都支持,不会局限于innodb

    基于GTID的主从复制

    什么是GTID?

    GTID是一个唯一标识符,主库的UUID+ 事务提交号,TID组成

    ## UUID MySQL实例的ID
    [root@db01 data]# cat auto.cnf 
    [auto]
    server-uuid=6b898418-23ec-11ea-9271-000c29e98743
    

    TID:事务提交号

    GTID

    6b898418-23ec-11ea-9271-000c29e98743:4

    GTID新特性

    • 支持多线程复制(主库:dump线程,从库:IO线程和 每一个库都开启一个SQL线程)

    • 无需再找binlog的名字和位置点,(show master status;file/position)

      • change master to
      • master_host='10.0.0.51',
      • master_user='rep',
      • master_password='123',
      • master_auto_position=1;
      #1.grant replication slave on \*.\* to rep@'%' identified by '123';
      #2.在从库上执行以上change语句
      #3.start slave;
      
    • 基于Row复制只保存改变的列,大大节省Disk Space/Network resources和Memory usage.

    • 支持把Master 和Slave的相关信息记录在Table中,原来是记录在文件里,记录在表里,增强可用性

    • 支持延时复制

    GTID实践

    mysql> show variables like '%gtid%';
    +---------------------------------+-----------+
    | Variable_name                   | Value     |
    +---------------------------------+-----------+
    | binlog_gtid_simple_recovery     | OFF       |
    | enforce_gtid_consistency        | OFF       |## 开启
    | gtid_executed                   |           |
    | gtid_mode                       | OFF       |## 开启
    | gtid_next                       | AUTOMATIC |
    | gtid_owned                      |           |
    | gtid_purged                     |           |
    | simplified_binlog_gtid_recovery | OFF       |
    +---------------------------------+-----------+
    
    [root@db01 data]# vim /etc/my.cnf
    
    [mysqld]
    gtid_mode=ON
    enforce_gtid_consistency
    log-bin=mysql-bin
    binlog_format=row
    log-slave-updates
    server_id=1
    
    #1.级联复制
    #2.双主+keepalived
    #3.gtid
    
    [root@db01 data]# /etc/init.d/mysqld restart‘
    
    #创建主从复制用户
    mysql> grant replication slave on *.* to rep@'%' identified by '123';
    
    #从库执行change master
    change master to
    master_host='10.0.0.51',
    master_user='rep',
    master_password='123',
    master_auto_position=1;
    
    #开启主从复制
    mysql> start slave;
    
    #检查主从复制状态
    mysql> show slave status\G
                Slave_IO_Running: Yes
                Slave_SQL_Running: Yes
    
    
    mysql> show master status;
    +------------------+----------+--------------+------------------+----------------------------------------+
    | File             | Position | Binlog_Do_DB | Binlog_Ignore_DB | Executed_Gtid_Set                      |
    +------------------+----------+--------------+------------------+----------------------------------------+
    | mysql-bin.000004 |      191 |              |                  | 6b898418-23ec-11ea-9271-000c29e98743:1 |
    +------------------+----------+--------------+------------------+----------------------------------------+
    
    
    [root@db01 data]# tail -100 /application/mysql/data/db01.err
    
    image.png

    报错原因:如果想要开启gtid-mode参数,必须依赖 log-bin 和 log-slave-updates

    解决办法:

    [root@db01 data]# vim /etc/my.cnf
    [mysqld]
    log-bin=mysql-bin
    log-slave-updates
    
    image.png

    报错原因:必须要开启GTID

    解决办法:

    [root@db03 scripts]# vim /etc/my.cnf
    [mysqld]
    server_id=3
    gtid_mode=ON
    enforce_gtid_consistency
    log-bin=mysql-bin
    binlog_format=row
    log-slave-updates
    

    基于GTID的MHA

    传统

    1.主库要开启binlog,从库不用开启binlog

    2.主库要有中从复制用户,从库不需要创建主从复制用户

    3.主库server_id=5,从库只要不等于5即可,从库之间可以相同


    基于MHA的主从复制

    1.主库要开启binlog,从库也要开启binlog

    2.主库要创建主从复制用户,从库也必须创建主从复制用户

    3.主库server_id=5,从库只要不等于5即可,从库之间必须不相同

    <font color='red'>从库随时会被提升为新的主库</font>

    1.关闭所有数据库自动清除relay log 的功能

    • 主库要关闭
    • 从库也要关闭
    • 临时+永久关闭

    2.从库要设置为只读 开启read-only功能

    • 主库不开启
    • 从库要开启
    • 临时开启
    #临时关闭自动清除relay log功能(所有库)
    set global relay_log_purge = 0;
    #永久关闭自动清除relay log功能(所有库)
    [root@db01 data]# vim /etc/my.cnf
    relay_log_purge = 0
    
    #临时开启只读功能(所有从库)
    set global read_only=1;
    

    部署MHA

    image.png
    [root@db01 ~]# ll
    -rw-r--r-- 1 root root 36326 Dec 16 08:35 mha4mysql-node-0.56-0.el6.noarch.rpm
    
    [root@db02 ~]# ll
    -rw-r--r--  1 root root     87119 Dec 16 08:35 mha4mysql-manager-0.56-0.el6.noarch.rpm
    -rw-r--r--  1 root root     36326 Dec 16 08:35 mha4mysql-node-0.56-0.el6.noarch.rpm
    
    [root@db03 ~]# ll
    -rw-r--r-- 1 root root 36326 Dec 16 08:35 mha4mysql-node-0.56-0.el6.noarch.rpm
    
    [root@db04 ~]# ll
    -rw-r--r-- 1 root root 36326 Dec 16 08:35 mha4mysql-node-0.56-0.el6.noarch.rpm
    
    ## 安装包下载地址
    https://github.com/yoshinorim/mha4mysql-manager/wiki/Downloads
    
    # 安装node
    [root@db01 ~]# yum localinstall -y mha4mysql-node-0.56-0.el6.noarch.rpm
    [root@db02 ~]# yum localinstall -y mha4mysql-node-0.56-0.el6.noarch.rpm
    [root@db03 ~]# yum localinstall -y mha4mysql-node-0.56-0.el6.noarch.rpm
    [root@db04 ~]# yum localinstall -y mha4mysql-node-0.56-0.el6.noarch.rpm
    
    #安装manager
    [root@db02 ~]# yum localinstall -y mha4mysql-manager-0.56-0.el6.noarch.rpm 
    
    #创建MHA管理用户(所有库都要创建)
    mysql> grant all on *.* to mha@'%' identified by 'mha';
    
    #做命令的软链接
    [root@db01 ~]# ln -s /application/mysql/bin/mysqlbinlog /usr/bin/mysqlbinlog
    [root@db01 ~]# ln -s /application/mysql/bin/mysql /usr/bin/mysql
    
    [root@db02 ~]# ln -s /application/mysql/bin/mysqlbinlog /usr/bin/mysqlbinlog
    [root@db02 ~]# ln -s /application/mysql/bin/mysql /usr/bin/mysql
    
    [root@db03 ~]# ln -s /application/mysql/bin/mysqlbinlog /usr/bin/mysqlbinlog
    [root@db03 ~]# ln -s /application/mysql/bin/mysql /usr/bin/mysql
    
    [root@db04 ~]# ln -s /application/mysql/bin/mysqlbinlog /usr/bin/mysqlbinlog
    [root@db04 ~]# ln -s /application/mysql/bin/mysql /usr/bin/mysql
    
    #创建密钥对
    [root@db01 ~]# ssh-keygen -t dsa -P '' -f ~/.ssh/id_dsa >/dev/null 2>&1
    [root@db01 ~]# ssh-copy-id -i ~/.ssh/id_dsa.pub 10.0.0.51
    [root@db01 ~]# ssh-copy-id -i ~/.ssh/id_dsa.pub 10.0.0.52
    [root@db01 ~]# ssh-copy-id -i ~/.ssh/id_dsa.pub 10.0.0.53
    [root@db01 ~]# ssh-copy-id -i ~/.ssh/id_dsa.pub 10.0.0.54
    
    ----
    
    [root@db02 ~]# ssh-keygen -t dsa -P '' -f ~/.ssh/id_dsa >/dev/null 2>&1
    [root@db02 ~]# ssh-copy-id -i ~/.ssh/id_dsa.pub 10.0.0.51
    [root@db02 ~]# ssh-copy-id -i ~/.ssh/id_dsa.pub 10.0.0.52
    [root@db02 ~]# ssh-copy-id -i ~/.ssh/id_dsa.pub 10.0.0.53
    [root@db02 ~]# ssh-copy-id -i ~/.ssh/id_dsa.pub 10.0.0.54
    
    ----
    
    [root@db03 ~]# ssh-keygen -t dsa -P '' -f ~/.ssh/id_dsa >/dev/null 2>&1
    [root@db03 ~]# ssh-copy-id -i ~/.ssh/id_dsa.pub 10.0.0.51
    [root@db03 ~]# ssh-copy-id -i ~/.ssh/id_dsa.pub 10.0.0.52
    [root@db03 ~]# ssh-copy-id -i ~/.ssh/id_dsa.pub 10.0.0.53
    [root@db03 ~]# ssh-copy-id -i ~/.ssh/id_dsa.pub 10.0.0.54
    
    ----
    
    [root@db04 ~]# ssh-keygen -t dsa -P '' -f ~/.ssh/id_dsa >/dev/null 2>&1
    [root@db04 ~]# ssh-copy-id -i ~/.ssh/id_dsa.pub 10.0.0.51
    [root@db04 ~]# ssh-copy-id -i ~/.ssh/id_dsa.pub 10.0.0.52
    [root@db04 ~]# ssh-copy-id -i ~/.ssh/id_dsa.pub 10.0.0.53
    [root@db04 ~]# ssh-copy-id -i ~/.ssh/id_dsa.pub 10.0.0.54
    
    
    # 写MHA配置文件
    [root@db02 ~]# mkdir /etc/mha
    [root@db02 ~]# vim /etc/mha/app1.cnf
    [server default]
    manager_log=/etc/mha/app1/manager.log
    manager_workdir=/etc/mha/app1
    master_binlog_dir=/application/mysql/data
    user=mha
    password=mha
    ping_interval=2
    repl_password=123
    repl_user=rep
    ssh_user=root
    ssh_port=22
    
    [server1]
    hostname=10.0.0.51
    port=3306
    
    
    [server2]
    #candidate_master=1
    #check_repl_delay=0
    hostname=10.0.0.52
    port=3306
    
    
    [server3]
    hostname=10.0.0.53
    port=3306
    
    [server4]
    hostname=10.0.0.54
    port=3306
    
    ## 启动前测试
    [root@db02 ~]# masterha_check_ssh --conf=/etc/mha/app1.cnf
    Mon Dec 16 12:12:11 2019 - [info] All SSH connection tests passed successfully.
    
    [root@db02 ~]# masterha_check_repl --conf=/etc/mha/app1.cnf
    MySQL Replication Health is OK.
    
    #启动MHA
    nohup masterha_manager --conf=/etc/mha/app1.cnf --remove_dead_master_conf --ignore_last_failover < /dev/null > /etc/mha/app1/manager.log 2>&1 &
    
    #检测MHA启动状态
    [root@db02 ~]# masterha_check_status --conf=/etc/mha/app1.cnf
    app1 (pid:121442) is running(0:PING_OK), master:10.0.0.51
    
    #停止MHA
    [root@db02 ~]# masterha_stop --conf=/etc/mha/app1.cnf
    
    image.png

    报错原因:将IP解析成主机名了

    解决方法:

    #在配置文件中,添加一个跳过反向解析的参数
    skip_name_resolve
    

    相关文章

      网友评论

          本文标题:mysql(十三)

          本文链接:https://www.haomeiwen.com/subject/eqfdnctx.html