MySQL 双主 + keepalived

摘要:
使用Keepalive,您可以通过虚拟IP实现双主机与外部的统一接口,以及自动检查和故障切换机制,从而实现MySQL数据库的高可用性方案。

参考:https://www.cnblogs.com/kevingrace/p/6710136.html

MySQL双主复制 + keepalived 可以实现数据高可用。双主即互为master-slave,其中任意一个改变,另外一个会跟着改变(与主从不同,主从是单向);可以实现数据库服务器的热备,但是一个Master宕机后不能实现动态切换。使用Keepalived,可以通过虚拟IP,实现双主对外的统一接口以及自动检查、失败切换机制,从而实现MySQL数据库的高可用方案。

一、双主配置

1、服务器规划

master1:192.168.116.128

master2:192.168.116.130

vip:192.168.116.129

2、mysql 配置

(1) master1(192.168.116.128) mysql服务器配置

进入mysql配置文件:

cd /etc/my.cnf

log-bin=mysql-bin
binlog_format=mixed
server-id=128

auto-increment-increment=2
auto-increment-offset=1
log-slave-updates
sync-binlog=1

黑色的是之前主从复制配置信息,红色的是主主配置需要新增的配置信息。

(2) master2(192.168.116.130) mysql服务器配置

进入mysql配置文件:

cd /etc/my.cnf

log-bin=mysql-bin
binlog_format=mixed
server-id=130

auto-increment-increment=2
auto-increment-offset=2
log-slave-updates
sync-binlog=1

黑色的是之前主从复制配置信息,红色的是主主配置需要新增的配置信息

(3) master1,master2 分别创建复制账号

master1 执行下列语句:

grant replication slave on *.* to 'latiny130'@'192.168.116.130' identified by '123456'; 

创建的账号是给作为从服务器master2使用

master2 执行下列语句:

grant replication slave on *.* to 'latiny128'@'192.168.116.128' identified by '123456'; 

创建的账号是给作为从服务器master1使用

(4) 登录到命令行分别查看master1,master2作为主数据库的状态

master1

MySQL 双主 + keepalived第1张

File为mysql-bin.000001,Position为154才是初始状态,如果不是这两个值,最好重置一下,输入reset master即可。

master2

MySQL 双主 + keepalived第2张

 (5)  配置并启动master1、master2从服务器线程信息
① master1
登录到命令行,重置从服务器线程状态
stop slave;
reset slave;
 
配置从服务器访问主服务器的信息,注意这里配置的master1作为从服务器配置的信息对应的应该是master2服务器信息

change master to master_host='192.168.116.130',master_user='latiny130',master_password='123456',master_log_file='mysql-bin.000001',master_log_pos=154;

启动master1的slave线程

start slave;

② master2
登录到命令行,重置从服务器线程状态
stop slave;
reset slave;
 
配置从服务器访问主服务器的信息,注意这里配置的master2作为从服务器配置的信息对应的应该是master1服务器信息

change master to master_host='192.168.116.128',master_user='latiny128',master_password='123456',master_log_file='mysql-bin.000001',master_log_pos=154;

启动master2的slave线程

start slave;

至此,master1 与 master2 互为主从的配置完成,可以进行测试,分别修改master1与master2上mysql的数据,检查另外一个库会不会一起改变。
 
二、配置mysql + keepalived 高可用环境
 
1、安装keepalived 并将其配置成系统服务,master1和master2两台机器上同样进行如下操作
 
[root@master1 ~]# yum install -y openssl-devel
[root@master1 ~]# cd /usr/local/src/
[root@master1 src]# wget http://www.keepalived.org/software/keepalived-1.3.5.tar.gz
[root@master1 src]# tar -zvxf keepalived-1.3.5.tar.gz
[root@master1 src]# cd keepalived-1.3.5
[root@master1 keepalived-1.3.5]# ./configure --prefix=/usr/local/keepalived
[root@master1 keepalived-1.3.5]# make && make install
     
