毕业设计之mysql+主从复制+keepalived

环境介绍

mysql_VIP:192.168.111.123
mysql_M!:192.168.111.151
mysql_M2:192.168.111.152

安装mysql可以查看

两个数据库都需要设置主从复制使用的账号和权限

mysql>  grant replication slave on *.* to bbs_slave@'192.168.111.%' identified by 'salve2004';
Query OK, 0 rows affected, 1 warning (0.16 sec)
mysql> flush privileges;

注意:其中relication slave是权限 bbs_slave 是账号名字

主库开启二进制日志和设置server_id

主要加入这些
#开启二进制日志并指定位置
log-bin=/data/mysql/logs/mysql-bin
#设置id
server-id=1

 

重启主库服务器;

[root@mysql.quan.bbs ~]$service mysqld restart
Shutting down MySQL.. SUCCESS! 
Starting MySQL.. SUCCESS!

 

查看master状态:

复制代码
mysql> show master status;
+------------------+----------+--------------+------------------+-------------------+
| File             | Position | Binlog_Do_DB | Binlog_Ignore_DB | Executed_Gtid_Set |
+------------------+----------+--------------+------------------+-------------------+
| mysql-bin.000001 |     1058 |              |                  |                   |
+------------------+----------+--------------+------------------+-------------------+
1 row in set (0.00 sec)
上面的File Position是后面需要用到的
复制代码

导出以存在的数据并复制到从库(这里只列出一库)

[root@mysql.quan.bbs data]$mysqldump -u root -p --all-databases >/tmp/2020.02.20.sql
Enter password: 
[root@mysql.quan.bbs data]$scp -P 20042 /tmp/2020.02.20.sql apps@192.168.111.153:/tmp
apps@192.168.111.153's password: 
2020.02.20.sql                                                       100% 3136KB   3.1MB/s   00:00    

 

 

 

两个从库都需要设置的

导入接受到的数据文件:

复制代码
[root@mysql.bktwo.quan.bbs tmp]$mysql -u root -p
Enter password: 
Welcome to the MySQL monitor.  Commands end with ; or \g.
Your MySQL connection id is 10
Server version: 5.7.29-log Source distribution

Copyright (c) 2000, 2020, Oracle and/or its affiliates. All rights reserved.

Oracle is a registered trademark of Oracle Corporation and/or its
affiliates. Other names may be trademarks of their respective
owners.

Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.

mysql> source /tmp/2020.02.20.sql
复制代码

 

修改配置文件:

主要加入这些
#开启二进制日志并指定位置
log-bin=/data/mysql/logs/mysql-bin
#设置id
server-id=33 #不能和master重复

 

重启服务器:

[root@mysql.bkone.quan.bbs data]$service mysqld restart

 

登陆数据库设置master信息:

建议先确保slave是停止的(stop slave)

复制代码
mysql> change master to
    ->  master_host='192.168.111.151',
    ->  master_user='bbs_slave',
    -> master_password='slave2004',
    ->  master_port=3306,
    -> master_log_file='mysql-bin.000001',
    ->  master_log_pos=1058;
Query OK, 0 rows affected, 2 warnings (0.01 sec)
复制代码

注意:有些数据是主库拿到的,master_log_file   master_log_pos

 

启动slave并查看状态:

复制代码
mysql> start slave;
Query OK, 0 rows affected (0.10 sec)
mysql> show slave status\G
*************************** 1. row ***************************
               Slave_IO_State: Waiting for master to send event
                  Master_Host: 192.168.111.151
                  Master_User: bbs_slave
                  Master_Port: 3306
                Connect_Retry: 60
              Master_Log_File: mysql-bin.000003
          Read_Master_Log_Pos: 154
               Relay_Log_File: mysql-relay-bin.000002
                Relay_Log_Pos: 320
        Relay_Master_Log_File: mysql-bin.000003
             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: 154
              Relay_Log_Space: 527
              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
                  Master_UUID: ad0e3900-4a82-11ea-927e-005056370631
             Master_Info_File: /data/mysql/data/master.info
                    SQL_Delay: 0
          SQL_Remaining_Delay: NULL
      Slave_SQL_Running_State: Slave has read all relay log; waiting for more updates
           Master_Retry_Count: 86400
                  Master_Bind: 
      Last_IO_Error_Timestamp: 
     Last_SQL_Error_Timestamp: 
               Master_SSL_Crl: 
           Master_SSL_Crlpath: 
           Retrieved_Gtid_Set: 
            Executed_Gtid_Set: 
                Auto_Position: 0
         Replicate_Rewrite_DB: 
                 Channel_Name: 
           Master_TLS_Version: 
