Linux集群架构

Stella981
• 阅读 594

一、集群介绍

集群,简单地说是指一组(若干个)相互独立的计算机,利用高速通信网络组成一个较大的计算机服务系统,每个集群节点(即集群中的每台计算机)都是运行各自服务的独立服务器。

集群的特点:高性能(Performance)、价格有效(Cost-effectiveness)、可伸缩性(Scalability)、高可用性(Availability)、透明性(Traansparency)、可管理性(Manageability)、可编程性(Programmability)

集群的分类:

负载均衡集群:Load  balancing clusters,简称LBC、LB

高可用集群:High-availability clusters,简称HAC

高性能计算集群:High-performance  clusters,简称HPC

网格计算集群:Grid computing clusters

常见的集群开源软件:

高可用: Keepalived、Heartbeat

负载均衡:Keepalived、Nginx、LVS、Haproxy

二、keepalived介绍

1、keepalived介绍

keepalived是目前轻量级的管理方便、易用的高可用软件解决方案,有core、check和vrrp等3个模块,类似于工作在3、4和7层交换机制的软件。

keepalived软件起初是专门为LVS负载均衡软件设计的,用来管理并监控LVS集群系统中各个服务节点的状态,后来又加入了可以实现高可用的VRRP功能。

layer3、4、7工作在TCP/IP协议栈的IP层、传输层及应用层,实现原理:

·layer 3: keepalived使用layer 3的方式工作时,keepalived会定期向服务集群中的服务器发送一个ICMP的数据包,如果发现某台服务器的IP地址无法ping通时,keepalived便报告这台服务器失效,并将它从服务器集群中剔除。layer的3方式是以服务器的IP地址是否有效作为服务器工作正常与否的标准。

·layer 4:  layer 4主要以TCP端口的状态来决定服务工作正常与否,例如80端口,如果检测到某台80端口没有启动,则将这台机子从集群中剔除。

·layer 7: layer 7 工作在应用层,keepalived根据用户的设定检查服务器程序的运行是否正常,如果与用户的设定不相符,则将其剔除。

2、keepalived工作原理

keepalive高可用对之间是通过VRRP通信的。

1、VRRP,全称Virutal  Router  Redundancy Protocol(虚拟路由冗余协议),VRRP的出现是为了解决静态路由的单点故障。

2、VRRP是通过一种竞选协议机制来将路由任务交给某台VRRP路由器的。

3、VRRP使用IP多播(Multicast)方式实现高可用之间的通信,默认多播地址为:224.0.0.18。

4、工作时主节点发包,备节点接包。当备节点接收不到主节点发的数据包的时候,就启动接管程序接管主节点的资源。备节点可以有多个,通过优先级竞选。

5、VRRP使用了加密协议加密数据,但keepalive官方目前还是推荐使用明文的方式配置认证类型和密码。

3、keepalived服务工作原理

keepalived高可用对之间通过VRRP进行通信,VRRP是通过竞选机制来确定主备的,主的优先级高于备,因此在工作时会优先获得所有的资源,备节点处于等待状态,当主挂了的时候,备节点就会接管主节点的资源,然后顶替主节点对外提供服务。

在keepalive服务对之间,只有作为主的服务器会一直发送VRRP广播包,告诉备它还活着,此时备不会抢占主,当主不可用时,即备监听不到主发送的广播包时,就会启动相关服务接管资源,保证业务的连续性。接管速度最快可以小于1秒。

三、keepalived高可用集群搭建

keepalived +  nginx高可用集群

准备两台机器,一台作为master,一台作为backup,全部机子清空防火墙规则,关闭selinux

master:ip 192.168.10.205,系统:RHEL7.5,安装nginx,主机名:node0

backup:ip 192.168.10.206,系统:RHEL7.5,安装nginx,主机名:node1

VIP:192.168.10.88

1、master配置(node0主机)

(1)编译安装nginx

[root@node0 ~]# yum install -y gd-devel gcc 
[root@node0 ~]# useradd -s /sbin/nologin -r nginx
[root@node0 ~]# curl -O http://nginx.org/download/nginx-1.14.0.tar.gz
[root@node0 ~]# tar xf nginx-1.14.0.tar.gz 
[root@node0 ~]# cd nginx-1.14.0/
[root@node0 nginx-1.14.0]# ./configure --prefix=/usr/local/nginx\
    --user=nginx\
    --group=nginx\
    --http-log-path=/mydata/logs/nginx/access.log\
    --error-log-path=/mydata/logs/nginx/error.log\
    --with-http_ssl_module\
    --with-http_realip_module\
    --with-http_flv_module\
    --with-http_mp4_module\
    --with-http_gunzip_module\
    --with-http_gzip_static_module\
    --with-http_image_filter_module\
    --with-http_stub_status_module
[root@node0 nginx-1.14.0]# make && make install

(2)安装keepalived

yum安装keepalived软件

[root@node0 ~]# yum install -y keepalived

(3)配置keepalived

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

[root@node0 ~]# vim /etc/keepalived/keepalived.conf
global_defs {
   notification_email {
     acassen@firewall.loc
   }
   notification_email_from Alexandre.Cassen@firewall.loc
   smtp_server 127.0.0.1
   smtp_connect_timeout 30
   router_id LVS_DEVEL
}

vrrp_script chk_nginx {
   script "/data/sh/chk_nginx.sh"
   interval 3
   weight 2
}
vrrp_instance VI_1 {
    state MASTER
    interface ens33
    virtual_router_id 51
    priority 100
    advert_int 1
    authentication {
        auth_type PASS
        auth_pass 1111
    }
    virtual_ipaddress {
        192.168.10.88
    }
    track_script {
        chk_nginx
    }
}

部分解释:

global_defs {         #全局设置
   notification_email {           #设置邮件通知
     acassen@firewall.loc           #定义接收邮件的人
   }
   notification_email_from Alexandre.Cassen@firewall.loc       #定义发邮件的地址,一般没什么用
   smtp_server 127.0.0.1      #发邮件的地址
   smtp_connect_timeout 30
   router_id LVS_DEVEL
}

