我是靠谱客的博主 怕黑冷风,最近开发中收集的这篇文章主要介绍MySQL+KeepAlived实现双主高可用方案实践,觉得挺不错的,现在分享给大家,希望可以做个参考。

概述

目录

 

1、什么叫双主高可用(双机热备)

2、搭建主主同步

3、配置MySQL+Keepalived故障转移的高可用环境

4、测试

5、MyCAT双主高可用

5.1 架构图

5.2 准备环境

5.3 高可用配置


1、什么叫双主高可用(双机热备)

我们通常说的双机热备是指两台机器都在运行,但并不是两台机器都同时在提供服务。当提供服务的一台出现故障的时候,另外一台会马上自动接管并且提供服务,而且切换的时间非常短。MySQL双主复制,即互为Master-Slave(只有一个Master提供写操作),可以实现数据库服务器的热备,但是一个Master宕机后不能实现动态切换。使用Keepalived,可以通过虚拟IP,实现双主对外的统一接口以及自动检查、失败切换机制,从而实现MySQL数据库的高可用方案。之前梳理了MySQL主从同步,下面说下MySQL+Keepalived双主热备高可用方案的实施。

实现双机热备的逻辑:

1)先实施Master->Slave的主主同步。主主是数据双向同步,主从是数据单向同步。一般情况下,主库宕机后,需要手动将连接切换到从库上。(但是用keepalived就可以自动切换)
2)再结合Keepalived的使用,通过VIP实现MySQL双主对外连接的统一接口。即客户端通过Vip连接数据库;当其中一台宕机后,VIP会漂移到另一台上,这个过程对于客户端的数据连接来说几乎无感觉,从而实现高可用。

watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L2h1eGlhbmcxOTg1MTExNA==,size_16,color_FFFFFF,t_70

2、搭建主主同步

Master1:192.168.223.128    安装mysql和keepalived
Master2: 192.168.223.129    安装mysql和keepalived
VIP:192.168.223.136 (虚拟漂移IP,不需要另外起一台服务)
​
要实现主主同步,可以先实现主从同步,即master1->master2的主从同步,然后master2->master1的主从同步.
这样,双方就完成了主主同步。
 
注意下面几点:
1)要保证同步服务期间之间的网络联通。即能相互ping通,能使用对方授权信息连接到对方数据库(防火墙开放3306端口)。
2)同步前,双方数据库中需要同步的数据要保持一致。这样,同步环境实现后,再次更新的数据就会如期同步了。
​
可能出现的问题:
    1、报错:
    Last_IO_Error: Fatal error: The slave I/O thread stops because master and slave have equal MySQL server ids; these ids must be different for replication to work (or the --replicate-same-server-id option must be used on slave but this does not always make sense; please check the manual before using it).
    解决办法:
    删除mysql数据目录下的auto.cnf文件,重启mysql服务即可!
 
    2、另:Keepalived必须使用root账号启动!

配置文件my.cnf

#1: 主库1修改配置 vim /etc/my.cnf
server-id = 1         
log-bin = master-bin     
sync_binlog = 1
binlog_checksum = none
binlog_format = ROW
auto-increment-increment = 2     
auto-increment-offset = 1    
slave-skip-errors = all
log_slave_updates=1
#2: 主库2修改配置 vim /etc/my.cnf
server-id = 2         
log-bin = master-bin     
sync_binlog = 1 #表示每次事务提交,MySQL都会把binlog刷下去,是最安全但是性能损耗最大的设置
binlog_checksum = none #不做日志统计检查,提升性能
binlog_format = ROW 
auto-increment-increment = 2 #表示自增长字段每次递增的量,其默认值是1,取值范围是1 .. 65535    
auto-increment-offset = 1 #表示自增长字段从那个数开始,他的取值范围是1 .. 65535    
slave-skip-errors = all #从节点跳过所有错误
log_slave_updates=1 # 从节点也要保存binlog日志,三级同步使用
#PS:其实就server-id不一样而已
#分别重启服务
------------------------------------------------------------------------------------
#3:分别进入128,129两台mysql服务器:
mysql -uroot -proot
#都创建主从连接账户repl
CREATE USER repl;
#从库repl密码123456 跟主库连接,有slave的权限     
GRANT replication slave ON *.* TO 'repl'@'192.168.223.128或者129' identified by '123456';
#刷新生效
flush privileges;
#最好将库锁住,仅仅允许读,以保证数据一致性;待主主同步环境部署后再解锁;
#锁住后,就不能往表里写数据,但是重启mysql服务后就会自动解锁!
flush tables with read lock;  #注意该参数设置后,如果自己同步对方数据,同步前一定要记得先解锁!
---------------------------------------------------------------------------------
#4:#分别创建主库连接,master_log_file和master_log_position的值需要执行:show MASTER status;查询设置比当前文件早的文件名或者比当前position小的position值
​
#128机器做同步操作----》
unlock tables;     #先解锁,将对方数据同步到自己的数据库中
stop slave;#停止同步,避免数据有更新
CHANGE MASTER TO 
    master_host='192.168.223.129',
    master_port=3306,
    master_user='repl',
    master_password='123456',
    master_log_file='master-bin.000001',
    master_log_pos=501; 
