MySQL读写分离最佳实践

图片来自网络

文/Bruce.Liu1

文章大纲

  1. 读写分离简介
    1.1. 常见高并发场景
    1.2. 读写分离原理
    1.3. 读写分离类型
  2. Maxsacle
    2.1. Maxsacle简介
    2.2. Maxsacle安装
    2.3. Maxsacle配置
  3. Keepalived lvs
    3.1. Keepalived lvs简介
    3.2. Keepalived lvs安装
    3.3. Keepalived lvs高可用验收
    3.4. Keepalived lvs运维注意事项
    3.5. 附录

1.读写分离简介

1.1.常见高并发场景

随着一个网站的业务不断扩展,数据不断增加,数据库的压力也会越来越大,对数据库或者SQL的基本优化可能达不到最终的效果,此时可以考虑通过添加数据库节点来使其达到提升性能的目的通常有以下常见几种方案。

  • 读写分离
    打开一个帖子内容页,需要select帖子表,和帖子评论表,每个耗时10ms的话。每秒1000次查询就是这个数据库的极限了。也就是说,这个论坛只能承载每秒500次访问。那么我们就可以对这个数据库做读写分离,来成倍提高数据库的读性能。

  • 水平分表
    交易历史,这种表。因为很少查询1年前的信息。所以,我们可以按年份来进行水平分表。将今年的表优先对待。就减少了要查询的表的大小。

  • 分库
    如果我们的系统非常大了,功能非常多,就会有很多类型的数据库表,例如营销活动的表,和用户账号的表是没有关联的,那么我们就可以将他们分到两个数据库中,然后放到不同的独立的数据库服务器,就能使数据库吞吐量成倍增加。

  • 垂直分表
    典型的应用场景是在文章列表这样的场景,一般来讲,我们的文章表会有title、userId、Content等字段,其中的Content字段一般是Text或者LongText类型,而其它的字段都是固定长度的数据类型。我们知道一个数据库优化规则是:

    • 如果一个表的所有字段都是固定长度类型的,那么它就是定长表,定长表比动态长度表查询性能要高
    • 那么,我们就可以使用垂直分表来将文章表分成文章表和文章内容表。于是文章列表页面所需的查询,就只需要查询一张定长表了。
  • 引入Cache
    通常来说即使前者的数据库架构做得再好,对于定时抢购/抽奖/等,这种类似高密度密集访问的场景也是力不从心,最好的方法还是在服务层和数据库层添加一个缓存层用,使其让请求命中至缓存层,数据层只持久化变更的数据即可。

1.2.读写分离原理

MySQL的主从复制和MySQL的读写分离两者有着紧密联系,首先部署主从复制,只有主从复制完了,才能在此基础上进行数据的读写分离。简单来说,读写分离就是只在主服务器上写,只在从服务器上读,基本的原理是让主数据库处理事务性查询,而从数据库处理select查询。当业务量非常大时,一台服务器的性能无法满足需求,就可以通过配置主从复制实现写分离来分摊负载,避免因负载太高而造成无法及时响应请求。

1.3.读写分离类型

  • 基于程序代码内部实现
    在代码中根据select,insert进行路由分类,这类方法也是目前生产环境应用最广泛的,优点是性能好,因为在程序代码中已经将读写的数据源拆分至两个,所以不需要额外的MySQL proxy解析SQL报文,在进行路由至不同数据库节点。缺点是通常该架构较复杂,运维成本相对较高。

  • 基于中间代理层实现
    代理层一般位于客户端和服务器之间,代理服务器接到客户端请求后通过解析SQL文本再将SQL路由至可用的数据库节点中。优点是程序不需要改造可以实现无缝迁移,可移植性较好。缺点是性能相对前者略微逊色一些,并且并不是所有的读操作都能够被路由至从节点中。

2.Maxsacle

2.1.Maxsacle简介

图片来自网络

maxscale是mariadb公司开发的一套数据库中间件,可以很方便的实现读写分离方案;并且提供了读写分离的负载均衡和高可用性保障。另外maxscale对于前端应用而言是透明的,我们可以很方便的将应用迁移到maxscale中实现读写分离方案,来分担主库的压力。maxscale也提供了sql语句的解析过滤功能。这里我们主要讲解maxscale的安装、配置以及注意事项。

  • Maxsacle特性

