前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >centos 下 mysql+keepalived实现双主自由切换

centos 下 mysql+keepalived实现双主自由切换

作者头像
庞小明
发布2018-09-19 14:52:37
6230
发布2018-09-19 14:52:37
举报
文章被收录于专栏:pangguoming

本文的目的是搭建一个互为主从的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配置文件,如下所示。

代码语言:javascript
复制
[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的配置文件,如下:

代码语言:javascript
复制
[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上配置

代码语言:javascript
复制
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为主。

代码语言:javascript
复制
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的配置文件

代码语言:javascript
复制
! 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
    }
}

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

代码语言:javascript
复制
[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文件添加可执行权限

代码语言:javascript
复制
 chmod +x  /etc/keepalived/mysqlcheck/check_slave.sh 

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

mysql2中keepalived的配置

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

代码语言:javascript
复制
[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
    }
}

第二步:编写检测脚本:

代码语言:javascript
复制
[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文件添加可执行权限

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

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2018-09-18 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • ip规划
  • mysql双主配置
  • keepalived配置
    • mysql1中keepalived的配置
      • mysql2中keepalived的配置
      • VIP漂移检测
      相关产品与服务
      云数据库 MariaDB
      腾讯云数据库 MariaDB(TencentDB for MariaDB) 让您轻松在云端部署、使用 MariaDB 数据库。MariaDB 是在 MySQL 版权被 Oracle 收购后,由 MySQL 创始人 Monty 创立,其版权授予了“MariaDB基金会(非营利性组织)”以保证 MariaDB 永远开源,良好的开源策略,是企业级应用的最优选择,主流开源社区系统/软件的数据库系统,均已默认配置 MariaDB。
      领券
      问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档