当前位置: 首页 > news >正文

Keepalived 双机热备

本章主要内容:

  • Keepalived 双机热备基础知识
  • 学会构建双机热备系统
  • 学会构建LVS+HA 高可用群集

简介

        在这个高度信息化的IT时代,企业的生产系统,业务运营,销售和支持,以及日常管理等环节越来越依赖于计算机和服务,对于高可用(HA)技术的应用需求不断提高,以便提供持续的,不间断的计算机系统或网络服务。

        本章将学习如何使用 Keepalived 实现双机热备,包括针对IP地址的故障切换,以及在 LVS 高可用群集中的热备应用

1.1 Keepalived 双机热备基础知识

        Keepalived 起初是专门针对LVS 设计的一款强大的辅助工具,主要用来提供故障切换(Failover)和健康检查(Health Checking)功能——判断 LVS 负载调度器,节点服务器的可用性,及时隔离并替换新的服务器,当故障主机恢复后将其重新加入群集

1.1.1Keepalived 概述及安装

        Keepalived 的官方网站位于 http://www.keepalived.org/ 本章将以yum 方式讲解 Keepalived 的安装,配置和使用过程,在非 LVS 群集环境中使用时,Keepalived 也可以作为热备软件使用。

1.Keepalived 的热备方式

        Keepalived 采用 VRRP(Virtual Router Redundancy Protocol,虚拟路由冗余协议)热备份,以软件的方式实现 Linux 服务器的多机热备功能,VRRP 时针对路由器的一种备份解决方案--由多台路由器组成一个热备组,通过共用的虚拟IP 地址对外提供服务:每个热备组内同一时只有一台路由器提供服务,其他路由器处于冗余状态,若当前在线的路由器失效,则其他路由器会自动接替(优先级决定接替顺序)虚拟IP,以继续提供服务 如图所示

        热备组内的每台路由器都可能成为主路由器,虚拟路由器的IP地址(VIP)可以在热备组的路由器之间进行转移,所以也称为漂移IP地址。使用Keepalived 时,漂移地址的实现不需要手动建立虚接口配置文件(如上一章讲解的ens33:0)而是由Keepalived 根据配置文件自动管理。

2.Keepalived 的安装与服务控制
1)安装Keepalived

        在CentOS7 系统中,使用YUM 方式安装 keepalived 会自动安装keepalived 所需的软件包。除此之外,在LVS 群集环境中应用时,也需要用到 ipvsadm 管理工具

[root@Keepalived01 ~]# yum -y install keepalived ipvsadm
2)控制 Keepalived 服务

YUM 安装 keepalived 后,执行以下命令将 keepalived 服务设置为开机启动。

[root@Keepalived01 ~]# systemctl enable keepalived.service 

1.1.2 使用 Keepalived 实现双机热备

        基于 VRRP 的热备方式,Keepalived 可以用作服务器的故障切换,每个热备组可以有多台服务器——当然,最常用的就是双机热备了。在这种双机热备方案中,故障切换主要针对虚拟IP地址的漂移来实现,因此能够适用于各种应用服务器(不管 Web,FTP,Mail,还是SSH,DNS.....)

        本小结将通过一个简单的案例来说明 Keepalived 双机热备的配置方法。其中,主,备服务器的IP地址为 192.168.182.100 和 192.168.182.101,基于漂移地址 192.168.182.200 提供Web服务

        主,备服务器中都需要安装 Keepalived,具体步骤参考1.1.1节,使用YUM方式安装 httpd 提供web服务

1.主服务器的配置

        Keepalived 服务的配置目录位于 /etc/keepalived/ 其中,Keepalived.conf 是主配置文件:另外包括一个子目录 samples/ 提供了许多配置详例作为参考。在Keepalived 的配置文件中,使用 global_defs {....} 区段指定全局参数,使用 vrrp_instance 实例名称 {....} 区段指定VRRP 热备参数,注释文件以 “ !”号开头

