Nginx 学习(九)集群概述与LVS工作模式的配置

news2024/9/22 5:35:06

 一  集群

1  概述

  • 通过高速网络将很多服务器集中起来一起提供同一种服务,在客户端看来就像是只有一个服务器
  • 可以在付出较低成本的情况下获得在性能、可靠性、灵活性方面的相对较高的收益
  • 任务调度是集群系统中的核心技术

2  目的

  • 提高性能。如计算密集型应用,如:天气预报、核试验模拟
  • 降低成本。相对百万美元级的超级计算机,价格便宜
  • 提高可扩展性。只要增加集群节点即可
  • 增强可靠性。多个节点完成相同功能,避免单点失败

3  分类

高性能计算集群HP。通过以集群开发的并行应用程序,解决复杂的科学问题

负载均衡(LB)集群。客户端负载在计算机集群中尽可能平均分摊。

高可用(HA)集群。避免单点故障,当一个系统发生故障时,可以快速迁移。

二  LVS

1  概述

  • Linux虚拟服务器 (LVS) 是章文嵩在国防科技大学就读博士期间创建的
  • LVS可以实现高可用的、可伸缩的Web、Mail、Cache和Media等网络服务
  • 最终目标是利用Linux操作系统和LVS集群软件实现一个高可用、高性能、低成本的服务器应用集群

2  组成

前端:负载均衡层。由一台或多台负载调度器构成

中间:服务器群组层。由一组实际运行应用服务的服务器组成

底端:数据共享存储层。提供共享存储空间的存储区域

3  术语

Director Server: 调度服务器,将负载分发到Real Server的服务器

Real Server:真实服务器-真正提供应用服务的服务器

VIP:虚拟IP地址-公布给用户访问的虚拟IP地址

DIP:调度器连接后端节点服务器的IP地址

RIP:真实IP地址。集群节点上使用的IP地址

4  工作模式

 VS/NAT(网络地址转换)

  • 通过网络地址转换实现的虚拟服务器
  • 大并发访问时,调度器的性能成为瓶颈

VS/DR(路由模式)

  • 直接使用路由技术实现虚拟服务器
  • 节点服务器需要配置VIP,注意MAC地址广播

VS/TUN(隧道模式)

  • 通过隧道方式实现虚拟服务器

5  负载均衡调度算法

LVS目前实现了10种调度算法

常见的调度算法

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

 

 

 三  配置

 1  LVS NAT模式

  • 架构图

  • 环境准备

client1eth0->192.168.88.10网关192.168.88.5
lvs1

eth0 -> 192.168.88.5

eth1 -> 192.168.99.5

web1eth1->192.168.99.100网关192.168.99.5
web2eth1->192.168.99.200网关192.168.99.5
# 创建4台虚拟机
[root@myhost ~]# vm clone client1 lvs1 web{1..2}

# 初始化虚拟机
[root@myhost ~]# virsh console client1  # 连接client1控制台
localhost login: root
Password: a
# 登陆之后,将以下内容粘贴到终端
hostnamectl set-hostname client1
nmcli connection modify "System eth0" con-name eth0
nmcli connection modify eth0 ipv4.method manual ipv4.addresses 192.168.88.10/24 autoconnect yes ipv4.gateway 192.168.88.5
nmcli connection down eth0
nmcli connection up eth0

# 退出
[root@localhost ~]# exit
# 退出之后,按ctrl+]可回到真机

# 真机通过ssh连接client1
[root@myhost ~]# rm -f ~/.ssh/known_hosts 
[root@myhost ~]# ssh 192.168.88.10


# 配置第2台机器作为lvs1
[root@myhost ~]# virsh console lvs1
localhost login: root
Password: a

# 登陆之后,将以下内容复制到命令行
hostnamectl set-hostname lvs1
nmcli connection modify "System eth0" con-name eth0
nmcli connection modify eth0 ipv4.method manual ipv4.addresses 192.168.88.5/24 autoconnect yes
nmcli connection down eth0
nmcli connection up eth0

rm -f /etc/sysconfig/network-scripts/ifcfg-eth1
nmcli connection add con-name eth1 ifname eth1 type ethernet autoconnect yes ipv4.method manual ipv4.addresses 192.168.99.5/24
reboot     # 重启系统,使得eth1网卡生效

# 按ctrl+]可回到真机

# 真机通过ssh连接lvs1
[root@myhost ~]# ssh 192.168.88.5