1.带权重的读写分离(负载均衡)
2.SQL防火墙
3.多种路由策略(Connection based, Statement based,Schema based)
4.自动检测MySQL master Failover (配合MHA或者MRM)
5.检测主从延时
6.多租户sharding架构

https://mariadb.com/kb/zh-cn/3028/
https://mariadb.com/downloads/mariadb-tx/maxscale

2.2.Maxsacle安装

2.2.1.软件参考文档

参考文档:
官方文档:https://mariadb.com/kb/en/mariadb-enterprise/maxscale-20-installation-guide/

软件下载:
maxSacle软件:https://downloads.mariadb.com/MaxScale/

2.1.2.系统环境介绍
  • 系统版本
    CentOS release 6.7 (Final) x86_64

  • MySQL版本
    mysql-5.7.20.-x86_64(RPM)

  • maxSacle版本
    maxscale-2.0.5

2.1.3.安装软件
# rpm -ivh maxscale-2.0.5-1.rhel.6.x86_64.rpm
2.1.4.DB创建用户
  • 创建监控复制状态账号
mysql> grant replication slave, replication client on *.* to scalemon@'192.168.2.%' identified by 'monitor18';
  • 创建业务账号
mysql> grant all privileges on mycat.* to user_maxscale@'192.168.2.%' identified by 'H2kXvhaJxRSl';
mysql> grant select on *.* to user_maxscale@'192.168.2.%';
2.1.5.maxscale创建目录
mkdir -p /data1/maxscale4007/log/
mkdir -p /data1/maxscale4007/data/
mkdir -p /data1/maxscale4007/cache/
mkdir -p /data1/maxscale4007/pid/
chown -R maxscale:maxscale /data1/maxscale4007
2.1.6.maxsacle创建秘钥
# maxkeys /data1/maxscale4007/data/
# maxpasswd /data1/maxscale4007/data/.secrets monitor18
80068EB8F16774E59BECBF8EE23AD60D
# maxpasswd /data1/maxscale4007/data/.secrets H2kXvhaJxRSl
41A9A7EFD164EF7C2D590F43F405E465
2.1.6.maxscale创建配置文件
vim /etc/maxscale4007.cnf 

[maxscale]
threads=auto    #开启线程个数,默认为1.设置为auto会同cpu核数相同 
maxlog=1        #将日志写入到maxscale的日志文件中
log_to_shm=0    #不将日志写入到共享缓存中,开启debug模式时可打开加快速度
log_warning=1   #记录告警信息 
log_error=1     #记录错误信息
log_notice=1    #记录notice
log_info=0      #不记录info
log_debug=0     #不记录debug
#log_augmentation=1
LimitNOFILE=65536
logdir=/data1/maxscale4007/log/  
datadir=/data1/maxscale4007/data/  
cachedir=/data1/maxscale4007/cache/  
piddir=/data1/maxscale4007/pid/  
libdir=/usr/lib64/maxscale/  
execdir=/usr/bin/  

[server1]
type=server
address=192.168.2.120
port=3389
protocol=MySQLBackend

[server2]
type=server
address=192.168.2.121
port=3389
protocol=MySQLBackend

[MySQL Monitor]
type=monitor
module=mysqlmon
servers=server1,server2
user=scalemon
passwd=80068EB8F16774E59BECBF8EE23AD60D
monitor_interval=5000      #监控心跳为5秒
#detect_replication_lag=true  #监控主从复制延迟
#max_slave_replication_lag  #控制maxscale运行的最大延迟
detect_stale_master=true   #当复制slave全部断掉时,maxscale仍然可用,将所有的访问指向master节点

#[Read-Only Service]
#type=service
#router=readconnroute
#servers=server2
#user=user_maxscale
#passwd=A622DB34CBF413527DE9048EBC3FE42E66EF97D8DD167887F781C5108213FD21
#router_options=slave

#读写分离,用户需要有SELECT ON mysql.db;SELECT ON mysql.tables_priv;SHOW DATABASES ON *.*的权限  
[Read-Write Service]
type=service
router=readwritesplit
servers=server1,server2
user=user_maxscale
passwd=41A9A7EFD164EF7C2D590F43F405E465
max_slave_connections=100%
use_sql_variables_in=master  #sql语句中的存在变量只指向master中执行
enable_root_user=1   #允许root用户登录执行
#master_accept_reads=true  #master节点也可以转发读请求 