[root@Keepalived01 ~]# systemctl stop firewalld
[root@Keepalived01 ~]# cd /etc/keepalived/
[root@Keepalived01 keepalived]# cp keepalived.conf keepalived.conf.bak
[root@Keepalived01 keepalived]# vim keepalived.conf
global_defs {router_id Keepalived01    //本路由器(服务器)的名称
}vrrp_instance VI_1 {    //定义VRRP 热备实例state MASTER        //热备状态,MASTER 表示主服务器interface ens33        //承载VIP接口的 ID 号,每个热备组保存一致virtual_router_id 1    //虚拟路由器的ID号,每个热备组保持一致priority 100        //优先级,数值越大优先级越高advert_int 1        //通告间隔秒数(心跳频率)authentication {        //认证信息,每个热备组保持一致auth_type PASS    //认证类型auth_pass 1111    //密码字串}virtual_ipaddress {192.168.182.200        //指定漂移地址(VIP)可以多有个}
}

        确认上述配置无误,然后启动Keepalived 服务,实际状态为 master 的主服务器将为 ens33 接口自动添加 VIP 地址,通过 ip 命令可以查看(注意:ifconfig 命令看不到)

[root@Keepalived01 keepalived]# systemctl start keepalived.service     //启动服务
[root@Keepalived01 keepalived]# ip addr show dev ens33 
2: ens33: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP group default qlen 1000link/ether 00:0c:29:e8:c0:2b brd ff:ff:ff:ff:ff:ffinet 192.168.182.100/24 brd 192.168.182.255 scope global noprefixroute ens33valid_lft forever preferred_lft foreverinet 192.168.182.200/32 scope global ens33    //自动设置的VIP地址valid_lft forever preferred_lft foreverinet6 fe80::8898:d4ee:8e2f:474b/64 scope link noprefixroute valid_lft forever preferred_lft forever
[root@Keepalived01 keepalived]# 
2.备份服务器的配置

        在同一个keepalived热备组内所有的服务器的keepalived配置文件基本相同,包括虚拟路由器的id号认证信息、漂移地址、心跳帧率等,不同之处主要在于路由器名称、热备状态、优先级、

  • 路由器名称(router_id)建议为每个参与热备份服务器指定不同的名称
  • 热备状态(state)至少应有一台主服务器,将状态设为 MASTER;可以有多台备用的服务器,将状态设置为 BACKUP
  • 优先级(priority)数值越大取得VIP 控制权的优先级越高,因此主服务器的优先级应该设为最高;其他备用服务器的优先级可以依次减递,但不要相同,以免争夺 VIP 控制权时发生冲突

        配置备用服务器(可以有多台)时,可以参考主服务器的 keepalived.conf 配置文件内容,只要修改路由器名称,热备状态,优先级就可以了

[root@Keepalived02 ~]# systemctl stop firewalld.service 
[root@Keepalived02 ~]# cd /etc/keepalived/
[root@Keepalived02 keepalived]# cp keepalived.conf keepalived.conf.bak
[root@Keepalived02 keepalived]# vim keepalived.conf
global_defs {router_id keepalived02    //本路由器(服务器)名称
}vrrp_instance VI_1 {state BACKUP        //备份状态为BACKUPinterface ens33virtual_router_id 1priority 99    //优先级,数值低于主服务器advert_int 1authentication {auth_type PASSauth_pass 1111}virtual_ipaddress {192.168.182.200}
}

        确认配置无误,一样需要启动 Keepalived 服务,此时主服务器任然在线,VIP地址实际上任然由主服务器控制,其他服务器处于备用状态,因此在备用服务器中将不会有 ens33 添加VIP 地址

