最新文章专题视频专题问答1问答10问答100问答1000问答2000关键字专题1关键字专题50关键字专题500关键字专题1500TAG最新视频文章推荐1 推荐3 推荐5 推荐7 推荐9 推荐11 推荐13 推荐15 推荐17 推荐19 推荐21 推荐23 推荐25 推荐27 推荐29 推荐31 推荐33 推荐35 推荐37视频文章20视频文章30视频文章40视频文章50视频文章60 视频文章70视频文章80视频文章90视频文章100视频文章120视频文章140 视频2关键字专题关键字专题tag2tag3文章专题文章专题2文章索引1文章索引2文章索引3文章索引4文章索引5123456789101112131415文章专题3
当前位置: 首页 - 科技 - 知识百科 - 正文

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

来源:动视网 责编:小采 时间:2020-11-09 16:14:23
文档

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

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


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

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

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

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


配置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 #不抢占资源,意思就是它活了之后也不会再把主抢回来,备机不需要设置改项

    文档

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

    LVS+KeepAlived,搭建MySQL高可用负载均衡:本套方案也是前段时间测试的几个方案之一,这套方案相对来说部署、维护都比较方便。 keepalived简单来讲就是,Keepalived是一个专门为lvs提供高可用功能的机制,它可以实现当有两个主从lvs,而且主lvs损坏的时候,将其IP地址以及lvs转移至备份lvs上。其
    推荐度:
    标签: 搭建 mysql 可用
    • 热门焦点

    最新推荐

    猜你喜欢

    热门推荐

    专题
    Top