[MaxAdmin Service]
type=service
router=cli

#[Read-Only Listener]
#type=listener
#service=Read-Only Service
#protocol=MySQLClient
#port=3300

#读写分离服务端口
[Read-Write Listener]
type=listener
service=Read-Write Service
protocol=MySQLClient
port=4007

#管理服务端口
[MaxAdmin Listener]
type=listener
service=MaxAdmin Service
protocol=maxscaled
socket=/data1/maxscale4007/maxadmin.sock
port=6604

2.3.Maxsacle配置

2.3.1.maxscale启动
maxsacle -f /etc/maxscale4007.cnf
2.3.2.maxscale关闭
# maxadmin -S /data1/maxscale4007/maxadmin.sock "shutdown maxscale"
2.3.3.maxscale服务状态
MaxScale> list listeners
Listeners.
---------------------+--------------------+-----------------+-------+--------
Service Name         | Protocol Module    | Address         | Port  | State
---------------------+--------------------+-----------------+-------+--------
Read-Write Service   | MySQLClient        | *               |  4007 | Running
MaxAdmin Service     | maxscaled          | *               |  6604 | Running
MaxAdmin Service     | maxscaled          | /data1/maxscale4007/maxadmin.sock |     0 | Running
---------------------+--------------------+-----------------+-------+--------

MaxScale> list servers
Servers.
-------------------+-----------------+-------+-------------+--------------------
Server             | Address         | Port  | Connections | Status              
-------------------+-----------------+-------+-------------+--------------------
server1            | 192.168.2.120   |  3389 |           0 | Master, Running
server2            | 192.168.2.121   |  3389 |           0 | Slave, Running
-------------------+-----------------+-------+-------------+--------------------

MaxScale> list services
Services.
--------------------------+----------------------+--------+---------------
Service Name              | Router Module        | #Users | Total Sessions
--------------------------+----------------------+--------+---------------
Read-Write Service        | readwritesplit       |      1 |     2
MaxAdmin Service          | cli                  |      3 |     3
--------------------------+----------------------+--------+---------------

show services
Service 0x18d6330
    Service:                             Read-Write Service
    Router:                              readwritesplit (0x7f17ce109d40)
    State:                               Started
    Number of router sessions:              1
    Current no. of router sessions:         1
    Number of queries forwarded:            1
    Number of queries forwarded to master:  0 (0.00%)
    Number of queries forwarded to slave:   1 (100.00%)
    Number of queries forwarded to all:     0 (0.00%)
    Started:                             Sat Jan  6 09:43:33 2018
    Root user access:                    Enabled
    Backend databases:
        192.168.2.120:3389  Protocol: MySQLBackend
        192.168.2.121:3389  Protocol: MySQLBackend
    Users data:                          0x18eb920
    Total connections:                   2
    Currently connected:                 2
Service 0x18d4870
    Service:                             MaxAdmin Service
    Router:                              cli (0x7f17ce313560)
    State:                               Started
    Started:                             Sat Jan  6 09:43:33 2018
    Root user access:                    Disabled
    Backend databases:
    Users data:                          0x18ed620
    Total connections:                   3
    Currently connected:                 3
2.3.4.测试读写分离
  • maxScale打开info级别日志
# vim /etc/maxscale4007.cnf
log_info=1
  • maxScale重新加载配置
# maxadmin -S /data1/maxscale4007/maxadmin.sock 
MaxScale> reload config
Reloading configuration from file.
  • client测试
# mysql -h 192.168.2.122 -P4007 -uuser_maxscale -pH2kXvhaJxRSl
  • maxScale分析日志