[root@Keepalived02 keepalived]# systemctl start keepalived.service 
[root@Keepalived02 keepalived]# ip addr show dev ens33 
2: ens33: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP group default qlen 1000link/ether 00:0c:29:10:f2:b6 brd ff:ff:ff:ff:ff:ffinet 192.168.182.101/24 brd 192.168.182.255 scope global noprefixroute ens33valid_lft forever preferred_lft foreverinet6 fe80::47b8:3cc0:3783:e45f/64 scope link noprefixroute valid_lft forever preferred_lft forever
[root@Keepalived02 keepalived]# 
3.测试双机热备功能

        Keepalived 的日志消息保存在 /var/log/messages 文件中,在测试主,备故障自动切换功能时,可以跟踪此日志文件来观察备份状态的变化。以针对连通性和 Web 服务的测试为例,主要操作如下所述。

1)测试连通性

        在客户机中执行 ping -t 192.168.182.200 命令,能够正常,持续ping通,根据以下操作继续观察测试结果

(1)停止启用主服务器的Keepalived 服务器,发现ping测试只中断了 1 或 2 个包即恢复正常,说明已有其他服务器接替 VIP地址,并及时响应客户机请求。可以看到主服务器没用ens33这个VIP控制权了

[root@Keepalived01 keepalived]# systemctl stop keepalived.service 
[root@Keepalived01 keepalived]# ip addr show dev ens33 
2: ens33: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP group default qlen 1000link/ether 00:0c:29:e8:c0:2b brd ff:ff:ff:ff:ff:ffinet 192.168.182.100/24 brd 192.168.182.255 scope global noprefixroute ens33valid_lft forever preferred_lft foreverinet6 fe80::8898:d4ee:8e2f:474b/64 scope link noprefixroute valid_lft forever preferred_lft forever
[root@Keepalived01 keepalived]#

 

 可以看到备用服务器已经夺取VIP控制权

[root@Keepalived02 keepalived]# ip addr show dev ens33 
2: ens33: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP group default qlen 1000link/ether 00:0c:29:10:f2:b6 brd ff:ff:ff:ff:ff:ffinet 192.168.182.101/24 brd 192.168.182.255 scope global noprefixroute ens33valid_lft forever preferred_lft foreverinet 192.168.182.200/32 scope global ens33valid_lft forever preferred_lft foreverinet6 fe80::47b8:3cc0:3783:e45f/64 scope link noprefixroute valid_lft forever preferred_lft forever
[root@Keepalived02 keepalived]# 

(2)重新启动主服务器的 Keepalived 服务,发现 ping 测试只中断了 1 或 2 个包即恢复正常,说明主服务器已恢复正常,并夺回 VIP 地址的控制权

再次使用 ip addr show dev ens33 查看主,备服务器可以看到VIP已经重新被主服务器夺回控制权 

2)Web 访问测试

在客户机中访问 http://192.168.182.200 ,将看到由主服务器 192.168.182.100 提供的网页文档

(1)停止启用主服务器的 Keepalived 服务,再次访问上述 Web 服务,将看到由备用服务器192.168.182.101 提供的网页文档,说明 VIP 地址以切换至备用服务器

(2)在重启启用主服务器的 Keepalived 服务,再次访问上述 Web 服务,将看到重新由主服务器192.168.182.100 提供的晚饭也文档,说明主服务器已重新夺取VIP 地址

3)查看日志记录

        在执行主,备服务器故障切换的过程中,分别观察各自的 /var/log/messages 日志文件,可以看到MASTER,SLAVE 状态迁移记录

(1)主服务器中 Keepalived 服务状态先变为 stop 移除 VIP 地址,恢复后重新变更为 MASTER

[root@Keepalived01 keepalived]# less /var/log/messages

        通过上述测试过程,可以发现双机热备已经正常,客户机只要通过 VIP 地址就可以访问服务器所提供的 Web 等应用,其中任何一台服务器失效,另一台将会立即接替服务,从而实现调高可用性。实际应用时,注意主,备服务器所提供的 Web 服务内容要保存一致

