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当中。 
    在生产环境中,利用这种机制能够实现故障转移的功能。

  • 相关阅读:
    5 Things Every Manager Should Know about Microsoft SharePoint 关于微软SharePoint每个经理应该知道的五件事
    Microsoft SharePoint 2010, is it a true Document Management System? 微软SharePoint 2010,它是真正的文档管理系统吗?
    You think you use SharePoint but you really don't 你认为你使用了SharePoint,但是实际上不是
    Introducing Document Management in SharePoint 2010 介绍SharePoint 2010中的文档管理
    Creating Your Own Document Management System With SharePoint 使用SharePoint创建你自己的文档管理系统
    MVP模式介绍
    权重初始化的选择
    机器学习中线性模型和非线性的区别
    神经网络激励函数的作用是什么
    深度学习中,交叉熵损失函数为什么优于均方差损失函数
  • 原文地址:https://www.cnblogs.com/pangguoming/p/9667491.html
Copyright © 2011-2022 走看看