0

0

LVS+KeepAlived,搭建MySQL高可用负载均衡

php中文网

php中文网

发布时间:2016-06-07 14:56:09

|

1678人浏览过

|

来源于php中文网

原创

本套方案也是前段时间测试的几个方案之一,这套方案相对来说部署、维护都比较方便。 keepalived简单来讲就是,Keepalived是一个专门为lvs提供高可用功能的机制,它可以实现当有两个主从lvs,而且主lvs损坏的时候,将其IP地址以及lvs转移至备份lvs上。其高可用

本套方案也是前段时间测试的几个方案之一,这套方案相对来说部署、维护都比较方便。

keepalived简单来讲就是,Keepalived是一个专门为lvs提供高可用功能的机制,它可以实现当有两个主从lvs,而且主lvs损坏的时候,将其IP地址以及lvs转移至备份lvs上。其高可用主要基于VRRP协议实现,VRRP是一个“选举”协议,它能够动态地将一个虚拟路由器的责任指定至同一个VRRP组中的其它路由器上,从而消除了静态路由配置的单点故障。如果一个VRRP设备将虚拟路由器IP地址作为真实的接口地址,则该设备被称为IP地址拥有者。如果IP地址拥有者是可用的,通常它将成为Master。

wKiom1Wlub-y9fKhAAEf3K-tsMA017.jpg

如图所示,客户端的写请求全落在双主的负载均衡上,客户端的读请求全落在两个从的负载均衡上。值得注意的是,当一个主库宕机之后,对应的从库也必须处于离线状态,如当master1宕机之后,其下的slave1也要处于离线状态。否则读操作有可能读取不到最新的数据。使对应的slave下线操作需要专门的脚本处理。


开店星免费开源商城系统
开店星免费开源商城系统

开店星基于Yii2+Vue2.0+uniapp 前沿技术研发,易学易用,前后端分离,多端开发,负载均衡,性能优越架构稳定;商城商品、订单、用户精细化管理;涵盖秒杀、消费奖励、超.级海报等基础营销插件;H5+小程序+公众号,全渠道覆盖,框架成熟稳定便于扩展,高效二开,低成本快速搭建个性化商城。 演示站地址: 账号:admin 密码:admin移动页面展示

下载

配置MySQL主从

MySQL的安装略过,本例采用MySQL5.6的版本。

前期准备:

修改四个节点的/etc/hosts文件,确保根据主机名能正常通信

[root@master1~]# cat /etc/hosts
192.168.1.121   master1.node.com
192.168.1.114   master2.node.com
192.168.1.122   slave1.node.com
192.168.1.123   slave2.node.com

确保每个节点的UUID唯一

[root@master1 ~]# cat /mysqldata/auto.cnf
[auto]
server-uuid=fa6cdd4e-337b-11e4-97e9-000c293a63cc

若发现存在两个一样的UUID,手动修改即可,UUID为16进制格式。


Mysql主从配置:

1、配置master节点:

[mysqld]
binlog-format=ROW
log-bin=master-bin
log-slave-updates=true
gtid-mode=on 
enforce-gtid-consistency=true
master-info-repository=TABLE
relay-log-info-repository=TABLE
sync-master-info=1
slave-parallel-workers=2
binlog-checksum=CRC32
master-verify-checksum=1
slave-sql-verify-checksum=1
binlog-rows-query-log_events=1
server-id=1 #不得与其他节点相同
report-port=3306
port=3306
datadir=/mydata
socket=/tmp/mysql.sock
auto_increment_increment=2 #该配置只需要在master1、master2上配置 用来确保自增键不冲突 
auto_increment_offset=1 #该配置只需要在master1、master2上配置 用来确保自增键不冲突 
binlog-do-db=mydb #需要同步的数据库,多个数据库添加多行配置项即可,需要重启mysql实例

mysql中有自增长字段,在做数据库的主主同步时需要设置自增长的两个相关配置:auto_increment_offset和auto_increment_increment。

  • auto_increment_offset表示自增长字段从那个数开始,他的取值范围是1 .. 65535

  • auto_increment_increment表示自增长字段每次递增的量,其默认值是1,取值范围是1 .. 65535

  • 在主主同步配置时,需要将两台服务器的auto_increment_increment增长量都配置为2,而要把auto_increment_offset分别配置为1和2.