1.2 LVS+Keepalived 高可用群集

        Keepalived 的设计目标时构建高可用的 LVS 负载均衡群集,可以调用 ipvsadm 工具来创建虚拟服务器,管理服务器池,而不仅仅用作双机热备,使用,Keepalived 构建 LVS 群集更加简单易用,主要优势体现在:对 LVS 负载调度器实现热备切换,提高可用性:对服务器池中的节点进行健康检查,自动移除失效节点,恢复后再重新加入

        在基于LVS+Keepalived 群集结构中,至少包括两台热备的负载均衡调度器,三台以上的节点服务器。本节将以 DR 模式的 LVS 群集为基础,增加一台从负调度器,使用 Keepalived 来实现主,从调度器的热备,从而构建兼有负载均衡,糕可用两种能力的 LVS 网站群集平台,如图

        使用 Keepalived 构建 LVS 群集时,也需要用到 ipvsadm 管理工具,但大部分工作会由 Keepalived 自动完成,不需要手动执行 ipvsadm (除了查看和监控群集以为)

1.配置主调度器

1)配置全局。热备配置

首先为主,从调度器实现热备功能,漂移地址使用LVS 群集的 VIP地址

[root@Keepalived01 ~]# vim /etc/keepalived/keepalived.conf
[root@Keepalived01 ~]# cat /etc/keepalived/keepalived.conf
! Configuration File for keepalivedglobal_defs {router_id Keepalived01
}vrrp_instance VI_1 {state MASTERinterface ens33virtual_router_id 1priority 100advert_int 1authentication {auth_type PASSauth_pass 1111}virtual_ipaddress {192.168.182.200}
}[root@Keepalived01 ~]# 
2)Web 服务器池配置

        在Keepalived 的热备配置基础上添加 virtual_server VIP 端口 {.....} 区段来配置虚拟服务器主要包括对负载调度算法,群集工作模式,健康检查间隔,真实服务器地址等参数的设置

[root@Keepalived01 ~]# vim /etc/keepalived/keepalived.conf
virtual_server 192.168.182.200 80 {        //虚拟服务器地址(VIP)端口delay_loop 15    //健康检查的时间间隔(秒)lb_algo rr    //轮询rr调度算法lb_kind DR        //直接路由DR群集工作模式persistence_timeout 60    //连接保持时间(秒) 若启用请去掉!号protocol TCP    //应用服务器采用的是TCP协议real_server 192.168.182.102 80 {        //第一个Web节点的地址,端口weight 1    //节点的权重TCP_CHECK{        //检查健康方式connect_port 80    //检查的目标端口connect_timeout 3    //连接超时(秒)nb_get_retry 3        //重试次数delay_before_retry 4    //重试间隔(秒)}   }       real_server 192.168.182.103 80 {    //第二个Web节点的地址,端口weight 1TCP_CHECK{connect_port 80connect_timeout 3nb_get_retry 3delay_before_retry 4}}
}

3)重启Keepalived fuwu
[root@Keepalived01 ~]# systemctl restart keepalived.service 

2.配置从调度器

        从调度器的配置与主调度器基本相同,也包括全局配置,热备配置,服务器池配置,只需要调整 router_id state priority 参数即可,其余内容完全相同。配置完成以后重启 Keepalived 服务

[root@Keepalived02 ~]# vim /etc/keepalived/keepalived.conf! Configuration File for keepalivedglobal_defs {router_id keepalived02
}vrrp_instance VI_1 {state BACKUPinterface ens33virtual_router_id 1priority 99advert_int 1authentication {auth_type PASSauth_pass 1111}virtual_ipaddress {192.168.182.200persistence_timeout 60protocol TCPreal_server 192.168.182.102 80 {weight 1TCP_CHECK{connect_port 80connect_timeout 3nb_get_retry 3delay_before_retry 4}}real_server 192.168.182.103 80 {weight 1TCP_CHECK{connect_port 80connect_timeout 3nb_get_retry 3delay_before_retry 4}}
}[root@Keepalived02 ~]# systemctl restart keepalived.service

3.主/从服务器的参数配置

1)主服务器
[root@Keepalived01 ~]# vim /etc/sysctl.conf 
[root@Keepalived01 ~]# cat /etc/sysctl.conf | grep net
net.ipv4.conf.all.send_redirects = 0
net.ipv4.conf.default.send_redirects = 0
net.ipv4.conf.ens33.send_redirects = 0[root@Keepalived01 ~]# sysctl -p
net.ipv4.conf.all.send_redirects = 0
net.ipv4.conf.default.send_redirects = 0
net.ipv4.conf.ens33.send_redirects = 0[root@Keepalived01 ~]# systemctl restart keepalived.service 
 2)从服务器
