作者:管理员  历史版本:1  更新时间:2024-05-13 18:33

主从复制的方式

MySQL 5.6 开始主从复制有两种方式:基于日志binlog)和 基于 GTID全局事务标示符)。

本文只涉及基于日志 binlog主从配置

主从复制的流程

MySQL 同步操作通过 3 个线程实现,其基本步骤如下:

  1. 主服务器 将数据的更新记录到 二进制日志Binary log)中,用于记录二进制日志事件,这一步由 主库线程 完成;
  2. 从库主库二进制日志 复制到本地的 中继日志Relay log),这一步由 从库 I/O 线程 完成;
  3. 从库 读取 中继日志 中的 事件,将其重放到数据中,这一步由 从库 SQL 线程 完成。

基于Docker的MySQL主从集群搭建

环境

keepalivemysqlvip:192.168.64.100
keepalivemysqlmaster:192.168.64.133
keepalivemysqlslave:192.168.64.132

#配置开始前,先关闭双方的firewalld服务以及selinux

分别在master和slave服务器中创建mysql的映射目录:

$ mkdir -p /root/mysql/data /root/mysql/logs /root/mysql/conf

配置文件

  • 在master服务器中创建配置

    my.cnf配置文件内容如下:

    [mysqld]
    log-bin=mysql-bin #开启二进制日志
    server-id=1 #设置server-id,唯一值,标识主机
    default-storage-engine = INNODB
    character-set-server = utf8
    collation-server = utf8_general_ci
    max_connections = 1024 # 最大连接数量
    max_allowed_packet = 64M
    lower_case_table_names = 1 # 关闭大小写敏感
    innodb_buffer_pool_size = 256M
    join_buffer_size = 256M
    read_rnd_buffer_size = 16M
    sort_buffer_size = 16M
  • 在slave服务器中创建配置

    my.cnf配置文件内容如下:

    [mysqld]
    server-id=2
    default-storage-engine = INNODB
    character-set-server = utf8
    collation-server = utf8_general_ci
    max_connections = 1024 # 最大连接数量
    max_allowed_packet = 64M
    lower_case_table_names = 1 # 关闭大小写敏感
    innodb_buffer_pool_size = 256M
    join_buffer_size = 256M
    read_rnd_buffer_size = 16M
    sort_buffer_size = 16M

执行完以上命令后,masterslave服务器的工作目录下应有以下文件和目录:

/root/mysql
├── conf
│   └── my.cnf
├── data
├── logs

启动

  • 在master服务器中启动master节点

    $ docker run -p 3306:3306 --name mysql-master 
    -v /root/mysql/conf:/etc/mysql/conf.d 
    -v /root/mysql/logs:/logs 
    -v /root/mysql/data:/var/lib/mysql 
    -e MYSQL_ROOT_PASSWORD=root 
    -d mysql:5.7
  • 在slave服务器中启动slave节点:

    $ docker run -p 3306:3306 --name mysql-slave 
    -v /root/mysql/conf:/etc/mysql/conf.d 
    -v /root/mysql/logs:/logs 
    -v /root/mysql/data:/var/lib/mysql 
    -e MYSQL_ROOT_PASSWORD=root 
    -d mysql:5.7

在master节点建立rep账号

执行以下命令,进入master容器,并执行mysql命令,连接master数据库。(默认密码已通过环境变量配置为root)

$ docker exec -it master mysql -u root -p

连接数据库后,首先创建一个用于同步的账号rep, 密码为123456slave节点的ip为192.168.64.132

#创建用户(IP为可访问该master的IP,任意IP就写'%')
mysql> create user 'rep'@'192.168.64.132' identified by '123456';

#分配权限(IP为可访问该 master的IP,任意IP就写'%')
mysql> grant replication slave on *.* to 'rep'@'192.168.64.132';

#刷新权限
mysql> flush privileges;

创建完rep账户后,顺便执行show master status命令,记录下查询到的信息。后面配置slave时将会使用到。

mysql> show master status;
+------------------+----------+--------------+------------------+-------------------+
| File             | Position | Binlog_Do_DB | Binlog_Ignore_DB | Executed_Gtid_Set |
+------------------+----------+--------------+------------------+-------------------+
| mysql-bin.000001 |     1389 |              | mysql            |                   |
+------------------+----------+--------------+------------------+-------------------+
1 row in set (0.00 sec)

配置slave

slava节点执行以下命令,进入slave容器,并执行mysql命令,连接slave数据库。(默认密码已通过环境变量配置为root)

$ docker exec -it slave mysql -u root -p

接着执行以下sql语句,配置slave的master:

mysql> CHANGE MASTER TO

MASTER_HOST='192.168.64.133',

MASTER_USER='rep',

MASTER_PASSWORD='123456',

MASTER_LOG_FILE='mysql-bin.000001',

MASTER_LOG_POS=439

注意,以上信息,请根据之前查询到的master status来配置。

接着,激活slave:

mysql> start slave;

最后,查询slave状态:

mysql> SHOW SLAVE STATUS;

Slave_IO_RunningSlave_SQL_Running都为YES的时候就表示主从同步设置成功了。

至此,我们的Mysql 主从集群已经启动完成。

Keepalived

介绍

Keekpalived工作原理:通过vrrp协议实现

img

  1. master在工作状态会不断群发一个广播包(内涵优先参数)

  2. 其他路由收到收到广播后会和自己的优先参数作对比,如果优先参数小于自己则什么都不执行,如果优先参数大于自己则开启争抢机制

  3. 如果启动了争抢机制,他就会群发自己的优先参数,最终优先参数最小的称为master路由.