vrrp_script chk_nginx {          #nginx健康监测
   script "/data/sh/chk_nginx.sh"      #这脚本得自己编写,脚本放在/data/sh/目录中
   interval 3      #每隔3秒执行一次该脚本
   weight 2        #权重
}
vrrp_instance VI_1 {
    state MASTER     # 主为MASTER,备用为BACKUP
    interface ens33     #监听的网卡
    virtual_router_id 51   #虚拟路由id
    priority 100     #权重,master要比backup大,默认为100
    advert_int 1
    authentication {
        auth_type PASS
        auth_pass 1111   #定义密码,默认为1111,master和backup的密码要一样
    }
    virtual_ipaddress {   #定义虚拟ip,vip
        192.168.10.88
    }
    track_script {
        chk_nginx  #定义监控脚本,名称要跟前面vrrp_script定义的名字一样
    }
}

(3)nginx检查检测脚本

脚本存放目录:/data/sh,名称为:chk_nginx.sh

[root@node0 ~]# mkdir /data/sh -pv
mkdir: created directory ‘/data/sh’
[root@node0 ~]# vim /data/sh/chk_nginx.sh
#!/bin/bash

#时间变量,用于记录日志

d=`date --date today +%Y%m%d_%H:%M:%S`

#计算nginx的进程数量

n=`ps -C nginx --no-heading | wc -l`

#如果进程为0,则启动nginx,并且再次检测nginx进程数量
#如果进程还为0,说明nginx无法启动,此时需要关闭keepalived服务

if [ $n -eq "0" ];then
   /etc/rc.d/init.d/nginx start
   n2=`ps -C nginx --no-heading | wc -l`
   if [ $n2 -eq "0" ];then
      echo "$d   nginx  down,keepalived will stop!!!" >> /var/log/check_nginx.log
      systemctl stop keepalived
   fi
fi

脚本添加可执行权限:

[root@node0 ~]# chmod +x /data/sh/chk_nginx.sh

(4)创建nginx的web测试页

因为nginx是编译安装(安装目录:/usr/local/nginx/),所以默认网站目录是:/usr/local/nginx/html/

[root@node0 ~]# echo "<h1> Nginx Test Page on 192.168.10.205..." > /usr/local/nginx/html/index.html 

2、backup配置(node1主机)

(1)编译安装nginx

安装过程省略,参考master的编译安装nginx

(2)安装keepalived

yum安装keepalived软件

[root@node1 ~]# yum install -y keepalived

(3)配置keepalived

backup的keepalived与master的配置大同小异,不同的是:

 state   BACKUP  
 priority  90 :backup的权限要比master的小

配置文件全文如下:

global_defs {
   notification_email {
     acassen@firewall.loc
   }
   notification_email_from Alexandre.Cassen@firewall.loc
   smtp_server 127.0.0.1
   smtp_connect_timeout 30

global_defs {
   notification_email {
     acassen@firewall.loc
   }
   notification_email_from Alexandre.Cassen@firewall.loc
   smtp_server 127.0.0.1
   smtp_connect_timeout 30
   router_id LVS_DEVEL
}

vrrp_script chk_nginx {
   script "/data/sh/chk_nginx.sh"
   interval 3
   weight 2
}
vrrp_instance VI_1 {
    state BACKUP
    interface ens33
    virtual_router_id 51
    priority 90
    advert_int 1
    authentication {
        auth_type PASS
        auth_pass 1111
    }
    virtual_ipaddress {
        192.168.10.88
    }
    track_script {
        chk_nginx
    }
}

(4)nginx健康检查脚本

nginx检查检测脚本跟master的一样。在这里省略编写过程了。

(5)创建nginx的web服务测试页

因为nginx是编译安装(安装目录:/usr/local/nginx/),所以默认网站目录是:/usr/local/nginx/html/

[root@node1 ~]# echo "<h1> Nginx Test Page on 192.168.10.206..." > /usr/local/nginx/html/index.html

3、测试

node0、node1主机开启keepalived服务,清空防火墙规则,node0开启nginx服务,但node1不开启nginx。

浏览器打开:192.168.10.88

Linux集群架构

此时访问的是node0的web服务。

[root@node0 ~]# ip addr
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000
    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 group default qlen 1000
    link/ether 00:0c:29:d0:a0:1b brd ff:ff:ff:ff:ff:ff
    inet 192.168.10.205/24 brd 192.168.10.255 scope global noprefixroute ens33
       valid_lft forever preferred_lft forever
    inet 192.168.10.88/32 scope global ens33
       valid_lft forever preferred_lft forever
    inet6 fe80::b9c0:9b69:38a1:8ff6/64 scope link noprefixroute 
       valid_lft forever preferred_lft forever
[root@node0 ~]# 

测试2:关闭node0的nginx服务

[root@node0 ~]# /usr/local/nginx/sbin/nginx -s stop

过一会会自动启动nginx

测试3:把node0的keepalived服务停掉。过一会vip会漂移到node1,并且node1会自动开启nginx服务

node0停止keepalived:

[root@node0 ~]# systemctl stop keepalived
[root@node0 ~]# ip addr | grep ens33
2: ens33: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP group default qlen 1000
    inet 192.168.10.205/24 brd 192.168.10.255 scope global noprefixroute ens33
[root@node0 ~]# 

查看node1的ip:

[root@node1 ~]# ip addr | grep ens33
2: ens33: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP group default qlen 1000
    inet 192.168.10.206/24 brd 192.168.10.255 scope global noprefixroute ens33
    inet 192.168.10.88/32 scope global ens33
[root@node1 ~]# ss -tnl
State      Recv-Q Send-Q                                         Local Address:Port                                                        Peer Address:Port              
LISTEN     0      128                                                        *:111                                                                    *:*                  
LISTEN     0      128                                                        *:80                                                                     *:*                  
LISTEN     0      128                                                        *:22                                                                     *:*                  
LISTEN     0      100                                                127.0.0.1:25                                                                     *:*                  
LISTEN     0      128                                                       :::111                                                                   :::*                  
LISTEN     0      128                                                       :::22                                                                    :::*                  
LISTEN     0      100                                                      ::1:25                                                                    :::*                  
[root@node1 ~]# 

刷新浏览器:

Linux集群架构

此时访问的是node1站点。

然后,启动node0的keepalived服务,vip又漂移到node0了。刷新浏览器:

Linux集群架构

此时访问的是node0站点。

至此,keepalived高可用nginx搭建成功。可以实现故障转移了。

需要注意的是:要关闭selinux

四、负载均衡集群介绍

负载均衡软件分类:

主流的负载均衡开源软件:LVS、keepalived、haproxy、nginx等

其中,LVS属于4层(网络OSI7层模型),nginx属于7层,haproxy即可以是4层,也可以是7层。

keepalived的负载均衡功能其实就是lvs

lvs这种4层的负载均衡是可以分发除80外的其他端口通信,比如mysql,而nginx仅仅支持http、https、mail

haproxy也可以支持mysql

4层和7层负载比较:

LVS4层的更稳定,能承受更多的请求

nginx 7层的更加灵活,能实现更多的个性化需要

五、LVS介绍

1、lvs介绍

LVS:Linux  Virtuer  Server,即Linux虚拟服务器,是一个虚拟的服务器集群系统,基于TCP/IP做的路由和转发,稳定性和效率很高。本项目在1998年5月由章文嵩博士成立,是中国国内最早出现的自由软件项目之一。

 LVS集群采用IP负载均衡技术和基于内容请求分发技术。调度器具有很好的吞吐率,将请求均衡地转移到不同的服务器上执行,且调度器自动屏蔽掉服务器的故障,从而将一组服务器构成一个高性能的、高可用的虚拟服务器。整个服务器集群的结构对客户是透明的,而且无需修改客户端和服务器端的程序。为此,在设计时需要考虑系统的透明性、可伸缩性、高可用性和易管理性。

一般来说,LVS集群采用三层结构

A、负载调度器(load balancer)或者叫分发器(Load Runner),它是整个集群对外面的前端机,负责将客户的请求发送到一组服务器上执行,而客户认为服务是来自一个IP地址(我们可称之为虚拟IP地址)上的。

B、服务器池(server pool),是一组真正执行客户请求的服务器,执行的服务有WEB、MAIL、FTP和DNS等。

C、共享存储(shared storage),它为服务器池提供一个共享的存储区,这样很容易使得服务器池拥有相同的内容,提供相同的服务。

2、lvs主要模式

LVS属于四层转发,主要有NAT、DR、TUN等模式。

2.1 LVS-NAT模式

LVS NAT 模式工作原理:

此模式借助iptables的nat表来实现。

1、客户端通过互联网访问director(调度器,也叫分发器Load Runner)时,请求报文的目标地址是VIP,director(调度器)通过NAT(网络地址转换),重写请求报文的目标地址为后端服务器的真实地址(RIP),然后根据预设的调度算法,将请求分派给后端的real server(真实服务器);

2、真实服务器收到请求报文后,经处理,发出响应报文,响应报文通过调度器时,报文的源地址被重写为VIP,之后返回给客户端,完成整个负载调度过程。

优点:支持所有操作系统及私有网络,且只需一个公网 IP 地址

缺点:用户请求和响应报文都必须经过dr地址重写,当用户请求越来越多时,调度器的处理能力将成为瓶颈。

2.2  LVS-DR模式

director分配请求到不同的real server。real server 处理请求后直接回应给用户,这样director负载均衡器仅处理客户机与服务器的一半连接。负载均衡器仅处理一半的连接,避免了新的性能瓶颈,同样增加了系统的可伸缩性。Director Routing采用的是物理层(修改MAC地址)技术,因此,所以服务器都必须在同一个物理网段。

·这种模式,需要一个公共的IP配置在分发器和所有的rs上,也就是vip

·跟TUN模式不同的是,它会把数据包的MAC地址修改为rs的MAC地址

·rs接收到数据包后,会还原原始数据包,这样目标ip为vip,因为所有的rs都配置了这个vip,所以它会认为是它自己

LVS-DR模式工作原理:MAC地址转换

假设每台机子的ip与mac信息如下:

Linux集群架构

MAC地址转换过程:

(1)客户端(ip:192.168.10.201)向目标vip发出请求, Director接收。此时IP包头部及数据帧头信息如下:

Linux集群架构

(2)Director根据负载均衡算法选择一台active的RS(假设是192.168.10.101),并将此RIP所在网卡的mac地址作为目标mac地址,发送到局域网里。此时IP包头部及数据帧头信息如下:

Linux集群架构

(3)real server(192.168.10.101)在局域网中收到这个帧,拆开后发现目标IP(VIP)与本地匹配,于是处理这个报文,随后重新封装报文,发送到局域网。此时IP包及数据帧头信息如下:

Linux集群架构

(4)如果client与LVS在同一网段,那么clinet(192.168.10.201)将收到这个回复报文。如果跨了网段,那么这个报文通过gateway/路由通过Internet返回给用户。 以上就是LVS-DR模式的原理。

2.3 LVS-TUN模式

director分配请求到不同的real server。real server 处理请求后直接回应给用户,这样director负载均衡器仅处理客户机与服务器的一半连接。IP Tunneling技术极大地提高了director的调度能力,同时也极大地提高了系统容纳的最大节点数,可以超过100个节点。real server可以在任何LAN或WAN上运行,也就意味着允许物理上的分布,这对灾难恢复有重要意义。服务器必须有正式的公网ip地址用于与客户机直接通信,并且所有服务器必须支持IP隧道协议。

·这种模式,需要一个公共的IP配置在分发器和所有RS上,我们把它叫做vip

·客户端请求的目标IP为vip,分发器接收到请求数据包后,会对数据包加工,把目标ip改为rs的ip,这样数据包就到了rs上

·rs接收到数据包后,会还原原始数据包,这样目标ip为vip,因为所有的rs上配置了这个vip,所以它会认为是ta自己。

DR与TUN区别: Director与IP Tunneling相比,没有IP封装的开销,但由于采用物理层(修改MAC地址)技术,所有服务器都必须在一个物理网段。

六、LVS调度算法

lvs支持的算法有:

轮询:Round-Robin,简称:rr

加权轮询:Weight Round-Robin,简称:wrr

最小连接:Least-Connection,简称:lc

加权最小连接:Weight  Least-Connection,简称:wlc

基于局部性的最小连接:Locality-Based  Least Connections,简称:lblc

带复制的基于局部性最小连接:Locality-Based  Least Connections with Replication,简称:lblcr

目标地址散列调度:Destination Hashing,简称:dh

源地址散列调度:Source Hashing,简称:sh

七、LVS-NAT模式搭建

实验拓扑图如下:

Linux集群架构

**LVS负载均衡器(director)**:CentOS7.5系统,有两块网卡,一块连接外网(vip:192.168.10.200),另一块连接内网(dip:10.0.0.88)

Real Server 1(简称:rs1):RHEL 7.5系统,ip:10.0.0.101,提供web服务

Real Server 2(简称:rs2):RHEL 7.5系统,ip:10.0.0.102,提供web服务

虚拟化软件:VMare Workstation 14 pro

1、RS1、RS2安装httpd、iptables防火墙

在实验前,先设置RS1、RS2可以连接外网,使用yum安装相关软件。

1、安装配置httpd

rs1、rs2准备好web服务。

rs1安装httpd服务:

[root@node5 ~]# yum install -y httpd

配置测试页,并启动httpd服务:

[root@node5 ~]# echo "<h1> Real Server 1 :10.0.0.101 </h1>" >/var/www/html/index.html
[root@node5 ~]# systemctl start httpd

rs2安装httpd服务:

[root@node1 ~]# yum install httpd -y

配置测试页,并启动httpd服务:

[root@node1 ~]# echo "<h1> Real Server 2 :10.0.0.102 </h1>" > /var/www/html/index.html
[root@node1 ~]# systemctl start httpd

2、安装iptables防火墙

rs1安装iptables防火墙:

[root@node5 ~]# yum install iptables-services -y

停用firewalld防火墙,启用iptables防火墙并清空防火墙规则

[root@node5 ~]# systemctl stop firewalld
[root@node5 ~]# systemctl start iptables
[root@node5 ~]# iptables -F
[root@node5 ~]# service iptables save
iptables: Saving firewall rules to /etc/sysconfig/iptables:[  OK  ]
[root@node5 ~]# 

rs2安装iptables防火墙:

[root@node1 ~]# yum install iptables-services -y

停用firewalld防火墙,启用iptables防火墙并清空防火墙规则

[root@node1 ~]# systemctl stop firewalld
[root@node1 ~]# systemctl start iptables
[root@node1 ~]# iptables -F
[root@node1 ~]# service iptables save
iptables: Saving firewall rules to /etc/sysconfig/iptables:[  OK  ]
[root@node1 ~]# 

2、lvs调度器配置

lvs调度器,也就分发器,director

1、准备两块网卡

分发器有两块网卡,VMare中再添加一块网卡,如下图:

Linux集群架构

一块网卡使用NAT,连接外网,另一块使用仅主机模式,连接内网。

2、配置ip

查看网卡ip信息:

[root@localhost ~]# ip addr
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000
    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 group default qlen 1000
    link/ether 00:0c:29:55:10:a8 brd ff:ff:ff:ff:ff:ff
    inet 192.168.10.200/24 brd 192.168.10.255 scope global noprefixroute ens33
       valid_lft forever preferred_lft forever
    inet6 fe80::b3d1:90a4:26af:f468/64 scope link noprefixroute 
       valid_lft forever preferred_lft forever
3: ens37: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP group default qlen 1000
    link/ether 00:0c:29:55:10:b2 brd ff:ff:ff:ff:ff:ff
[root@localhost ~]# 

如上所以,已经有两块网卡了,ens33、ens37

vip(网卡:ens33):192.168.10.200,已经配置好了,不需要重新配置了,其配置文件内容如下:

[root@localhost ~]# cat /etc/sysconfig/network-scripts/ifcfg-ens33
TYPE=Ethernet
PROXY_METHOD=none
BROWSER_ONLY=no
BOOTPROTO=none
DEFROUTE=yes
IPV4_FAILURE_FATAL=no
IPV6INIT=yes
IPV6_AUTOCONF=yes
IPV6_DEFROUTE=yes
IPV6_FAILURE_FATAL=no
IPV6_ADDR_GEN_MODE=stable-privacy
NAME=ens33
UUID=08d70096-32cb-4506-b0d9-e212a3874f59
DEVICE=ens33
ONBOOT=yes
IPADDR=192.168.10.200
PREFIX=24
GATEWAY=192.168.10.2
DNS1=119.29.29.29
DNS2=183.254.116.116
IPV6_PRIVACY=no
ZONE=public

配置DIP(网卡:ens37):10.0.0.88:

[root@localhost ~]# vim  /etc/sysconfig/network-scripts/ifcfg-ens37
TYPE=Ethernet
BOOTPROTO=none
NAME=ens37
DEVICE=ens37
ONBOOT=yes
IPADDR=10.0.0.88
PREFIX=24
GATEWAY=10.0.0.1

保存退出,重启网络服务:

[root@localhost ~]# systemctl restart network
[root@localhost ~]# 

查看ip:

[root@localhost ~]# ip addr
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000
    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 group default qlen 1000
    link/ether 00:0c:29:55:10:a8 brd ff:ff:ff:ff:ff:ff
    inet 192.168.10.200/24 brd 192.168.10.255 scope global noprefixroute ens33
       valid_lft forever preferred_lft forever
    inet6 fe80::b3d1:90a4:26af:f468/64 scope link noprefixroute 
       valid_lft forever preferred_lft forever
3: ens37: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP group default qlen 1000
    link/ether 00:0c:29:55:10:b2 brd ff:ff:ff:ff:ff:ff
    inet 10.0.0.88/24 brd 10.0.0.255 scope global noprefixroute ens37
       valid_lft forever preferred_lft forever
    inet6 fe80::20c:29ff:fe55:10b2/64 scope link 
       valid_lft forever preferred_lft forever
[root@localhost ~]# 

OK,ip已经设置好了。

3、关闭firewalld防火墙,安装并启用iptables防火墙,清空防火墙规则

[root@localhost ~]# yum install iptables-services -y
[root@localhost ~]# systemctl stop firewalld
[root@localhost ~]# systemctl start iptables
[root@localhost ~]# iptables -F
[root@localhost ~]# service iptables save
iptables: Saving firewall rules to /etc/sysconfig/iptables:[  OK  ]
[root@localhost ~]# 

4、关闭selinux,要永久关闭修改配置文件即可。

[root@localhost ~]# setenforce 0
[root@localhost ~]# 

5、安装ipvsadm软件

ipvsadm是管理lvs的工具

[root@localhost ~]# yum install ipvsadm -y

6、编写设置lvs的命令脚本并执行

脚本名称: lvs_nat.sh

[root@localhost ~]# vim lvs_nat.sh
#director服务器上开启路由转发功能
echo 1 > /proc/sys/net/ipv4/ip_forward
#关闭icmp的重定向
echo 0 > /proc/sys/net/ipv4/conf/all/send_redirects
echo 0 > /proc/sys/net/ipv4/conf/default/send_redirects
#lvs-nat模式中有两块网卡,所以这两块网卡也要关闭icmp重定向
#我这里的两块网卡名是:ens33、ens37
echo 0 > /proc/sys/net/ipv4/conf/ens33/send_redirects
echo 0 > /proc/sys/net/ipv4/conf/ens37/send_redirects
#director设置nat防火墙
iptables -t nat -F
iptables -t nat -X
iptables -t nat -A POSTROUTING -s 10.0.0.88/24 -j MASQUERADE
#director设置ipvsadm规则
IPVSADM='/usr/sbin/ipvsadm'
$IPVSADM -C #情况已有的规则
$IPVSADM -A -t 192.168.10.200:80 -s rr
$IPVSADM -a -t 192.168.10.200:80 -r 10.0.0.101:80 -m -w 1
$IPVSADM -a -t 192.168.10.200:80 -r 10.0.0.102:80 -m -w 1

ipvsadm规则参数解释:

-A :在内核的虚拟服务器表中添加一条新的虚拟服务器记录。也就是增加一台新的虚拟服务器。

-t:tcp协议    

-s:指定调度算法

-p : 会话保持时间

-a:表示添加real server的地址    

-t:tcp协议  

-r:指定real server的ip地址  

-m:表示masquerade,也就是NAT

-g :  表示dr模式

-i :表示隧道模式

执行脚本:

[root@localhost ~]# sh lvs_nat.sh 
[root@localhost ~]# 

没有任何输出,表示执行成功。

3、RS1配置

1、配置ip:10.0.0.101

[root@node5 ~]# vim /etc/sysconfig/network-scripts/ifcfg-ens33
TYPE=Ethernet
PROXY_METHOD=none
BOOTPROTO=none
DEFROUTE=yes
NAME=ens33
UUID=1408d649-6aa0-4338-895f-f12e33304ac5
DEVICE=ens33
ONBOOT=yes
IPADDR=10.0.0.101
PREFIX=24
GATEWAY=10.0.0.88
DNS1=119.29.29.29
DNS2=182.254.116.116
~                      

需要注意的是,网关设为为分发器的dip:10.0.0.88,DNS可有可无

修改网卡为仅主机模式:

Linux集群架构

2、重启网络服务

[root@node5 ~]# systemctl restart network

3、关闭selinux,要永久关闭修改配置文件即可。

这里临时关闭selinux

[root@node5 ~]# setenforce 0
[root@node5 ~]# 

3、RS2配置

1、配置ip:10.0.0.102

[root@node1 ~]# vim /etc/sysconfig/network-scripts/ifcfg-ens33
TYPE=Ethernet
BOOTPROTO=none
DEFROUTE=yes
NAME=ens33
UUID=c685222d-c62f-4a06-9d00-47ed21e46c1f
DEVICE=ens33
ONBOOT=yes
IPADDR=10.0.0.102
PREFIX=24
GATEWAY=10.0.0.88
DNS1=119.29.29.29
DNS2=183.254.116.116

需要注意的是,网关设为为分发器的dip:10.0.0.88,DNS可有可无

修改网卡为仅主机模式:

Linux集群架构

2、重启网络服务

[root@node1 ~]# systemctl restart network

3、关闭selinux,要永久关闭修改配置文件即可。

这里临时关闭selinux

[root@node1 ~]# setenforce 0
[root@node1 ~]# 

4、测试

浏览器打开:192.168.10.200

Linux集群架构

使用curl测试:

[root@localhost ~]# curl 192.168.10.200
<h1> Real Server 2 :10.0.0.102 </h1>
[root@localhost ~]# curl 192.168.10.200
<h1> Real Server 1 :10.0.0.101 </h1>
[root@localhost ~]# curl 192.168.10.200
<h1> Real Server 2 :10.0.0.102 </h1>
[root@localhost ~]# curl 192.168.10.200
<h1> Real Server 1 :10.0.0.101 </h1>
[root@localhost ~]# curl 192.168.10.200
<h1> Real Server 2 :10.0.0.102 </h1>
[root@localhost ~]# curl 192.168.10.200
<h1> Real Server 1 :10.0.0.101 </h1>
[root@localhost ~]# curl 192.168.10.200
<h1> Real Server 2 :10.0.0.102 </h1>
[root@localhost ~]# 

因为使用轮询算法,所访问基本是平均的。

至此,lvs-nat搭建成功。

八、LVS-DR模式搭建

lvs-dr模式网络拓扑图:

Linux集群架构

使用使用3台机子,每台机子都可以直接连接外网,每台机子只有一块网卡。每台机子都通过配置网卡别名配一个vip

1、Director分发器配置

1、安装ipvsadm、net-tools

因为我的系统是最小化安装的,没有ifconfig命令,所以要安装net-tools

[root@localhost ~]# yum install -t ipvsadm net-tools

2、编写dr模式脚本,并执行

#!/bin/bash
#关闭路由端口转发,其实就dr模式,开不开启路由转发都行
echo 0 > /proc/sys/net/ipv4/ip_forward
#相关变量
ipv=/usr/sbin/ipvsadm
vip=192.168.10.88
rs1=192.168.10.205
rs2=192.168.10.206
#通过网卡别名配置vip,也就是虚拟网卡
ifdown ens33 #先关闭网卡再开启,是为了清空已有的虚拟网卡设置
ifup ens33
ifconfig ens33:0 $vip broadcast $vip netmask 255.255.255.255 up
route add -host $vip dev ens33:0
#设置规则
$ipv -C
$ipv -A -t $vip:80 -s wrr
$ipv -a -t $vip:80 -r $rs1:80 -g -w 1
$ipv -a -t $vip:80 -r $rs2:80 -g -w 1

参数:-g:表示dr模式,-w:权重

执行脚本:

[root@node5 ~]# sh lvs_dr_rs.sh

2、RS1、RS2配置

1、RS1、RS2安装net-tools

# yum install -y net-tools

2、RS1、RS2安装httpd服务

# yum install -y httpd

测试页:

RS1:

[root@node5 ~]# echo "<h1> Real Server 1 :192.168.10.205 </h1>" > /var/www/html/index.html 

RS2:

[root@node1 ~]# echo "<h1> Real Server 2 :192.168.10.206 </h1>" > /var/www/html/index.html 

RS1、RS2开启httpd服务,并清空防火墙规则

# systemctl restart httpd
# iptables -F

2、编写dr脚本,并执行。

RS1、RS2都创建一个脚本:lvs_dr_rs.sh,脚本内容:

#!/bin/bash
vip=192.168.10.88
#把vip绑定在lo上,是为了实现rs直接把结果返回给客户端
ifconfig lo:0 $vip broadcast $vip netmask 255.255.255.255 up
route add -host $vip lo:0
#修改arp参数
echo 1 > /proc/sys/net/ipv4/conf/all/arp_ignore
echo 1 > /proc/sys/net/ipv4/conf/lo/arp_ignore
echo 2 > /proc/sys/net/ipv4/conf/all/arp_announce
echo 2 > /proc/sys/net/ipv4/conf/lo/arp_announce

因为Director、Real Server都配置了相同的VIP(192.168.10.88),如果不关闭ARP转发,则ip冲突了。

arp参数解释:

 arp_ignore为1:只回答目标ip地址是访问本网络接口(此处为ens33)的ARP查询请求。
 也就是说,arp_ignore设为1,当别人的arp请求过来的时候,如果接收的网卡设备上面没有这个ip,就不做出相应。默认为0,只要这台机子上任何一个网卡设备上面有这个ip,就响应arp请求,并发送mac地址。

 arp_announce(宣告)设为2:对查询目标使用最适当的本地地址。例如,如果在ens33接口上接收到了一个VIP的arp请求包,内核判断这个VIP地址是不是跟ens33接口上的IP一样。如果一样,则回复这个包;如果不一样,就丢弃不回应。

RS1、RS2执行脚本:

# sh lvs_dr_rs.sh

3、测试

浏览器打开vip:192.168.10.88

Linux集群架构

使用curl测试,但不能在director上执行curl测试:

在192.168.10.207机子上测试:

[root@localhost ~]# curl 192.168.10.88
<h1> Real Server 1 :192.168.10.205 </h1>
[root@localhost ~]# curl 192.168.10.88
<h1> Real Server 2 :192.168.10.206 </h1>
[root@localhost ~]# curl 192.168.10.88
<h1> Real Server 1 :192.168.10.205 </h1>
[root@localhost ~]# curl 192.168.10.88
<h1> Real Server 2 :192.168.10.206 </h1>
[root@localhost ~]# ifconfig
eth0      Link encap:Ethernet  HWaddr 00:0C:29:24:42:91  
          inet addr:192.168.10.207  Bcast:192.168.10.255  Mask:255.255.255.0

OK。lvs-dr搭建成功。

4、ab压力测试

在192.168.10.207机子上测试。

1、安装httpd-tools工具

[root@localhost ~]# yum install -y httpd-tools

2、使用ab命令测试。

语法:ab -n  数字 -c 数字  http://连接

参数解释:
-n:requests Number of requests to perform,在测试会话中所执行的请求总个数。默认时,仅执行一个请求
-c:concurrency Number of multiple requests to make,一次产生的请求个数。默认是,一次一个。

测试:同时处理1000个请求,一次要执行1000个并发请求。

[root@localhost ~]# ab -n 1000 -c 1000 http://192.168.10.88/index.html
This is ApacheBench, Version 2.3 <$Revision: 655654 $>
Copyright 1996 Adam Twiss, Zeus Technology Ltd, http://www.zeustech.net/
Licensed to The Apache Software Foundation, http://www.apache.org/

Benchmarking 192.168.10.88 (be patient)
Completed 100 requests
Completed 200 requests
Completed 300 requests
Completed 400 requests
Completed 500 requests
Completed 600 requests
Completed 700 requests
apr_socket_recv: Connection reset by peer (104)
Total of 742 requests completed

失败,分发器、RS1、RS2均执行一下命令:

# echo "net.ipv4.tcp_syncookies = 0" >> /usr/lib/sysctl.d/50-default.conf
# sysctl -p

重新测试:

[root@localhost ~]# ab -n 1000 -c 1000 http://192.168.10.88/index.html
This is ApacheBench, Version 2.3 <$Revision: 655654 $>
Copyright 1996 Adam Twiss, Zeus Technology Ltd, http://www.zeustech.net/
Licensed to The Apache Software Foundation, http://www.apache.org/

Benchmarking 192.168.10.88 (be patient)
Completed 100 requests
Completed 200 requests
Completed 300 requests
Completed 400 requests
Completed 500 requests
Completed 600 requests
Completed 700 requests
Completed 800 requests
Completed 900 requests
Completed 1000 requests
Finished 1000 requests


Server Software:        Apache/2.4.6
Server Hostname:        192.168.10.88
Server Port:            80

Document Path:          /index.html
Document Length:        41 bytes

Concurrency Level:      1000
Time taken for tests:   3.394 seconds
Complete requests:      1000
Failed requests:        0
Write errors:           0
Total transferred:      301301 bytes
HTML transferred:       41041 bytes
Requests per second:    294.67 [#/sec] (mean)
Time per request:       3393.581 [ms] (mean)
Time per request:       3.394 [ms] (mean, across all concurrent requests)
Transfer rate:          86.70 [Kbytes/sec] received

Connection Times (ms)
              min  mean[+/-sd] median   max
Connect:        1   99  12.8     98     124
Processing:    31 1317 1313.0    127    3250
Waiting:        2 1311 1317.0    121    3249
Total:        113 1416 1314.8    237    3351

Percentage of the requests served within a certain time (ms)
  50%    237
  66%   2160
  75%   2169
  80%   3150
  90%   3321
  95%   3339
  98%   3347
  99%   3350
 100%   3351 (longest request)
[root@localhost ~]# 

测试结果解释:

Server Software:        Apache/2.4.6      #被测试的httpd版本
Server Hostname:        192.168.10.88 #服务器主机名
Server Port:            80 #服务器端口

Document Path:          /index.html #测试的页面文档
Document Length:        41 bytes  # 文档大小

Concurrency Level:      1000  #并发数
Time taken for tests:   3.394 seconds #整个测试的耗时
Complete requests:      1000  #完成的请求数量
Failed requests:        0 #失败的请求数量 Write errors:           0
Total transferred:      301301 bytes
#整个测试中总传输字节数
HTML transferred:       41041 bytes  #整个场景中HTML内容传输量。
Requests per second:    294.67 [#/sec] (mean) #每秒处理请求数,相当于服务器中的每秒事务数,后面的括号的mean表示这是一个平均值。
Time per request:       3393.581 [ms] (mean)  #平均请求响应时间,mean表示这是一个平均值。
Time per request:       3.394 [ms] (mean, across all concurrent requests)  #每个请求的时间,1.080[毫秒](意思是说,在所有的并发请求),每个请求实际运行时间的平均值。由于对于并发请求,cpu实际上并不是同时处理的,而是按照每个请求获得的时间片逐个轮转处理的,所以基本上第一个Time per  request时间约等于第二个Time per  request时间乘以并发请求数。
Transfer rate:          86.70 [Kbytes/sec] received #传输速率,平均每秒网络上的流量,可以帮助排除是否存在网络流量过大导致响应时间延长的问题。

Connection Times (ms)  #连接时间
min  mean[+/-sd] median   max
Connect:        1   99  12.8     98     124
Processing:    31 1317 1313.0    127    3250
Waiting:        2 1311 1317.0    121    3249
Total:        113 1416 1314.8    237    3351

Percentage of the requests served within a certain time (ms)  #在一定的时间内提供服务的请求的百分比(毫秒)
50%    237
  66%   2160
  75%   2169
  80%   3150
  90%   3321
  95%   3339
  98%   3347
  99%   3350
 100%   3351 (longest request)

九、keepalived+LVS搭建

keepalived本身具有负载均衡功能,内置了ipvsadm的功能,因此不需要使用ipvsadm设置规则了。

这里使用3台机子:

Linux集群架构

1、还原实验环境

由于前面已经做了DR模式,所以为了有一个干净的实验环境,把三台机子还原快照。

2、director设置

1、安装keepalived

[root@localhost ~]# yum install keepalived -y

2、配置keepalived

keepalived安装目录:/etc/keepalived/

[root@localhost ~]# cd /etc/keepalived/
[root@localhost keepalived]# mv keepalived.conf keepalived.conf.bak
[root@localhost keepalived]# grep -v "#" keepalived.conf.bak > keepalived.conf
[root@localhost keepalived]# vim keepalived.conf
! Configuration File for keepalived

global_defs {
   notification_email {
     acassen@firewall.loc
   }
   notification_email_from Alexandre.Cassen@firewall.loc
   smtp_server 192.168.200.1
   smtp_connect_timeout 30
   router_id LVS_DEVEL
}

vrrp_instance VI_1 {
    state MASTER  #备用服务器为BACKUP
    interface ens33 #绑定vip的网卡,这里为ens33
    virtual_router_id 51
    priority 100  #权重,备用服务器上的权重比MASTER的权重小,比如设为90
    advert_int 1
    authentication {
        auth_type PASS
        auth_pass 1111
    }
    virtual_ipaddress {
        192.168.10.88 #设置vip
    }
}

virtual_server 192.168.10.88 80 {
    delay_loop 6 #每隔6每秒查询real server的状态
    lb_algo rr  #lvs算法,这里为rr:轮询
    lb_kind DR  #lvs模式,DR模式
    persistence_timeout 50 #同一IP的连接50秒内被分配到同一台real  server
    protocol TCP  #使用TCP协议

    real_server 192.168.10.205 80 {
        weight 100 #权重
        TCP_CHECK {
        connect_timeout 10 #10秒无响应超时
        nb_get_retry 3
        delay_before_retry 3
        connect_port 80
        }
    }
    real_server 192.168.10.206 80 {
        weight 100 #权重
        TCP_CHECK {
        connect_timeout 10 #10秒无响应超时
        nb_get_retry 3
        delay_before_retry 3
        connect_port 80
        }
    }
}

解释:

! Configuration File for keepalived

global_defs {
   notification_email {
     acassen@firewall.loc
   }
   notification_email_from Alexandre.Cassen@firewall.loc
   smtp_server 192.168.200.1
   smtp_connect_timeout 30
   router_id LVS_DEVEL
}

vrrp_instance VI_1 {
    state MASTER  #备用服务器为BACKUP
    interface ens33 #绑定vip的网卡,这里为ens33
    virtual_router_id 51
    priority 100      #权重,备用服务器上的权重比MASTER的权重小,比如设为90
    advert_int 1
    authentication {
        auth_type PASS
        auth_pass 1111   #认证密钥,默认1111,可使用 openssl rand -hex 6产生
    }
    virtual_ipaddress {
        192.168.10.88 #设置vip
    }
}

virtual_server 192.168.10.88 80 {
    delay_loop 6     #每隔6每秒查询real server的状态
    lb_algo rr           #lvs算法,这里为rr:轮询
    lb_kind DR          #lvs模式,DR模式
    persistence_timeout 50         #同一IP的连接50秒内被分配到同一台real  server
    protocol TCP    #使用TCP协议

    real_server 192.168.10.205 80 {
        weight 100   #权重
        TCP_CHECK {
        connect_timeout 10     #10秒无响应超时
        nb_get_retry 3
        delay_before_retry 3
        connect_port 80
        }
    }
    real_server 192.168.10.206 80 {
        weight 100     #权重
        TCP_CHECK {
        connect_timeout 10    #10秒无响应超时
        nb_get_retry 3
        delay_before_retry 3
        connect_port 80
        }
    }
}

3、清空防火墙,关闭selinux

这里是临时关闭selinux

[root@localhost ~]# iptables -F
[root@localhost ~]# setenforce 0
[root@localhost ~]# 

4、启动keepalived

[root@localhost ~]# systemctl start keepalived

查看一下ip:

[root@localhost ~]# ip addr
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000
    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 group default qlen 1000
    link/ether 00:0c:29:55:10:a8 brd ff:ff:ff:ff:ff:ff
    inet 192.168.10.200/24 brd 192.168.10.255 scope global noprefixroute ens33
       valid_lft forever preferred_lft forever
    inet 192.168.10.88/32 scope global ens33
       valid_lft forever preferred_lft forever
    inet6 fe80::b3d1:90a4:26af:f468/64 scope link noprefixroute 
       valid_lft forever preferred_lft forever
3: ens37: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP group default qlen 1000
    link/ether 00:0c:29:55:10:b2 brd ff:ff:ff:ff:ff:ff
[root@localhost ~]# 

OK,虚拟ip已经设置好了

5、查看ipvsadm的规则

要看规则,必须安装ipvsadm 

[root@localhost ~]# yum install ipvsadm -y

查看规则:

[root@localhost ~]# ipvsadm -L -n
IP Virtual Server version 1.2.1 (size=4096)
Prot LocalAddress:Port Scheduler Flags
  -> RemoteAddress:Port           Forward Weight ActiveConn InActConn
TCP  192.168.10.88:80 rr persistent 50

规则没添加成功。RS1、RS2清空防火墙、关闭selinux之后,director重启keepalived

[root@localhost ~]# systemctl restart keepalived
[root@localhost ~]# ipvsadm -L -n
IP Virtual Server version 1.2.1 (size=4096)
Prot LocalAddress:Port Scheduler Flags
  -> RemoteAddress:Port           Forward Weight ActiveConn InActConn
TCP  192.168.10.88:80 rr persistent 50
  -> 192.168.10.205:80            Route   100    0          0         
  -> 192.168.10.206:80            Route   100    0          0         
[root@localhost ~]# 

OK,规则添加成功了。

3、RS1、RS2设置

1、RS1、RS2安装httpd、创建测试页参考前面的实验

2、RS1、RS2清空防火墙、关闭selinux

3、RS1、RS2编写脚本并执行

脚本名:lvs_dr_rs.sh,脚本内容如下:

#!/bin/bash
vip=192.168.10.88
#把vip绑定在lo上,是为了实现rs直接把结果返回给客户端
ifdown lo
ifup lo
ifconfig lo:0 $vip broadcast $vip netmask 255.255.255.255 up
route add -host $vip lo:0
#修改arp参数
echo 1 > /proc/sys/net/ipv4/conf/all/arp_ignore
echo 1 > /proc/sys/net/ipv4/conf/lo/arp_ignore
echo 2 > /proc/sys/net/ipv4/conf/all/arp_announce
echo 2 > /proc/sys/net/ipv4/conf/lo/arp_announce

RS1、RS2执行脚本:

# sh lvs_dr_rs.sh

4、测试

浏览器打开vip:192.168.10.88

Linux集群架构

curl测试:

Linux集群架构

因为设置了:persistence_timeout 50    #同一IP的连接50秒内被分配到同一台real  server

所以请求分配到同一rs。没有轮询效果,把persistence_timeout 50删除,重启keepalived,再请求:

Linux集群架构

OK。轮询效果出来了

这里keepalived之配置了MASTER,没有配置BACKUP。

点赞
收藏
评论区
推荐文章
blmius blmius
3年前
MySQL:[Err] 1292 - Incorrect datetime value: ‘0000-00-00 00:00:00‘ for column ‘CREATE_TIME‘ at row 1
文章目录问题用navicat导入数据时,报错:原因这是因为当前的MySQL不支持datetime为0的情况。解决修改sql\mode:sql\mode:SQLMode定义了MySQL应支持的SQL语法、数据校验等,这样可以更容易地在不同的环境中使用MySQL。全局s
皕杰报表之UUID
​在我们用皕杰报表工具设计填报报表时,如何在新增行里自动增加id呢?能新增整数排序id吗?目前可以在新增行里自动增加id,但只能用uuid函数增加UUID编码,不能新增整数排序id。uuid函数说明:获取一个UUID,可以在填报表中用来创建数据ID语法:uuid()或uuid(sep)参数说明:sep布尔值,生成的uuid中是否包含分隔符'',缺省为
待兔 待兔
5个月前
手写Java HashMap源码
HashMap的使用教程HashMap的使用教程HashMap的使用教程HashMap的使用教程HashMap的使用教程22
Jacquelyn38 Jacquelyn38
3年前
2020年前端实用代码段,为你的工作保驾护航
有空的时候,自己总结了几个代码段,在开发中也经常使用,谢谢。1、使用解构获取json数据let jsonData  id: 1,status: "OK",data: 'a', 'b';let  id, status, data: number   jsonData;console.log(id, status, number )
Wesley13 Wesley13
3年前
Java获得今日零时零分零秒的时间(Date型)
publicDatezeroTime()throwsParseException{    DatetimenewDate();    SimpleDateFormatsimpnewSimpleDateFormat("yyyyMMdd00:00:00");    SimpleDateFormatsimp2newS
Wesley13 Wesley13
3年前
mysql设置时区
mysql设置时区mysql\_query("SETtime\_zone'8:00'")ordie('时区设置失败,请联系管理员!');中国在东8区所以加8方法二:selectcount(user\_id)asdevice,CONVERT\_TZ(FROM\_UNIXTIME(reg\_time),'08:00','0
Wesley13 Wesley13
3年前
00:Java简单了解
浅谈Java之概述Java是SUN(StanfordUniversityNetwork),斯坦福大学网络公司)1995年推出的一门高级编程语言。Java是一种面向Internet的编程语言。随着Java技术在web方面的不断成熟,已经成为Web应用程序的首选开发语言。Java是简单易学,完全面向对象,安全可靠,与平台无关的编程语言。
Stella981 Stella981
3年前
Django中Admin中的一些参数配置
设置在列表中显示的字段,id为django模型默认的主键list_display('id','name','sex','profession','email','qq','phone','status','create_time')设置在列表可编辑字段list_editable
Wesley13 Wesley13
3年前
MySQL部分从库上面因为大量的临时表tmp_table造成慢查询
背景描述Time:20190124T00:08:14.70572408:00User@Host:@Id:Schema:sentrymetaLast_errno:0Killed:0Query_time:0.315758Lock_
Python进阶者 Python进阶者
11个月前
Excel中这日期老是出来00:00:00,怎么用Pandas把这个去除
大家好,我是皮皮。一、前言前几天在Python白银交流群【上海新年人】问了一个Pandas数据筛选的问题。问题如下:这日期老是出来00:00:00,怎么把这个去除。二、实现过程后来【论草莓如何成为冻干莓】给了一个思路和代码如下:pd.toexcel之前把这