Keepalived高可用集群部署
KeepAlived
KeepAlived安装
1.yum源安装
yum install keepalived
2.官网源码包编译
KeepAlived官网提供可编译源码包,可直接下载。
官网地址:

官网提供的软件包,解压编译安装即可。
KeepAlived部署
高可用实现支持多种集群配置模式:主备模式,主主模式,N+1模式,N+M模式;另外支持资源及节点故障检测。
准备工作
- 硬件准备
要实现KeepAlived的多种模式,因此这里准备了4台虚拟机进行测试,设备IP分别为:
192.168.25.23
192.168.25.24
192.168.25.25
192.168.25.26
- 软件准备
本次高可用实现以nginx进行效果展示,nginx未进行任何配置,仅修改了对应index.html文件以展示对应情况的高可用实现效果。
- nginx准备
系统可通过软件仓库安装nginx:
yum install nginx -y
启动nginx:
nginx
系统默认安装并启动了ApacheHttp服务,因此需要关闭httpd服务:
systemctl stop httpd
systemctl disable httpd
如果仍旧不能正常访问nginx主页,需要添加防火墙规则或关闭防火墙。
此处为方便后续操作且非为测试环境,所以关闭防火墙,如在生产环境,请添加防火墙规则:
systemctl stop firewalld
systemctl disable firewalld
分别在各个测试机中启动nginx后,测试页面是否正常显示,如出现以下页面即为正常:

为了方便辨别实现效果,此处修改nginx的主页。
nginx主页的位置为:
/usr/share/nginx/html/index.html
编辑index.html:
vim /usr/share/nginx/html/index.html
在86行下添加内容:
<h2><strong>The IP is 192.168.25.**</strong></h2>
IP地址根据实际情况进行修改,效果如下:

添加nginx默认启动:
systemctl enable nginx
至此,nginx准备完毕。
- keepalivd准备
软件仓库安装keepalived,分别在测试机上执行:
yum install keepalived -y
确认安装情况,执行脚本:
keepalived -v
输出内容如下:

查询对应的配置文件:
rpm -ql keepalived
相关内容如下:

文件说明:
/etc/keepalived -主目录
/etc/keepalived/keepalived.conf -配置文件
/etc/sysconfig/keepalived -系统配置文件
/usr/lib/systemd/system/keepalived.service -系统服务
/usr/libexec/keepalived -库目录
/usr/sbin/keepalived -系统命令
Keepalived主要通过修改/etc/keepalived/keepalived.conf配置文件进行配置高可用集群。
主备模式
节点配置
此模式下使用两台虚拟机和一个虚拟IP进行:
主节点:192.168.25.23
备节点:192.168.25.24
虚拟IP:192.168.25.10
- 主节点(192.168.25.23)配置内容:
! Configuration File for keepalived
global_defs {
router_id PV23
}
vrrp_instance VI_1 {
state MASTER
interface enp1s0
virtual_router_id 86
priority 200
unicast_src_ip 192.168.25.23
unicast_peer {
192.168.25.24
}
advert_int 1
authentication {
auth_type PASS
auth_pass 1111
}
virtual_ipaddress {
192.168.25.10
}
}
- 备节点(192.168.25.24)配置内容:
! Configuration File for keepalived
global_defs {
router_id PV24
}
vrrp_instance VI_1 {
state BACKUP
interface enp1s0
virtual_router_id 86
priority 200
unicast_src_ip 192.168.25.24
unicast_peer {
192.168.25.23
}
advert_int 1
authentication {
auth_type PASS
auth_pass 1111
}
virtual_ipaddress {
192.168.25.10
}
}
验证
正常状态
- 浏览器访问虚拟IP:192.168.25.10
- 页面显示实际访问地址为192.168.25.23,当前为正常状态,无论刷新多少次均显示为主节点提供服务。

故障
- 停止主节点keepalived服务,主节点执行;
systemctl stop keepalived - 浏览器访问虚拟IP:192.168.25.10;
- 页面实际访问地址为192.168.25.24,当前由于主节点故障,备用节点启用,接管VIP流量。