# 配置第3台机器作为web1
[root@myhost ~]# virsh console web1
localhost login: root
Password: a

# 登陆之后,将以下内容复制到命令行
hostnamectl set-hostname web1
nmcli connection modify "System eth0" con-name eth0
nmcli connection modify eth0 autoconnect no
rm -f /etc/sysconfig/network-scripts/ifcfg-eth1
nmcli connection add con-name eth1 ifname eth1 type ethernet autoconnect yes ipv4.method manual ipv4.addresses 192.168.99.100/24 ipv4.gateway 192.168.99.5
reboot

# 按ctrl+]可回到真机

# 真机通过ssh连接web1
[root@myhost ~]# ssh 192.168.99.100

# 配置第4台机器作为web2
[root@myhost ~]# virsh console web2
localhost login: root
Password: a

# 登陆之后,将以下内容复制到命令行
hostnamectl set-hostname web2
nmcli connection modify "System eth0" con-name eth0
nmcli connection modify eth0 autoconnect no
rm -f /etc/sysconfig/network-scripts/ifcfg-eth1
nmcli connection add con-name eth1 ifname eth1 type ethernet autoconnect yes ipv4.method manual ipv4.addresses 192.168.99.200/24 ipv4.gateway 192.168.99.5
reboot

# 按ctrl+]可回到真机

# 真机通过ssh连接web2
[root@myhost ~]# ssh 192.168.99.200
  • 虚拟机已关闭selinux和防火墙 。
  • 在pubserver上准备管理环境
# 创建工作目录
[root@pubserver ~]# mkdir cluster
[root@pubserver ~]# cd cluster/

#创建主配置文件
[root@pubserver cluster]# vim ansible.cfg
[defaults]
inventory = inventory
host_key_checking = false  # 不检查主机密钥

# 创建主机清单文件及相关变量
[root@pubserver cluster]# vim inventory
[clients]
client1 ansible_host=192.168.88.10

[webservers]
web1 ansible_host=192.168.99.100
web2 ansible_host=192.168.99.200

[lb]
lvs1 ansible_host=192.168.88.5

[all:vars]   # all是ansible自带的组,表示全部主机
ansible_ssh_user=root
ansible_ssh_pass=a

# 创建文件目录,用于保存将要拷贝到远程主机的文件
[root@pubserver cluster]# mkdir files

# 编写yum配置文件
[root@pubserver cluster]# vim files/local88.repo
[BaseOS]
name = BaseOS
baseurl = ftp://192.168.88.240/dvd/BaseOS
enabled = 1
gpgcheck = 0

[AppStream]
name = AppStream
baseurl = ftp://192.168.88.240/dvd/AppStream
enabled = 1
gpgcheck = 0

[rpms]
name = rpms
baseurl = ftp://192.168.88.240/rpms
enabled = 1
gpgcheck = 0
[root@pubserver cluster]# vim files/local99.repo
[BaseOS]
name = BaseOS
baseurl = ftp://192.168.99.240/dvd/BaseOS
enabled = 1
gpgcheck = 0

[AppStream]
name = AppStream
baseurl = ftp://192.168.99.240/dvd/AppStream
enabled = 1
gpgcheck = 0

[rpms]
name = rpms
baseurl = ftp://192.168.99.240/rpms
enabled = 1
gpgcheck = 0

# 编写用于上传yum配置文件的playbook
[root@pubserver cluster]# vim 01-upload-repo.yml
---
- name: config repos.d
  hosts: all
  tasks:
    - name: delete repos.d  # 删除repos.d目录
      file:
        path: /etc/yum.repos.d
        state: absent

    - name: create repos.d  # 创建repos.d目录
      file:
        path: /etc/yum.repos.d
        state: directory
        mode: '0755'

- name: config local88      # 上传repo文件到88网段
  hosts: clients,lb
  tasks:
    - name: upload local88
      copy:
        src: files/local88.repo
        dest: /etc/yum.repos.d/

- name: config local99      # 上传repo文件到99网段
  hosts: webservers
  tasks:
    - name: upload local99
      copy:
        src: files/local99.repo
        dest: /etc/yum.repos.d/
        
[root@pubserver cluster]# ansible-playbook 01-upload-repo.yml

2  配置LVS NAT模式步骤 

<1> 操作流程

Real Server:

        -  配置WEB服务器

Director Server:

        -  在上安装并启用ipvsadm- 创建虚拟服务器

        -  向虚拟服务器中加入节点

