集群及LVS简介、LVSNAT模式原理、LVSNAT模式配置、LVSDR模式原理、LVSDR模式配置、LVS错误排查

集群

  • 将很多机器组织到一起,作为一个整体对外提供服务

  • 集群在扩展性、性能方面都可以做到很灵活

  • 集群分类:

    • 负载均衡集群:Load Balance
    • 高可用集群:High Availability
    • 高性能计算:High Performance Computing

LVS

  • LVS:Linux Virtual Server,Linux虚拟服务器

  • 实现负载均衡集群

  • 作者:章文嵩。国防科技大学读博士期间编写

  • LVS的工作模式:

    • NAT:网络地址转换
    • DR:路由模式
    • TUN:隧道模式
  • 术语:

    • 调度器:LVS服务器
    • 真实服务器Real Server:提供服务的服务器
    • VIP:虚拟地址,提供给用户访问的地址
    • DIP:指定地址,LVS服务器上与真实服务器通信的地址
    • RIP:真实地址,真实服务器的地址
  • 常见的调度算法,共10个,常用的有4个:

    • 轮询rr:Real Server轮流提供服务
    • 加权轮询wrr:根据服务器性能设置权重,权重大的得到的请求更多
    • 最少连接lc:根据Real Server的连接数分配请求
    • 加权最少连接wlc:类似于wrr,根据权重分配请求

 

  • 环境准备

    • pubserver:eth0->192.168.88.240,eth1->192.168.99.240
    • client1:eth0->192.168.88.10,网关192.168.88.5
    • lvs1: eth0 -> 192.168.88.5;eth1->192.168.99.5
    • web1:eth1->192.168.99.100;网关192.168.99.5
    • web2:eth1->192.168.99.200;网关192.168.99.5
  • 虚拟机已关闭selinux和防火墙 。
  • 在pubserver上准备管理环境
# 创建工作目录[root@pubserver ~]# mkdir cluster[root@pubserver ~]# cd cluster/#创建主配置文件[root@pubserver cluster]# vim ansible.cfg[defaults]inventory = inventoryhost_key_checking = false  # 不检查主机密钥# 创建主机清单文件及相关变量[root@pubserver cluster]# vim inventory[clients]client1 ansible_host=192.168.88.10[webservers]web1 ansible_host=192.168.99.100web2 ansible_host=192.168.99.200[lb]lvs1 ansible_host=192.168.88.5[all:vars]   # all是ansible自带的组,表示全部主机ansible_ssh_user=rootansible_ssh_pass=a# 创建文件目录,用于保存将要拷贝到远程主机的文件[root@pubserver cluster]# mkdir files# 编写yum配置文件[root@pubserver cluster]# vim files/local88.repo[BaseOS]name = BaseOSbaseurl = ftp://192.168.88.240/dvd/BaseOSenabled = 1gpgcheck = 0[AppStream]name = AppStreambaseurl = ftp://192.168.88.240/dvd/AppStreamenabled = 1gpgcheck = 0[rpms]name = rpmsbaseurl = ftp://192.168.88.240/rpmsenabled = 1gpgcheck = 0[root@pubserver cluster]# vim files/local99.repo[BaseOS]name = BaseOSbaseurl = ftp://192.168.99.240/dvd/BaseOSenabled = 1gpgcheck = 0[AppStream]name = AppStreambaseurl = ftp://192.168.99.240/dvd/AppStreamenabled = 1gpgcheck = 0[rpms]name = rpmsbaseurl = ftp://192.168.99.240/rpmsenabled = 1gpgcheck = 0# 编写用于上传yum配置文件的playbook[root@pubserver cluster]# vim 01-upload-repo.yml---- name: config repos.dhosts: alltasks:- name: delete repos.d  # 删除repos.d目录file:path: /etc/yum.repos.dstate: absent- name: create repos.d  # 创建repos.d目录file:path: /etc/yum.repos.dstate: directorymode: '0755'- name: config local88      # 上传repo文件到88网段hosts: clients,lbtasks:- name: upload local88copy:src: files/local88.repodest: /etc/yum.repos.d/- name: config local99      # 上传repo文件到99网段hosts: webserverstasks:- name: upload local99copy:src: files/local99.repodest: /etc/yum.repos.d/[root@pubserver cluster]# ansible-playbook 01-upload-repo.yml
配置LVS NAT模式步骤
  • 配置2台web服务器