start slave;#开启同步
show SLAVE status;#查看从节点状态,有问题解决问题
​
#129机器做同步操作----》
unlock tables;     #先解锁,将对方数据同步到自己的数据库中
stop slave;#停止同步,避免数据有更新
CHANGE MASTER TO 
    master_host='192.168.223.128',
    master_port=3306,
    master_user='repl',
    master_password='123456',
    master_log_file='master-bin.000005',
    master_log_pos=308;
start slave;#开启同步
show SLAVE status;#查看从节点状态,有问题解决问题

测试:分别在128和129上面进行数据的增删改查,可以发现数据会相互同步!

3、配置MySQL+Keepalived故障转移的高可用环境

与之前keeppalived搭建Nginx高可用类似,我们都是利用keepalived的虚拟IP漂移来达到单点故障转移的问题

Keepalived看名字就知道,保持存活,在网络里面就是保持在线了,也就是所谓的高可用或热备,用来防止单点故障(单点故障是指一旦某一点出现故障就会导
整个系统架构的不可用)的发生,那说到keepalived不得不说的一个协议不是VRRP协议,可以说这个协议就是keepalived实现的基础。
1)Keepalived的工作原理是VRRP(Virtual Router Redundancy Protocol)虚拟路由冗余协议。在VRRP中有两组重要的概念:VRRP路由器和虚拟路由器,主控路由器和备份路由器。
2)VRRP路由器是指运行VRRP的路由器,是物理实体,虚拟路由器是指VRRP协议创建的,是逻辑概念。一组VRRP路由器协同工作,共同构成一台虚拟路由器。
Vrrp中存在着一种选举机制,用以选出提供服务的路由即主控路由,其他的则成了备份路由。当主控路由失效后,备份路由中会重新选举出一个主控路由,来继续工作,来保障不间断服务。

之前已经安装过Keepalived,这里不再赘述!

分别进入128,129两台服务器的keepalived.conf配置

vim /etc/keepalived/keepalived.conf
-------------------------------------------------------128------------------------------------------------------
​
global_defs {
   #不与其他节点重名即可
   router_id mysql_master
}
vrrp_script chk_mysql {     #检测mysql服务是否在运行。有很多方式,比如进程,用脚本检测等等
    script "/etc/keepalived/chk_mysql.sh"   #这里通过脚本监测
    interval 6                   #脚本执行间隔,每6s检测一次
    weight -5                    #脚本结果导致的优先级变更,检测失败(脚本返回非0)则优先级 -5
    fall 2                    #检测连续2次失败才算确定是真失败。会用weight减少优先级(1-255之间)
    rise 1                    #检测1次成功就算成功。但不修改优先级
}
​
vrrp_instance mysql {
    state BACKUP
    interface eth0      #指定虚拟ip的网卡接口
    #mcast_src_ip 192.168.223.129 #如果是漂移本地IP,可以不写
    virtual_router_id 51    #路由器标识,MASTER和BACKUP必须是一致的
    priority 100            #定义优先级,数字越大,优先级越高,在同一个vrrp_instance下,MASTER的优先级必须大于BACKUP的优先级。这样MASTER故障恢复后,就可以将VIP资源再次抢回来
    advert_int 1
    authentication {
        auth_type PASS
        auth_pass 1111
    }
    virtual_ipaddress {
        192.168.223.136
    }
​
    track_script {
      chk_mysql
    }
}
​
​
vim /etc/keepalived/keepalived.conf
-------------------------------------------------------129------------------------------------------------------
global_defs {
   #不与其他节点重名即可
   router_id mysql_master
}
vrrp_script chk_mysql {     #检测mysql服务是否在运行。有很多方式,比如进程,用脚本检测等等
    script "/etc/keepalived/chk_mysql.sh"   #这里通过脚本监测
    interval 6                   #脚本执行间隔,每6s检测一次
    weight -5                    #脚本结果导致的优先级变更,检测失败(脚本返回非0)则优先级 -5
    fall 2                    #检测连续2次失败才算确定是真失败。会用weight减少优先级(1-255之间)
    rise 1                    #检测1次成功就算成功。但不修改优先级
}
​
vrrp_instance mysql {
    state BACKUP
    interface eth0      #指定虚拟ip的网卡接口
    #mcast_src_ip 192.168.223.129 #如果是漂移本地IP,可以不写
    virtual_router_id 51    #路由器标识,MASTER和BACKUP必须是一致的
    priority 99            #定义优先级,数字越大,优先级越高,在同一个vrrp_instance下,MASTER的优先级必须大于BACKUP的优先级。这样MASTER故障恢复后,就可以将VIP资源再次抢回来
    advert_int 1
    authentication {
        auth_type PASS
        auth_pass 1111
    }
    virtual_ipaddress {
        192.168.223.136
    }
​
    track_script {
      chk_mysql
    }
}