Client:

        -  连接虚拟服务器测试

<2> 实施

  • 配置2台web服务器
# 创建首页文件,文件中包含ansible facts变量
[root@pubserver cluster]# vim files/index.html
Welcome from {{ansible_hostname}}

# 配置web服务器
[root@pubserver cluster]# vim 02-config-webservers.yml
---
- name: config webservers
  hosts: webservers
  tasks:
    - name: install nginx  # 安装nginx
      yum:
        name: nginx
        state: present

    - name: upload index   # 上传首页文件到web服务器
      template:
        src: files/index.html
        dest: /usr/share/nginx/html/index.html

    - name: start nginx    # 启动服务
      service:
        name: nginx
        state: started
        enabled: yes

[root@pubserver cluster]# ansible-playbook 02-config-webservers.yml

# 在lvs1上测试到web服务器的访问
[root@lvs1 ~]# curl http://192.168.99.100
Welcome from web1
[root@lvs1 ~]# curl http://192.168.99.200
Welcome 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 sysctl
  hosts: lb
  tasks:
    - name: set ip_forward
      sysctl:   # 用于修改内核参数的模块
        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.100
Welcome from web1
[root@client1 ~]# curl http://192.168.99.200
Welcome from web2
  • 安装LVS
[root@pubserver cluster]# vim 04-inst-lvs.yml
---
- name: install lvs
  hosts: lb
  tasks:
    - name: install lvs  # 安装lvs
      yum:
        name: ipvsadm
        state: present
        
[root@pubserver cluster]# ansible-playbook 04-inst-lvs.yml

ipvsadm使用说明

-A: 添加虚拟服务器
-E: 编辑虚拟服务器
-D: 删除虚拟服务器
-t: 添加tcp服务器
-u: 添加udp服务器
-s: 指定调度算法。如轮询rr/加权轮询wrr/最少连接lc/加权最少连接wlc

-a: 添加虚拟服务器后,向虚拟服务器中加入真实服务器
-r: 指定真实服务器
-w: 设置权重
-m: 指定工作模式为NAT
-g: 指定工作模式为DR

ipvsadm命令用法

  1. 使用命令添加基于TCP一些的集群服务
  2. 在集群中添加若千台后端真实服务器
  3. 实现同一客户端访问,调度器分配固定服务器
  4. 会使用ipvsadm实现规则的增、删、改保存ipvsadm规则
  • 配置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
> done
Welcome from web2
Welcome from web1
Welcome from web2
Welcome from web1
Welcome from web2
Welcome 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; done
Welcome from web2
Welcome from web2
Welcome from web1
Welcome from web2
Welcome from web2
Welcome from web1

3  LVS DR模式

  • 架构图

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

  • 修改实验环境

client1eth0-> 192.168.88.10
lvs1eth0->192.168.88.5删除eth1的IP
web1eth0->192.168.88.100删除eth1的IP
web2eth0->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-eth0
TYPE=Ethernet             # 网络类型为以太网
BOOTPROTO=none            # IP地址是静态配置的,也可以用static
NAME=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-eth1
TYPE=Ethernet
BOOTPROTO=none
NAME=eth1
DEVICE=eth1
ONBOOT=no
[root@web1 ~]# nmcli connection down eth1     # 终端卡住,关掉它,在新终端重新连

# 修改web2的网络
[root@web2 ~]# vim /etc/sysconfig/network-scripts/ifcfg-eth0 
TYPE=Ethernet
BOOTPROTO=none
NAME=eth0
DEVICE=eth0
ONBOOT=yes
IPADDR=192.168.88.200
PREFIX=24
GATEWAY=192.168.88.254
[root@web2 ~]# systemctl restart NetworkManager
[root@web2 ~]# vim /etc/sysconfig/network-scripts/ifcfg-eth1
TYPE=Ethernet
BOOTPROTO=none
NAME=eth1
DEVICE=eth1
ONBOOT=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.100
web2 ansible_host=192.168.88.200

[lb]
lvs1 ansible_host=192.168.88.5

[all:vars]
ansible_ssh_user=root
ansible_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 = BaseOS
baseurl = ftp://192.168.88.240/dvd/BaseOS
enabled = 1
gpgcheck = 0

[AppStream]
name = AppStream
baseurl = ftp://192.168.88.240/dvd/AppStream
enabled = 1
gpgcheck = 0

