• keepalived+LVS-DR集群


    一、Keepalived介绍

      keepalived 是一个类似于 layer3, 4 & 5 交换机制的软件,也就是我们平时说的第 3 层、第 4 层和第 5层交换。 Keepalived 的作用是检测 web 服务器的状态,如果有一台 web 服务器死机,或工作出现故障,Keepalived 将检测到,并将有故障的 web 服务器从系统中剔除,当 web 服务器工作正常后 Keepalived 自动将web 服务器加入到服务器群中,这些工作全部自动完成,不需要人工干涉,需要人工做的只是修复故障的web 服务器。

    拓展:OSI七层

    拓展:OSI七层相关协议

    拓展:VRRP/HSRP
      虚拟路由冗余协议(Virtual Router Redundancy Protocol,简称VRRP)是由IETF提出的解决局域网中配置静态网关出现单点失效现象的路由协议。使用组播方式通信。
    VRRP是一种路由容错协议,也可以叫做备份路由协议。一个局域网络内的所有主机都设置缺省路由(默认网关),当网内主机发出的目的地址不在本网段时,报文将被通过缺省路由发往外部路由器,从而实现了主机与外部网络的通信。当缺省路由器down掉(即端口关闭)之后,内部主机将无法与外部通信,如果路由器设置了VRRP时,那么这时,虚拟路由将启用备份路由器,从而实现全网通信。
    工作流程如图:

      HSRP:热备份路由器协议(HSRP)的设计目标是支持特定情况下 IP 流量失败转移不会引起混乱、并允许主机使用单路由器,以及即使在实际第一跳路由器使用失败的情形下仍能维护路由器间的连通性。换句话说,当源主机不能动态知道第一跳路由器的 IP 地址时,HSRP 协议能够保护第一跳路由器不出故障,是CISCO的私有协议!该协议中含有多台路由器,对应一个HSRP组。该组中只有一个路由器承担转发用户流量的职责,这就是活动路由器。当活动路由器失效后,备份路由器将承担该职责,成为新的活动路由器。这就是热备份的原理。
      HSRP和VRRP的区别:HSRP是cisco的专有协议.在Cisco的HSRP之后,internet工程任务小组(internet engineering task force,IETF)也制定一种路由冗余协议:虚拟路由冗余协议(Virtual Router Redundancy Protocol,VRRP),目前包括Csico在内的主流厂商均在其产品中支持VRRP协议!VRRP和HSRP也有很多不同。VRRP和HSRP 的一个主要的区别在安全方面:它允许参与VRRP组的设备间建立认证机制 。另一个主要区别 :VRRP中只有三种状态----初始状态(Initialize)、主状态(Master)、备份状态(Backup),而HSRP 有六种状态。其余在报文类型 、报文格式和通过TCP而非UDP发送的报文方面也有所不同

    二、Keepalived工作原理

      Layer3,4&5 工作在 IP/TCP 协议栈的 IP 层, TCP 层,及应用层,。
      Layer3: Keepalived 使用 Layer3 的方式工作式时, Keepalived 会定期向服务器群中的服务器发送一个 ICMP 的数据包(既我们平时用的 Ping 程序) , 如果发现某台服务的 IP 地址没有激活,Keepalived 便报告这台服务器失效,并将它从服务器群中剔除,这种情况的典型例子是某台服务器被非法关机。 Layer3 的方式是以服务器的 IP 地址是否有效作为服务器工作正常与否的标准。
      Layer4: 主要以 TCP 端口的状态来决定服务器工作正常与否。如 web server 的服务端口一般是80,如果 Keepalived 检测到 80 端口没有启动,则 Keepalived 将把这台服务器从服务器群中删除。
      Layer5: Layer5 就是工作在具体的应用层了,比 Layer3,Layer4 要复杂一点,在网络上占用的带宽也要大一些。 Keepalived 将根据用户的设定检查服务器程序的运行是否正常,如果与用户的设定不相符,则 Keepalived 将把服务器从服务器群中剔除。

    三、Keepalived的作用与构建

      1.管理 VIP VIP 会在 LVS 之间漂移
      2.监控 LVS分发器
        运行在主分发的 Keepalived 会以组播的形式向网络中宣告自己,即主分发器还活着,备用节点能收到。当备用节点,在一个时间单位中收不到组播,备用节点会认为主 LVS 挂了,开始接手主分发器工作,把 VIP 配给自己。

      3.管理 RS
        Keepalived 会每隔一个时间段去做一次类似于访问的操作如:
      探针: elinks http://192.168.3.64 –dump
      经典高可用web架构: LVS+keepalived+nginx+apache+php+eaccelerator(+nfs可选)
        http://www.keepalived.org/
      下载:http://www.keepalived.org/download.html

    四、使用Keepalived构建LVS-DR模式的高可用集群

    1.环境准备:

    2.网络拓扑图:

     

    3、配置主节点xuegod63

    [root@xuegod63 ~]# yum install -y ipvsadm keepalived
    [root@xuegod63 ~]# cd /etc/keepalived/
    [root@xuegod63 keepalived]# ls
    keepalived.conf
    [root@xuegod63 keepalived]# cp keepalived.conf keepalived.conf.bak
    [root@xuegod63 keepalived]# vim keepalived.conf
    global_defs {
       notification_email {
         root@localhost                         #默认三个地址,修改可用地址
       }
       notification_email_from root@localhost
       smtp_server localhost
       smtp_connect_timeout 30
       router_id xuegod63                       #标识当前节点名字,两个节点的此项需要不相同。
    }
    
    vrrp_instance apache {      #定义一个实例,一个集群就是一个实例。 默认VI_1 可以随意改
        state MASTER            #指定 A 节点为主节点 备用节点上设置为 BACKUP 即可 
        interface ens33         #绑定虚拟 IP 的网络接口 
        virtual_router_id 51    #VRRP 组名,两个节点的设置必须一样,以指明各个节点属于同一 VRRP 组
        priority 100            #主节点的优先级(1-254 之间),备用节点必须比主节点优先级低 
        advert_int 1            #组播信息发送间隔,两个节点设置必须一样 
        authentication {        #设置验证信息,两个节点必须一致 
            auth_type PASS
            auth_pass 1111
        }
        virtual_ipaddress {
            192.168.1.101       #指定虚拟 IP, 两个节点设置必须一样
        }
    }
    #类似添加虚拟一个服务 ipvsadm -A -t 192.168.1.70:80 -s rr
    virtual_server 192.168.1.111 80 {    #对虚拟IP63添加LVS相关内容
        delay_loop 6                    #Keepalived 多长时间监测一次 RS
        lb_algo rr                      #分发算法
        lb_kind DR                      #DR 模式
        nat_mask 255.255.255.0
        persistence_timeout 50  #同一IP 50秒内的请求都发到同个real server ,这个会影响LVS的 rr 调度算法, 同一 IP 超过 50 秒后,再次访问,才会被转发到另一台 real server 上。 persistence 持久性的意思
        protocol TCP
    # ipvsadm -a -t 192.168.2.111:80 -r 192.168.2.64 -g 添加的内容,类似这条命令
    # ipvsadm -a -t 192.168.2.111:80 -r 192.168.2.65 –g 添加的内容,类似这条命令
        real_server 192.168.1.62 80 { #配置服务节点 1,需要指定 realserver 的真实 IP 地址和端口,IP不端口之间用空格隔开 
            weight 1    #配置服务节点的权值,权值大小用数字表示,数字越大,权值越高,设置权值大小可以为不同性能的服务器  
            TCP_CHECK {     #这段内容手动添加,以前的内容删除
                    connect_timeout 3       #表示 3 秒无响应超时
                    nb_get_retry 3          #表示重试次数
                    delay_before_retry 3    #表示重试间隔
                    connect_port 80         #检测端口
                    }
        }
        real_server 192.168.1.64 80 {
            weight 1
            TCP_CHECK {
                    connect_timeout 3
                    nb_get_retry 3
                    delay_before_retry 3
                    connect_port 80
                    }
        }
    }
    #默认配置文件中还有两个 virtual_server 模版,把剩下的都删除了,就可以。 如: 
    #virtual_server 10.10.10.2 1358 {  。。。 } 
    #virtual_server 10.10.10.3 1358 {  。。。 }
    
    [root@xuegod63 ~]# yum install -y ipvsadm keepalived
    [root@xuegod63 keepalived]# systemctl restart keepalived
    [root@xuegod63 keepalived]# ipvsadm -Ln
    IP Virtual Server version 1.2.1 (size=4096)
    Prot LocalAddress:Port Scheduler Flags
      -> RemoteAddress:Port           Forward Weight ActiveConn InActConn
    TCP  192.168.1.101:80 rr persistent 50
      -> 192.168.1.62:80             Route   1      0          0         
      -> 192.168.1.64:80             Route   1      0          0         
    [root@xuegod63 keepalived]# ip a
    1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN qlen 1
        link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
        inet 127.0.0.1/8 scope host lo
           valid_lft forever preferred_lft forever
        inet6 ::1/128 scope host 
           valid_lft forever preferred_lft forever
    2: ens33: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP qlen 1000
        link/ether 00:0c:29:fc:6c:97 brd ff:ff:ff:ff:ff:ff
        inet 192.168.1.63/24 brd 192.168.1.255 scope global ens33
           valid_lft forever preferred_lft forever
        inet 192.168.1.101/32 scope global ens33
           valid_lft forever preferred_lft forever
        inet6 fe80::8182:e475:d8fe:cfd7/64 scope link 
           valid_lft forever preferred_lft forever
    
    [root@xuegod70 keepalived]# tail /var/log/messages  #查看keepalived日志文件
    Jul  3 10:40:07 xuegod70 Keepalived_vrrp[2464]: Sending gratuitous ARP on ens33 for 192.168.100.111
    Jul  3 10:40:07 xuegod70 Keepalived_vrrp[2464]: Sending gratuitous ARP on ens33 for 192.168.100.111
    Jul  3 10:40:07 xuegod70 Keepalived_vrrp[2464]: Sending gratuitous ARP on ens33 for 192.168.100.111
    Jul  3 10:40:07 xuegod70 Keepalived_vrrp[2464]: VRRP_Instance(apache) Sending/queueing gratuitous ARPs on ens33 for 192.168.100.111
    Jul  3 10:40:07 xuegod70 Keepalived_vrrp[2464]: Sending gratuitous ARP on ens33 for 192.168.100.111
    Jul  3 10:40:07 xuegod70 Keepalived_vrrp[2464]: Sending gratuitous ARP on ens33 for 192.168.100.111
    Jul  3 10:40:08 xuegod70 Keepalived_vrrp[2464]: Sending gratuitous ARP on ens33 for 192.168.100.111
    Jul  3 10:40:08 xuegod70 Keepalived_vrrp[2464]: Sending gratuitous ARP on ens33 for 192.168.100.111
    Jul  3 11:01:01 xuegod70 systemd: Started Session 5 of user root.
    Jul  3 11:01:01 xuegod70 systemd: Starting Session 5 of user root.

    4.配置次节点xuegod61

    [root@xuegod61 ~]# cd /etc/keepalived/
    [root@xuegod61 keepalived]# cp keepalived.conf keepalived.conf.bak
    [root@xuegod61 keepalived]# vim keepalived.conf
    global_defs {
       notification_email {
         root@localhost                         #默认三个地址,修改可用地址
       }
       notification_email_from root@localhost
       smtp_server localhost
       smtp_connect_timeout 30
       router_id xuegod61                       #标识当前节点名字,两个节点的此项需要不相同。
    }
    
    vrrp_instance apache {      #定义一个实例,一个集群就是一个实例。 默认VI_1 可以随意改
        state BACKUP            #指定 A 节点为主节点 备用节点上设置为 BACKUP 即可 
        interface ens33         #绑定虚拟 IP 的网络接口 
        virtual_router_id 51    #VRRP 组名,两个节点的设置必须一样,以指明各个节点属于同一 VRRP 组
        priority 90             #主节点的优先级(1-254 之间),备用节点必须比主节点优先级低 
        advert_int 1            #组播信息发送间隔,两个节点设置必须一样 
        authentication {        #设置验证信息,两个节点必须一致 
            auth_type PASS
            auth_pass 1111
        }
        virtual_ipaddress {
            192.168.1.101       #指定虚拟 IP, 两个节点设置必须一样
        }
    }
    #类似添加虚拟一个服务 ipvsadm -A -t 192.168.1.70:80 -s rr
    virtual_server 192.168.1.101 80 {    #对虚拟IP63添加LVS相关内容
        delay_loop 6                    #Keepalived 多长时间监测一次 RS
        lb_algo rr                      #分发算法
        lb_kind DR                      #DR 模式
        nat_mask 255.255.255.0
        persistence_timeout 50  #同一IP 50秒内的请求都发到同个real server ,这个会影响LVS的 rr 调度算法, 同一 IP 超过 50 秒后,再次访问,才会被转发到另一台 real server 上。 persistence 持久性的意思
        protocol TCP
    # ipvsadm -a -t 192.168.2.111:80 -r 192.168.2.64 -g 添加的内容,类似这条命令
    # ipvsadm -a -t 192.168.2.111:80 -r 192.168.2.65 –g 添加的内容,类似这条命令
        real_server 192.168.1.62 80 { #配置服务节点 1,需要指定 realserver 的真实 IP 地址和端口,IP不端口之间用空格隔开 
            weight 1    #配置服务节点的权值,权值大小用数字表示,数字越大,权值越高,设置权值大小可以为不同性能的服务器  
            TCP_CHECK {     #这段内容手动添加,以前的内容删除
                    connect_timeout 3       #表示 3 秒无响应超时
                    nb_get_retry 3          #表示重试次数
                    delay_before_retry 3    #表示重试间隔
                    connect_port 80         #检测端口
                    }
        }
        real_server 192.168.1.64 80 {
            weight 1
            TCP_CHECK {
                    connect_timeout 3
                    nb_get_retry 3
                    delay_before_retry 3
                    connect_port 80
                    }
        }
    }
    #默认配置文件中还有两个 virtual_server 模版,把剩下的都删除了,就可以。 如: 
    #virtual_server 10.10.10.2 1358 {  。。。 } 
    #virtual_server 10.10.10.3 1358 {  。。。 }
    
    [root@xuegod61 keepalived]# systemctl restart keepalived
    [root@xuegod61 keepalived]# systemctl enable keepalived
    Created symlink from /etc/systemd/system/multi-user.target.wants/keepalived.service to /usr/lib/systemd/system/keepalived.service.
    [root@xuegod61 keepalived]# ip a
    1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN qlen 1
        link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
        inet 127.0.0.1/8 scope host lo
           valid_lft forever preferred_lft forever
        inet6 ::1/128 scope host 
           valid_lft forever preferred_lft forever
    2: ens33: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP qlen 1000
        link/ether 00:0c:29:c8:db:80 brd ff:ff:ff:ff:ff:ff
        inet 192.168.1.61/24 brd 192.168.1.255 scope global ens33
           valid_lft forever preferred_lft forever
        inet6 fe80::e4ad:407d:9d2f:5db/64 scope link 
           valid_lft forever preferred_lft forever
    [root@xuegod61 keepalived]# ipvsadm -Ln
    IP Virtual Server version 1.2.1 (size=4096)
    Prot LocalAddress:Port Scheduler Flags
      -> RemoteAddress:Port           Forward Weight ActiveConn InActConn
    TCP  192.168.1.101:80 rr persistent 50
    

    5. 设置LVS IP 漂移 

    [root@xuegod63 keepalived]# systemctl stop keepalived
    You have new mail in /var/spool/mail/root
    [root@xuegod63 keepalived]# ipvsadm -Ln
    IP Virtual Server version 1.2.1 (size=4096)
    Prot LocalAddress:Port Scheduler Flags
      -> RemoteAddress:Port           Forward Weight ActiveConn InActConn
    
    [root@xuegod61 keepalived]# ip a
    1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN qlen 1
        link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
        inet 127.0.0.1/8 scope host lo
           valid_lft forever preferred_lft forever
        inet6 ::1/128 scope host 
           valid_lft forever preferred_lft forever
    2: ens33: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP qlen 1000
        link/ether 00:0c:29:c8:db:80 brd ff:ff:ff:ff:ff:ff
        inet 192.168.1.61/24 brd 192.168.10.255 scope global ens33
           valid_lft forever preferred_lft forever
        inet6 fe80::e4ad:407d:9d2f:5db/64 scope link 
           valid_lft forever preferred_lft forever
    [root@xuegod61 keepalived]# ipvsadm -Ln
    IP Virtual Server version 1.2.1 (size=4096)
    Prot LocalAddress:Port Scheduler Flags
      -> RemoteAddress:Port           Forward Weight ActiveConn InActConn
    TCP  192.168.1.101:80 rr persistent 50   #看到192.168.1.63飘移过来了,就证明一切正常了
    [root@xuegod61 keepalived]# ip a
    1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN qlen 1
        link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
        inet 127.0.0.1/8 scope host lo
           valid_lft forever preferred_lft forever
        inet6 ::1/128 scope host 
           valid_lft forever preferred_lft forever
    2: ens33: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP qlen 1000
        link/ether 00:0c:29:c8:db:80 brd ff:ff:ff:ff:ff:ff
        inet 192.168.1.61/24 brd 192.168.1.255 scope global ens33
           valid_lft forever preferred_lft forever
        inet 192.168.1.101/32 scope global ens33
           valid_lft forever preferred_lft forever
        inet6 fe80::e4ad:407d:9d2f:5db/64 scope link 
           valid_lft forever preferred_lft forever
    

    6. 配置RS1  xuegod62  

    [root@xuegod62 ~]# vim /etc/init.d/lvsrsdr
    #!/bin/bash
    #description:start relserver
    VIP=192.168.1.101
    source /etc/init.d/functions                #加载环境变量(可以加载所有的环境变量)
    case $1 in
    start)
            echo 'start LVS of Realserver DR'
            /sbin/ifconfig lo:1 $VIP broadcast $VIP netmask 255.255.255.255 up
            /sbin/route add -host $VIP dev lo:1
            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:1 down
            echo 'Close LVS of Realserver DR'
            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
    [root@xuegod62 ~]# chmod +x !$
    chmod +x /etc/init.d/lvsrsdr
    [root@xuegod62 ~]# ip a
    1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN qlen 1
        link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
        inet 127.0.0.1/8 scope host lo
           valid_lft forever preferred_lft forever
        inet6 ::1/128 scope host 
           valid_lft forever preferred_lft forever
    2: ens33: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP qlen 1000
        link/ether 00:0c:29:91:c9:b2 brd ff:ff:ff:ff:ff:ff
        inet 192.168.1.62/24 brd 192.168.10.255 scope global ens33
           valid_lft forever preferred_lft forever
        inet6 fe80::e06b:73c9:b179:7570/64 scope link 
           valid_lft forever preferred_lft forever
    [root@xuegod62 ~]# /etc/init.d/lvsrsdr start 
    Reloading systemd:                                         [  确定  ]
    Starting lvsrsdr (via systemctl):                          [  确定  ]
    [root@xuegod62 ~]# yum install -y httpd
    [root@xuegod62 ~]# echo 192.168.1.62 > /var/www/html/index.html
    [root@xuegod62 ~]# vim /etc/httpd/conf/httpd.conf 
    [root@xuegod62 ~]# systemctl restart httpd
    

    7. 配置RS2  xuegod64 

    [root@xuegod64 ~]# vim /etc/init.d/lvsrsdr
    #!/bin/bash
    #description:start relserver
    VIP=192.168.1.101
    source /etc/init.d/functions                #加载环境变量(可以加载所有的环境变量)
    case $1 in
    start)
            echo 'start LVS of Realserver DR'
            /sbin/ifconfig lo:1 $VIP broadcast $VIP netmask 255.255.255.255 up
            /sbin/route add -host $VIP dev lo:1
            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:1 down
            echo 'Close LVS of Realserver DR'
            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
    [root@xuegod64 ~]# chmod +x !$
    chmod +x /etc/init.d/lvsrsdr
    [root@xuegod64 ~]# ip a
    1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN qlen 1
        link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
        inet 127.0.0.1/8 scope host lo
           valid_lft forever preferred_lft forever
        inet6 ::1/128 scope host 
           valid_lft forever preferred_lft forever
    2: ens33: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP qlen 1000
        link/ether 00:0c:29:91:c9:b2 brd ff:ff:ff:ff:ff:ff
        inet 192.168.1.64/24 brd 192.168.10.255 scope global ens33
           valid_lft forever preferred_lft forever
        inet6 fe80::e06b:73c9:b179:7570/64 scope link 
           valid_lft forever preferred_lft forever
    [root@xuegod64 ~]# /etc/init.d/lvsrsdr start 
    Reloading systemd:                                         [  确定  ]
    Starting lvsrsdr (via systemctl):                          [  确定  ]
    [root@xuegod64 ~]# yum install -y httpd
    [root@xuegod64 ~]# echo 192.168.1.64 > /var/www/html/index.html
    [root@xuegod64 ~]# vim /etc/httpd/conf/httpd.conf 
    [root@xuegod64 ~]# systemctl restart httpd
    

    8. 测试

    [root@xuegod61 ~]# elinks 192.168.1.111 -dump
       192.168.1.62
    [root@xuegod61 ~]# elinks 192.168.1.111 -dump
       192.168.1.64
    [root@xuegod61 ~]# elinks 192.168.1.111 -dump
       192.168.1.62
    [root@xuegod61 ~]# elinks 192.168.1.111 -dump
       192.168.1.62
    

      

    ================================================================================== = 黑发不知勤学早,白首方悔读书迟。 --颜真卿《劝学》
  • 相关阅读:
    Asp.net button防止点击多次数据提交
    Asp.net button防止点击多次数据提交
    Asp.net button防止点击多次数据提交
    被投资人坑的大学生创业者
    分析了3200家创业公司
    移动互联网4种引流思维:免费思维、跨界思维、平台思维、金融思维
    腾讯入局、估值超10亿美元,“野路子”瑞幸的三大增长法则
    95后女生月入8万,竟然“玩着玩着”就赚到钱
    95后中介年入百万:“伪焦虑”是你人生最大的骗局
    一家靠收智商税盈利的公司,卖了340亿
  • 原文地址:https://www.cnblogs.com/happy1983/p/9248988.html
Copyright © 2020-2023  润新知