故障恢复
- 重新启动主节点keepalived服务;
systemctl restart keepalived - 浏览器访问虚拟IP:192.168.25.10;
- 页面实际访问地址为192.168.25.23,主节点恢复,接管VIP流量。

1+N(一主多备)模式
节点配置
此模式下使用三台虚拟机(备用节点)进行:
主节点:192.168.25.23
备节点1:192.168.25.24
备节点2:192.168.25.25
虚拟IP:192.168.25.10
- 主节点(192.168.25.23)配置内容:
! Configuration File for keepalived
global_defs {
router_id PV23
}
vrrp_instance VI_1 {
state MASTER
interface enp1s0
virtual_router_id 86
priority 200
unicast_src_ip 192.168.25.23
unicast_peer {
192.168.25.24
192.168.25.25
}
advert_int 1
authentication {
auth_type PASS
auth_pass 1111
}
virtual_ipaddress {
192.168.25.10
}
}
- 备节点(192.168.25.24)配置内容:
! Configuration File for keepalived
global_defs {
router_id PV24
}
vrrp_instance VI_1 {
state BACKUP
interface enp1s0
virtual_router_id 86
priority 100
unicast_src_ip 192.168.25.24
unicast_peer {
192.168.25.23
192.168.25.25
}
advert_int 1
authentication {
auth_type PASS
auth_pass 1111
}
virtual_ipaddress {
192.168.25.10
}
}
- 备节点(192.168.25.25)配置内容:
! Configuration File for keepalived
global_defs {
router_id PV25
}
vrrp_instance VI_1 {
state BACKUP
interface enp1s0
virtual_router_id 86
priority 20
unicast_src_ip 192.168.25.25
unicast_peer {
192.168.25.23
192.168.25.24
}
advert_int 1
authentication {
auth_type PASS
auth_pass 1111
}
virtual_ipaddress {
192.168.25.10
}
}
验证
正常状态
- 浏览器访问虚拟IP:192.168.25.10
- 页面显示实际访问地址为192.168.25.23,当前为正常状态,无论刷新多少次均显示为主节点提供服务。

故障-1
- 停止主节点keepalived服务,主节点执行;
systemctl stop keepalived - 浏览器访问虚拟IP:192.168.25.10;
- 页面实际访问地址为192.168.25.24,当前由于主节点故障,备用节点启用,由于备用节点1优先级高于备用节点2,所以备用节点1接管VIP流量。

故障-2
- 停止备节点1keepalived服务,备节点1执行;
systemctl stop keepalived - 浏览器访问虚拟IP:192.168.25.10;
- 页面实际访问地址为192.168.25.25,当前由于备节点1故障,备用节点2启用,所以备用节点2接管VIP流量。