[root@master1 keepalived-1.3.5]# cp /usr/local/src/keepalived-1.3.5/keepalived/etc/init.d/keepalived /etc/rc.d/init.d/
[root@master1 keepalived-1.3.5]# cp /usr/local/keepalived/etc/sysconfig/keepalived /etc/sysconfig/
[root@master1 keepalived-1.3.5]# mkdir /etc/keepalived/
[root@master1 keepalived-1.3.5]# cp /usr/local/keepalived/etc/keepalived/keepalived.conf /etc/keepalived/
[root@master1 keepalived-1.3.5]# cp /usr/local/keepalived/sbin/keepalived /usr/sbin/
[root@master1 keepalived-1.3.5]# echo "/etc/init.d/keepalived start" >> /etc/rc.local
 2、master1 对keeplived.conf 进行修改
vim /etc/keepalived/keepalived.conf
清空默认内容,采用如下配置:
MySQL 双主 + keepalived第3张MySQL 双主 + keepalived第4张
bal_defs {
    notification_email {
    ops@wangshibo.cn
    tech@wangshibo.cn
    }
           
    notification_email_from ops@wangshibo.cn
    smtp_server 127.0.0.1 
    smtp_connect_timeout 30
    router_id MASTER-HA
}

#检测mysql服务是否在运行。有很多方式,比如进程,用脚本检测等等
vrrp_script chk_mysql_port {
    #这里通过脚本监测
    script "/opt/chk_mysql.sh"
    #脚本执行间隔,每2s检测一次
    interval 2
    #脚本结果导致的优先级变更,检测失败(脚本返回非0)则优先级 -5
    weight -5
    #检测连续2次失败才算确定是真失败。会用weight减少优先级(1-255之间)
    fall 2
    #检测1次成功就算成功。但不修改优先级
    rise 1   
}
       
vrrp_instance VI_1 {
    state MASTER
    #指定虚拟ip的网卡接口
    interface eth0
    mcast_src_ip 192.168.116.128
    #路由器标识,MASTER和BACKUP必须是一致的    
    virtual_router_id 51 #定义优先级,数字越大,优先级越高,在同一个vrrp_instance下,MASTER的优先级必须大于BACKUP
    priority 101
    advert_int 1
    authentication {
        auth_type PASS
        auth_pass 1111
    }
    virtual_ipaddress {
        192.168.116.129
    }
      
    track_script { 
        chk_mysql_port
    }
}
View Code

编写切换脚本 vim /opt/chk_mysql.sh

MySQL 双主 + keepalived第5张MySQL 双主 + keepalived第6张
MYSQL=/usr/bin/mysql
MYSQL_HOST=localhost
MYSQL_USER=root
MYSQL_PASSWORD=123456
CHECK_TIME=3
  
#mysql  is working MYSQL_OK is 1 , mysql down MYSQL_OK is 0
  
MYSQL_OK=1
  
function check_mysql_helth (){
    $MYSQL -h $MYSQL_HOST -u $MYSQL_USER -p${MYSQL_PASSWORD} -e "show status;" >/dev/null 2>&1
    if [ $? = 0 ] ;then
    MYSQL_OK=1
    else
    MYSQL_OK=0
    fi
    return $MYSQL_OK
}
while [ $CHECK_TIME -ne 0 ]
do
    let "CHECK_TIME -= 1"
    check_mysql_helth
if [ $MYSQL_OK = 1 ] ; then
    CHECK_TIME=0
    exit 0
fi
if [ $MYSQL_OK -eq 0 ] &&  [ $CHECK_TIME -eq 0 ]
then
    pkill keepalived
    exit 1
fi
sleep 1
done
View Code

对脚本授权:chmod 755 /opt/chk_mysql.sh

启动keepalived:/etc/init.d/keepalived start

