zoukankan      html  css  js  c++  java
  • Mysql主从高可用方案

    MySQL-Replication+keepalived

    背景描述:因萤石项目组需要一套保证数据高可用性方案,故研究了MySQL-Replication+keepalived来做数据的高可用性。

    1.1MySQL Replication

    主从复制(也称 AB 复制)允许将来自一个MySQL数据库服务器(主服务器)的数据复制到一个或多个MySQL数据库服务器(从服务器)。
    复制是异步的 从站不需要永久连接以接收来自主站的更新。
    根据配置,您可以复制数据库中的所有数据库,所选数据库甚至选定的表。
    MySQL中复制的优点包括:
    •    横向扩展解决方案 - 在多个从站之间分配负载以提高性能。在此环境中,所有写入和更新都必须在主服务器上进行。但是,读取可以在一个或多个从设备上进行。该模型可以提高写入性能(因为主设备专用于更新),同时显着提高了越来越多的从设备的读取速度。
    •    数据安全性 - 因为数据被复制到从站,并且从站可以暂停复制过程,所以可以在从站上运行备份服务而不会破坏相应的主数据。
    •    分析 - 可以在主服务器上创建实时数据,而信息分析可以在从服务器上进行,而不会影响主服务器的性能。
    •    远程数据分发 - 您可以使用复制为远程站点创建数据的本地副本,而无需永久访问主服务器。

    主服务器上面的任何修改都会通过自己的 I/O tread(I/O 线程)保存在二进制日志 Binary log 里面。

    从服务器上面也启动一个 I/O thread,通过配置好的用户名和密码, 连接到主服务器上面请求读取二进制日志,然后把读取到的二进制日志写到本地的一个Realy log(中继日志)里面。

    从服务器上面同时开启一个 SQL thread 定时检查 Realy log(这个文件也是二进制的),如果发现有更新立即把更新的内容在本机的数据库上面执行一遍。

    每个从服务器都会收到主服务器二进制日志的全部内容的副本。

    从服务器设备负责决定应该执行二进制日志中的哪些语句。

    除非另行指定,否则主从二进制日志中的所有事件都在从站上执行。

    如果需要,您可以将从服务器配置为仅处理一些特定数据库或表的事件。

    重要: 您无法将主服务器配置为仅记录特定事件。

    每个从站(从服务器)都会记录二进制日志坐标:

         文件名

         文件中它已经从主站读取和处理的位置。

    由于每个从服务器都分别记录了自己当前处理二进制日志中的位置,因此可以断开从服务器的连接,重新连接然后恢复继续处理。

    1.1.1一主多从

    如果一主多从的话,这时主库既要负责写又要负责为几个从库提供二进制日志。此时可以稍做调整,将二进制日志只给某一从,这一从再开启二进制日志并将自己的二进制日志再发给其它从。或者是干脆这个从不记录只负责将二进制日志转发给其它从,这样架构起来性能可能要好得多,而且数据之间的延时应该也稍微要好一些。工作原理图如下:

    1.1.2关于二进制日志

    mysqld将数字扩展名附加到二进制日志基本名称以生成二进制日志文件名。每次服务器创建新日志文件时,该数字都会增加,从而创建一系列有序的文件。每次启动或刷新日志时,服务器都会在系列中创建一个新文件。服务器还会在当前日志大小达到max_binlog_size参数设置的大小后自动创建新的二进制日志文件 。二进制日志文件可能会比max_binlog_size使用大型事务时更大, 因为事务是以一个部分写入文件,而不是在文件之间分割。
    为了跟踪已使用的二进制日志文件,mysqld还创建了一个二进制日志索引文件,其中包含所有使用的二进制日志文件的名称。默认情况下,它具有与二进制日志文件相同的基本名称,并带有扩展名'.index'。在mysqld运行时,您不应手动编辑此文件。
    术语二进制日志文件通常表示包含数据库事件的单个编号文件。
    术语二进制日志表示含编号的二进制日志文件集加上索引文件。
    SUPER权限的用户可以使用SET sql_log_bin=0语句禁用其当前环境下自己的语句的二进制日志记录

    1.2配置Replication

    1.2.1相关准备

    mysql1:192.168.10.120  ----master
    mysql2:192.168.10.130  ----slave
    VIP:    192.168.10.125  
    主机名和hosts配置
    在192.168.10.120服务器上
    [root@localhost ~]# hostnamectl set-hostname mysql1
    [root@mysql1 ~]# vim /etc/hosts
    192.168.10.120 mysql1
    192.168.10.130 mysql2
    在192.168.10.130服务器上
    [root@localhost ~]# hostnamectl set-hostname mysql2
    [root@mysql2 ~]# vim /etc/hosts
    192.168.10.120 mysql1
    192.168.10.130 mysql2

    1.2.2配置步骤:

    1. 在主服务器上,您必须启用二进制日志记录并配置唯一的服务器ID。需要重启服务器。
    编辑主服务器的配置文件 `my.cnf`,添加如下内容
    [root@mysql1 ~]# vim /etc/my.cnf
    [mysqld]
    log-bin=/var/log/mysql/mysql-bin
    server-id=1
    创建日志目录并赋予权限
    [root@mysql1 ~]#  mkdir /var/log/mysql
    [root@mysql1 ~]#  chown mysql.mysql /var/log/mysql
    重启服务
    [root@mysql1 ~]#  systemctl restart mysqld 
    注意
    如果省略server-id(或将其显式设置为默认值0),则主服务器拒绝来自从服务器的任何连接。
    
    为了在使用带事务的InnoDB进行复制设置时尽可能提高持久性和一致性,
    您应该在master my.cnf文件中使用以下配置项:
    innodb_flush_log_at_trx_commit = 1
    sync_binlog = 1
    
    确保未在复制主服务器上启用skip-networking选项。
    如果已禁用网络,则从站无法与主站通信,并且复制失败。
    2.应该创建一个专门用于复制数据的用户
    每个从服务器需要使用MySQL 主服务器上的用户名和密码连接到主站。
    例如,计划使用用户 `test` 可以从任何主机上连接到 `master` 上进行复制操作, 并且用户 test 仅可以使用复制的权限。
    在主服务器上执行如下操作
    [root@mysql1 ~]#
    MariaDB [(none)]> CREATE USER 'test'@'%' 
    MariaDB [(none)]> GRANT REPLICATION SLAVE ON *.*  TO  'test'@'%'  identified by '123';
    3.在从服务器上使用刚才的用户进行测试连接
    [root@mysql2 ~]# mysql -utest -p'123' –hmysql1
    Welcome to the MariaDB monitor.  Commands end with ; or g.
    Your MariaDB connection id is 171
    Server version: 10.3.9-MariaDB-log MariaDB Server
    
    Copyright (c) 2000, 2018, Oracle, MariaDB Corporation Ab and others.
    
    Type 'help;' or 'h' for help. Type 'c' to clear the current input statement.
    
    MariaDB [(none)]> show databases;
    +--------------------+
    | Database           |
    +--------------------+
    | information_schema |
    +--------------------+
    1 row in set (0.001 sec)
    
    MariaDB [(none)]>
    [root@mysql2 ~]# mysql -u用户 -p密码 -h主ip

    1.2.3下面的操作根据如下情况继续

    1.2.3.1主中有数据
    如果在启动复制之前有现有数据需要与从属设备同步,请保持客户端正常运行,以便锁定保持不变。这可以防止进行任何进一步的更改,以便复制到从站的数据与主站同步。
    1. 在主服务器中导出先有的数据
    如果主数据库包含现有数据,则必须将此数据复制到每个从站。有多种方法可以实现:
    使用mysqldump工具创建要复制的所有数据库的转储。这是推荐的方法,尤其是在使用时 InnoDB
    [root@mysql1 ~]# mysqldump  -u用户名  -p密码  --all-databases  --master-data=1 > dbdump.db
    这里的用户是主服务器的用户
    如果不使用 --master-data 参数,则需要手动锁定单独会话中的所有表。
    
    2.从主服务器中使用 scp 或 rsync 等工具,把备份出来的数据传输到从服务器中。
    在主服务中执行如下命令
    [root@mysql1~]# scp  dbdump.db root@mysql2:/root/
    这里的 mysql2 需要能被主服务器解析出 IP 地址,或者说可以在主服务器中 ping 通。
    
    3.配置从服务器,并重启
    在从服务器上编辑其配置文件my.cnf并添加如下内容
    [root@mysql2 ~]# vim /etc/my.cnf
    [mysqld]
    server-id=2
    
    4.导入数据到从服务器,并配置连接到主服务器的相关信息
    登录到从服务器上,执行如下操作
    [root@mysql2 ~]# mysql> source   /root/dbdump.db  或
    [root@mysql2 ~]# mysql -uroot -p123 < /root/dbdump.db
    
    5在从服务器配置连接到主服务器的相关信息登录到从服务器上
    [root@mysql2 ~]# mysql –uroot –p123
    MariaDB [(none)]> CHANGE MASTER TO
    MASTER_HOST='mysql1,  -- 主服务器的主机名(也可以是 IP) 
    MASTER_USER='test',           -- 连接到主服务器的用户
    MASTER_PASSWORD='123';        -- 到主服务器的密码
    
    6. 启动从服务器的复制线程
    MariaDB [(none)]> start slave;
    Query OK, 0 rows affected (0.09 sec)
    检查是否成功
    在从服务上执行如下操作,加长从服务器端 IO线程和 SQL 线程是否是 `OK`
    MariaDB [(none)]> show slave statusG
    输出结果中应该看到 I/O 线程和 SQL 线程都是 `YES`, 就表示成功。
    执行此过程后,在主服务上操作的修改数据的操作都会在从服务器中执行一遍,这样就保证了数据的一致性。
    最后的效果应为:
    Slave_IO_Running: Yes
    Slave_SQL_Running: Yes
    1.2.3.2主服务器中无数据
    主服务器配置
    1.    my.cnf配置文件
    [root@mysql1 ~]# vim /etc/my.cnf
    [mysqld]
    log-bin=/var/log/mysql/mysql-bin
    server-id=1
    
    2.    创建日志目录并赋予权限
    [root@mysql1 ~]#  mkdir /var/log/mysql
    [root@mysql1 ~]#  chown mysql.mysql /var/log/mysql
    
    3.    重启服务
    [root@mysql1 ~]#  systemctl restart mysqld 
    从服务器设置
    4配置从服务器,并重启
    在从服务器上编辑其配置文件my.cnf并添加如下内容
    [root@mysql2 ~]# vim /etc/my.cnf
    [mysqld]
    server-id=2
    [root@mysql2~]#  systemctl restart mysqld 
    
    5.查看主服务器的二进制日志的名称
    通过使用命令行客户端连接到主服务器来启动主服务器上的会话,并通过执行以下 `FLUSH TABLES WITH READ LOCK`  语句来刷新所有表和阻止写语句:
    [root@mysql1 ~]# mysql –uroot –p123
    MariaDB [(none)]> FLUSH TABLES WITH READ LOCK;
    Query OK, 0 rows affected (0.000 sec)
    
    MariaDB [(none)]> show master status G
    *************************** 1. row ***************************
                File: mysql-bin.000010
            Position: 473
        Binlog_Do_DB: 
    Binlog_Ignore_DB: 
    1 row in set (0.000 sec)
    MariaDB [(none)]>
    
    
    
    6在从服务器的 mariadb 中执行如下语句
    MariaDB [(none)]> CHANGE MASTER TO
    MASTER_HOST='mysql1',
    MASTER_USER='test',
    MASTER_PASSWORD='123',
    MASTER_LOG_FILE=' mysql-bin.000010',
    MASTER_LOG_POS=0;
    启动从服务器的复制线程
    MariaDB [(none)]> start slave;
    Query OK, 0 rows affected (0.09 sec)
    检查是否成功
    在从服务上执行如下操作,加长从服务器端 IO线程和 SQL 线程是否是 `OK`
    MariaDB [(none)]> show slave statusG
    输出结果中应该看到 I/O 线程和 SQL 线程都是 `YES`, 就表示成功。
    执行此过程后,在主服务上操作的修改数据的操作都会在从服务器中执行一遍,这样就保证了数据的一致性。
    最后的效果应为:
    Slave_IO_Running: Yes
    Slave_SQL_Running: Yes
    
    
    7.查看
    在master上执行show binlog events命令,可以看到第一个binlog文件的内容
    MariaDB [(none)]> show binlog eventsG
    *************************** 1. row ***************************
       Log_name: mysql-bin.000001
            Pos: 4
     Event_type: Format_desc
      Server_id: 1
    End_log_pos: 256
           Info: Server ver: 10.3.9-MariaDB-log, Binlog ver: 4
    *************************** 2. row ***************************
       Log_name: mysql-bin.000001
            Pos: 256
     Event_type: Gtid_list
      Server_id: 1
    End_log_pos: 285
           Info: []
    *************************** 3. row ***************************
    Log_name 是二进制日志文件的名称,一个事件不能横跨两个文件
    Pos 这是该事件在文件中的开始位置
    Event_type 事件的类型,事件类型是给slave传递信息的基本方法,每个新的binlog都以Format_desc类型开始,以Rotate类型结束
    Server_id 创建该事件的服务器id
    End_log_pos 该事件的结束位置,也是下一个事件的开始位置,因此事件范围为Pos~End_log_pos  -  1
    Info 事件信息的可读文本,不同的事件有不同的信息
    
    8. 在从站上暂停复制
    可以使用STOP SLAVE和 START SLAVE语句停止并启动从站上的复制 。
    要停止从主服务器处理二进制日志,请使用 STOP SLAVE:
    MariaDB [(none)]> STOP SLAVE;
    当复制停止时,从I / O线程停止从主二进制日志读取事件并将它们写入中继日志,并且SQL线程停止从中继日志读取事件并执行它们。您可以通过指定线程类型单独暂停I / O或SQL线程:
    MariaDB [(none)]> STOP SLAVE IO_THREAD;
    MariaDB [(none)]> STOP SLAVE SQL_THREAD;
    要再次开始执行,请使用以下START SLAVE语句:
    MariaDB [(none)]> START SLAVE;
    要启动特定线程,请指定线程类型:
    MariaDB [(none)]> START SLAVE IO_THREAD;
    MariaDB [(none)]> START SLAVE SQL_THREAD;
    1.2.3.3关于Slave_IO_Running:     Slave_SQL_Running:的解决方法
    若出现:
    Slave_IO_Running: Connecting
    Slave_SQL_Running: Yes
    可能是主配置文件里面的权限问题,若是这样则在主机中更改权限配置
    GRANT ALL PRIVILEGES ON *.* TO '用户'@'IP' IDENTIFIED BY '密码';
    更改完成后刷新服务:systemctl restart mysqld
    在从中:stop slave; start salve;
    检查是否成功:MariaDB [(none)]> show slave statusG
    也有可能是从配置文件出错,则在从里面更改配置文件;
    最后的效果应为:
    Slave_IO_Running: Yes
    Slave_SQL_Running: Yes
    
    
    若出现:
    Slave_IO_Running: no
    Slave_SQL_Running: Yes
    则可能是
    [root@mysql1 ~]# vim /usr/local/mysqld/data/auto.cnf中主从的UUID相同
    更改文件中的UUID刷新即可。
    
    检查主从server_id
    主库:
    MariaDB [(none)]>  show variables like 'server_id';
    +---------------+-------+
    | Variable_name | Value |
    +---------------+-------+
    | server_id     | 1     |
    +---------------+-------+
    1 row in set (0.01 sec)
    ————————————————
    
    从库:
    MariaDB [(none)]>  show variables like 'server_id';
    +---------------+-------+
    | Variable_name | Value |
    +---------------+-------+
    | server_id     | 1     |
    +---------------+-------+
    1 row in set (0.01 sec)
    ————————————————
    若slave节点/etc/my.cnf文件中已存在server-id=2,则重启mysql(systemctl restart mysqld)即可;
    若不存在,则加上重启即可。
    
    也有可能是因为主从日志号不同而导致
    查看主日志号show master statusG
       File :mysql-bin.000007
     在从中查看slave日志文件号show slave statusG
       File :mysql-bin.000005
    发现是因为主从日志文件号不同而导致 
    在从中stop slave;
     CHANGE MASTER TO MASTER_LOG_FILE='mysql-bin.000026', MASTER_LOG_POS=0; 
     flush privileges;
     start slave;
    show slave statusG
    
    若出现:
    Slave_IO_Running: Yes
    Slave_SQL_Running: No
    解决方法一:
    可能是slave机器重起后,事务回滚造成的.
    MariaDB [(none)]> stop slave ;
    MariaDB [(none)]> set GLOBAL SQL_SLAVE_SKIP_COUNTER=1;    #客户端运行,用来跳过几个事件,只有当同步进程出现错误而停止的时候才可以执行。
    MariaDB [(none)]> start slave ;
    
    解决办法二、
    
    首先停掉Slave服务:slave stop
    到主服务器上查看主机状态:
    记录File和Position对应的值
    
    进入master
    
    mysql> show master status;
    +----------------------+----------+--------------+------------------+
    | File                 | Position | Binlog_Do_DB | Binlog_Ignore_DB |
    +----------------------+----------+--------------+------------------+
    | localhost-bin.000094 | 33622483 |              |                  | 
    +----------------------+----------+--------------+------------------+
    1 row in set (0.00 sec)
    
     然后到slave服务器上执行手动同步:
    mysql> change master to 
    > master_host='master_ip',
    > master_user='user', 
    > master_password='pwd', 
    > master_port=3306, 
    > master_log_file=localhost-bin.000094', 
    > master_log_pos=33622483 ;
    1 row in set (0.00 sec)
    MariaDB [(none)]> start slave ;
    其他问题:https://www.cnblogs.com/wangxin37/p/6398755.html

    2.1 keepalived 高可用

    2.1.1 Keepalived VRRP 介绍

    Virtual Route Redundancy Protocol,即虚拟路由冗余协议。它主要是实现路由器高可用的容错协议。
    将多台路由器组成路由器组(Router Group),组中包括Master及Backup,在外部看来就像一台路由
    器,拥有一个VIP。Master会发送组播消息,当Backup在指定的时间收不到vrrp包就会认为master宕掉,
    然后通过VRRP协议再次竞选新的路由器当Master,从而保证路由器的高可用。
    
    在VRRP协议实现中,虚拟路由器使用00-00-5E-00-01-XX作为虚拟MAC地址,XX就是唯一的VRID。

    2.2相关步骤

    一、安装keepalived 
    二、keepalived 主备配置文件
    三、mysql状态检测脚本/etc/keepalived/keepalived_check_mysql.sh
    四、检测与恢复
    注 keepalived之间使用vrrp组播方式通信使用的IP地址是192.168.10.125  
    2.2.1 安装keepalived
    yum安装
    [root@mysql1 ~]# yum -y install keepalived
    [root@mysql2 ~]# yum -y install keepalived
    2.2.2配置keepalived
    192.168.10.120 Master配置
    [root@mysql1 ~]# vim /etc/keepalived/keepalived.conf
    ! Configuration File for keepalived
    
    global_defs {
       router_id mysql1
    }
    
    vrrp_script check_run {
       script "/root/keepalived_check_mysql.sh"
       interval 5
    }
    
    vrrp_instance VI_1 {
        state MASTER
        interface eth0   #设置实例绑定的网卡 VRRP心跳包从哪块网卡发出
        virtual_router_id 88 #组ID
        priority 100 #优先级别,高优先级竞选为master
        advert_int 1 检查间隔,默认1秒 VRRP心跳包的发送周期,单位为s; 组播信息发送间隔,两个节点设置必须一样
        authentication { #设置认证
            auth_type PASS  #认证方式
            auth_pass 12345 #认证密码(密码只识别前8位)
        }
    
        track_script {
            check_run
        }
    
        virtual_ipaddress {
            192.168.10.125 #VIP
        }
    }
    
    =====================================================================
    
    
    
    192.168.10.130 Slave配置
     [root@mysql2 ~]# vim /etc/keepalived/keepalived.conf
    =====================================================================
    ! Configuration File for keepalived
    
    global_defs {
       router_id mysql2
    }
    
    vrrp_script check_run {
       script "/root/keepalived_check_mysql.sh"
       interval 5
    }
    
    vrrp_instance VI_1 {
        state BACKUP
        interface eth0
        virtual_router_id 88
        priority 50
        advert_int 1
        authentication {
            auth_type PASS
            auth_pass 12345
        }
    
        track_script {
            check_run
        }
    
        virtual_ipaddress {
            192.168.10.125
        }
    }
    2.2.3keepalived 主备配置文件
    版本一:简单使用:
    [root@mysql1  ~]#  vim /etc/keepalived/keepalived_check_mysql.sh
    #!/bin/bash
    /usr/bin/mysql -uroot -p123 -e "show status" &>/dev/null 
    if [ $? -ne 0 ] ;then 
        service keepalived stop
    fi 
    
    版本二:检查多次:
    [root@mysql1  ~]#  vim /etc/keepalived/keepalived_check_mysql.sh
    #!/bin/bash 
    MYSQL=/usr/bin/mysql
    MYSQL_HOST=localhost 
    MYSQL_USER=root 
    MYSQL_PASSWORD=123
    CHECK_TIME=3
    
    #mysql  is working MYSQL_OK is 1 , mysql down MYSQL_OK is 0 
    MYSQL_OK=1
     
    check_mysql_helth (){ 
        $MYSQL -h $MYSQL_HOST -u $MYSQL_USER -p${MYSQL_PASSWORD} -e "show status" &>/dev/null 
        if [ $? -eq 0 ] ;then 
            MYSQL_OK=1
        else 
            MYSQL_OK=0 
        fi 
        return $MYSQL_OK 
    }
     
    while [ $CHECK_TIME -ne 0 ]
    do 
        check_mysql_helth 
        if [ $MYSQL_OK -eq 1 ] ; then 
                exit 0 
        fi
     
        if [ $MYSQL_OK -eq 0 ] &&  [ $CHECK_TIME -eq 1 ];then
                 /etc/init.d/keepalived stop                    
                 exit 1                                
         fi                                        
        let CHECK_TIME--
         sleep 1 
    done
    [root@mysql1  ~]#  chmod 755 /etc/keepalived/keepalived_check_mysql.sh
    [root@mysql2  ~]#  chmod 755 /etc/keepalived/keepalived_check_mysql.sh
    两边均启动keepalived
    [root@mysql1 ~]# systemctl start keepalived
    [root@mysql1 ~]# systemctl enable keepalived
    [root@mysql2 ~]# systemctl start keepalived
    [root@mysql2 ~]# systemctl enable keepalived
    2.2.4 检测与恢复
    开启keepalived后主中检查
    [root@mysql1 ~]# ip a
    1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000
        link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
        inet 127.0.0.1/8 scope host lo
           valid_lft forever preferred_lft forever
        inet6 ::1/128 scope host 
           valid_lft forever preferred_lft forever
    2: ens33: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP group default qlen 1000
        link/ether 00:0c:29:11:fc:e8 brd ff:ff:ff:ff:ff:ff
        inet 192.168.10.120/24 brd 192.168.10.255 scope global noprefixroute dynamic ens33
           valid_lft 1412sec preferred_lft 1412sec
        inet 192.168.10.125/32 scope global ens33
           valid_lft forever preferred_lft forever
        inet6 fe80::bc23:8c3:3e65:9409/64 scope link noprefixroute 
           valid_lft forever preferred_lft forever 
    开启keepalived后从中检查
    
    [root@mysql2 ~]# ip a
    1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000
        link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
        inet 127.0.0.1/8 scope host lo
           valid_lft forever preferred_lft forever
        inet6 ::1/128 scope host 
           valid_lft forever preferred_lft forever
    2: ens33: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP group default qlen 1000
        link/ether 00:0c:29:1a:47:ab brd ff:ff:ff:ff:ff:ff
        inet 192.168.10.130/24 brd 192.168.10.255 scope global noprefixroute dynamic ens33
           valid_lft 1387sec preferred_lft 1387sec
        inet6 fe80::bc23:8c3:3e65:9409/64 scope link tentative noprefixroute dadfailed 
           valid_lft forever preferred_lft forever
        inet6 fe80::e6bc:d8b3:5b9a:d738/64 scope link noprefixroute 
           valid_lft forever preferred_lft forever
    此时可以发现VIP192.168.10.125在mysql1服务器上。
    
    将主中mariadb停止,观看VIP是否会飘到从节点。
    [root@mysql1 ~]# systemctl stop mysqld
    Mysql1节点观察
    [root@mysql1 ~]# ip a
    1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000
        link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
        inet 127.0.0.1/8 scope host lo
           valid_lft forever preferred_lft forever
        inet6 ::1/128 scope host 
           valid_lft forever preferred_lft forever
    2: ens33: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP group default qlen 1000
        link/ether 00:0c:29:11:fc:e8 brd ff:ff:ff:ff:ff:ff
        inet 192.168.10.120/24 brd 192.168.10.255 scope global noprefixroute dynamic ens33
           valid_lft 1690sec preferred_lft 1690sec
        inet6 fe80::bc23:8c3:3e65:9409/64 scope link noprefixroute 
           valid_lft forever preferred_lft forever
    Mysql2节点观察
    [root@mysql2 ~]# ip a
    1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000
        link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
        inet 127.0.0.1/8 scope host lo
           valid_lft forever preferred_lft forever
        inet6 ::1/128 scope host 
           valid_lft forever preferred_lft forever
    2: ens33: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP group default qlen 1000
        link/ether 00:0c:29:1a:47:ab brd ff:ff:ff:ff:ff:ff
        inet 192.168.10.130/24 brd 192.168.10.255 scope global noprefixroute dynamic ens33
           valid_lft 1615sec preferred_lft 1615sec
        inet 192.168.10.125/32 scope global ens33
           valid_lft forever preferred_lft forever
        inet6 fe80::bc23:8c3:3e65:9409/64 scope link tentative noprefixroute dadfailed 
           valid_lft forever preferred_lft forever
        inet6 fe80::e6bc:d8b3:5b9a:d738/64 scope link noprefixroute 
           valid_lft forever preferred_lft forever
    
    此时可以发现VIP已经飘到mysql2节点上。
    [root@mysql ~]# mysql -uroot -p123
    Welcome to the MariaDB monitor.  Commands end with ; or g.
    Your MariaDB connection id is 680
    Server version: 10.3.9-MariaDB MariaDB Server
    
    Copyright (c) 2000, 2018, Oracle, MariaDB Corporation Ab and others.
    
    Type 'help;' or 'h' for help. Type 'c' to clear the current input statement.
    
    MariaDB [(none)]> show databases;
    +--------------------+
    | Database           |
    +--------------------+
    | alisa              |
    | information_schema |
    | mysql              |
    | performance_schema |
    | test               |
    +--------------------+
    5 rows in set (0.001 sec)
    
    MariaDB [(none)]>
    已验证从数据库中与主数据库相同
    
    恢复
    [root@mysql1 ~]# systemctl start mysqld
    [root@mysql1 ~]# ip a
    1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000
        link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
        inet 127.0.0.1/8 scope host lo
           valid_lft forever preferred_lft forever
        inet6 ::1/128 scope host 
           valid_lft forever preferred_lft forever
    2: ens33: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP group default qlen 1000
        link/ether 00:0c:29:11:fc:e8 brd ff:ff:ff:ff:ff:ff
        inet 192.168.10.120/24 brd 192.168.10.255 scope global noprefixroute dynamic ens33
           valid_lft 1412sec preferred_lft 1412sec
        inet 192.168.10.125/32 scope global ens33
           valid_lft forever preferred_lft forever
        inet6 fe80::bc23:8c3:3e65:9409/64 scope link noprefixroute 
           valid_lft forever preferred_lft forever 
    开启keepalived后从中检查
    
    [root@mysql2 ~]# ip a
    1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000
        link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
        inet 127.0.0.1/8 scope host lo
           valid_lft forever preferred_lft forever
        inet6 ::1/128 scope host 
           valid_lft forever preferred_lft forever
    2: ens33: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP group default qlen 1000
        link/ether 00:0c:29:1a:47:ab brd ff:ff:ff:ff:ff:ff
        inet 192.168.10.130/24 brd 192.168.10.255 scope global noprefixroute dynamic ens33
           valid_lft 1387sec preferred_lft 1387sec
        inet6 fe80::bc23:8c3:3e65:9409/64 scope link tentative noprefixroute dadfailed 
           valid_lft forever preferred_lft forever
        inet6 fe80::e6bc:d8b3:5b9a:d738/64 scope link noprefixroute 
           valid_lft forever preferred_lft forever
    此时可以发现VIP192.168.10.125飘回mysql1服务器上,mysql2服务器恢复原状。
  • 相关阅读:
    openOPC与监控页面二
    Node教程——Gulp前端构建工具-教程
    回到顶部插件
    《软件测试52讲》——测试基础知识篇
    计算贝塞尔曲线上点坐标
    少年,不要滥用箭头函数啊
    JS属性defer
    leetcode-572-另一个树的子树
    leetcode-9.-回文数
    leetcode-300-最长上升子序列
  • 原文地址:https://www.cnblogs.com/alisapine/p/13517691.html
Copyright © 2011-2022 走看看