故障恢复-1
- 重新启动主节点keepalived服务;
systemctl restart keepalived - 浏览器访问虚拟IP:192.168.25.10;
- 页面实际访问地址为192.168.25.23,主节点恢复,接管VIP流量。
故障恢复-2
- 重新启动备节点1keepalived服务;
systemctl restart keepalived - 浏览器访问虚拟IP:192.168.25.10;
- 页面实际访问地址为192.168.25.23,当前由于主节点状态正常,继续管理VIP流量。
主主(互为主备)模式
此模式下两台机器两个虚拟IP,每台机器对应一个虚拟IP的主节点,对应另一个虚拟IP的备节点,两台机器互为主备。
节点配置
此模式下使用两台虚拟机进行:
节点1:192.168.25.23
节点2:192.168.25.24
虚拟IP1:192.168.25.10
虚拟IP2:192.168.25.20
- 节点1配置内容
! Configuration File for keepalived
global_defs {
router_id PV23
}
vrrp_instance VI_1 {
state MASTER
interface enp1s0
virtual_router_id 86
priority 200
unicast_src_ip 192.168.25.23
unicast_peer {
192.168.25.24
}
advert_int 1
authentication {
auth_type PASS
auth_pass 1111
}
virtual_ipaddress {
192.168.25.10
}
}
vrrp_instance VI_2 {
state BACKUP
interface enp1s0
virtual_router_id 85
priority 20
unicast_src_ip 192.168.25.23
unicast_peer {
192.168.25.24
}
advert_int 1
authentication {
auth_type PASS
auth_pass 1111
}
virtual_ipaddress {
192.168.25.20
}
}
- 节点2配置内容
! Configuration File for keepalived
global_defs {
router_id PV24
}
vrrp_instance VI_1 {
state BACKUP
interface enp1s0
virtual_router_id 86
priority 100
unicast_src_ip 192.168.25.24
unicast_peer {
192.168.25.23
}
advert_int 1
authentication {
auth_type PASS
auth_pass 1111
}
virtual_ipaddress {
192.168.25.10
}
}
vrrp_instance VI_2 {
state MASTER
interface enp1s0
virtual_router_id 85
priority 100
unicast_src_ip 192.168.25.24
unicast_peer {
192.168.25.23
}
advert_int 1
authentication {
auth_type PASS
auth_pass 1111
}
virtual_ipaddress {
192.168.25.20
}
}
验证
正常状态
- 浏览器访问虚拟IP:192.168.25.10
- 页面显示实际访问地址为192.168.25.23,当前为正常状态,无论刷新多少次均显示为VIP1的主节点-节点1提供服务。
- 浏览器访问虚拟IP:192.168.25.20
- 页面显示实际访问地址为192.168.25.24,当前为正常状态,无论刷新多少次均显示为VIP2的主节点-节点2提供服务。

故障-1
- 停止节点1keepalived服务,节点1执行;
systemctl stop keepalived - 浏览器访问虚拟IP:192.168.25.10
- 页面显示实际访问地址为192.168.25.24,当前由于节点1故障,备用节点启用,所以作为节点1的备用节点,节点2接管VIP1流量。
- 浏览器访问虚拟IP:192.168.25.20
- 页面显示实际访问地址为192.168.25.24,当前为正常状态,无论刷新多少次均显示为VIP2的主节点-节点2提供服务。

故障-1恢复
- 恢复节点1keepalived服务,节点1执行;
systemctl restart keepalived - 浏览器访问虚拟IP:192.168.25.10
- 页面显示实际访问地址为192.168.25.23,由于节点1已恢复,作为VIP1的主节点-节点1,节点1恢复接管VIP1流量。
- 浏览器访问虚拟IP:192.168.25.20
- 页面显示实际访问地址为192.168.25.24,当前为正常状态,无论刷新多少次均显示为VIP2的主节点-节点2提供服务。

故障-2
- 停止节点2keepalived服务,节点2执行;
systemctl stop keepalived - 浏览器访问虚拟IP:192.168.25.10
- 页面显示实际访问地址为192.168.25.23,当前为正常状态,无论刷新多少次均显示为VIP1的主节点-节点1提供服务。
- 浏览器访问虚拟IP:192.168.25.20
- 页面显示实际访问地址为192.168.25.23,当前由于节点2故障,备用节点启用,所以作为节点2的备用节点,节点1接管VIP2流量。

故障-2恢复
- 恢复节点2keepalived服务,节点1执行;
systemctl restart keepalived - 浏览器访问虚拟IP:192.168.25.10
- 页面显示实际访问地址为192.168.25.23,当前为正常状态,无论刷新多少次均显示为VIP1的主节点-节点1提供服务。
- 浏览器访问虚拟IP:192.168.25.20
- 页面显示实际访问地址为192.168.25.24,由于节点2已恢复,作为VIP2的主节点-节点2,节点2恢复接管VIP2流量。