[root@Keepalived02 ~]# cat /etc/sysctl.conf | grep net
net.ipv4.conf.all.send_redirects = 0
net.ipv4.conf.default.send_redirects = 0
net.ipv4.conf.ens33.send_redirects = 0[root@Keepalived02 ~]# sysctl -p
net.ipv4.conf.all.send_redirects = 0
net.ipv4.conf.default.send_redirects = 0
net.ipv4.conf.ens33.send_redirects = 0[root@Keepalived02 ~]# systemctl restart keepalived.service

4.Web 服务池参数配置

[root@node01 ~]# vim /etc/sysctl.conf 
[root@node01 ~]# cat /etc/sysctl.conf | grep net
net.ipv4.conf.all.arp_ignore = 1
net.ipv4.conf.all.arp_announce = 2
net.ipv4.conf.default.arp_ignore = 1
net.ipv4.conf.default.arp_announce = 2
net.ipv4.conf.lo.arp_ignore = 1
net.ipv4.conf.lo.arp_announce = 2[root@node01 ~]# sysctl -p
net.ipv4.conf.all.arp_ignore = 1
net.ipv4.conf.all.arp_announce = 2
net.ipv4.conf.default.arp_ignore = 1
net.ipv4.conf.default.arp_announce = 2
net.ipv4.conf.lo.arp_ignore = 1
net.ipv4.conf.lo.arp_announce = 2[root@node01 ~]# cd /etc/sysconfig/network-scripts/
[root@node01 network-scripts]# cp ifcfg-lo ifcfg-lo:0
[root@node01 network-scripts]# vim ifcfg-lo:0
[root@node01 network-scripts]# vim ifcfg-lo:0
[root@node01 network-scripts]# cat ifcfg-lo:0
DEVICE=lo:0
IPADDR=192.168.182.200
NETMASK=255.255.255.255
ONBOOT=yes
[root@node01 network-scripts]# ifup ifcfg-lo:0
[root@node01 network-scripts]# ifconfig lo:0
lo:0: flags=73<UP,LOOPBACK,RUNNING>  mtu 65536inet 192.168.182.200  netmask 255.255.255.255loop  txqueuelen 1000  (Local Loopback)[root@node01 network-scripts]# 

5.配置NFS共享存储

1)安装 nfs-utils,rpcbind 软件包

        提供 RPC 支持的服务为 rpcbind,提供 NFS 共享的服务为 nfs,完成安装以后建议调整这两个服务的自启动状态,以便每次开机后自动启用。手动加载 NFS 共享服务时,应该先启动 rpcbind,再启动 nfs。

[root@NFS ~]# yum -y install nfs-utils rpcbind
[root@NFS ~]# systemctl enable nfs
[root@NFS ~]# systemctl enable rpcbind
2)设置共享目录

        NFS 的配置文件为/etc/exports,文件内容默认为空(无任何共享)。在 exports 文件中设置共享资源时,记录格式为“目录位置客户机地址(权限选项)”。例如,若要将文件夹/opt/wwwroot 共享给 192.168.182.0/24 网段使用,允许读写操作,具体配置如下所示
 