这样才可以避免两台服务器同时做更新时自增长字段的值之间发生冲突。

2、配置slave节点

[mysqld]
binlog-format=ROW
log-slave-updates=true
gtid-mode=on 
enforce-gtid-consistency=true
master-info-repository=TABLE
relay-log-info-repository=TABLE
sync-master-info=1
slave-parallel-workers=2
binlog-checksum=CRC32
master-verify-checksum=1
slave-sql-verify-checksum=1
binlog-rows-query-log_events=1
server-id=11 #不得与其他节点相同
report-port=3306
port=3306
log-bin=mysql-bin.log
datadir=/mydata
socket=/tmp/mysql.sock
auto_increment_increment=2 #该配置只需要在master1、master2上配置 用来确保自增键不冲突 
auto_increment_offset=1 #该配置只需要在master1、master2上配置 用来确保自增键不冲突 
binlog-do-db=mydb #需要同步的数据库,多个数据库添加多行配置项即可,需要重启mysql实例

四个节点的配置信息差不多一样,server-id要确保唯一性。


3、创建复制用户


mysql> GRANT REPLICATION SLAVE ON *.* TO repl@'192.168.1.114' IDENTIFIED BY 'passwd';

为了便于管理,本例中将所有节点的复制用户都设置为一样的。

4、为备节点提供初始数据集

锁定主表,备份主节点上的数据,将其还原至从节点;如果没有启用GTID,在备份时需要在master上使用show master status命令查看二进制日志文件名称及事件位置,以便后面启动slave节点时使用。

5、启动从节点的复制线程

master1:

mysql> CHANGE MASTER TO MASTER_HOST='master2.node.com', MASTER_USER='repl', MASTER_PASSWORD='passwd', MASTER_AUTO_POSITION=1;

master2:

mysql> CHANGE MASTER TO MASTER_HOST='master1.node.com', MASTER_USER='repl', MASTER_PASSWORD='passwd', MASTER_AUTO_POSITION=1;

slave1:

mysql> CHANGE MASTER TO MASTER_HOST='master1.node.com', MASTER_USER='repl', MASTER_PASSWORD='passwd', MASTER_AUTO_POSITION=1;

slave2:

mysql> CHANGE MASTER TO MASTER_HOST='master2.node.com', MASTER_USER='repl', MASTER_PASSWORD='passwd', MASTER_AUTO_POSITION=1;

没启用GTID,需要使用如下命令:

slave> CHANGE MASTER TO MASTER_HOST='master1.node.com',
-> MASTER_USER='repl',
-> MASTER_PASSWORD='passwd',
-> MASTER_LOG_FILE='master-bin.000003',#需要在对应的master上边执行show master status;查看
-> MASTER_LOG_POS=1174;#需要在对应的master上边执行show master status;查看

在从节点上查看是否成功开启复制

mysql> show slave status\G;
*************************** 1. row ***************************
   Slave_IO_State: Waiting for master to send event
  Master_Host: master2.node.com
  Master_User: repl
  Master_Port: 3306
Connect_Retry: 60
  Master_Log_File: mygateway-bin.000025
  Read_Master_Log_Pos: 231
   Relay_Log_File: initiator-relay-bin.000012
Relay_Log_Pos: 409
Relay_Master_Log_File: mygateway-bin.000025
 Slave_IO_Running: Yes
Slave_SQL_Running: Yes
  Replicate_Do_DB: 
  Replicate_Ignore_DB: 
   Replicate_Do_Table: 
   Replicate_Ignore_Table: 
  Replicate_Wild_Do_Table: 
  Replicate_Wild_Ignore_Table: 
   Last_Errno: 0
   Last_Error: 
 Skip_Counter: 0
  Exec_Master_Log_Pos: 231
  Relay_Log_Space: 586
  Until_Condition: None
   Until_Log_File: 
Until_Log_Pos: 0
   Master_SSL_Allowed: No
   Master_SSL_CA_File: 
   Master_SSL_CA_Path: 
  Master_SSL_Cert: 
Master_SSL_Cipher: 
   Master_SSL_Key: 