[rpms]
name = rpms
baseurl = ftp://192.168.88.240/rpms
enabled = 1
gpgcheck = 0

4  配置LVS DR模式

<1>操作流程

Real Server

        - 配置WEB服务器

        - 配置辅助IP地址、调整内核参数

Director Server

        - 在上安装并启用ipvsadml

        - 配置辅助IP地址

        - 创建虚拟服务器、向虚拟服务器中加入节点

Client:

        - 连接虚拟服务器测试

<2>  ARP广播的问题

当客户端发起访问VIP对应的域名的请求时,根据网络通信原理会产生ARP广播

因为负载均衡器和真实的服务器在同一网络并且VIP设置在集群中的每个节点上

此时集群内的真实服务器会尝试回答来自客户端的ARP广播,这就会产生问题,大家都说我是VIP

<3>  内核参数说明

arp_ignore(定义回复ARP广播的方式)
-0:回应所有的本地地址ARP广播,本地地址可以配置在任意网络接口(默认值)
-1:只回应配置在入站网卡接口上的任意IP地址的ARP广播

arp_announce
-0:使用配置在任意网卡接口上的本地IP地址
-2:对查询目标使用最适当的本地地址。在此模式下将忽略这个IP数据包的源地址并尝试选择与能与该地址通信的本地地址。首要是选择所有的网络接口的子网中外出访问子网中包含该目标IP地址的本地地址。如果没有合适的地址被发现,将选择当前的发送网络接口或其他的有可能接受到该ARP回应的网络接口来进行发送

<4> 实施

  • 在lvs1的eth0上配置vip 192.168.88.15。
[root@pubserver cluster]# vim 05-config-lvsvip.yml
---
- name: config lvs vip
  hosts: lb
  tasks:
    - name: add vip
      lineinfile:   # 确保文件中有某一行内容
        path: /etc/sysconfig/network-scripts/ifcfg-eth0
        line: IPADDR2=192.168.88.15
      notify: restart eth0  # 通知执行handlers中的任务

  handlers:   # 被通知执行的任务写到这里
    - name: restart eth0
      shell: 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 88
    inet 192.168.88.5/24 brd 192.168.88.255 scope global noprefixroute eth0
    inet 192.168.88.15/24 brd 192.168.88.255 scope global secondary noprefixroute eth0
  • 在2台web服务器的lo上配置vip 192.168.88.15。lo:0网卡需要使用network-scripts提供的配置文件进行配置。
[root@pubserver cluster]# vim 06-config-webvip.yml
---
- name: config webservers vip
  hosts: webservers
  tasks:
    - name: install network-scripts  # 安装服务
      yum:
        name: network-scripts
        state: present

    - name: add lo:0   # 创建lo:0的配置文件
      copy:
        dest: /etc/sysconfig/network-scripts/ifcfg-lo:0
        content: |
          DEVICE=lo:0
          NAME=lo:0
          IPADDR=192.168.88.15
          NETMASK=255.255.255.255
          NETWORK=192.168.88.15
          BROADCAST=192.168.88.15
          ONBOOT=yes
      notify: activate lo:0

  handlers:
    - 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:0
DEVICE=lo:0
NAME=lo:0
IPADDR=192.168.88.15
NETMASK=255.255.255.255
NETWORK=192.168.88.15
BROADCAST=192.168.88.15
ONBOOT=yes

[root@web1 network-scripts]# ifconfig  # 可以查看到lo:0网卡信息
lo:0: flags=73<UP,LOOPBACK,RUNNING>  mtu 65536
        inet 192.168.88.15  netmask 255.255.255.255
        loop  txqueuelen 1000  (Local Loopback)
  • 在2台web服务器上配置内核参数,使得它们不响应对192.168.88.15的请求
[root@web1 ~]# sysctl -a | grep arp_ignore
net.ipv4.conf.all.arp_ignore = 1
net.ipv4.conf.lo.arp_ignore = 0
[root@web1 ~]# sysctl -a | grep arp_announce
net.ipv4.conf.all.arp_announce = 2
net.ipv4.conf.lo.arp_announce = 0

[root@web1 ~]# vim /etc/sysctl.conf 
net.ipv4.conf.all.arp_ignore = 1
net.ipv4.conf.lo.arp_ignore = 1
net.ipv4.conf.all.arp_announce = 2
net.ipv4.conf.lo.arp_announce = 2
[root@web1 ~]# sysctl -p