# 创建首页文件,文件中包含ansible facts变量[root@pubserver cluster]# vim files/index.htmlWelcome from {{ansible_hostname}}# 配置web服务器[root@pubserver cluster]# vim 02-config-webservers.yml---- name: config webservershosts: webserverstasks:- name: install nginx  # 安装nginxyum:name: nginxstate: present- name: upload index   # 上传首页文件到web服务器template:src: files/index.htmldest: /usr/share/nginx/html/index.html- name: start nginx    # 启动服务service:name: nginxstate: startedenabled: yes[root@pubserver cluster]# ansible-playbook 02-config-webservers.yml# 在lvs1上测试到web服务器的访问[root@lvs1 ~]# curl http://192.168.99.100Welcome from web1[root@lvs1 ~]# curl http://192.168.99.200Welcome from web2
  • 确保lvs1的ip转发功能已经打开。该功能需要改变内核参数
# 查看ip转发功能的内核参数[root@lvs1 ~]# sysctl -a    # 查看所有的内核参数[root@lvs1 ~]# sysctl -a | grep ip_forward  # 查看ip_foward参数net.ipv4.ip_forward = 1   # 1表示打开转发,0表示关闭转发# 设置打开ip_forward功能[root@pubserver cluster]# vim 03-sysctl.yml---- name: config sysctlhosts: lbtasks:- name: set ip_forwardsysctl:   # 用于修改内核参数的模块name: net.ipv4.ip_forward       # 内核模块名value: '1'        # 内核模块的值sysctl_set: yes   # 立即设置生效sysctl_file: /etc/sysctl.conf   # 配置写入文件[root@pubserver cluster]# ansible-playbook 03-sysctl.yml# 测试从客户端到服务器的访问[root@client1 ~]# curl http://192.168.99.100Welcome from web1[root@client1 ~]# curl http://192.168.99.200Welcome from web2
  • 安装LVS
[root@pubserver cluster]# vim 04-inst-lvs.yml---- name: install lvshosts: lbtasks:- name: install lvs  # 安装lvsyum:name: ipvsadmstate: present[root@pubserver cluster]# ansible-playbook 04-inst-lvs.yml
  • ipvsadm使用说明
[root@lvs1 ~]# ipvsadm-A: 添加虚拟服务器-E: 编辑虚拟服务器-D: 删除虚拟服务器-t: 添加tcp服务器-u: 添加udp服务器-s: 指定调度算法。如轮询rr/加权轮询wrr/最少连接lc/加权最少连接wlc-a: 添加虚拟服务器后,向虚拟服务器中加入真实服务器-r: 指定真实服务器-w: 设置权重-m: 指定工作模式为NAT-g: 指定工作模式为DR
  • 配置LVS
# 为web服务器创建虚拟服务器,使用rr调度算法[root@lvs1 ~]# ipvsadm -A -t 192.168.88.5:80 -s rr# 查看配置[root@lvs1 ~]# ipvsadm -Ln  # L是列出,n是使用数字,而不是名字# 向虚拟服务器中添加RIP[root@lvs1 ~]# ipvsadm -a -t 192.168.88.5:80 -r 192.168.99.100 -w 1 -m[root@lvs1 ~]# ipvsadm -a -t 192.168.88.5:80 -r 192.168.99.200 -w 2 -m# 查看配置[root@lvs1 ~]# ipvsadm -Ln# 验证[root@client1 ~]# for i in {1..6}> do> curl http://192.168.88.5> doneWelcome from web2Welcome from web1Welcome from web2Welcome from web1Welcome from web2Welcome from web1# 删除配置。(如果配置有错,用以下命令删除重配置)[root@lvs1 ~]# ipvsadm -D -t 192.168.88.5:80# 修改调度模式为加权轮询[root@lvs1 ~]# ipvsadm -E -t 192.168.88.5:80 -s wrr# 验证配置[root@client1 ~]# for i in {1..6}; do curl http://192.168.88.5; doneWelcome from web2Welcome from web2Welcome from web1Welcome from web2Welcome from web2Welcome from web1

LVS DR模式

 

  • LVS DR模式,LVS主机和web服务器都是单网卡。它们连在同一网络中

  • 修改实验环境

    • client1:eth0-> 192.168.88.10
    • lvs1:eth0->192.168.88.5,删除eth1的IP
    • web1:eth0->192.168.88.100,删除eth1的IP
    • web2:eth0->192.168.88.200,删除eth1的IP