2018-01-06 09:50:48   [7]  info   : > Autocommit: [enabled], trx is [not open], cmd: COM_QUERY, type: QUERY_TYPE_READ, stmt: select * from t1 
2018-01-06 09:50:48   [7]  info   : Route query to slave    192.168.2.121:3389 <
2018-01-06 09:51:03   [7]  info   : > Autocommit: [enabled], trx is [open], cmd: COM_QUERY, type: QUERY_TYPE_BEGIN_TRX, stmt: begin 
2018-01-06 09:51:03   [7]  info   : Route query to master   192.168.2.120:3389 <
2018-01-06 09:51:03   [7]  info   : > Autocommit: [enabled], trx is [open], cmd: COM_QUERY, type: QUERY_TYPE_READ, stmt: select * from t1 
2018-01-06 09:51:03   [7]  info   : Route query to master   192.168.2.120:3389 <
2018-01-06 09:51:03   [7]  info   : > Autocommit: [enabled], trx is [not open], cmd: COM_QUERY, type: QUERY_TYPE_COMMIT, stmt: commit 
2018-01-06 09:51:03   [7]  info   : Route query to master   192.168.2.120:3389 <

maxScale注意:

  • 创建链接的时候,不支持压缩协议
  • 转发路由不能动态的识别master节点的迁移
  • LONGLOB字段不支持
  • 在一下情况会将语句转到master节点中(保证事务一致):
    明确指定事务;
    prepared的语句;
    语句中包含存储过程,自定义函数
    包含多条语句信息:INSERT INTO ... ; SELECT LAST_INSERT_ID();
  • 一些语句默认会发送到后端的所有server中,但是可以指定
    use_sql_variables_in=[master|all] (default: all)
  • maxscale不支持主机名匹配的认证模式,只支持IP地址方式的host解析。所以在添加user的时候记得使用合适的范式。
  • 跨库查询不支持,会显示的指定到第一个数据库中

3.Keepalived lvs

3.1.Keepalived lvs简介

在互联网应用技术中,负载均衡一直是热门话题,使用负载均衡技术主要的目的包括如下几点:

  • 高可用性:
    组成系统的某些设备或部件失效,并不会影响正常的服务

  • 可扩展性:
    用户的增加,引起访问数 乃至流量的增加,这种情况下,需要对系统进行扩容,以应对这种快速增长,并且通常该场景中最基本扩展要求就是对用户是透明的

  • 负载能力:
    当整个系统的负责趋于饱和时,通过增加物理服务器和扩充物理带宽来解决这个麻烦。增加物理服务器后,系统的负载情况将在所有集群的物理服务器之间按照指定的算法从新达到新的均衡

虚拟服务器是负载均衡体系的基本架构,分为:转发器(Director)和真实服务器。

图片来自keepalived官网
  • 转发器(Director):
    主要负责包转发、负载均衡,该功能通过ipvsadm具体实现。

  • 真实服务器(Real):
    真正接受并处理请求的服务器,通常泛指:nginx、mysql等不同场景等服务

3.2.Keepalived lvs安装

3.2.1.软件参考文档

参考文档:
官方文档:http://www.keepalived.org/pdf/sery-lvs-cluster.pdf

软件下载:
keepalived软件:http://www.keepalived.org/download.html
Ipvs软件:http://www.linuxvirtualserver.org/software/kernel-2.6/ipvsadm-1.24.tar.gz

3.2.2.系统环境介绍
  • 系统版本
    CentOS release 6.7 (Final) x86_64

  • MySQL版本
    mysql-5.7.20.-x86_64(RPM)

  • keepalived版本
    keepalived-1.2.13-5

  • 架构示意图

图片来自原创
3.2.3.lvs客户端
  • 真实服务器上操作(slave1 slave2),参照格式编写lvs 客户端配置脚本,保存后给予执行权限。其完整的内容如下:
# vim /usr/local/bin/lvs_real

#!/bin/bash
#description : start realserver

VIP=192.168.2.210

/etc/rc.d/init.d/functions

case "$1" in
start)
        echo " start LVS of REALServer"
        /sbin/ifconfig lo:0 $VIP broadcast $VIP netmask 255.255.255.255 up
        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
        ;;
stop)
        /sbin/ifconfig lo:0 down
        echo "close LVS Directorserver"
        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 "Usage: $0 {start|stop}"
        exit 1
esac
  • 真实服务器上操作(slave1 slave2),启动lvs client并配置成开机自启动
# chmod 755 /usr/local/bin/lvs_real
# chmod 755 /etc/rc.d/init.d/functions
# /usr/local/bin/lvs_real start
# echo "/usr/local/bin/lvs_real start" >> /etc/rc.d/rc.local
  • 验证lvs client