[root@web2 ~]# vim /etc/sysctl.conf 
net.ipv4.conf.all.arp_ignore = 1
net.ipv4.conf.lo.arp_ignore = 1
net.ipv4.conf.all.arp_announce = 2
net.ipv4.conf.lo.arp_announce = 2
[root@web2 ~]# sysctl -p
  • 在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/; done
Welcome from web2
Welcome from web1
Welcome from web2
Welcome from web2
Welcome from web1
Welcome 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 88
    inet 192.168.88.5/24 brd 192.168.88.255 scope global noprefixroute eth0
    inet 192.168.88.15/24 brd 192.168.88.255 scope global secondary noprefixroute eth0

[root@web1 ~]# ifconfig lo:0
lo:0: flags=73<UP,LOOPBACK,RUNNING>  mtu 65536
        inet 192.168.88.15  netmask 255.255.255.255
        loop  txqueuelen 1000  (Local Loopback)

# 查看内核参数
[root@web1 ~]# sysctl -p
net.ipv4.conf.all.arp_ignore = 1
net.ipv4.conf.lo.arp_ignore = 1
net.ipv4.conf.all.arp_announce = 2
net.ipv4.conf.lo.arp_announce = 2

# 查看规则
[root@lvs1 ~]# 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.88.15:80 wlc
  -> 192.168.88.100:80            Route   1      0          12
  -> 192.168.88.200:80            Route   2      0          18

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

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

相关文章

记LGSVL Map Annotation使用

导入点云 内置的点云导入器工具提供了将最流行的点云文件格式&#xff08;PCD、PLY、LAS、LAZ&#xff09;转换为可用于仿真的数据所需的所有功能。 要访问点云导入器窗口&#xff0c;请在 Unity 编辑器中打开模拟器项目&#xff0c;然后导航到 Simulator/Import Point Cloud…

java 前缀树的实现,敏感词的匹配和标记

目录 一、前缀树的介绍和定义1.前缀树的定义2.前缀树的结构 二、前缀树的实现1.向前缀树中增加词语2.向前缀树中删除词语3.对于使用前缀树进行词语标识&#xff1a;4.前缀树的实现代码 三、前缀树使用及测试1.向前缀树上增加词语2.根据输入匹配前缀树上的词语3.判断前缀树上是否…

Java 基于SpringBoot+Vue的社区医院管理系统的实现

博主介绍&#xff1a;✌程序员徐师兄、7年大厂程序员经历。全网粉丝30W,Csdn博客专家、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域和毕业项目实战✌ 文章目录 1、效果演示2、 前言介绍3. 技术栈4系统设计4.1数据库设计4.2系统整体设计4.2.1 系统设计思想4.2.…

加拿大CCPSA-SOR/2016-152(婴儿床、摇篮和婴儿摇篮法规)认证要求解答

亚马逊加拿大站儿童床垫CCPSA认证: ●SOR/2016-152&#xff08;婴儿床、摇篮和婴儿摇篮法规&#xff09; ●SOR/2018-83&#xff08;含铅消费品法规&#xff09; ●SOR/2016-193&#xff08;表面涂层材料法规 - 铅&#xff09; ●SOR/2016-188&#xff08;邻苯二甲酸盐&…

大漠插件普通定制版内存调用与com对象调用方法

首先.打开大漠类库生成工具.拖入定制版的dll文件会生成各个语言的调用例子 如下图所示 详见视频教程 大漠插件普通定制版内存调用与com对象调用方法

qt作业day5

//客户端&#xff0c;#include "tcpcli.h" #include "ui_tcpcli.h"TcpCli::TcpCli(QWidget *parent) :QWidget(parent),ui(new Ui::TcpCli) {ui->setupUi(this);//给客户端指针实例化对象cli_sock new QTcpSocket(this);ui->discntBtn->setEnabl…

Docker的运行机制和底层技术简介

&#xff08;笔记总结自《微服务架构基础》书籍&#xff09; 一、Docker的引擎 Docker Engine&#xff08;Docker引擎&#xff09;是Docker的核心部分&#xff0c;使用的是客户端-服务器&#xff08;C/S&#xff09;架构模式&#xff1a; ①Docker Cli&#xff1a;Docker命令…

金融工程学学习笔记第一章

第一章 金融工程概述 什么是金融工程 金融工程的含义 金融工程&#xff1a; 金融工程&#xff1a;一门融现代金融学、数理和工程方法与信息技术与一体的新兴交叉型学科。 工程是指以某种设想的目标为依据&#xff0c;应用有关科学知识和技术手段&#xff0c;通过有组织的一…