# 删除lvs虚拟服务器配置[root@lvs1 ~]# ipvsadm -D -t 192.168.88.5:80[root@lvs1 ~]# ipvsadm -Ln# 删除lvs1上eth1的配置[root@lvs1 ~]# nmcli connection modify eth1 ipv4.method disabled ipv4.addresses ''[root@lvs1 ~]# nmcli connection down eth1# 修改web1的配置:停掉eth1的地址。配置eth0的地址为192.168.88.100# 进入网卡配置文件目录[root@web1 ~]# cd /etc/sysconfig/network-scripts/# eth0网卡的配置文件叫ifcfg-eth0[root@web1 network-scripts]# ls ifcfg-eth*ifcfg-eth0  ifcfg-eth1# 配置eth0地址[root@web1 network-scripts]# vim ifcfg-eth0TYPE=Ethernet             # 网络类型为以太网BOOTPROTO=none            # IP地址是静态配置的,也可以用staticNAME=eth0                 # 为设备重命名DEVICE=eth0               # 网卡设备名ONBOOT=yes                # 开机激活网卡IPADDR=192.168.88.100     # IP地址PREFIX=24                 # 子网掩码长度GATEWAY=192.168.88.254    # 网关[root@web1 ~]# systemctl restart NetworkManager    # 重启网络服务# 在web1上停掉eth1[root@web1 ~]# vim /etc/sysconfig/network-scripts/ifcfg-eth1TYPE=EthernetBOOTPROTO=noneNAME=eth1DEVICE=eth1ONBOOT=no[root@web1 ~]# nmcli connection down eth1     # 终端卡住,关掉它,在新终端重新连# 修改web2的网络[root@web2 ~]# vim /etc/sysconfig/network-scripts/ifcfg-eth0 TYPE=EthernetBOOTPROTO=noneNAME=eth0DEVICE=eth0ONBOOT=yesIPADDR=192.168.88.200PREFIX=24GATEWAY=192.168.88.254[root@web2 ~]# systemctl restart NetworkManager[root@web2 ~]# vim /etc/sysconfig/network-scripts/ifcfg-eth1TYPE=EthernetBOOTPROTO=noneNAME=eth1DEVICE=eth1ONBOOT=no[root@web2 ~]# nmcli connection down eth1# 修改pubserver的主机清单文件[root@pubserver cluster]# cp inventory inventory.bak[root@pubserver cluster]# vim inventory[clients]client1 ansible_host=192.168.88.10[webservers]web1 ansible_host=192.168.88.100web2 ansible_host=192.168.88.200[lb]lvs1 ansible_host=192.168.88.5[all:vars]ansible_ssh_user=rootansible_ssh_pass=a# 修改2台web服务器yum配置文件中的地址[root@web1 ~]# sed -i 's/99/88/' /etc/yum.repos.d/local99.repo[root@web1 ~]# cat /etc/yum.repos.d/local99.repo[BaseOS]name = BaseOSbaseurl = ftp://192.168.88.240/dvd/BaseOSenabled = 1gpgcheck = 0[AppStream]name = AppStreambaseurl = ftp://192.168.88.240/dvd/AppStreamenabled = 1gpgcheck = 0[rpms]name = rpmsbaseurl = ftp://192.168.88.240/rpmsenabled = 1gpgcheck = 0

配置LVS DR模式

  1. 在lvs1的eth0上配置vip 192.168.88.15。
[root@pubserver cluster]# vim 05-config-lvsvip.yml---- name: config lvs viphosts: lbtasks:- name: add viplineinfile:   # 确保文件中有某一行内容path: /etc/sysconfig/network-scripts/ifcfg-eth0line: IPADDR2=192.168.88.15notify: restart eth0  # 通知执行handlers中的任务handlers:   # 被通知执行的任务写到这里- name: restart eth0shell: nmcli connection down eth0; nmcli connection up eth0[root@pubserver cluster]# ansible-playbook 05-config-lvsvip.yml# 在lvs1查看添加的IP地址[root@lvs1 ~]# ip a s eth0 | grep 88inet 192.168.88.5/24 brd 192.168.88.255 scope global noprefixroute eth0inet 192.168.88.15/24 brd 192.168.88.255 scope global secondary noprefixroute eth0