keepalived搭建

#安装keepalived 
$ yum -y install keepalived 

#修改主keepalived配置文件
$ vim /etc/keepalived/keepalived.conf  

#启动keepalived
$ systemctl start keepalived

# keepalived日志
$ tail -f -n 100 /var/log/messages

#配置开始前,先关闭双方的firewalld服务以及selinux!

keepalived配置文件说明

! Configuration File for keepalived              

global_defs {           #全局定义部分
   notification_email { #设置警报邮箱
     tomchil@qq.com      #邮箱
   }
   notification_email_from tomchil@qq.com      #设置发件人地址
   smtp_server 127.0.0.1        #设置smtp server地址
   smtp_connect_timeout 30         #设置smtp超时连接时间    以上参数可以不配置
   router_id LVS_DEVEL             #是Keepalived服务器的路由标识在一个局域网内,这个标识(router_id)是唯一的
}

// 定义自动核对mysql的脚本
vrrp_script check_mysql {
    script "/root/mysql/check_mysql.sh" 
    interval 22
    weight 2   
} 

vrrp_instance VI_1 {      #VRRP实例定义区块名字是VI_1
    state MASTER          #表示当前实例VI_1的角色状态这个状态只能有MASTER和BACKUP两种状态,并且需要大写这些字符MASTER为正式工作的状态,BACKUP为备用的状态
    interface ens33       
    virtual_router_id 51  #虚拟路由ID标识,这个标识最好是一个数字,在一个keepalived.conf配置中是唯一的, MASTER和BACKUP配置中相同实例的virtual_router_id必须是一致的.
    priority 100          #priority为优先级 越大越优先
    advert_int 1          #为同步通知间隔。MASTER与BACKUP之间通信检查的时间间隔,单位为秒,默认为1.
    authentication {      #authentication为权限认证配置不要改动,同一vrrp实例的MASTER与BACKUP使用相同的密码才能正常通信。
        auth_type PASS
        auth_pass 1111
    }
    virtual_ipaddress {   #设置虚拟IP地址
        192.168.64.100         
   }
   track_script {
        //指定核对的脚本,check_mysql是上述自定义的
        check_mysql
   }
}

#以下为虚拟服务器定义部分
virtual_server 192.168.64.100 3306 {      #设置虚拟服务器,指定虚拟IP和端口
    delay_loop 6                          #健康检查时间为6秒
    lb_algo rr                            #设置负载调度算法 rr算法
    lb_kind NAT                           #设置负载均衡机制 #有NAT,TUN和DR三种模式可选
    nat_mask 255.255.255.0                   #非NAT模式注释掉此行  注释用!号
    persistence_timeout 50                #连接保留时间,50秒无响应则重新分配节点
    protocol TCP                          #指定转发协议为TCP 
    real_server 192.168.64.133 3306 {        #RS节点1
        weight 1                #权重
        notify_down /etc/keepalived/bin/shutdown.sh //检测到mysql服务down后执行的脚本
        TCP_CHECK {             #节点健康检查
            connect_timeout 8       #延迟超时时间
            nb_get_retry 3          #重试次数
            delay_before_retry 3    #延迟重试次数
            connect_port 3306       #利用80端口检查
        }
    }
}

keepalived启动成功后,VIP节点可以通过查看IP地址,可以看到配置的虚拟节点

Keepalived和MySQL主从组成高可用服务

  1. 按如上操作,安装好MySQL和keepalived

  2. 修改master节点的keepalived.conf

    ! Configuration File for keepalived
    
    global_defs {
       router_id mysql-1
    }
    
    vrrp_script check_mysql {
        script "/root/mysql/check_mysql.sh" 
        interval 22
        weight 2   
    } 
    
    vrrp_instance VI_1 {
        state MASTER
        interface ens33
        virtual_router_id 51
        priority 100
        advert_int 1
        authentication {
            auth_type PASS
            auth_pass 1111
        }
        virtual_ipaddress {
            192.168.64.100
        }
        track_script {
            check_mysql
       }
    }
    
    virtual_server 192.168.64.100 3306 {
        delay_loop 6
        lb_algo rr
        lb_kind NAT
        persistence_timeout 50
        protocol TCP
    
        real_server 192.168.64.133 3306 {
            weight 3
            notify_down /root/mysql/shutdown.sh
            TCP_CHECK {
                connect_timeout 3
                nb_get_retry 3
                delay_before_retry 3
            connect_port 3306
            }
        }
    }
  3. 修改slave的keepalived.conf

    ! Configuration File for keepalived
    
    global_defs {
       router_id mysql-2
    }
    
    vrrp_instance VI_1 {
        state BACKUP
        interface ens33
        virtual_router_id 51
        priority 50
        advert_int 1
        authentication {
            auth_type PASS
            auth_pass 1111
        }
        virtual_ipaddress {
            192.168.64.100
        }
    }
    
    virtual_server 192.168.64.100 3306 {
        delay_loop 6
        lb_algo rr
        lb_kind NAT
        persistence_timeout 50
        protocol TCP
    
        real_server 192.168.64.132 3306 {
            weight 3
            notify_down /root/mysql/shutdown.sh
            TCP_CHECK {   
                connect_timeout 3
                nb_get_retry 3
                delay_before_retry 3
            connect_port 3306
            }
        }
    }

    4.在master和slave节点编写检测服务down后所要执行的脚本(添加/root/mysql/shutdown.sh)

    #!/bin/bash
    pkill keepalived

    ​ 给shutdown.sh执行权限

    $ chomod +x shutdown.sh

    5.分别启动master和slave节点的mysql,以及keepalived