3、master2 对keeplived.conf 进行修改
MySQL 双主 + keepalived第7张MySQL 双主 + keepalived第8张
bal_defs {
    notification_email {
    ops@wangshibo.cn
    tech@wangshibo.cn
    }
           
    notification_email_from ops@wangshibo.cn
    smtp_server 127.0.0.1 
    smtp_connect_timeout 30
    router_id MASTER-HA
}
       
vrrp_script chk_mysql_port {
    script "/opt/chk_mysql.sh"
    interval 2            
    weight -5                 
    fall 2                 
    rise 1               
}
       
vrrp_instance VI_1 {
    state BACKUP
    interface eth0    
    mcast_src_ip 191.168.116.130
    virtual_router_id 51    
    priority 99          
    advert_int 1         
    authentication {   
        auth_type PASS 
        auth_pass 1111     
    }
    virtual_ipaddress {    
        192.168.116.129
    }
      
    track_script {               
        chk_mysql_port             
    }
}
View Code

编写切换脚本 vim /opt/chk_mysql.sh

MySQL 双主 + keepalived第9张MySQL 双主 + keepalived第10张
MYSQL=/usr/bin/mysql
MYSQL_HOST=localhost
MYSQL_USER=root
MYSQL_PASSWORD=123456
CHECK_TIME=3
  
#mysql  is working MYSQL_OK is 1 , mysql down MYSQL_OK is 0
  
MYSQL_OK=1
  
function check_mysql_helth (){
    $MYSQL -h $MYSQL_HOST -u $MYSQL_USER -p${MYSQL_PASSWORD} -e "show status;" >/dev/null 2>&1
    if [ $? = 0 ] ;then
    MYSQL_OK=1
    else
    MYSQL_OK=0
    fi
    return $MYSQL_OK
}
while [ $CHECK_TIME -ne 0 ]
do
    let "CHECK_TIME -= 1"
    check_mysql_helth
if [ $MYSQL_OK = 1 ] ; then
    CHECK_TIME=0
    exit 0
fi
if [ $MYSQL_OK -eq 0 ] &&  [ $CHECK_TIME -eq 0 ]
then
    pkill keepalived
    exit 1
fi
sleep 1
done
View Code

对脚本授权:chmod 755 /opt/chk_mysql.sh

启动keepalived:/etc/init.d/keepalived start

4、两台服务器授权允许root用户或者其用户(chk_mysql.sh里配置的),用户在客户端登录测试

登录命令行:grant all on *.* to root@'192.168.116.129' identified by "123456";

 
 
5、两台服务器的防火墙配置,关闭防火墙或者打开mysql的端口,默认为3306
 
 
6、测试
(1) 远程客户端登录vip 服务器192.168.116.129,对数据库进行操作,会同步到master1与master2;
(2) 关闭master1,vip会自动切到master2;恢复master1,vip会切回maseter1;
 三、keepalived  的抢占和非抢占模式
 
keepalive 是基于vrrp 协议在linux主机上以守护进程方式,根据配置文件实现健康检查。vrrp 是一种选择协议,它可以把一个虚拟路由器的责任动态分配到局域网上的VRRP路由器中的一台。控制虚拟路由器IP地址的VRRP路由器称为主路由器,它负责转发数据包到这些虚拟IP地址。一旦主路由器不可用,这种选择过程就提供了动态的故障转移机制,这就允许虚拟路由器的IP地址可以作为终端主机的默认第一跳路由器。
 
keepalive通过组播,单播等方式(自定义),实现keepalive主备推选。工作模式分为抢占和非抢占(通过参数nopreempt来控制)。
 
1、抢占模式
 
主服务正常工作时,虚拟IP会在主上,备不提供服务,当主服务优先级低于备的时候,备会自动抢占虚拟IP,这时,主不提供服务,备提供服务。也就是说,工作在抢占模式下,不分主备,只管优先级。
 