2.在2台web服务器的lo上配置vip 192.168.88.15。lo:0网卡需要使用network-scripts提供的配置文件进行配置

[root@pubserver cluster]# vim 06-config-webvip.yml---- name: config webservers viphosts: webserverstasks:- name: install network-scripts  # 安装服务yum:name: network-scriptsstate: present- name: add lo:0   # 创建lo:0的配置文件copy:dest: /etc/sysconfig/network-scripts/ifcfg-lo:0content: |DEVICE=lo:0NAME=lo:0IPADDR=192.168.88.15NETMASK=255.255.255.255NETWORK=192.168.88.15BROADCAST=192.168.88.15ONBOOT=yesnotify: activate lo:0handlers:- name: activate lo:0   # 激活网卡shell: ifup lo:0[root@pubserver cluster]# ansible-playbook 06-config-webvip.yml# 查看结果[root@web1 ~]# cd /etc/sysconfig/network-scripts/[root@web1 network-scripts]# cat ifcfg-lo:0DEVICE=lo:0NAME=lo:0IPADDR=192.168.88.15NETMASK=255.255.255.255NETWORK=192.168.88.15BROADCAST=192.168.88.15ONBOOT=yes[root@web1 network-scripts]# ifconfig  # 可以查看到lo:0网卡信息lo:0: flags=73<UP,LOOPBACK,RUNNING>  mtu 65536inet 192.168.88.15  netmask 255.255.255.255loop  txqueuelen 1000  (Local Loopback)

3.在2台web服务器上配置内核参数,使得它们不响应对192.168.88.15的请求 

[root@web1 ~]# sysctl -a | grep arp_ignorenet.ipv4.conf.all.arp_ignore = 1net.ipv4.conf.lo.arp_ignore = 0[root@web1 ~]# sysctl -a | grep arp_announcenet.ipv4.conf.all.arp_announce = 2net.ipv4.conf.lo.arp_announce = 0[root@web1 ~]# vim /etc/sysctl.conf net.ipv4.conf.all.arp_ignore = 1net.ipv4.conf.lo.arp_ignore = 1net.ipv4.conf.all.arp_announce = 2net.ipv4.conf.lo.arp_announce = 2[root@web1 ~]# sysctl -p[root@web2 ~]# vim /etc/sysctl.conf net.ipv4.conf.all.arp_ignore = 1net.ipv4.conf.lo.arp_ignore = 1net.ipv4.conf.all.arp_announce = 2net.ipv4.conf.lo.arp_announce = 2[root@web2 ~]# sysctl -p

 4.在lvs1上配置虚拟服务器

# 创建虚拟服务器[root@lvs1 ~]# ipvsadm -A -t 192.168.88.15:80 -s wlc# 向虚拟服务器中加真实服务器[root@lvs1 ~]# ipvsadm -a -t 192.168.88.15:80 -r 192.168.88.100 -w 1 -g[root@lvs1 ~]# ipvsadm -a -t 192.168.88.15:80 -r 192.168.88.200 -w 2 -g# 查看配置[root@lvs1 ~]# ipvsadm -Ln# 客户验证[root@client1 ~]# for i in {1..6}; do curl http://192.168.88.15/; doneWelcome from web2Welcome from web1Welcome from web2Welcome from web2Welcome from web1Welcome from web2

附:出错时,排错步骤:

# 在lvs上可以访问到web服务器[root@lvs1 ~]# curl http://192.168.88.100/192.168.99.100[root@lvs1 ~]# curl http://192.168.88.200/apache web server2# 查看vip[root@lvs1 ~]# ip a s eth0 | grep 88inet 192.168.88.5/24 brd 192.168.88.255 scope global noprefixroute eth0inet 192.168.88.15/24 brd 192.168.88.255 scope global secondary noprefixroute eth0[root@web1 ~]# ifconfig lo:0lo:0: flags=73<UP,LOOPBACK,RUNNING>  mtu 65536inet 192.168.88.15  netmask 255.255.255.255loop  txqueuelen 1000  (Local Loopback)# 查看内核参数[root@web1 ~]# sysctl -pnet.ipv4.conf.all.arp_ignore = 1net.ipv4.conf.lo.arp_ignore = 1net.ipv4.conf.all.arp_announce = 2net.ipv4.conf.lo.arp_announce = 2# 查看规则[root@lvs1 ~]# ipvsadm -LnIP Virtual Server version 1.2.1 (size=4096)Prot LocalAddress:Port Scheduler Flags-> RemoteAddress:Port           Forward Weight ActiveConn InActConnTCP  192.168.88.15:80 wlc-> 192.168.88.100:80            Route   1      0          12-> 192.168.88.200:80            Route   2      0          18

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/673607.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