1 row in set (0.00 sec)
复制代码

测试就主库创建一个数据库,去从库查看有无同步即可

按照上面的使M1和M2达到互为主从同步

 

配置keepalived高可用

M1 M2都需要安装

[root@mysql.bkone.quan.bbs ~]$yum install keepalived -y

先修改M1的配置文件:

[root@mysql.quan.bbs ~]$vim /etc/keepalived/keepalived.conf 


global_defs {
   router_id MYSQL_MM  # 标识
   vrrp_skip_check_adv_addr
   vrrp_strict        # 严格执行 VRRP 协议规范
   vrrp_garp_interval 0
   vrrp_gna_interval 0
}

vrrp_script check_mysql {
    script "/bin/sh /etc/keepalived/keepalived_mysql_check.sh"  # 检查脚本
    interval 10  # 检查周期
}

vrrp_instance MYSQL_MM {
    state BACKUP            # 都设为 BACKUP,避免起来后抢占
    interface eth0          # 网卡名称,根据实际情况填写
    virtual_router_id 222   # 用来区分 VRRP 组播的标记,取值 0-255
    priority 100
    advert_int 1
    nopreempt               # 设为非抢占
    authentication {
        auth_type PASS
        auth_pass 1111
    }

    virtual_ipaddress {
        192.168.111.123
    }

    # Slave 节点可以注释下面检查脚本,Slave 没有必要一直检查
    track_script {
        check_mysql
    }
}

 

M2的配置文件: 主要修改

virtual_router_id  nopreempt  priority 
global_defs {
   router_id MYSQL_MM  # 标识
   vrrp_skip_check_adv_addr
   vrrp_strict        # 严格执行 VRRP 协议规范
   vrrp_garp_interval 0
   vrrp_gna_interval 0
}

vrrp_script check_mysql {
    script "/bin/sh /etc/keepalived/keepalived_mysql_check.sh"  # 检查脚本
    interval 10  # 检查周期
}

vrrp_instance MYSQL_MM {
    state BACKUP            # 都设为 BACKUP,避免起来后抢占
    interface eth0          # 网卡名称,根据实际情况填写
    virtual_router_id 223   # 用来区分 VRRP 组播的标记,取值 0-255
    priority 99
    advert_int 1
 #   nopreempt               # 设为非抢占
    authentication {
        auth_type PASS
        auth_pass 1111
    }


    virtual_ipaddress {
        192.168.111.123
    }

    # Slave 节点可以注释下面检查脚本,Slave 没有必要一直检查
    track_script {
        check_mysql
    }
}

 

M1 M2都需要编写检测脚本:

#!/bin/bash
counter=$(netstat -an|grep "LISTEN"|grep "3306"|wc -l)

if [ "${counter}" -eq 0 ]; then
        /etc/init.d/keepalived stop
fi

 

测试:

#M1未关闭
[root@mysql.quan.bbs ~]$mysql -u bbs_slave -h 192.168.111.123 -p Enter password: Welcome to the MySQL monitor. Commands end with ; or \g. Your MySQL connection id is 648 Server version: 5.7.29-log Source distribution Copyright (c) 2000, 2020, Oracle and/or its affiliates. All rights reserved. Oracle is a registered trademark of Oracle Corporation and/or its affiliates. Other names may be trademarks of their respective owners. Type 'help;' or '\h' for help. Type '\c' to clear the current input statement. mysql> show variables like 'hostname'; +---------------+----------------+ | Variable_name | Value | +---------------+----------------+ | hostname | mysql.quan.bbs | +---------------+----------------+ 1 row in set (0.00 sec) mysql> exit Bye #M1关闭
[root@mysql.quan.bbs
~]$service mysqld stop Shutting down MySQL........... SUCCESS! [root@mysql.quan.bbs ~]$mysql -u bbs_slave -h 192.168.111.123 -p Enter password: Welcome to the MySQL monitor. Commands end with ; or \g. Your MySQL connection id is 105 Server version: 5.7.29-log Source distribution Copyright (c) 2000, 2020, Oracle and/or its affiliates. All rights reserved. Oracle is a registered trademark of Oracle Corporation and/or its affiliates. Other names may be trademarks of their respective owners. Type 'help;' or '\h' for help. Type '\c' to clear the current input statement. mysql> show variables like 'hostname'; +---------------+----------------------+ | Variable_name | Value | +---------------+----------------------+ | hostname | mysql.bkone.quan.bbs | +---------------+----------------------+ 1 row in set (0.01 sec) mysql> exit Bye #M1 重新开始
[root@mysql.quan.bbs
~]$service mysqld start Starting MySQL. SUCCESS! [root@mysql.quan.bbs ~]$mysql -u bbs_slave -h 192.168.111.123 -p Enter password: Welcome to the MySQL monitor. Commands end with ; or \g. Your MySQL connection id is 107 Server version: 5.7.29-log Source distribution Copyright (c) 2000, 2020, Oracle and/or its affiliates. All rights reserved. Oracle is a registered trademark of Oracle Corporation and/or its affiliates. Other names may be trademarks of their respective owners. Type 'help;' or '\h' for help. Type '\c' to clear the current input statement. mysql> show variables like 'hostname'; +---------------+----------------------+ | Variable_name | Value | +---------------+----------------------+ | hostname | mysql.bkone.quan.bbs | +---------------+----------------------+ 1 row in set (0.00 sec)

 

 

 

原理解析:

】双主KeepAlived

【4.0】概念

  MySQL的高可用方案有很多,比如Cluster、MMM、MHA、DRBD,以及Oracle官方推出的Fabric等,这些方案各有优劣,但都比较复杂,安装配置有一定难度,对线上库实施动静太大。就我们的具体情况而言,并不需要这么复杂的环境,实施简单、对现有架构影响最小、能迅速解决问题的方案才是最适合的。比如我们现在只是配置了MySQL Replication,加上如Keepalived这样的高可用软件,就能实现我们的需求。

        MySQL架构为Master/Slave,当Master故障时,虚IP漂移到Slave上提供服务,简单环境如图1所示。在这种架构中,故障自动切换以后,需要采取手动操作的方式与新的Master进行复制。当然也可以设置为Active-Passive模式下的双Master复制。

  

 

 

 

  

  利用KeepAlived实现故障转移(功能上类似于MSSQL的镜像,形式上类似于windows的故障转移群集)