Seconds_Behind_Master: 0
Master_SSL_Verify_Server_Cert: No
Last_IO_Errno: 0
Last_IO_Error: 
   Last_SQL_Errno: 0
   Last_SQL_Error: 
  Replicate_Ignore_Server_Ids: 
 Master_Server_Id: 11
  Master_UUID: 50aef63f-ed82-11e4-94f3-000c293a63bb
 Master_Info_File: mysql.slave_master_info
SQL_Delay: 0
  SQL_Remaining_Delay: NULL
  Slave_SQL_Running_State: Slave has read all relay log; waiting for the slave I/O thread to update it
   Master_Retry_Count: 86400
  Master_Bind: 
  Last_IO_Error_Timestamp: 
 Last_SQL_Error_Timestamp: 
   Master_SSL_Crl: 
   Master_SSL_Crlpath: 
   Retrieved_Gtid_Set: 50aef63f-ed82-11e4-94f3-000c293a63bb:1-10
Executed_Gtid_Set: 50aef63f-ed82-11e4-94f3-000c293a63bb:1-10,
fa6cdd4e-337b-11e4-97e9-000c293a63cc:1-30
Auto_Position: 1
1 row in set (0.01 sec)

Slave_IO_Running: Yes\Slave_SQL_Running: Yes 表示主从复制线程成功执行。


配置高可用负载均衡


以上完成以后,MySQL的主从环境搭建成功,下面配置keepalived+lvs高可用负载均衡。

master1、mastre2搭建写高可用负载均衡,VIP:192.168.1.120。

slave1、slave2搭建读高可用负载均衡,VIP:192.168.1.200。

为了节省服务器,将四台mysql节点上都装上keeplived,本例中lvs已经在内核中开启了,若内核版本过低或lvs模块没有在内核中开启需要自行安装lvs。

1、安装keeplived,四个节点都一样

[root@master1~]# yum -y install keeplived

配置文件位置:/etc/keepalived/keepalived.conf

2、配置lvs,四个节点上几乎都一样

lvs脚本,只需要修改相应的VIP即可

#!/bin/bash  
# description: Config realserver lo and apply noarp
SNS_VIP=192.168.1.120 #修改为对应的VIP即可
. /etc/rc.d/init.d/functions
case "$1" in
start)
   ifconfig lo:0 $SNS_VIP netmask 255.255.255.255 broadcast $SNS_VIP
   /sbin/route add -host $SNS_VIP dev lo:0
   echo "1" >/proc/sys/net/ipv4/conf/lo/arp_ignore
   echo "2" >/proc/sys/net/ipv4/conf/lo/arp_announce
   echo "1" >/proc/sys/net/ipv4/conf/all/arp_ignore
   echo "2" >/proc/sys/net/ipv4/conf/all/arp_announce
   sysctl -p >/dev/null 2>&1
   echo "RealServer Start OK"  
   ;;
stop)
   ifconfig lo:0 down
   route del $SNS_VIP >/dev/null 2>&1
   echo "0" >/proc/sys/net/ipv4/conf/lo/arp_ignore
   echo "0" >/proc/sys/net/ipv4/conf/lo/arp_announce
   echo "0" >/proc/sys/net/ipv4/conf/all/arp_ignore
   echo "0" >/proc/sys/net/ipv4/conf/all/arp_announce
   echo "RealServer Stoped"  
   ;;
*)
   echo "Usage: $0 {start|stop}"  
   exit 1
esac

四个节点都执行:

[root@localhost~]# chmod u+x /etc/rc.d/init.d/realserver.sh
[root@localhost~]# /etc/rc.d/init.d/realserver.sh start #启动lvs脚本设置参数,绑定VIP

3、配置keepalived

Keepalived是一个专门为lvs提供高可用功能的机制,它可以实现当有两个主从lvs,而且主lvs损坏的时候,将其IP地址以及lvs转移至备份lvs上。

master1、master2上的keeplived为互备模式

slave1、slave2上的keeplived为互备模式

keepalibved配置文件内容:

vrrp_instance VI_1 {
    state MASTER #在备机上修改为BACKUP
    interface eth1 #VIP要绑定到eth1上,是具体情况而定,填写具体的主机网卡名称
    virtual_router_id 52
    priority 100 #对应备机的值要小于这个值
    advert_int 1
    authentication {
        auth_type PASS #备机上要与之一致
        auth_pass 1111 #备机上要与之一致
    }

    virtual_ipaddress {
        192.168.1.120/32 dev eth1 label eth1:0 #VIP要绑定到eth1上,是具体情况而定,填写具体的主机网卡名称,修改为对应的VIP
    }
}

virtual_server 192.168.1.120 3306 {#修改为对应的VIP
        delay_loop 6
        lb_algo rr #lvs负载均衡算法
        lb_kind DR #lvs的转发模式
        #nat_mask 255.255.255.0
        #persistence_timeout 50
        protocol TCP

        real_server 192.168.1.121 3306 {#修改为对应的realserever
                weight 2
                TCP_CHECK {
                connect_timeout 3
                nb_get_retry 3
                delay_before_retry 3
                connect_port 3306
                }
        }

        real_server 192.168.1.114 3306 {#修改为对应的realserver
                    weight 2
                    TCP_CHECK {
                    connect_timeout 3
                    nb_get_retry 3
                    delay_before_retry 3
                    connect_port 3306
                    }
        }

}

启动keepalibed,并查看VIP绑定情况

[root@localhost~]#/etc/init.d/keepalived start
[root@localhost~]#ip add #查看IP状态
[root@localhost~]# ipvsadm -Ln # 查看LVS状态,若有没有该工具yum -y install ipvsadm即可

对mysql的健康状态检查后执行的操作,在real_server区段添加:

notify_up  $PATH/SCRIPT.sh #检测到服务开启后执行的脚本 可以是邮件报警,如某某IP,mysql挂掉。。。。
notify_down $PATH/SCRIPT.sh #检测到服务停止后执行的脚本.

在实际应用中,当master挂掉之后,backup会占有资源。但当master恢复之后会抢占资源,自己继续做回主,将VIP绑定至master主机上。此时正在连接的业务有可能会中断。所以在生产上需要设置为不抢占(nopreempt)资源,即它活了之后也不会将主抢回来,继续作为备机存在。但nopreempt只能在stat 为BACKUP时设置,所以此时应该将主备机上的stat 都设置为BACKUP,将priority设置为一高一低,以优先级高低确定谁是主。

对keeplived做简单的修改即可:

state BACKUP    #都修改成BACKUP
virtual_router_id 60    #默认51 主从都修改为60
priority 100    #优先级(1-254之间),另一台改为90,备用节点必须比主节点优先级低。
nopreempt               #不抢占资源,意思就是它活了之后也不会再把主抢回来,备机不需要设置改项


相关文章

keep
keep

Keep是一款健身安排,无论是想减肥塑形或增肌,还是寻找健身跑步瑜伽计步等训练计划,你可以随时随地选择课程进行训练!权威教练视频教学,健身干货自由分享!有需要的小伙伴快来保存下载体验吧!

下载

相关标签:

本站声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn

热门AI工具

更多
DeepSeek
DeepSeek

幻方量化公司旗下的开源大模型平台

豆包大模型
豆包大模型

字节跳动自主研发的一系列大型语言模型

通义千问
通义千问

阿里巴巴推出的全能AI助手

腾讯元宝
腾讯元宝

腾讯混元平台推出的AI助手

文心一言
文心一言

文心一言是百度开发的AI聊天机器人,通过对话可以生成各种形式的内容。

讯飞写作
讯飞写作

基于讯飞星火大模型的AI写作工具,可以快速生成新闻稿件、品宣文案、工作总结、心得体会等各种文文稿

即梦AI
即梦AI

一站式AI创作平台,免费AI图片和视频生成。

ChatGPT
ChatGPT

最最强大的AI聊天机器人程序,ChatGPT不单是聊天机器人,还能进行撰写邮件、视频脚本、文案、翻译、代码等任务。

相关专题

更多
Swift iOS架构设计与MVVM模式实战
Swift iOS架构设计与MVVM模式实战

本专题聚焦 Swift 在 iOS 应用架构设计中的实践,系统讲解 MVVM 模式的核心思想、数据绑定机制、模块拆分策略以及组件化开发方法。内容涵盖网络层封装、状态管理、依赖注入与性能优化技巧。通过完整项目案例,帮助开发者构建结构清晰、可维护性强的 iOS 应用架构体系。