6-3、T型加减速单片机程序【51单片机+L298N步进电机系列教程】

↑↑↑点击上方【目录】&#xff0c;查看本系列全部文章 摘要&#xff1a;根据前两节内容&#xff0c;已完成所有计算工作&#xff0c;本节内容介绍具体单片机程序流程及代码 一、程序流程图 根据前两节文章内容可知&#xff0c;T型加减速的关键内容是运动类型的判断以及定时…

CPP项目:Boost搜索引擎

1.项目背景 对于Boost库来说&#xff0c;它是没有搜索功能的&#xff0c;所以我们可以实现一个Boost搜索引擎来实现一个简单的搜索功能&#xff0c;可以更快速的实现Boost库的查找&#xff0c;在这里&#xff0c;我们实现的是站内搜索&#xff0c;而不是全网搜索。 2.对于搜索…

qt/c++实现表情选择框

&#x1f482; 个人主页:pp不会算法^ v ^ &#x1f91f; 版权: 本文由【pp不会算法v】原创、在CSDN首发、需要转载请联系博主 &#x1f4ac; 如果文章对你有帮助、欢迎关注、点赞、收藏(一键三连)和订阅专栏哦 实现功能 。编解码的设计 。映射关系设计 。匹配机制设计 演示效…

Lustre文件系统fid介绍

fid介绍 fid是lustre文件系统中文件的唯一标识&#xff0c;总共128位&#xff0c;fid序列、fid序列内编号、fid版本号&#xff08;目前未使用默认为0&#xff09; /*** File IDentifier.** FID is a cluster-wide unique identifier of a file or an object (stripe).* FIDs …

HarmonyOS SDK 助力新浪新闻打造精致易用的新闻应用

原生智能是HarmonyOS NEXT的核心亮点之一&#xff0c;依托HarmonyOS SDK丰富全面的开放能力&#xff0c;开发者只需通过几行代码&#xff0c;即可快速实现AI功能。新浪新闻作为鸿蒙原生应用开发的先行者之一&#xff0c;从有声资讯入手&#xff0c;基于Speech Kit朗读控件上线听…

【C#】.net core 6.0 设置根目录下某个文件夹可访问,访问创建的图片等资源

欢迎来到《小5讲堂》 大家好&#xff0c;我是全栈小5。 这是《C#》系列文章&#xff0c;每篇文章将以博主理解的角度展开讲解&#xff0c; 特别是针对知识点的概念进行叙说&#xff0c;大部分文章将会对这些概念进行实际例子验证&#xff0c;以此达到加深对知识点的理解和掌握。…

记录 | python list extend()

extend() 函数用于在列表末尾一次性追加另一个序列中的多个值&#xff08;用新列表扩展原来的列表&#xff09;。 以下实例展示了 extend()函数的使用方法&#xff1a; #!/usr/bin/pythonaList [123, xyz, zara, abc, 123]; bList [2009, manni]; aList.extend(bList)print …

应用层DoS

应用层&#xff08;application layer&#xff09;是七层OSI模型的第七层。应用层直接和应用程序 对接并提供常见的网络应用服务&#xff0c;能够在实现多个系统应用进程相互通信的同 时&#xff0c;完成一系列业务处理所需的服务。位于应用层的协议有很多&#xff0c;常见的包…

SpringBoot实现统一异常处理

文章目录 前言实现步骤定义统一响应对象类定义业务异常枚举接口和实现定义业务异常基类定义全局异常处理切面测试和验证 总结 前言 近日心血来潮想做一个开源项目&#xff0c;目标是做一款可以适配多端、功能完备的模板工程&#xff0c;包含后台管理系统和前台系统&#xff0c…

Android CMakeLists.txt语法详解

