zoukankan      html  css  js  c++  java
  • centos 下 mysql+keepalived实现双主自由切换

    目录

    本文的目的是搭建一个互为主从的mysql高可用架构,用来保证mysql服务器宕机的时候,能够自动的切换的另一台mysql服务器。

    ip规划

    主机名ip地址角色
    mysql1 RIP:172.25.0.41 VIP 172.25.0.200 主服务器1
    mysql2 Rip:172.25.0.42 VIP 172.25.0.200 主服务器2

    mysql双主配置

    第一步,修改mysql1配置文件,如下所示。

    [root@mysql1 ~]# vim /etc/my.cnf
    [mysqld]
    datadir=/var/lib/mysql
    socket=/var/lib/mysql/mysql.sock
    # Disabling symbolic-links is recommended to prevent assorted security risks
    symbolic-links=0
    # Settings user and group are ignored when systemd is used.
    # If you need to run mysqld under a different user or group,
    # customize your systemd unit file for mariadb according to the
    # instructions in http://fedoraproject.org/wiki/Systemd
    server-id = 1
    log-bin = binlog
    relay_log = mysql-relay-bin
    log_slave_updates =1
    auto_increment_increment=2
    #表示自增长ID的数量,即步进
    auto_increment_offset=1
    ##自增长ID起始位置
    [mysqld_safe]
    log-error=/var/log/mariadb/mariadb.log
    pid-file=/var/run/mariadb/mariadb.pid
    
    #
    # include all files from the config directory
    #
    !includedir /etc/my.cnf.d
    

      

    第二步:修改mysql2的配置文件,如下:

    [root@mysql2 ~]# vim /etc/my.cnf
    [mysqld]
    datadir=/var/lib/mysql
    socket=/var/lib/mysql/mysql.sock
    # Disabling symbolic-links is recommended to prevent assorted security risks
    symbolic-links=0
    # Settings user and group are ignored when systemd is used.
    # If you need to run mysqld under a different user or group,
    # customize your systemd unit file for mariadb according to the
    # instructions in http://fedoraproject.org/wiki/Systemd
    server-id=2
    #配置server-id,标识从服务器
    relay_log = mysql-relay-bin
    #打开Mysql中继日志
    log_bin =mysql-bin
    #打开从服务器的二进制日志
    log_slave_updates =1
    #使得更新的数据写进二进制日志中
    auto_increment_increment=2
    #表示自增长ID的数量,即步进
    auto_increment_offset=2
    #自增长ID起始位置
    
    [mysqld_safe]
    log-error=/var/log/mariadb/mariadb.log
    pid-file=/var/run/mariadb/mariadb.pid
    
    #
    # include all files from the config directory
    #
    !includedir /etc/my.cnf.d
    

      

    第三步:在mysql1上创建复制账号,在Master的数据库中建立一个备份帐户:每个slave使用标准的MySQL用户名和密码连接master。进行复制操作的用户会授予REPLICATION SLAVE权限。 
    MariaDB [(none)]> grant replication slave ,replication client on *.* to slave@'172.25.%.%' identified by 'centos'; 
    第四步:启动从服务器配置线程,在mysql2上配置

    MariaDB [(none)]> change master to 
    master_host='172.25.0.41', 
    master_user='slave', 
    master_password='centos', 
    master_log_file='binlog.000003', 
    #指明初始复制时的mysql1中的binlog文件
    master_log_pos=245;
    #指明初始复制时binlog文件的位置
    

      

    开启slave线程 
    MariaDB [(none)]> start slave; 
    第五步:上述已搭建好mysql1和mysql2的主从,接下来配置mysql2和mysql1的主从,使其能够互为主从。在mysq1上指定mysql2为主。

    MariaDB [(none)]> change master to 
    master_host='172.25.0.42',   
    master_user='slave',   
    master_password='centos',   
    master_log_file='mysql-bin.000003',   
    master_log_pos=486688;
    #指明复制时的起始文件和起始位置。
    

       

    开启slave进程 
    MariaDB [(none)]> start slave;

    keepalived配置

    keepalived能够实现mysql1和mysql2共享一个虚拟ip,当前端访问数据库的时候,可以直接指向这个ip地址,若mysql1宕机了,VIP资源可以直接共享给mysql2.

    mysql1中keepalived的配置

    第一步:编辑keepalived的配置文件

    ! Configuration File for keepalived
    global_defs {
       #设置报警通知邮件地址,可以设置多个
       notification_email {
        root@localhost
       }
       #设置邮件的发送地址
       notification_email_from mysql@xiaomi.com
       #设置smtp server的地址,该地址必须是存在的
       smtp_server 127.0.0.1
       #设置连接smtp server的超时时间
       smtp_connect_timeout 30
       #运行Keepalived服务器的标识,发邮件时显示在邮件标题中的信息
       router_id mysql_ha
    }
    # 检测脚本
    vrrp_script chk_mysql {
        script "/etc/keepalived/mysqlcheck/check_slave.sh"
        interval 2
        weight 2
    }
    #定义VRRP实例,实例名自定义
    vrrp_instance mysql-ha {
        #指定Keepalived的角色,MASTER主机 BACKUP备份
        state BACKUP #此处两个都设置为BACKUP
        #指定HA监测的接口
        interface ens34
        #虚拟路由标识,这个标识是一个数字(1-255),在一个VRRP实例中主备服务器ID必须一样
        virtual_router_id 68
        #优先级,数字越大优先级越高,在一个实例中主服务器优先级要高于备服务器
        priority 100  #从服务器99
        #设置主备之间同步检查的时间间隔单位秒
        advert_int 1
        #设置不抢占模式(DB1设置即可)
        nopreempt
        #设置验证类型和密码
        authentication {
            #验证类型有两种{PASS|HA}
            auth_type PASS
            #设置验证密码,在一个实例中主备密码保持一样
            auth_pass centos
        }
        track_script {
            chk_mysql  # 执行监控的服务
        }
        #定义虚拟IP地址,可以有多个,每行一个
        virtual_ipaddress {
        172.25.0.200
        }
    }
    

      

    第二步:编写心跳检测脚本:

    [root@mysql1 /etc/keepalived/mysqlcheck]# vim /etc/keepalived/mysqlcheck/check_slave.sh 
    
    #!/bin/bash
    #This scripts is check for Mysql Slave status
    counter=$(netstat -na|grep "LISTEN"|grep "3306"|wc -l)
    if [ "${counter}" -eq 0 ]; then
        systemctl stop keepalived
        killall keepalived
    fi
    ping 172.25.0.41 -w1 -c1 &>/dev/null
    if [ $? -ne 0 ]
    then
        systemctl stop keepalived
        killall keepalived
    fi

    需要为此.sh文件添加可执行权限

     chmod +x  /etc/keepalived/mysqlcheck/check_slave.sh 
    

      

    基于网段是否可用以及mysql数据库是否工作来判断服务器的心跳

    mysql2中keepalived的配置

    第一步:编辑keepalived中的配置文件

    [root@mysql2 ~]# vim /etc/keepalived/keepalived.conf 
    
    ! Configuration File for keepalived
    global_defs {
       #设置报警通知邮件地址,可以设置多个
       notification_email {
        root@localhost
       }
       #设置邮件的发送地址
       notification_email_from mysql@xiaomi.com
       #设置smtp server的地址,该地址必须是存在的
       smtp_server 127.0.0.1
       #设置连接smtp server的超时时间
       smtp_connect_timeout 30
       #运行Keepalived服务器的标识,发邮件时显示在邮件标题中的信息
       router_id mysql_ha
    }
    # 检测脚本
    vrrp_script chk_mysql {
        script "/etc/keepalived/mysqlcheck/check_slave.sh"
        interval 2
        weight 2
    }
    #定义VRRP实例,实例名自定义
    vrrp_instance mysql-ha {
        #指定Keepalived的角色,MASTER主机 BACKUP备份
        state BACKUP #此处两个都设置为BACKUP
        #指定HA监测的接口
        interface ens34
        #虚拟路由标识,这个标识是一个数字(1-255),在一个VRRP实例中主备服务器ID必须一样
        virtual_router_id 68
        #优先级,数字越大优先级越高,在一个实例中主服务器优先级要高于备服务器
        priority 90  #从服务器99
        #设置主备之间同步检查的时间间隔单位秒
        advert_int 1
        #设置不抢占模式(DB1设置即可)
        #nopreempt
        #设置验证类型和密码
        authentication {
            #验证类型有两种{PASS|HA}
            auth_type PASS
            #设置验证密码,在一个实例中主备密码保持一样
            auth_pass centos
        }
        track_script {
            chk_mysql  # 执行监控的服务
        }
        #定义虚拟IP地址,可以有多个,每行一个
        virtual_ipaddress {
        172.25.0.200
        }
    }
    

       

    第二步:编写检测脚本:

    [root@mysql2 ~]# vim /etc/keepalived/mysqlcheck/check_slave.sh 
    
    #!/bin/bash
    #This scripts is check for Mysql Slave status
    counter=$(netstat -na|grep "LISTEN"|grep "3306"|wc -l)
    if [ "${counter}" -eq 0 ]; then
        systemctl stop keepalived
        killall keepalived
    fi
    ping 172.25.0.42 -w1 -c1 &>/dev/null
    if [ $? -ne 0 ]
    then
        systemctl stop keepalived
        killall keepalived
    fi
    

      

    需要为此.sh文件添加可执行权限

     chmod +x  /etc/keepalived/mysqlcheck/check_slave.sh 
    

      

    上述心跳检测脚本中,对于状态的检测写的很简单,其一是基于该服务器的mysql是否开启,其二是基于该网段是否可以ping通。可以根据自己的需求,将该脚本设计的更复杂一些。比如根据数据库的插入、删除等是否可用、主从线程是否开启等进行细分。提高检测的精准度。

    VIP漂移检测

    mysql1和mysql2中同时开启keepalived服务和msyql服务

    查看mysql1中的ip地址: 
    [root@mysql1 ~]# ip a s 
    这里写图片描述
    由上图可知,此时的VIP是在mysql1中的。 
    停止mysql1中的mysql服务,再观察mysql1和mysql2的ip状况。 
    mysql1: 
    这里写图片描述 
    MySQL2: 
    这里写图片描述
    可以看到VIP资源已经由mysql1转移到了mysql2当中。 
    在生产环境中,利用这种机制能够实现故障转移的功能。

  • 相关阅读:
    linux hosts文件详+mac主机名被莫名其妙修改
    WPF整理--动态绑定到Logical Resource
    WPF整理-使用逻辑资源
    WPF整理-自定义一个扩展标记(custom markup extension)
    WPF整理-XAML访问静态属性
    WPF整理-为控件添加自定义附加属性
    WPF整理-为User Control添加依赖属性
    使用MS Test进行单元测试
    WPF整理-XAML构建后台类对象
    毕业那点事儿--回顾在大学这7年
  • 原文地址:https://www.cnblogs.com/pangguoming/p/9667491.html
Copyright © 2011-2022 走看看