[root@NFS ~]#  mkdir /aaa
[root@NFS ~]# vim /etc/exports
[root@NFS ~]# cat /etc/exports
/aaa 192.168.182.0/24(rw,sync,no_root_squash)
3)启动NFS 服务程序
[root@NFS ~]# systemctl start rpcbind
[root@NFS ~]# systemctl start nfs
[root@NFS ~]# netstat -anpt | grep rpc
tcp        0      0 0.0.0.0:111             0.0.0.0:*               LISTEN      67104/rpcbind       
tcp        0      0 0.0.0.0:20048           0.0.0.0:*               LISTEN      67238/rpc.mountd    
tcp        0      0 0.0.0.0:33982           0.0.0.0:*               LISTEN      67235/rpc.statd     
tcp6       0      0 :::50091                :::*                    LISTEN      67235/rpc.statd     
tcp6       0      0 :::111                  :::*                    LISTEN      67104/rpcbind       
tcp6       0      0 :::20048                :::*                    LISTEN      67238/rpc.mountd    
[root@NFS ~]# 
4)查看本机发布的NFS 共享目录
[root@NFS ~]# showmount -e
Export list for NFS:
/aaa 192.168.182.0/24
[root@NFS ~]# 

6.在客户机中访问 NFS 共享存储

        NFS 协议的目标是提供一种网络文件系统,因此对 NFS 共享的访问也使用 mount 命令来进行挂载,对应的文件系统类型为 nfs。既可以手动挂载,也可以加入/etc/fstab 配置文件来实现开机自动挂载。考虑到群集系统中的网络稳定性,NFS 服务器与客户机之间最好使用专有网络进行连接。


1)Web池安装 rpcbind 软件包,并启动 rpcbind 服务

        若要正常访问 NFS 共享资源,客户机中也需要安装 rpcbind 软件包,并启动 rpcbind 系统服务。另外,为了使用 showmount 查询工具,建议将 nfs-utils 软件包也一并装上

[root@node01 ~]# yum -y install rpcbind nfs-utils
[root@node01 ~]# systemctl enable rpcbind
[root@node01 ~]# systemctl start rpcbind

       如果已经安装了 nfs-utils 软件包,则客户机也可以使用 showmount 查看 NFS 服务器端共享了哪些目录,查询格式为“showmount -e 服务器地址

[root@node01 ~]# showmount -e 192.168.182.105
Export list for 192.168.182.105:
/aaa 192.168.182.0/24
[root@node01 ~]# 

1.3 Web池安装 httpd 创建测试网页

1)Web池安装httpd,创建测试网页的命令如下
[root@node01 ~]# yum -y install httpd
[root@node01 ~]# mount 192.168.182.105:/aaa /var/www/html/
[root@node01 ~]# vim /var/www/html/index.html
[root@node01 ~]# cat /var/www/html/index.html 
<h1>Hello Word</h1>
[root@node01 ~]#[root@node02 ~]# mount 192.168.182.105:/aaa /var/www/html/
2)Web池启动httpd 服务程序
[root@node01 ~]# systemctl enable httpd
[root@node01 ~]# systemctl start httpd
3)Web服务器池配置 fstab 自动挂载

        修改/etc/fstab 配置文件,加入 NFS 共享目录的挂载设置。注意将文件系统类型设为 nfs,挂载参数建议添加_netdev(设备需要网络)。若添加 soft、intr 参数可以实现软挂载,允许在网络中断时放弃挂载。这样,客户机就可以在每次开机后自动挂载 NFS 共享资源了。
 

[root@node01 ~]# vim /etc/fstab 
[root@node01 ~]# cat /etc/fstab | grep nfs
192.168.182.105:/aaa /var/www/html nfs   defaults,netdev 0 0
[root@node01 ~]# 

 

1.4 测试 LVS+Keepalived 高可用群集

        在客户机的浏览器中,能够通过LVS+Keepalived 群集的 VIP 地址(192.168.182.200)正常访问Web 页面内容。当主,从调度器任何一个失效时,Web站点任然何以访问(可能需要刷新或者重新打开浏览器)只需服务器池有两台及以上的真实服务器可用,就可以实现访问量的负载均衡。

        通过主,从调度器的 /var/log/messages 日志文件,可以追踪故障切换过程,若要查看负载分配情况,可以执行 ipvsadm-ln     或 ipvsadm -lnc 等操作。最终可以验证 LVS+Keepalived 高可用负载均衡群集的健壮性