N+1模式
此模式下三台机器两个虚拟IP,两台机器各对应一个虚拟IP的主节点,另外一台机器为两个虚拟IP的备节点。
节点配置
此模式下使用两台虚拟机进行:
主节点1:192.168.25.23
主节点2:192.168.25.24
备节点:192.168.25.25
虚拟IP1:192.168.25.10
虚拟IP2:192.168.25.20
- 节点1配置内容
! Configuration File for keepalived
global_defs {
router_id PV23
}
vrrp_instance VI_1 {
state MASTER
interface enp1s0
virtual_router_id 86
priority 200
unicast_src_ip 192.168.25.23
unicast_peer {
192.168.25.25
}
advert_int 1
authentication {
auth_type PASS
auth_pass 1111
}
virtual_ipaddress {
192.168.25.10
}
}
- 主节点2配置内容
! Configuration File for keepalived
global_defs {
router_id PV24
}
vrrp_instance VI_2 {
state MASTER
interface enp1s0
virtual_router_id 85
priority 100
unicast_src_ip 192.168.25.24
unicast_peer {
192.168.25.25
}
advert_int 1
authentication {
auth_type PASS
auth_pass 1111
}
virtual_ipaddress {
192.168.25.20
}
}
- 备节点配置内容
! Configuration File for keepalived
global_defs {
router_id PV25
}
vrrp_instance VI_1 {
state BACKUP
interface enp1s0
virtual_router_id 86
priority 100
unicast_src_ip 192.168.25.25
unicast_peer {
192.168.25.23
}
advert_int 1
authentication {
auth_type PASS
auth_pass 1111
}
virtual_ipaddress {
192.168.25.10
}
}
vrrp_instance VI_2 {
state BACKUP
interface enp1s0
virtual_router_id 85
priority 20
unicast_src_ip 192.168.25.25
unicast_peer {
192.168.25.24
}
advert_int 1
authentication {
auth_type PASS
auth_pass 1111
}
virtual_ipaddress {
192.168.25.20
}
}
验证
正常状态
- 浏览器访问虚拟IP:192.168.25.10
- 页面显示实际访问地址为192.168.25.23,当前为正常状态,无论刷新多少次均显示为VIP1的主节点-节点1提供服务。
- 浏览器访问虚拟IP:192.168.25.20
- 页面显示实际访问地址为192.168.25.24,当前为正常状态,无论刷新多少次均显示为VIP2的主节点-节点2提供服务。

故障-1
- 停止主节点1keepalived服务,主节点1执行;
systemctl stop keepalived - 浏览器访问虚拟IP:192.168.25.10
- 页面显示实际访问地址为192.168.25.25,当前由于主节点1故障,备用节点启用,所以作为节点1的备用节点,备节点接管VIP1流量。
- 浏览器访问虚拟IP:192.168.25.20
- 页面显示实际访问地址为192.168.25.24,当前为正常状态,无论刷新多少次均显示为VIP2的主节点-节点2提供服务。

故障-1恢复
- 恢复主节点1keepalived服务,主节点1执行;
systemctl restart keepalived - 浏览器访问虚拟IP:192.168.25.10
- 页面显示实际访问地址为192.168.25.23,由于节点1已恢复,作为VIP1的主节点-主节点1,主节点1重新接管VIP1流量。
- 浏览器访问虚拟IP:192.168.25.20
- 页面显示实际访问地址为192.168.25.24,当前为正常状态,无论刷新多少次均显示为VIP2的主节点-主节点2提供服务。

故障-2
- 停止主节点2keepalived服务,主节点2执行;
systemctl stop keepalived - 浏览器访问虚拟IP:192.168.25.10
- 页面显示实际访问地址为192.168.25.23,当前为正常状态,无论刷新多少次均显示为VIP1的主节点-主节点1提供服务。
- 浏览器访问虚拟IP:192.168.25.20
- 页面显示实际访问地址为192.168.25.25,当前由于主节点2故障,备用节点启用,所以作为主节点2的备用节点,备节点接管VIP2流量。