一.CMake简介 你或许听过好几种 Make 工具&#xff0c;例如 GNU Make &#xff0c;QT 的 qmake &#xff0c;微软的 MSnmake&#xff0c;BSD Make&#xff08;pmake&#xff09;&#xff0c;Makepp&#xff0c;等等。这些 Make 工具遵循着不同的规范和标准&#xff0c;所执行的…

设计模式2-对象池模式

对象池模式&#xff0c;Object Pool Pattern&#xff0c;当你的应用程序需要频繁创建和销毁某种资源&#xff08;比如数据库连接、线程、socket连接等&#xff09;时&#xff0c;Object Pool 设计模式就变得很有用。它通过预先创建一组对象并将它们保存在池中&#xff0c;以便在…

Python datetime 模块的高级应用

Python datetime 模块的高级应用 介绍方法时区处理日期格式化日期计算常见问题及解决方案代码日历应用时间序列分析 介绍 datetime 模块是 Python 中用于处理日期和时间的标准库模块。它提供了日期和时间类型&#xff08;date、time、datetime&#xff09;以及与日期和时间相关…

机器人运动学林沛群——变换矩阵

对于仅有移动&#xff0c;由上图可知&#xff1a; A P B P A P B o r g ^AP^BP^AP_{B org} APBPAPBorg​ 对于仅有转动&#xff0c;可得&#xff1a; A P B A R B P ^AP^A_BR^BP APBA​RBP 将转动与移动混合后&#xff0c;可得&#xff1a; 一个例子 在向量中&#xff…

「递归算法」:二叉树剪枝

一、题目 给你二叉树的根结点 root &#xff0c;此外树的每个结点的值要么是 0 &#xff0c;要么是 1 。 返回移除了所有不包含 1 的子树的原二叉树。 节点 node 的子树为 node 本身加上所有 node 的后代。 示例 1&#xff1a; 输入&#xff1a;root [1,null,0,0,1] 输出&…

grafana+prometheus+hiveserver2(jmx_exporter+metrics)

一、hiveserver2开启metrics&#xff0c;并启动jmx_exporter 1、修改hive-site.xml文件开启metrics <property><name>hive.server2.metrics.enabled</name><value>true</value> </property> <property><name>hive.service.m…

ChatGPT高效提问—prompt常见用法(续篇三)

ChatGPT高效提问—prompt常见用法&#xff08;续篇三&#xff09; 1.1 多选项 ​ 多选项技术为模型提供了一个清晰的问题或任务&#xff0c;并附带一组预先定义的潜在答案。这种方法在生成仅限于特定选项集的文本方面表现出色&#xff0c;适用于问答、文本补全和其他任务。利…

MySQL 日志管理

4.6&#xff09;日志管理 MySQL 支持丰富的日志类型&#xff0c;如下&#xff1a; 事务日志&#xff1a;transaction log 事务日志的写入类型为 "追加"&#xff0c;因此其操作为 "顺序IO"&#xff1b; 通常也被称为&#xff1a;预写式日志 write ahead…

《MySQL 简易速速上手小册》第1章:MySQL 基础和安装(2024 最新版)

文章目录 1.1 MySQL 概览&#xff1a;版本、特性和生态系统1.1.1 基础知识1.1.2 重点案例1.1.3 拓展案例 1.2 安装和配置 MySQL1.2.1 基础知识1.2.2 安装步骤1.2.3 重点案例1.2.4 拓展案例 1.3 基础命令和操作1.3.1 基础知识1.3.2 重点案例1.3.3 拓展案例 1.1 MySQL 概览&#…

【Web】vulhub Fastjson反序列化漏洞复现学习笔记

目录 1.2.24 RCE CVE-2017-18349 复现流程 原理分析 1.2.47 RCE CNVD-2019-22238 复现流程 原理分析 漏洞探测 1.2.24 RCE CVE-2017-18349 复现流程 vulhub启动靶场 用marshalsec启动LDAP/RMI服务 java -cp marshalsec-0.0.3-SNAPSHOT-all.jar marshalsec.jndi.LDAPRef…

Redis篇之redis是单线程

一、redis是单线程 Redis是单线程的&#xff0c;但是为什么还那么快&#xff1f;主要原因有下面3点原因&#xff1a; 1. Redis是纯内存操作&#xff0c;执行速度非常快。 2. 采用单线程&#xff0c;避免不必要的上下文切换可竞争条件&#xff0c;多线程还要考虑线程安全问题。 …