编辑监测脚本:vim /etc/keepalived/chk_mysql.sh

#如果mysql服务挂掉了,就会关闭keepalived的服务,让VIP漂移到其他服务节点
-------------------------------------------------------------------------------------------
#!/bin/bash
counter=$(netstat -na|grep "LISTEN"|grep "3306"|wc -l)
if [ "${counter}" -eq 0 ]; then
    killall keepalived
fi
#当然,你也可以抢救1次再关闭....
-------------------------------------------------------------------------------------------
#!/bin/bash
counter=$(netstat -na|grep "LISTEN"|grep "3306"|wc -l)
if [ "${counter}" -eq 0 ]; then
    service mysql restart
    sleep 5;
    counter=$(netstat -na|grep "LISTEN"|grep "3306"|wc -l)
    if [ "${counter}" -eq 0 ]; then
        killall keepalived
    fi
fi

4、测试

watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L2h1eGlhbmcxOTg1MTExNA==,size_16,color_FFFFFF,t_70

分别关停其中一个服务节点服务看看效果!

5、MyCAT双主高可用

5.1 架构图

watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L2h1eGlhbmcxOTg1MTExNA==,size_16,color_FFFFFF,t_70

5.2 准备环境

192.168.223.128 :MySQL Master1;MyCAT1,Keepalived1

192.168.223.129 :MySQL Master2;MyCAT2,Keepalived2

192.168.223.130 :MySQL Slave1;

192.168.223.131 :MySQL Slave2;

192.168.223.132 :VIP

5.3 高可用配置

5.3.1 MySQL双主同步配置

略,参考本课件第二步

5.3.2 MySQL主从同步配置

略,参考上节课课件《分库分表之Mycat进阶》

5.3.3 MyCAT配置

核心配置:schema.xml 两个MyCAT只需要配置不同的MySQL读写服务器

<!-- 设置表的存储方式.schema name="TESTDB" 与 server.xml中的 TESTDB 设置一致  -->
        <schema name="TESTDB" checkSQLschema="true" sqlMaxLimit="100">
                <table name="users" primaryKey="id"  dataNode="dn1" />
                <table name="item" primaryKey="id" dataNode="dn$2-3" rule="role1"/>
        </schema>
  
        <!-- 设置表的存储方式.schema name="TESTDB" 与 server.xml中的 TESTDB 设置一致  -->
        <dataNode name="dn1" dataHost="localhost1" database="db01" />
        <dataNode name="dn2" dataHost="localhost1" database="db02" />
        <dataNode name="dn3" dataHost="localhost1" database="db03" />
​
---------------------------------128--------------------------------------------------------
        <!-- mycat 逻辑主机dataHost对应的物理主机.其中也设置对应的mysql登陆信息 -->
        <dataHost name="localhost1" maxCon="1000" minCon="10" balance="3"
                          writeType="0" dbType="mysql" dbDriver="jdbc" switchType="1"  slaveThreshold="100">
                <heartbeat>select user()</heartbeat>
                <!-- can have multi write hosts -->
                <writeHost host="hostM1" url="jdbc:mysql://192.168.223.128:3306" user="root" password="root">
                        <readHost host="hostS1" url="jdbc:mysql://192.168.223.130:3306" user="root" password="root"/>  
                </writeHost>
                <!-- <writeHost host="hostM2" url="localhost:3316" user="root" password="123456"/> -->
        </dataHost>
