LVS+KeepAlived,建立MySQL高可用负载均衡51CTO博客 - 千亿集团

LVS+KeepAlived,建立MySQL高可用负载均衡51CTO博客

2019年03月01日14时57分40秒 | 作者: 景彰 | 标签: 可用,负载,均衡 | 浏览: 1680

本套计划也是前段时间测验的几个计划之一,这套计划相对来说布置、保护都比较便利。

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


版权声明
本文来源于网络,版权归原作者所有,其内容与观点不代表千亿集团立场。转载文章仅为传播更有价值的信息,如采编人员采编有误或者版权原因,请与我们联系,我们核实后立即修改或删除。

猜您喜欢的文章