如上配置,不管keepalived.conf里的state配置成master还是backup,只看谁的priority 优先级高(一般而言,state为master的优先级要高于backup)。priority 优先级高的那一个在故障恢复后,会自动将VIP资源再次抢占回来!!
 
2、非抢占模式
这种方式通过参数nopreempt(一般设置在advert_int的那一行下面)来控制。不管priority优先级,只要master 机器发生故障,vip 资源就会被切换到backup上。并且当master 机器恢复后,也不会去将vip 资源抢占回来,直至backup机器发生故障时,才能自动切换回来。
 

千万注意:
nopreempt这个参数只能用于state为backup的情况,所以在配置的时候要把master和backup的state都设置成backup,这样才会实现keepalived的非抢占模式!

也就是说:
(1) 当state状态一个为master,一个为backup的时候,加不加nopreempt这个参数都是一样的效果。即都是根据priority优先级来决定谁抢占vip资源的,是抢占模式!
(2) 当state状态都设置成backup,如果不配置nopreempt参数,那么也是看priority优先级决定谁抢占vip资源,即也是抢占模式。
(3) 当state状态都设置成backup,如果配置nopreempt参数,那么就不会去考虑priority优先级了,是非抢占模式!即只有vip当前所在机器发生故障,另一台机器才能接管vip。即使优先级高的那一台机器恢复 后也不会主动抢回vip,只能等到对方发生故障,才会将vip切回来。

免责声明:文章转载自《MySQL 双主 + keepalived》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇什么是盒模型?【b301】神经网络下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

开源软件源码阅读小技巧

开源软件已经广泛的被互联网公司所应用,不仅仅是因为其能给企业节省一大笔成本,而且最重要的是拥有更多的自主可控性,能从源头上对软件质量进行把控。另一方面,由于开源软件背后往往没有大型的商业公司,所以文档相对来说不是非常完善(或者说文档和代码不一定相互对应),因此,作为一名合格程序员,尤其是基础软件开发的程序员,阅读开源软件源码的能力是必备的素质。 MySQ...

Hive笔记--配置以及遇到的问题

ubuntu安装mysql http://www.2cto.com/database/201401/273423.htmlHive安装: http://www.aboutyun.com/forum.php?mod=viewthread&tid=6902 (aboutyun)http://wangqiaowqo.iteye.com/blog/1618...

mysql有多大内存?能存多少数据?

Mysql: MySQL 3.22 限制的表大小为4GB。 MyISAM 存储引擎: 最大表尺寸增加到了65536TB(2567 – 1字节)。由于允许的表尺寸更大,MySQL数据库的最大有效表尺寸通常是由操作系统对文件大小的限制决定的,而不是由MySQL内部限制决定的。 InnoDB 存储引擎 InnoDB 存储引擎将InnoDB 表保存在一个表空间内,...

Vue-Router基础知识点总结【vue系列】

Vue-Router 认识路由 1.什么是路由 2.后端路由阶段 3.前端路由阶段 前端路由的规则 1.URL的hash 2.HTML5的history模式 Vue-Router基础 1.认识vue-router 2.安装与使用vue-router 3.路由组件详解 路由配置其他补充 1.路由的默认路径 2.路径的History模式...

Mysql—用存储过程和事件每月定时创建一张数据库表

业务需求,把用户操作日志写入一张日志表sys_oper_log。上线2个月来,有74万条记录了。 现考虑要分库分表了。每个月初先备份以sys_oper_log为前缀,日期年月为后缀的数据库表,比如:sys_oper_log_202007 ,然后再创建一张以sys_oper_log数据库表。 实现思路:Mysql如何每月自动建表?一、新建事件每月调用存储过程...

Git使用:

配置可参考: 配置name 及email:$ git config --global user.name "Your Name"$ git config --global user.email "email@example.com"创建版本库:通过git init命令把这个?录变成Git可以管理的仓库:$ git init提交出现错误: fatal: Un...