# ifconfig

… …  省略  … …
lo:0      Link encap:Local Loopback  
          inet addr:10.209.5.201  Mask:255.255.255.255
          UP LOOPBACK RUNNING  MTU:16436  Metric:1

3.2.4.安装配置keepalived
  • 安装ipvs
    Ipvs(IP Virtual Server)是整个负载均衡的基础,如果没有这个基础,故障隔离与切换就毫无意义;Ipvs具体是由ipvsadm这个程序来完成的。因此需要安装ipvsadm
# yum -y install ipvsadm-1.26-4.el6.x86_64
  • 安装keepalived软件
    负载均衡器上操作(Master Backup)安装keepalived和ipvsadm工具包
# yum -y install keepalived.x86_64
  • 开启路由转发
    负载均衡器上操作(Master Backup),开启路由转发
# echo "net.ipv4.ip_forward = 1" >> /etc/sysctl.conf
# sysctl -p
  • Master的配置文件
# vim /etc/keepalived/keepalived.conf

! Configuration File for keepalived

global_defs {
   notification_email {
     acassen@firewall.loc
     failover@firewall.loc
     sysadmin@firewall.loc
   }
   router_id lvs_mysql_3389
}

vrrp_instance vi_3389 { 
    state MASTER
    interface eth0
    lvs_sync_daemon_inteface eth0
    virtual_router_id 11
    priority 90
    nopreempt
    advert_int 1 
    authentication { 
        auth_type PASS 
        auth_pass mysql3389
    } 
    virtual_ipaddress { 
        192.168.2.210
    } 
}
 
virtual_server 192.168.2.210 3389 { 
    delay_loop 2 
    lb_algo wrr
    lb_kind DR 
#    persistence_timeout 60 
    protocol TCP 
 
    real_server 192.168.2.120 3389 {
        weight 3 
    TCP_CHECK {
            connect_timeout 10
            nb_get_retry 3
            delay_before_retry 3
            connect_port 3389
        }
    }
  
    real_server 192.168.2.121 3389 {
        weight 3 
    TCP_CHECK {                 
            connect_timeout 10      
            nb_get_retry 3          
            delay_before_retry 3    
            connect_port 3389
        }
    } 

}
  • Backup的配置文件
# vim /etc/keepalived/keepalived.conf

! Configuration File for keepalived

global_defs {
   notification_email {
     acassen@firewall.loc
     failover@firewall.loc
     sysadmin@firewall.loc
   }
   router_id lvs_mysql_3389
}

vrrp_instance vi_3389 { 
    state MASTER
    interface eth0
    lvs_sync_daemon_inteface eth0
    virtual_router_id 11
    priority 10
    nopreempt
    advert_int 1 
    authentication { 
        auth_type PASS 
        auth_pass mysql3389
    } 
    virtual_ipaddress { 
        192.168.2.210
    } 
}
 
virtual_server 192.168.2.210 3389 { 
    delay_loop 2 
    lb_algo wrr
    lb_kind DR 
#    persistence_timeout 60 
    protocol TCP 
 
    real_server 192.168.2.120 3389 {
        weight 3 
    TCP_CHECK {
            connect_timeout 10
            nb_get_retry 3
            delay_before_retry 3
            connect_port 3389
        }
    }
  
    real_server 192.168.2.121 3389 {
        weight 3 
    TCP_CHECK {                 
            connect_timeout 10      
            nb_get_retry 3          
            delay_before_retry 3    
            connect_port 3389
        }
    } 

}
  • 启动服务并验证
    启动keepalived服务并验证(Master Backup)
# /etc/init.d/keepalived start
# chkconfig keepalived on

3.3.Keepalived lvs高可用验收

  • keepalived故障测试

Master模拟宕机,测试Backup是否能够第一时间接管Keepalived服务,并切换vip

  • Master重启机器
# init 6
  • Backup已经看出可以接管
# ip addr
… …  省略  … …
8: bond0: <BROADCAST,MULTICAST,MASTER,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP 
    link/ether a0:36:9f:79:07:4c brd ff:ff:ff:ff:ff:ff
    inet 10.209.5.195/25 brd 10.209.5.255 scope global bond0
    inet 10.209.5.201/32 scope global bond0    # bakcup已经看出可以接管
    inet6 fe80::a236:9fff:fe79:74c/64 scope link 
       valid_lft forever preferred_lft forever
  • lvs client故障测试