​
---------------------------------129--------------------------------------------------------
<!-- mycat 逻辑主机dataHost对应的物理主机.其中也设置对应的mysql登陆信息 -->
        <dataHost name="localhost1" maxCon="1000" minCon="10" balance="3"
                          writeType="0" dbType="mysql" dbDriver="jdbc" switchType="1"  slaveThreshold="100">
                <heartbeat>select user()</heartbeat>
                <!-- can have multi write hosts -->
                <writeHost host="hostM1" url="jdbc:mysql://192.168.223.129:3306" user="root" password="root">
                        <readHost host="hostS1" url="jdbc:mysql://192.168.223.131:3306" user="root" password="root"/>  
                </writeHost>
                <!-- <writeHost host="hostM2" url="localhost:3316" user="root" password="123456"/> -->
        </dataHost>
​

5.3.4 Keepalived配置

keepalived.conf

​
-------------------------------------128---------------------------------------------
​
! Configuration File for keepalived
global_defs {
    #不与其他节点重名即可
   router_id mycat
}
​
vrrp_script chk_mycat {     #检测mysql服务是否在运行。有很多方式,比如进程,用脚本检测等等
    script "/etc/keepalived/chk_mycat.sh"   #这里通过脚本监测
    interval 6                   #脚本执行间隔,每6s检测一次
    weight -5                    #脚本结果导致的优先级变更,检测失败(脚本返回非0)则优先级 -5
    fall 2                    #检测连续2次失败才算确定是真失败。会用weight减少优先级(1-255之间)
    rise 1                    #检测1次成功就算成功。但不修改优先级
}
​
vrrp_instance mycat {
    state BACKUP
    interface eth0      #指定虚拟ip的网卡接口
    virtual_router_id 51    #路由器标识,MASTER和BACKUP必须是一致的
    priority 90            #定义优先级,数字越大,优先级越高,在同一个vrrp_instance下,MASTER的优先级必须大于BACKUP的优
先级。这样MASTER故障恢复后,就可以将VIP资源再次抢回来
    authentication {
        auth_type PASS
        auth_pass 1111
    }
    virtual_ipaddress {
        192.168.223.132
    }
     track_script {
      chk_mycat
    }
}
​
-------------------------------------129---------------------------------------------
​
! Configuration File for keepalived
global_defs {
    #不与其他节点重名即可
   router_id mycat
}
​
vrrp_script chk_mycat {     #检测mysql服务是否在运行。有很多方式,比如进程,用脚本检测等等
    script "/etc/keepalived/chk_mycat.sh"   #这里通过脚本监测
    interval 6                   #脚本执行间隔,每6s检测一次
    weight -5                    #脚本结果导致的优先级变更,检测失败(脚本返回非0)则优先级 -5
    fall 2                    #检测连续2次失败才算确定是真失败。会用weight减少优先级(1-255之间)
    rise 1                    #检测1次成功就算成功。但不修改优先级
}
​
vrrp_instance mycat {
    state BACKUP
    interface eth0      #指定虚拟ip的网卡接口
    virtual_router_id 51    #路由器标识,MASTER和BACKUP必须是一致的
    priority 100            #定义优先级,数字越大,优先级越高,在同一个vrrp_instance下,MASTER的优先级必须大于BACKUP的优
#先级。这样MASTER故障恢复后,就可以将VIP资源再次抢回来
    authentication {
        auth_type PASS
        auth_pass 1111
    }
    virtual_ipaddress {
        192.168.223.132
    }
     track_script {
      chk_mycat
    }
}

存活脚本 chk_mycat:

#!/bin/bash
counter=$(netstat -na|grep "LISTEN"|grep "3306"|wc -l)
if [ "${counter}" -eq 0 ]; then
    service mysqld restart
    sleep 5;
    counter=$(netstat -na|grep "LISTEN"|grep "3306"|wc -l)
    if [ "${counter}" -eq 0 ]; then
        /usr/local/mycat/bin/mycat stop
        killall keepalived
    fi
fi
​

PS:由于节点过多,镜像文件是复制的,一定要注意mysql的server_id和server_uuid不要相同,否则会报错

一定一定注意请检查每个数据库节点是否存在相同的server_id/server_uuid:

show variables like '%server%id%';

检测脚本执行一定要小于检测脚本执行间隔时间,否则当前检测进程还没执行完,会被下一个进程挂起,永远也不会成功!

 

watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L2h1eGlhbmcxOTg1MTExNA==,size_16,color_FFFFFF,t_70

 

 

 

最后

以上就是怕黑冷风为你收集整理的MySQL+KeepAlived实现双主高可用方案实践的全部内容,希望文章能够帮你解决MySQL+KeepAlived实现双主高可用方案实践所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(58)

评论列表共有 0 条评论

立即
投稿
返回
顶部