【4.1】keepalived 简介

  (4.1.1)起源

  keepalived软件起初是专门为了LVS负载均衡软件设计的,用来管理并监控LVS集群系统中各个服务节点的状态,后台又加入了可以实现高可用的VRRP功能。(VRRP:全称 virtual router redundancy protocol,虚拟路由冗余协议)

  因此Keepalived除了能够管理LVS软件外,还可以作为其他服务(如:Nginx/Haproxy/Mysql)的高可用解决方案软件;

  (4.1.2)实现与组成

  keepalived 软件主要是通过VRRP协议实现高可用功能的。

  VRRP是 virtual route redundancyProtocol(虚拟路由器荣誉协议)的缩写,VRRP出现的目的就是为了解决静态路由单点故障问题,它能够保证当个别节点宕机时,整个网络可以不间断的运行。

  (4.1.3)常见运作场景

  一个web服务器至少有2台PC运行Keepalived,一台作为主服务器(master),一台作为备份服务器(Backup),但是对外表现为一个虚拟IP,在Keepalived服务政策工作时,主Master节点会不断地向备节点发送(多播的方式,组播地址为224.0.0.18)心跳消息,用以告诉备节点自己还活着。

  当主Master节点发生故障时,就无法发送心跳消息,备节点也就因此无法继续监测到来自主Master节点的心跳,于是调用自身接管程序,接管主Master节点的IP资源及服务。

  而当主Master节点恢复时,备Backup节点又会释放主节点故障时自身接管的IP资源及服务,恢复到原来的备用角色。(抢占模式)(也可以设置成非抢占模式,让其保持主,而不释放资源给原主,具体见4.1.7)

  所以,keepAlived,一方面具有配置管理LVS的功能,同时还具有对LVS下面节点进行健康检查的功能,另一方面也可以实现系统网络服务的高可用功能,而且Keepalived是可以工作在网络的 Layer3,4&7,即网络层(IP层),传输层(TCP层),及应用层,再后面就直接在很多场景下代替了原始的LVS软件方案。

  (4.1.4)keepalived服务的三个重要功能

    (1)管理LVS负载均衡软件

    (2)实现LVS集群节点的健康检查

    (3)作为系统网络服务的高可用性(failover)

  

  (4.1.5)Keepalived服务的工作原理

  Keepalived服务对之间通过VRRP进行通信的,VRRP是通过竞选机制来确定主备的(有点像故障转移群集中的投票仲裁形式),主的优先级高于备,因此工作时主会优先获得所有的资源,备节点处于等待状态,当主挂了的时候,备节点就会接管主节点的资源,然后顶替主节点对外服务。

  在Keepalived服务对之间,只有作为主的服务器会一直发送VRRP广播包,告诉备它还活着,此时备不会抢占主,当主不可用(也就是备没有受到VRRP广播包信息),就会启动相关服务接管资源,保证业务的连续性,接管速度最快可以小于1秒。

  (4.1.6)keepalived 的三个核心模块

    分别是core/check/vrrp

    core:keepalived的核心,负责主进程的启动、维护以及全局配置文件的加载和解析。

    check:负责健康检查,包括常见的各种检查方式。

    vrrp:是用来实现VRRP协议的;(VRRP:全称 virtual router redundancy protocol,虚拟路由冗余协议)

  (4.1.7)什么是VRRP?

  VRRP,全称 virtual router redundancy protocol,虚拟路由冗余协议。

  VRRP的出现就是为了解决静态路由的单点故障问题,VRRP是通过一种竞选机制来将路由的任务交给某台VRRP路由器的。 

  (1)VRRP是怎么解决通信问题的?

   在现实的网络环境中,两台需要通信的主机(end-host)大多数情况下并没有直接地物理连接。对于这样的情况,它们之间的路由怎么选择?通常有两种方法解决如何选定到达目的主机的下一跳路由问题:

    使用动态路由协议,如RIP、OSPF等。
    配置静态路由。

  
        很明显,在主机上配置动态路由,因为管理、维护成本以及是否支持等诸多问题是不切实际的。那么配置静态路由就变得很流行。

   实际上,这种方式一直沿用至今。但是,路由器,或者说默认网关(default gateway)却经常成为单故障点。就算配置了多个静态路由,却因为必须重启网络才能生效而变得不实用。

        VRRP(虚拟路由冗余协议,Virtual Router Redundancy Protocol)的目的就是为了解决静态路由单点故障问题。

  它通过一种竞选(election)协议动态地将路由任务交给LAN中虚拟路由器中的某台VRRP路由器。这里有两个关键名词:VRRP路由器和虚拟路由器。

    VRRP路由器:VRRP路由器就是一台路由器,只不过上面运行了VRRPD程序来实现VRRP协议而已,是物理的路由器。一台VRRP路由器可以位于多个虚拟路由器中。
    虚拟路由器:所谓虚拟,就是说并不是实际存在的,是一个逻辑而不是物理的路由器。

          虚拟路由器通常由多台VRRP路由器通过某种方式组成,就好像将这些物理路由器都丢到一个池里面去,整个池对外看起来就像是一台路由器,但其实内部有多台。虚拟路由器的标识称为VRID。
                在一个VRRP虚拟路由中,有多台物理的VRRP路由器,但是这多台物理路由并不同时工作,而是由一台称为master的负责路由工作,其它的都是backup。

          master并非一成不变,VRRP协议让每个VRRP路由器参与竞选,最终获胜的就是master。master有一些特权,比如拥有虚拟路由器的IP地址,我们的主机就是用这个IP地址作为静态路由的。

          拥有特权的master要负责转发发送给网关地址的包和响应ARP请求。

 

  (2)VRRP的工作机制
        VRRP通过竞选协议来实现虚拟路由器的功能,所有的协议报文都是通过IP多播(multicast)包形式发送的,多播地址为224.0.0.18。虚拟路由器由VRID(范围0-255)和一组IP地址组成,对外表现为一个众所周知的MAC地址:00-00-5E-00-01-{VRID}。所以,在一个虚拟路由器中,不管谁是master,对外都是相同的MAC和IP(称之为VIP)。客户端主机并不需要因为master的改变而修改自己的路由配置,对它们来说,这种主从的切换是透明的。

        在一个虚拟路由器中,只有作为master的VRRP路由器会一直发送VRRP广告包(VRRP Advertisement Message),backup不会抢占master,除非它的优先级更高。

  当master不可用时,backup收不到广告包,多台backup中优先级最高的这台会抢占为master。这种抢占是非常快速的(<1秒),以保证服务的连续性。出于安全性考虑,VRRP包使用了加密协议进行加密

  (3)keepalived的实现模式

  Keepalived通过组播(默认)、单播(自定义),实现keepalived主备推选,工作模式分为抢占和非抢占。

  《1》抢占模式

    主服务器正常工作时,虚拟IP会在主上,备不提供服务,当主服务优先级低于备的时候,备会自动抢占虚拟IP,这时,主提供服务,备提供服务。

    也就是说,抢占模式下,不分主备,只管优先级。

    不管 keepalived.conf 里的 state 配置成 master 还是 backup ,只看谁的priority 优先级高, priority 优先级高的那一个,在故障恢复后,会自动将VIP资源再次抢回来。

  《2》非抢占模式

    这种方式通过参数nopreempt(一般设置在advert_int 的那一行下面)来控制。不管priority优先级,只要master机器发生故障,VIP资源就会被切换到backup上。

    并且,当master机器恢复后,也不会将VIP资源抢回来。除非Backup机器发生故障,才能自动把VIP等资源切换会主库。

    

    nopreempt 这个参数只能用户state为backup的情况,所以在配置的时候要把master和backup的state都设置成backup,这样才会实现keepalived的非抢占模式!

    也就是说

    a)当state状态一个为master,一个为backup的时候,加不加nopreempt 这个参数都是一样的效果。

      即都是根据priority优先级来决定谁抢占VIP资源,属于抢占模式!

    b)当state状态都设置成backup,如果不配置nopreempt参数。

      也是根据priority优先级来决定谁抢占VIP资源,属于抢占模式!

    c)当state状态都设置成backup,如果配置了 nopreempt 参数,那么久不会去考虑priority优先级了。

      是非抢占模式! 即只有VIP当前所在机器发生故障,另一台机器才能接管VIP。 不考虑优先级问题。

 

 

【4.2】Keepalived在MySQL上有什么作用?

  mysql双主复制,即互为Master-Slave(只有一个Master提供写操作),可以实现数据库服务器的热备。

  但一个Master宕机后不能实现动态切换,使用Keepalived,可以通过虚拟IP,实现双主对外的统一接口以及自动检查、失败切换机制,从而实现MySQL数据库的高可用方案。

 

  《1》架构1:主备集群架构(双主HA+keepalived)

  方案:mysql 双主 或者 主从+keepalived 主从自动切换

  服务器:2台PC

  优点:架构简单,节省资源

  缺点:无法线性扩展,主从失败后需要手动恢复主从架构

posted @ 2020-03-09 14:26  linux——quan  阅读(363)  评论(0编辑  收藏  举报