故障-2恢复
- 恢复节点2keepalived服务,节点1执行;
systemctl restart keepalived - 浏览器访问虚拟IP:192.168.25.10
- 页面显示实际访问地址为192.168.25.23,当前为正常状态,无论刷新多少次均显示为VIP1的主节点-节点1提供服务。
- 浏览器访问虚拟IP:192.168.25.20
- 页面显示实际访问地址为192.168.25.24,由于主节点2已恢复,作为VIP2的主节点-主节点2,主节点2恢复接管VIP2流量。

故障-3
- 停止主节点1keepalived服务,主节点1执行;
systemctl stop keepalived - 停止主节点2keepalived服务,主节点2执行;
systemctl stop keepalived - 浏览器访问虚拟IP:192.168.25.10
- 页面显示实际访问地址为192.168.25.25,当前由于主节点1故障,备用节点启用,所以作为节点1的备用节点,备节点接管VIP1流量。
- 浏览器访问虚拟IP:192.168.25.20
- 页面显示实际访问地址为192.168.25.25,当前由于主节点2故障,备用节点启用,所以作为主节点2的备用节点,备节点接管VIP2流量。

故障-3恢复
- 恢复主节点1keepalived服务,主节点1执行;
systemctl restart keepalived - 浏览器访问虚拟IP:192.168.25.10
- 页面显示实际访问地址为192.168.25.23,由于节点1已恢复,作为VIP1的主节点-主节点1,主节点1重新接管VIP1流量。
- 恢复节点2keepalived服务,节点1执行;
systemctl restart keepalived - 浏览器访问虚拟IP:192.168.25.20
- 页面显示实际访问地址为192.168.25.24,由于主节点2已恢复,作为VIP2的主节点-主节点2,主节点2恢复接管VIP2流量。

N+M模式
N+M模式的配置参考N+1模式,复制备节点即可
资源故障检测
说明
Keepalived通过在配置文件中添加script来实现对服务状态的检测和故障切换
在global配置段外定义脚本或者shell命令,然后再virtual_server配置段中调用脚本,最后根据脚本的执行结果(成功或失败) 来增加或减少当前的节点的优先级,因为keepalived是根据优先级来判断是否为主节点 所以当优先级低时则就成为备份节点 从而将VIP飘动到优先级高的主节点上 实现了对其他服务的高可用
script配置及调用说明:
vrrp_script chk_nginx { # chk_nginx为自定义的vrrp脚本名称 后续调用需要此名称
script "killall -0 sshd" # 执行的脚本或命令
interval 2 # 监测的时间间隔 单位:秒 默认:1秒
weight -4 # 此值默认为0 范围:-253~253 ,
# 如果此值为负数 则代表当上面的脚本或命令执行失败时($?结果为非0) 则将本节点的优先级减去定义的值;
# 如果此值为正数 则代表当上面的脚本或命令执行成功时($?结果为0) 则将本节点的优先级加上定义的值
fall 2 # 脚本或命令执行几次失败后 将本节点标记为失败(进而进行减优先级操作)
rise 2 # 脚本或命令执行几次成功后 将本节点标记为成功(进而恢复节点)
user USERNAME # 以什么用户身份执行脚本
}
vrrp_instance VI_1 {
...
track_script {
script_name
}
}
节点配置
本次使用两台虚拟机和一个虚拟IP进行配置:
主节点:192.168.25.23
备节点:192.168.25.24
虚拟IP:192.168.25.10
- 主节点配置内容:
! Configuration File for keepalived
global_defs {
router_id PV23
}
vrrp_script check_nginx {
script "/etc/keepalived/check_nginx.sh"
interval 2
weight -30
fall 2
rise 2
}
vrrp_instance VI_1 {
state MASTER
interface enp1s0
virtual_router_id 86
priority 100
unicast_src_ip 192.168.25.23
unicast_peer {
192.168.25.24
}
advert_int 1
authentication {
auth_type PASS
auth_pass 1111
}
virtual_ipaddress {
192.168.25.10
}
track_script {
check_nginx
}
}
- 备节点配置内容:
! Configuration File for keepalived
global_defs {
router_id PV24
}
vrrp_script check_nginx {
script "/etc/keepalived/check_nginx.sh"
interval 2
weight -30
fall 2
rise 2
}
vrrp_instance VI_1 {
state BACKUP
interface enp1s0
virtual_router_id 86
priority 80
unicast_src_ip 192.168.25.24
unicast_peer {
192.168.25.23
}
advert_int 1
authentication {
auth_type PASS
auth_pass 1111
}
virtual_ipaddress {
192.168.25.10
}
track_script {
check_nginx
}
}
- 配置检测脚本
分别在主节点和备节点编辑脚本,编辑:
vim /etc/keepalived/check_nginx.sh
脚本内容为:\
#!/bin/sh
A=`ps -C nginx --no-header |wc -l`
if [ $A -eq 0 ];then
# nginx # 此处为展示效果,在nginx出现故障后,注释不重启nginx。
sleep 2
if [ `ps -C nginx --no-header |wc -l` -eq 0 ];then
killall keepalived
fi
fi
为脚本添加执行权限:
chmod +x /etc/keepalived/check_nginx.sh
验证
正常状态
- 浏览器访问虚拟IP:192.168.25.10
- 页面显示实际访问地址为192.168.25.23,当前为正常状态,无论刷新多少次均显示为主节点提供服务。