AI极客日报0908 - Zoom的AI新功能揭示;助听技术的未来趋势;ChatGPT与Canva的融合;机器人学习策略游戏

最新动态 &#x1f4bb; Zoom推出内置AI助手 概述&#xff1a;Zoom刚刚推出了AI Companion&#xff0c;这是一个嵌入其平台的AI助手&#xff0c;旨在提高生产效率 — 对付费用户来说没有额外费用。 关键点&#xff1a; AI Companion将协助用户撰写聊天回复&#xff0c;自动生…

preload和prefetch、dns-prefetch和preconnect

一、preload和prefetch 二、dns-prefetch和preconnect &#xff08;也是针对未来页面&#xff09; 三、总结

ModuleNotFoundError: No module named ‘lavis‘解决方案

大家好,我是爱编程的喵喵。双985硕士毕业,现担任全栈工程师一职,热衷于将数据思维应用到工作与生活中。从事机器学习以及相关的前后端开发工作。曾在阿里云、科大讯飞、CCF等比赛获得多次Top名次。现为CSDN博客专家、人工智能领域优质创作者。喜欢通过博客创作的方式对所学的…

idea所有历史版本下载

目录 链接直达 图文讲解 我idea嘎了&#xff0c;最新版的一直在闪退&#xff0c;于是我就在网上找idea的历史版本下载&#xff0c;结果都不太如意。 链接直达 idea历史版本 图文讲解 来到idea下载的官网 Download IntelliJ IDEA – The Leading Java and Kotlin IDE 一直…

面向过程的编程语言(如:C)和面向对象的编程语言(如:C++)的区别

面向过程的编程语言&#xff08;如C&#xff09;和面向对象的编程语言&#xff08;如C&#xff09;在编程范式上有明显的区别。 抽象级别: 面向过程的语言侧重于算法和过程的编写&#xff0c;将程序分解为一系列函数或过程的集合。而面向对象的语言则强调数据和对象的封装&…

python 创建 Telnet 客户端

目录 前言 1. Telnet 客户端框架 2. Telnet 代码分解 2.1 基于 TK 创建会话窗口 2.1.1 创建 Text 文本控件 2.1.2 创建 Frame 容器 2.1.2.1 基于 Frame 容器创建主机地址输入框 2.1.2.1.1 主机地址输入框绑定焦点事件 2.1.2.2 创建 Telnet 连接按钮控件 2.1.2.3 创建…

机器学习——图片处理应用(人脸补全)

0、前言&#xff1a;本文内容是机器学习算法回归预测的应用&#xff0c;其中数据集主要来自sklearn库自带的人脸数据&#xff0c;目的是通过KNN回归、线性回归、岭回归算法通过人物的左半张脸预测人物的右半张脸。 意义1&#xff1a;通过该项目掌握图片数据在机器学习当中的处…

CSS笔记(黑马程序员pink老师前端)圆角边框

圆角边框 border-radius:length; 效果显示 <!DOCTYPE html> <html lang"en"><head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial-scale1.0"><title>Documen…

【新项目】

01 概述 新凝血四项&#xff0c;又称血栓前四项&#xff0c;分为&#xff1a;TAT、PIC、TM、tPAI.C四个检测项目。 生理性高凝状态会伴随着孕妈妈们的整个妊娠期&#xff0c;凝血和纤溶系统的异常状态导致孕产妇发生静脉血栓栓塞症(VTE)的风险比一般人群高。非妊娠妇女凝血项…

LeetCode518. 零钱兑换 II

518. 零钱兑换 II 一、题目 给你一个整数数组 coins 表示不同面额的硬币&#xff0c;另给一个整数 amount 表示总金额。 请你计算并返回可以凑成总金额的硬币组合数。如果任何硬币组合都无法凑出总金额&#xff0c;返回 0 。 假设每一种面额的硬币有无限个。 题目数据保证…

RTMP流媒体服务器EasyDSS视频直播点播平台如何生成可自动播放的分享链接

EasyDSS支持一站式的上传、转码、直播、回放、嵌入、分享功能&#xff0c;具有多屏播放、自由组合、接口丰富等特点。平台可以为用户提供专业、稳定的直播推流、转码、分发和播放服务&#xff0c;全面满足超低延迟、超高画质、超大并发访问量的要求。在推流方面&#xff0c;Eas…