将slave1 slave2主机进行重启,用于模拟宕机,测试是否会将请求转发至正常的Master1

  • Slave1重启机器
# init 6
  • Slave2重启机器
# init 6
  • 负载局衡器上验证转发链路状态,链路正常能够连接Master
# ipvsadm -L
IP Virtual Server version 1.2.1 (size=4096)
Prot LocalAddress:Port Scheduler Flags
  -> RemoteAddress:Port           Forward Weight ActiveConn InActConn
TCP  10.209.5.201:chevinservices wrr
  -> 10.209.5.191:chevinservices  Route   3      0          0
  • MHA故障切换对LVS的影响测试

  • MySQL Master1重启机器

# init 6
  • Master故障后,负载均衡器的链路状态
# ipvsadm -L
IP Virtual Server version 1.2.1 (size=4096)
Prot LocalAddress:Port Scheduler Flags
  -> RemoteAddress:Port           Forward Weight ActiveConn InActConn
TCP  10.209.5.201:chevinservices wrr
  -> 10.209.5.192:chevinservices  Route   3      0          0         
  -> 10.209.5.193:chevinservices  Route   3      0          0

如果MySQL 原来的Master 是重启的情况,负载均衡器还会将请求转发至原Master,不会去检测原Master的复制状态以及是否有延迟的,以下是原Master起来后,负载均衡器上的链路状态

# ipvsadm -L
IP Virtual Server version 1.2.1 (size=4096)
Prot LocalAddress:Port Scheduler Flags
  -> RemoteAddress:Port           Forward Weight ActiveConn InActConn
TCP  10.209.5.201:chevinservices wrr
  -> 10.209.5.191:chevinservices  Route   3      0          0         
  -> 10.209.5.192:chevinservices  Route   3      0          0         
  -> 10.209.5.193:chevinservices  Route   3      0          0  

3.4.Keepalived lvs运维注意事项

  • 线上变更注意事项

线上keepalived环境(基于端口探测方式)不会检查MySQL复制链路以及延迟情况,所以对于大数据量表的DDL变更,最好是放在夜间或者业务低峰期进行,复制的异常也要及时的处理,避免因数据延迟或者复制不同步导致业务读取过期的数据

  • keepalived环境slave扩容
    1.部署新的slave
    2.修改Mha配置文件,将新添加slave也加上,并设置成永不成为master
    3.在keepalived的Backup节点上添加新slave的配置标签,并将keepalived Master的keepalived服务停止,此时keepalive的服务会切换到Backup节点上,将master的配置文件在进行更新,并把服务启动,这样就完成了online的扩容工作

  • 主从切换后的注意事项
    1.首先检查MHA切换是否成功、除原主以外的其他slave是否change成功到切到新master上
    2.在负载均衡器上是否检查链路是否正常(ipvsad –L),并且在主从切换后一定要手动测试链路是否畅通,因为有的时候master的网络服务异常等网络情况会引起lvs client工作异常,如果手动链接链路异常并且负载均衡器上链路正常,请第一时间去该MySQL服务器上启动lvs client 程序)( lvs_real start)

  • lvs client的维护与停机
    当MySQL的slave服务器由于硬件故障或者切换导致需要大量时间用于停机维护时,登录到停机维护的设备上执行“/usr/local/bin/maintenance_mode.sh 10.209.5.194 3349”,脚本有两个参数:禁止访问的IP、禁止访问的端口,一般来讲就是禁止keepalived server转发过来的MySQL 端口对应的请求。脚本内容见附录。

附录

  • Keepalived配置文件详解