[root@Keepalived01 ~]# ipvsadm -lnc
IPVS connection entries
pro expire state       source             virtual            destination
TCP 00:28  NONE        192.168.182.1:0    192.168.182.200:80 192.168.182.102:80
TCP 00:52  FIN_WAIT    192.168.182.1:59054 192.168.182.200:80 192.168.182.102:80
TCP 01:21  FIN_WAIT    192.168.182.1:59194 192.168.182.200:80 192.168.182.102:80
TCP 00:50  FIN_WAIT    192.168.182.1:59193 192.168.182.200:80 192.168.182.102:80
[root@Keepalived01 ~]#

相关文章:

  • Python的集合set用法介绍与例子
  • 第9章 正则表达式
  • 【加强版】小学数学出题,加减乘除混合运算,支持自定义数字,一键打印
  • apache、nginx、php 隐藏版本号
  • spring ioc容器
  • 使用 Elasticsearch 和 LlamaIndex 进行高级文本检索:句子窗口检索
  • SpringBoot:详解依赖注入和使用配置文件
  • 《Python 3 基础》- numpy的array,python的list、tuple的区别与联系再辨析
  • 【C++ 程序设计入门基础】- 第4节-函数
  • 分布式搜索引擎--认识
  • 【设计模式】01-前言
  • Spring集成
  • 【镜像制作】OS云主机镜像的制作——以H3C为例
  • SAP 中销售订单占用库存和交货单占用库存取值
  • PaddleSeg的训练与测试推理全流程(超级详细)
  • 【剑指offer】让抽象问题具体化
  • 30天自制操作系统-2
  • angular2 简述
  • Java Agent 学习笔记
  • leetcode讲解--894. All Possible Full Binary Trees
  • spring-boot List转Page
  • 大型网站性能监测、分析与优化常见问题QA
  • 动态规划入门(以爬楼梯为例)
  • 关于字符编码你应该知道的事情
  • 近期前端发展计划
  • 区块链将重新定义世界
  • 如何合理的规划jvm性能调优
  • 小程序测试方案初探
  • 写给高年级小学生看的《Bash 指南》
  • 学习使用ExpressJS 4.0中的新Router
  • 验证码识别技术——15分钟带你突破各种复杂不定长验证码
  • 再次简单明了总结flex布局,一看就懂...
  • nb
  • “十年磨一剑”--有赞的HBase平台实践和应用之路 ...
  • Hibernate主键生成策略及选择
  • #define
  • #我与Java虚拟机的故事#连载11: JVM学习之路
  • (02)vite环境变量配置
  • (10)ATF MMU转换表
  • (BFS)hdoj2377-Bus Pass
  • (七)微服务分布式云架构spring cloud - common-service 项目构建过程
  • (十五)使用Nexus创建Maven私服
  • (一)80c52学习之旅-起始篇
  • (转)eclipse内存溢出设置 -Xms212m -Xmx804m -XX:PermSize=250M -XX:MaxPermSize=356m
  • (转)全文检索技术学习(三)——Lucene支持中文分词
  • (转)微软牛津计划介绍——屌爆了的自然数据处理解决方案(人脸/语音识别,计算机视觉与语言理解)...
  • .NET/C# 解压 Zip 文件时出现异常:System.IO.InvalidDataException: 找不到中央目录结尾记录。
  • .pyc文件还原.py文件_Python什么情况下会生成pyc文件?
  • /usr/local/nginx/logs/nginx.pid failed (2: No such file or directory)
  • ?php echo ?,?php echo Hello world!;?
  • @31省区市高考时间表来了,祝考试成功
  • @converter 只能用mysql吗_python-MySQLConverter对象没有mysql-connector属性’...
  • @PreAuthorize注解
  • @transaction 提交事务_【读源码】剖析TCCTransaction事务提交实现细节
  • [20160902]rm -rf的惨案.txt