0

2026.03.03

C++高性能网络编程与Reactor模型实践
C++高性能网络编程与Reactor模型实践

本专题围绕 C++ 在高性能网络服务开发中的应用展开,深入讲解 Socket 编程、多路复用机制、Reactor 模型设计原理以及线程池协作策略。内容涵盖 epoll 实现机制、内存管理优化、连接管理策略与高并发场景下的性能调优方法。通过构建高并发网络服务器实战案例,帮助开发者掌握 C++ 在底层系统与网络通信领域的核心技术。

3

2026.03.03

Golang 测试体系与代码质量保障:工程级可靠性建设
Golang 测试体系与代码质量保障:工程级可靠性建设

Go语言测试体系与代码质量保障聚焦于构建工程级可靠性系统。本专题深入解析Go的测试工具链(如go test)、单元测试、集成测试及端到端测试实践,结合代码覆盖率分析、静态代码扫描(如go vet)和动态分析工具,建立全链路质量监控机制。通过自动化测试框架、持续集成(CI)流水线配置及代码审查规范,实现测试用例管理、缺陷追踪与质量门禁控制,确保代码健壮性与可维护性,为高可靠性工程系统提供质量保障。

66

2026.02.28

Golang 工程化架构设计:可维护与可演进系统构建
Golang 工程化架构设计:可维护与可演进系统构建

Go语言工程化架构设计专注于构建高可维护性、可演进的企业级系统。本专题深入探讨Go项目的目录结构设计、模块划分、依赖管理等核心架构原则,涵盖微服务架构、领域驱动设计(DDD)在Go中的实践应用。通过实战案例解析接口抽象、错误处理、配置管理、日志监控等关键工程化技术,帮助开发者掌握构建稳定、可扩展Go应用的最佳实践方法。

57

2026.02.28

Golang 性能分析与运行时机制:构建高性能程序
Golang 性能分析与运行时机制:构建高性能程序

Go语言以其高效的并发模型和优异的性能表现广泛应用于高并发、高性能场景。其运行时机制包括 Goroutine 调度、内存管理、垃圾回收等方面,深入理解这些机制有助于编写更高效稳定的程序。本专题将系统讲解 Golang 的性能分析工具使用、常见性能瓶颈定位及优化策略,并结合实际案例剖析 Go 程序的运行时行为,帮助开发者掌握构建高性能应用的关键技能。

45

2026.02.28

Golang 并发编程模型与工程实践:从语言特性到系统性能
Golang 并发编程模型与工程实践:从语言特性到系统性能

本专题系统讲解 Golang 并发编程模型,从语言级特性出发,深入理解 goroutine、channel 与调度机制。结合工程实践,分析并发设计模式、性能瓶颈与资源控制策略,帮助将并发能力有效转化为稳定、可扩展的系统性能优势。

23

2026.02.27

Golang 高级特性与最佳实践:提升代码艺术
Golang 高级特性与最佳实践:提升代码艺术

本专题深入剖析 Golang 的高级特性与工程级最佳实践,涵盖并发模型、内存管理、接口设计与错误处理策略。通过真实场景与代码对比,引导从“可运行”走向“高质量”,帮助构建高性能、可扩展、易维护的优雅 Go 代码体系。

20

2026.02.27

Golang 测试与调试专题:确保代码可靠性
Golang 测试与调试专题:确保代码可靠性

本专题聚焦 Golang 的测试与调试体系,系统讲解单元测试、表驱动测试、基准测试与覆盖率分析方法,并深入剖析调试工具与常见问题定位思路。通过实践示例,引导建立可验证、可回归的工程习惯,从而持续提升代码可靠性与可维护性。

4

2026.02.27

漫蛙app官网链接入口
漫蛙app官网链接入口

漫蛙App官网提供多条稳定入口,包括 https://manwa.me、https

336

2026.02.27

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
自学IT网Linux负载均衡视频教程
自学IT网Linux负载均衡视频教程

共7课时 | 1.4万人学习

Linux负载均衡视频教程
Linux负载均衡视频教程

共7课时 | 1.9万人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号