global_defs {
   notification_email {  #指定keepalived在发生切换时需要发送email到的对象,一行一个
    sysadmin@fire.loc
   }
   notification_email_from Alexandre.Cassen@firewall.loc #指定发件人
   smtp_server localhost #指定smtp服务器地址
   smtp_connect_timeout 30 #指定smtp连接超时时间
   router_id LVS_DEVEL #运行keepalived机器的一个标识
}
vrrp_sync_group VG_1{ #监控多个网段的实例
group {
inside_network #实例名
outside_network
}
notify_master /path/xx.sh #指定当切换到master时,执行的脚本
netify_backup /path/xx.sh #指定当切换到backup时,执行的脚本
notify_fault "path/xx.sh VG_1" #故障时执行的脚本
notify /path/xx.sh 
smtp_alert #使用global_defs中提供的邮件地址和smtp服务器发送邮件通知
}
vrrp_instance inside_network {
    state BACKUP #指定那个为master,那个为backup,如果设置了nopreempt这个值不起作用,主备考priority决

定
    interface eth0 #设置实例绑定的网卡
    dont_track_primary #忽略vrrp的interface错误(默认不设置)
    track_interface{ #设置额外的监控,里面那个网卡出现问题都会切换
    eth0
    eth1
    }
    mcast_src_ip #发送多播包的地址,如果不设置默认使用绑定网卡的primary ip
    garp_master_delay #在切换到master状态后,延迟进行gratuitous ARP请求
    virtual_router_id 50 #VPID标记
    priority 99 #优先级,高优先级竞选为master
    advert_int 1 #检查间隔,默认1秒
    nopreempt #设置为不抢占 注:这个配置只能设置在backup主机上,而且这个主机优先级要比另外一台高
    preempt_delay #抢占延时,默认5分钟
    debug #debug级别
    authentication { #设置认证
        auth_type PASS #认证方式
        auth_pass 111111 #认证密码
    }
    virtual_ipaddress { #设置vip
        192.168.202.200
    }
}
virtual_server 192.168.202.200 23 {
    delay_loop 6 #健康检查时间间隔
    lb_algo rr  #lvs调度算法rr|wrr|lc|wlc|lblc|sh|dh
    lb_kind DR  #负载均衡转发规则NAT|DR|RUN
    persistence_timeout 5 #会话保持时间
    protocol TCP #使用的协议
    persistence_granularity <NETMASK> #lvs会话保持粒度
    virtualhost <string> #检查的web服务器的虚拟主机(host:头)    
    sorry_server<IPADDR> <port> #备用机,所有realserver失效后启用
real_server 192.168.200.5 23 {
            weight 1 #默认为1,0为失效
            inhibit_on_failure #在服务器健康检查失效时,将其设为0,而不是直接从ipvs中删除 
            notify_up <string> | <quoted-string> #在检测到server up后执行脚本
            notify_down <string> | <quoted-string> #在检测到server down后执行脚本
            
TCP_CHECK {
            connect_timeout 3 #连接超时时间
            nb_get_retry 3 #重连次数
            delay_before_retry 3 #重连间隔时间
            connect_port 23  健康检查的端口的端口
            bindto <ip>   
          }
HTTP_GET | SSL_GET{
    url{ #检查url,可以指定多个
         path /
         digest <string> #检查后的摘要信息
         status_code 200 #检查的返回状态码
        }
    connect_port <port> 
    bindto <IPADD>
    connect_timeout 5
    nb_get_retry 3
    delay_before_retry 2
}

SMTP_CHECK{
    host{
    connect_ip <IP ADDRESS>
    connect_port <port> #默认检查25端口
    bindto <IP ADDRESS>
         }
    connect_timeout 5
    retry 3
    delay_before_retry 2
    helo_name <string> | <quoted-string> #smtp helo请求命令参数,可选
}
MISC_CHECK{
    misc_path <string> | <quoted-string> #外部脚本路径
    misc_timeout #脚本执行超时时间
    misc_dynamic #如设置该项,则退出状态码会用来动态调整服务器的权重,返回0 正常,不修改;返回1,

检查失败,权重改为0;返回2-255,正常,权重设置为:返回状态码-2
}
    }



最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 151,511评论 1 330
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 64,495评论 1 273
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 101,595评论 0 225
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 42,558评论 0 190
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 50,715评论 3 270
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 39,672评论 1 192
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 31,112评论 2 291
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 29,837评论 0 181
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 33,417评论 0 228
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 29,928评论 2 232
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 31,316评论 1 242
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 27,773评论 2 234
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 32,253评论 3 220
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 25,827评论 0 8
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 26,440评论 0 180
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 34,523评论 2 249
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 34,583评论 2 249

推荐阅读更多精彩内容