nginx服务故障
- 停止主节点nginx服务,主节点执行;
killall nginx - 浏览器访问虚拟IP:192.168.25.10;
- 页面实际访问地址为192.168.25.24,当前由于主节点资源故障,权重-30,优先级低于备用节点,备用节点启用,接管VIP流量。

nginx服务恢复
故障恢复
- 重新启动主节点nginx服务;
nginx - 浏览器访问虚拟IP:192.168.25.10;
- 页面实际访问地址为192.168.25.23,主节点nginx恢复,权重恢复,优先级高于备用节点,重新接管VIP流量。

Keepalived高可用集群部署的更多相关文章
- Keepalived高可用集群应用
Keepalived高可用集群应用 1.keepalived服务说明 1.1.keepalived介绍 Keepalived是一个用C语言编写的路由软件.该项目的主要目标是为Linux系统和基于Lin ...
- Nginx+Keepalived高可用集群应用实践
Nginx+Keepalived高可用集群应用实践 1.Keepalived高可用软件 1.1 Keepalived服务的三个重要功能 1.1.1管理LVS负载均衡软件 早期的LVS软件,需要通过命令 ...
- hbase高可用集群部署(cdh)
一.概要 本文记录hbase高可用集群部署过程,在部署hbase之前需要事先部署好hadoop集群,因为hbase的数据需要存放在hdfs上,hadoop集群的部署后续会有一篇文章记录,本文假设had ...
- (十)RabbitMQ消息队列-高可用集群部署实战
原文:(十)RabbitMQ消息队列-高可用集群部署实战 前几章讲到RabbitMQ单主机模式的搭建和使用,我们在实际生产环境中出于对性能还有可用性的考虑会采用集群的模式来部署RabbitMQ. Ra ...
- Haproxy+keepalived高可用集群实战
1.1 Haproxy+keepalived高可用集群实战 随着互联网火热的发展,开源负载均衡器的大量的应用,企业主流软件负载均衡如LVS.Haproxy.Nginx等,各方面性能不亚于硬件负载均衡 ...
- RocketMQ的高可用集群部署
RocketMQ的高可用集群部署 标签(空格分隔): 消息队列 部署 1. RocketMQ 集群物理部署结构 Rocket 物理部署结构 Name Server: 单点,供Producer和Cons ...
- RabbitMQ的高可用集群部署
RabbitMQ的高可用集群部署 标签(空格分隔): 消息队列 部署 1. RabbitMQ部署的三种模式 1.1 单一模式 单机情况下不做集群, 仅仅运行一个RabbitMQ. # docker-c ...
- rocketmq高可用集群部署(RocketMQ-on-DLedger Group)
rocketmq高可用集群部署(RocketMQ-on-DLedger Group) rocketmq部署架构 rocketmq部署架构非常多,都是为了解决一些问题,越来越高可用,越来越复杂. 单ma ...
- MySQL MHA 高可用集群部署及故障切换
MySQL MHA 高可用集群部署及故障切换 1.概念 2.搭建MySQL + MHA 1.概念: a)MHA概念 : MHA(MasterHigh Availability)是一套优秀的MySQL高 ...
- Kubernetes容器集群 - harbor仓库高可用集群部署说明
之前介绍Harbor私有仓库的安装和使用,这里重点说下Harbor高可用集群方案的部署,目前主要有两种主流的Harbor高可用集群方案:1)双主复制:2)多harbor实例共享后端存储. 一.Harb ...
随机推荐
- JDK8下载安装及环境配置
Java基础知识 Java的三种版本 JavaSE :标准版,主要用于开发桌面程序,控制台开发等等 JavaME:嵌入式开发,主要用于开发手机,小家电等等,目前使用的比较少 JavaEE:企业级开发, ...
- 【pytest官方文档】解读- 开发可pip安装的第三方插件
在上一篇的 hooks 函数分享中,开发了一个本地插件示例,其实已经算是在编写插件了.今天继续跟着官方文档学习更多知识点. 一个插件包含一个或多个钩子函数,pytest 正是通过调用各种钩子组成的插件 ...
- 支持JDK19虚拟线程的web框架,之二:完整开发一个支持虚拟线程的quarkus应用
欢迎访问我的GitHub 这里分类和汇总了欣宸的全部原创(含配套源码):https://github.com/zq2599/blog_demos 本篇概览 本篇是<支持JDK19虚拟线程的web ...
- 三、Ocelot请求聚合与负载均衡
上一篇文章介绍了在.Net Core中如何使用Ocelot:https://www.cnblogs.com/yangleiyu/p/16847439.html 本文介绍在ocelot的请求聚合与负载均 ...
- 从小白到架构师(4): Feed 流系统实战
「从小白到架构师」系列努力以浅显易懂.图文并茂的方式向各位读者朋友介绍 WEB 服务端从单体架构到今天的大型分布式系统.微服务架构的演进历程.读了三篇万字长文之后各位想必已经累了(主要是我写累了), ...
- 小菜鸡学习---<正则表达式学习笔记2>
正则表达式学习笔记2 一.修饰符 前面我们学习的都是用于匹配的基本的关键的一些表达式符号,现在我们来学习修饰符.修饰符不写在正则表达式里,修饰符位于表达式之外,比如/runoob/g,这个最后的g就是 ...
- UML建模语言、设计原则、设计模式
1.UML统一建模语言 定义:用于软件系统设计与分析的语言工具 目的:帮助开发人员更好的梳理逻辑.思路 学习地址:UML概述_w3cschool 官网:https://www.omg.org/spec ...
- 「浙江理工大学ACM入队200题系列」问题 K: 零基础学C/C++84——奇偶ASCII值判断
本题是浙江理工大学ACM入队200题第八套中的K题 我们先来看一下这题的题面. 题面 题目描述 任意输入一个字符,判断其ASCII是否是奇数,若是,输出YES,否则,输出NO; 例如,字符A的ASCI ...
- 从0到1搭建redis6.0.7续更~
"心有所向,日复一日,必有精进" 前言: 想必大家看完我之前写的搭建redis服务器,大家都已经把redis搭建起来了吧如果没有搭建起来的小可爱请移步这里哦从0到1搭建redis6 ...
- mybatis实现数据行级权限拦截
最近在做一个测试平台,其中有一个需求是用户只能看到他有权限的项目数据.一开始这个需求只针对用例模块,我直接在sql后面加上了关联项目权限表.后面因为其他模块也需要这个权限判断,故打算把关联sql抽取出 ...