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

Kolla-ansible部署OpenStack集群

0. OpenStack 部署

系统要求

单机部署最低配置:

  • 2张网卡
  • 8G内存
  • 40G硬盘空间

主机系统:

  • CentOS Stream 9
  • Debian Bullseye (11)
  • openEuler 22.03 LTS
  • Rocky Linux 9- Ubuntu Jammy (22.04)

官方不再支持CentOS 7作为主机系统,我这里使用的是Rocky Linux 9.2(最小化安装)

如果这些主机中,有网卡名称不一致的问题,则可以通过team来使网卡名称一致

关闭所有节点的防火墙和selinux

systemctl disable --now firewalld

setenforce 0;sed -i ‘s/SELINUX=enforcing/SELINUX=disabled/g’ /etc/selinux/config

1. deploy节点安装依赖

1.1 安装基础依赖

dnf install git python3-devel libffi-devel gcc openssl-devel python3-libselinux

1.2 安装Ansible额外需要的包

官方文档中没有说明,实际部署过程中,没有这两个包会无法使用pip安装的ansible

dnf install python3-resolvelib sshpass

1.3 设置Python-venv虚拟环境

为了防止与系统的python环境冲突,这里使用虚拟环境安装ansible与kolla-ansible /path/to/venv是虚拟环境的目录,可以自己指定

创建虚拟环境

python3 -m venv /path/to/venv

进入虚拟环境

source /path/to/venv/bin/activate

在虚拟环境中输入deactivate命令,即可退出虚拟环境

更换pip国内源,更新pip

pip config set global.index-url https://pypi.tuna.tsinghua.edu.cn/simple
pip install -U pip

1.4 安装Ansible

Kolla-ansible需要ansible-core2.13~2.14的版本,这里需要指定版本安装

pip install ansible==7.7.0 ansible-core==2.14.11

1.5 所有节点安装docker

控制节点、网络节点、存储节点和计算节点

2. deploy节点安装Kolla-ansible

2.1 安装本体

pip install git+https://opendev.org/openstack/kolla-ansible@stable/2023.1

2.2 获取Kolla配置文件

创建配置文件夹

mkdir /etc/kolla

复制global.ymlpassword.yml到配置文件夹

cp -r /path/to/venv/share/kolla-ansible/etc_examples/kolla/* /etc/kolla

2.3 获取Ansible清单文件

复制all-in-onemultinode两个清单文件,分别对应了单机部署与多节点部署

cp /path/to/venv/share/kolla-ansible/ansible/inventory/* /etc/kolla

3. 安装Ansible Galaxy依赖

kolla-ansible install-deps    #可能偶现ERROR,多尝试

4. 配置Ansible

单机部署时,可以跳过这一步

编辑/etc/ansible/ansible.cfg,如果没有则需要先创建,将下面的内容添加到配置文件中

[defaults]
host_key_checking=False
pipelining=True
forks=100

5. 准备初始化配置 deploy

5.1 修改hosts

单机部署时,可以跳过这一步

在部署机的hosts中添加需要部署的主机的主机名,后续会自动同步到所有节点 编辑/etc/hosts文件,我这里准备部署3台控制节点与3台计算节点 (共用)

还需要配置deploy节点到这几个节点的 SSH互信

10.0.0.10 control01.openstack.instack.cloud control01
10.0.0.20 control02.openstack.instack.cloud control02
10.0.0.21 control03.openstack.instack.cloud control03

5.2 准备清单文件

  • 单机部署时,使用all-in-one清单文件- 多节点部署时,使用multinode清单文件

单机部署时,可以不用修改all-in-one清单文件

下面是我的multinode清单文件的开头部分,供参考

[all]
control01
control02
control03[control]
# 指定root密码、管理网卡
control01 # ansible_ssh_pass="root"  network_interface="ens192"
control02 # ansible_ssh_pass="root"  network_interface="ens192"
control03 # ansible_ssh_pass="root"  network_interface="ens192"[network:children]
# 可在组名后添加:children来对组进行嵌套
control[compute]
# 指定root密码、管理网卡、外部网卡
control [monitoring:children]
control[deployment]
localhost       ansible_connection=local

详细的配置规则见 Ansible文档(opens new window)

配置完成后,使用下面的命令测试Ansible的连通性

ansible -i multinode all -m ping

5.3 生成密码

kolla-genpwd

密码存储在/etc/kolla/passwords.yml

推荐自己修改一下某些密码,比如keystone_admin_password

5.4 配置 global.yml

镜像选择

Kolla可以选择多种镜像版本:

  • CentOS Stream (centos)- Debian (debian)- Rocky (rocky)- Ubuntu (ubuntu) 官方推荐新安装的使用rocky或ubuntu,这里使用和主机相同的rocky发行版

提示

默认不用修改

kolla_base_distro: "rocky"

镜像仓库

国内可能访问quay.io比较慢,可以指定国内的quay.io源

docker_registry: "quay.nju.edu.cn"

自建仓库

docker_registry: "hub.huahuayun.cloud"

登录

docker_registry_insecure: "yes"
docker_registry_username: "admin"
# docker_registry_password在password.yml中配置
#docker_registry: "quay.nju.edu.cn"
docker_registry: "hub.huahuayun.cloud"

网络

管理网络的网卡,也用于主机之间的通信,若非所有主机网卡名都是一致的,可以使用bond或team技术

network_interface: "bond0"

连接外部网络的网卡,需要一个开启的,没有配置IP的网卡

neutron_external_interface: "bond1"

用于管理的浮动IP,由keepalived提供高可用性,必须是管理网络中没有被使用的地址

kolla_internal_vip_address: "10.0.0.250"
kolla_external_vip_address: "192.168.110.110"
kolla_external_vip_interface: "bond2"

监控

enable_prometheus

虚拟机高可用

enable_hacluster

中心日志

enable_central_logging: "yes"
enable_venus: "yes"

global.yml中所有的选项,都可以在清单文件中为每个主机单独配置。上面的multinode文件中,指定了每台主机的管理网卡与外部网卡。

[root@huahuadeploy kolla]# cat globals.yml | grep -v '^#' | grep -v '^$'
---
workaround_ansible_issue_8743: yes
kolla_internal_vip_address: "10.20.10.110" # 内部管理网络VIP,internal endpoint使用
kolla_external_vip_address: "192.168.110.110" # (可选)外部管理网络VIP, public endpoint使用
docker_registry: "hub.huahuayun.cloud" # 本地Harbor仓库,或使用quay.io或使用quay.nju.edu.cn
docker_registry_insecure: "yes"
docker_registry_username: "admin"
network_interface: "bond0"  # 内部管理网络网卡名称,使用bond可以统一不同节点的网卡名称或者提供网络高可用
kolla_external_vip_interface: "bond2" # (可选)有外部管理网VIP时填写
neutron_external_interface: "bond1" # 提供者网络,一般用于公网IP和弹性IP
keepalived_virtual_router_id: "110" # 同一网络下有多个集群时需要不同的router_id,类型为uint8
openstack_region_name: "ChengDuTest"
enable_hacluster: "yes" # 是否启用实例高可用,节点故障时迁移
enable_barbican: "yes"
enable_ceilometer: "yes"
enable_ceilometer_ipmi: "yes"
enable_central_logging: "yes"
enable_cinder: "yes"
enable_cinder_backup: "yes"
enable_fluentd: "yes"
enable_gnocchi: "yes"
enable_gnocchi_statsd: "yes"
enable_grafana: "yes"
enable_ironic: "yes" # 是否需要包括裸金属服务
enable_mariabackup: "yes"
enable_neutron_dvr: "yes"
enable_neutron_qos: "yes"
enable_prometheus: "yes"
enable_redis: "yes" # 是否使用redis提供缓存和gnocchi的incoming存储
enable_skyline: "yes"
enable_venus: "yes"
enable_ironic_ipxe: "no"
ironic_dnsmasq_serve_ipxe: false
ceph_glance_keyring: "ceph.client.glance1.keyring"  # ceph相关的默认就行,这里用户和池名称均添加了数字1
ceph_glance_user: "glance1"
ceph_glance_pool_name: "images1"
ceph_cinder_keyring: "ceph.client.cinder1.keyring"
ceph_cinder_user: "cinder1"
ceph_cinder_pool_name: "volumes1"
ceph_cinder_backup_keyring: "ceph.client.cinder-backup1.keyring"
ceph_cinder_backup_user: "cinder-backup1"
ceph_cinder_backup_pool_name: "backups1"
ceph_nova_keyring: "{{ ceph_cinder_keyring }}"
ceph_nova_user: "cinder1" # 重点
ceph_nova_pool_name: "vms1" # 重点
ceph_gnocchi_keyring: "ceph.client.gnocchi1.keyring"
ceph_gnocchi_user: "gnocchi1"
ceph_gnocchi_pool_name: "gnocchi1"
glance_backend_ceph: "yes"
gnocchi_backend_storage: "ceph"
cinder_backend_ceph: "yes"
nova_backend_ceph: "yes"
ironic_dnsmasq_interface: "bond0" # 裸金属dnsmasq默认使用内部管理网
ironic_dnsmasq_dhcp_ranges:- range: "10.20.10.241,10.20.10.250"routers: "10.20.10.254"
ironic_inspector_kernel_cmdline_extras: ['ipa-lldp-timeout=90.0', 'ipa-collect-lldp=1']
prometheus_cmdline_extras: "--web.enable-lifecycle"

6. 配置ceph

我们需要提前部署一个ceph集群,要求ceph的public network和计算节点网络相通

存储池的名称和用户名可以在/etc/kolla/globals.yml中找到并修改

nova_backend_ceph, cinder_backend_ceph, glance_backend_ceph, ceph_cinder_backup_pool_name

ceph_nova_user, ceph_cinder_user, ceph_glance_user, cinder-backup

# Glance
ceph_glance_keyring: "ceph.client.glance1.keyring"
ceph_glance_user: "glance1"
ceph_glance_pool_name: "images1"
# Cinder
ceph_cinder_keyring: "ceph.client.cinder1.keyring"
ceph_cinder_user: "cinder1"
ceph_cinder_pool_name: "volumes1"
ceph_cinder_backup_keyring: "ceph.client.cinder-backup1.keyring"
ceph_cinder_backup_user: "cinder-backup1"
ceph_cinder_backup_pool_name: "backups1"
# Nova  # 重点是cinder1不是nova1
ceph_nova_keyring: "{{ ceph_cinder_keyring }}"
ceph_nova_user: "cinder1"
ceph_nova_pool_name: "vms1"
# Gnocchi
ceph_gnocchi_keyring: "ceph.client.gnocchi1.keyring"
ceph_gnocchi_user: "gnocchi1"
ceph_gnocchi_pool_name: "gnocchi1"

以下均在cephadm节点执行

6.1 创建存储池

ceph osd pool create volumes1
ceph osd pool create images1
ceph osd pool create backups1
ceph osd pool create vms1
ceph osd pool create gnocchi1rbd pool init volumes1
rbd pool init images1
rbd pool init backups1
rbd pool init vms1
ceph osd pool application enable gnocchi1 rgw # 在页面上去设置也可,pools>gnocchi>edit>application>rgw# optional
ceph osd pool create cephfs_data 64 64
ceph osd pool create cephfs_metadata 64 64
ceph osd pool application enable cephfs_data cephfs
ceph osd pool application enable cephfs_metadata cephfs
ceph fs new myfs cephfs_metadata cephfs_data

6.2 创建glance cinder cinder-backup账户

ceph auth get-or-create client.glance1 mon 'profile rbd' osd 'profile rbd pool=images1' mgr 'profile rbd pool=images1'ceph auth get-or-create client.cinder1 mon 'profile rbd' osd 'profile rbd pool=volumes1, profile rbd pool=vms1, profile rbd-read-only pool=images1' mgr 'profile rbd pool=volumes1, profile rbd pool=vms1'ceph auth get-or-create client.cinder-backup1 mon 'profile rbd' osd 'profile rbd pool=backups1' mgr 'profile rbd pool=backups1'ceph auth get-or-create client.gnocchi1 mon "allow r" osd "allow rwx pool=gnocchi1"

6.3 复制keyring

ceph auth get-or-create client.glance1 > /etc/ceph/ceph.client.glance1.keyring
ceph auth get-or-create client.cinder1 > /etc/ceph/ceph.client.cinder1.keyring
ceph auth get-or-create client.cinder-backup1 > /etc/ceph/ceph.client.cinder-backup1.keyring
ceph auth get-or-create client.gnocchi1 > /etc/ceph/ceph.client.gnocchi1.keyring

将上述文件copy到deploy节点的/etc/kolla/config下

.
├── cinder
│   ├── cinder-backup
│   │   ├── ceph.client.cinder-backup.keyring
│   │   ├── ceph.client.cinder.keyring
│   │   └── ceph.conf -> /etc/kolla/config/custom/ceph.conf
│   └── cinder-volume
│       ├── ceph.client.cinder.keyring
│       └── ceph.conf -> /etc/kolla/config/custom/ceph.conf
├── custom
│   └── ceph.conf
├── glance
│   ├── ceph.client.glance.keyring
│   └── ceph.conf -> /etc/kolla/config/custom/ceph.conf
├── gnocchi
│   ├── ceph.client.gnocchi1.keyring
│   └── ceph.conf -> /etc/kolla/config/custom/ceph.conf
├── haproxy
├── ironic
│   ├── ironic-agent.initramfs
│   ├── ironic-agent.kernel
│   └── pxelinux.0
├── nova
│   ├── ceph.client.cinder.keyring
│   └── ceph.conf -> /etc/kolla/config/custom/ceph.conf
└── nova.conf

nova.conf

[DEFAULT]
block_device_allocate_retries = 6000
block_device_allocate_retries_interval = 30
# config drive 能够在 instance 启动时将网络配置信息动态注入到操作系统中
flat_injected = true
[libvirt]
inject_password = true
[filter_scheduler]
enabled_filters = SimpleCIDRAffinityFilter,DifferentHostFilter,JsonFilter,SameHostFilter

7. 配置Ironic(可选)

vim /etc/kolla/globals.yml

enable_ironic: "yes"
enable_ironic_neutron_agent: "{{ enable_neutron | bool and enable_ironic | bool }}"
ironic_dnsmasq_interface: "{{ network_interface }}"
ironic_cleaning_network: "ext_net_test"
ironic_dnsmasq_dhcp_ranges:- range: "192.168.131.10,192.168.131.50"routers: "192.168.2.1"
ironic_dnsmasq_boot_file: "pxelinux.0"
ironic_inspector_kernel_cmdline_extras: ['ipa-lldp-timeout=90.0', 'ipa-collect-lldp=1']

下载镜像 (我们自己有——virt-custom制作的initramfs,允许root登录)

$ curl https://tarballs.opendev.org/openstack/ironic-python-agent/dib/files/ipa-centos9-stable-2023.1.kernel \-o /etc/kolla/config/ironic/ironic-agent.kernel$ curl https://tarballs.opendev.org/openstack/ironic-python-agent/dib/files/ipa-centos9-stable-2023.1.initramfs \-o /etc/kolla/config/ironic/ironic-agent.initramfs

8. 部署

我这里采用多节点部署,使用的是multinode清单文件,单机部署请使用all-in-one清单文件

引导服务器

kolla-ansible -i ./multinode bootstrap-servers  # 检查是否干净,关闭防火墙,安装一些包,这是需要联网的

部署前检查

kolla-ansible -i ./multinode prechecks

开始部署 莫慌,先去掉所有节点外网IP

kolla-ansible -i ./multinode deploy

9. 使用OpenStack

9.1 命令行(OpenStack CLI)

安装CLI客户端

pip install python-openstackclient -c https://releases.openstack.org/constraints/upper/2023.1
pip install python-ironicclient
pip install python-ironic-inspector-client

生成openrc文件

kolla-ansible post-deploy

使用openrc文件

. /etc/kolla/admin-openrc.sh

接下来就可以使用OpenStack CLI了

9.2 网页(Horizon)

浏览器中访问kolla_internal_vip_address or kolla_external_vip_address

skyline默认端口 9999

horizon默认端口80

输入账号密码即可

账号密码可在password.yml中找到

10 另外

若需要多个flat网络,可以通过neutron_bridge_name这个配置选项来配置网卡名称,globals.yaml中不提供此配置,需要自己写,请先跟踪一下ansible脚本

相关文章:

Kolla-ansible部署OpenStack集群

0. OpenStack 部署 系统要求 单机部署最低配置: 2张网卡8G内存40G硬盘空间 主机系统: CentOS Stream 9Debian Bullseye (11)openEuler 22.03 LTSRocky Linux 9- Ubuntu Jammy (22.04) 官方不再支持CentOS 7作为主机系统,我这里使用的是R…...

SHARE 203S PRO:倾斜摄影相机在地灾救援中的应用

在地质灾害的紧急关头,救援队伍面临的首要任务是迅速而准确地掌握灾区的地理信息。这时,倾斜摄影相机成为了救援测绘的利器。SHARE 203S PRO,这款由深圳赛尔智控科技有限公司研发的五镜头倾斜摄影相机,以其卓越的性能和功能&#…...

MATLAB算法实战应用案例精讲-【数模应用】中介效应分析(补充篇)(附R语言和python代码实现)

目录 前言 几个高频面试题目 中介效应分析与路径分析的区别 1.中介效应分析 2.路径分析 注意事项...

Day96:云上攻防-云原生篇Docker安全系统内核版本漏洞CDK自动利用容器逃逸

目录 云原生-Docker安全-容器逃逸&系统内核漏洞 云原生-Docker安全-容器逃逸&docker版本漏洞 CVE-2019-5736 runC容器逃逸(需要管理员配合触发) CVE-2020-15257 containerd逃逸(启动容器时有前提参数) 云原生-Docker安全-容器逃逸&CDK自动化 知识点&#xff1…...

python botos s3 aws

https://boto3.amazonaws.com/v1/documentation/api/latest/reference/services/s3.html AWS是亚马逊的云服务,其提供了非常丰富的套件,以及支持多种语言的SDK/API。本文针对其S3云储存服务的Python SDK(boto3)的使用进行介绍。 …...

python画神经网络图

代码1(画神经网络连接图) from math import cos, sin, atan import matplotlib.pyplot as plt # 注意这里并没有用到这个networkx这个库,完全是根据matploblib这个库来画的。 class Neuron():def __init__(self, x, y,radius,nameNone):self.x xself.y …...

Bash 编程精粹:从新手到高手的全面指南之逻辑控制

在 Unix 和 Linux 系统中,Bash(Bourne-Again Shell)是一种广泛使用的 shell,提供了强大的脚本编程能力。本文将详细介绍 Bash 脚本中的逻辑控制结构,包括条件判断、分支选择、循环控制以及退出控制等内容。 条件判断&…...

自动化运维(三十)Ansible 实战之自定义插件

Ansible 自定义插件允许你扩展其功能,以满足特定的自动化需求。Ansible 支持多种类型的插件开发,如动态库存、查找、回调、过滤器、变量等。这里我们将通过实例,介绍如何开发、部署和使用一个自定义插件。 开发自定义查找插件 查找插件用于在 Ansible 任务中动态获取数据。…...

实习僧网站的实习岗位信息分析

目录 背景描述数据说明数据集来源问题描述分析目标以及导入模块1. 数据导入2. 数据基本信息和基本处理3. 数据处理3.1 新建data_clean数据框3.2 数值型数据处理3.2.1 “auth_capital”(注册资本)3.2.2 “day_per_week”(每周工作天数&#xf…...

C语言中局部变量和全局变量是否可以重名?为什么?

可以重名 在C语言中, 局部变量指的是定义在函数内的变量, 全局变量指的是定义在函数外的变量 他们在程序中的使用方法是不同的, 当重名时, 局部变量在其所在的作用域内具有更高的优先级, 会覆盖或者说隐藏同名的全局变量 具体来说: 局部变量的生命周期只在函数内部,如果出了…...

小程序中配置scss

找到:project.config.json 文件 setting 模块下添加: "useCompilerPlugins": ["sass","其他的样式类型"] 配置完成后,重启开发工具,并新建文件 结果:...

ZYNQ-Vitis(SDK)裸机开发之(四)PS端MIO和EMIO的使用

目录 一、ZYNQ中MIO和EMIO简介 二、Vivado中搭建block design 1.配置PS端MIO: 2.配置PS端EMIO: 三、Vitis中新建工程进行GPIO控制 1. GPIO操作头文件gpio_hdl.h: 2.GPIO操作源文件gpio_hdl.c: 3.main函数进行调用 例程开发…...

聊聊jvm中内存模型的坑

jvm线程的内存模型 看图,简单来说线程中操作的变量是副本。在并发情况下,如果数据发生变更,副本的数据就变为脏数据。这个时候就会有并发问题。 参考:https://www.cnblogs.com/yeyang/p/12580682.html 怎么解决并发问题 解决的…...

DevOps已死?2024年的DevOps将如何发展

随着我们进入2024年,DevOps也发生了变化。新兴的技术、变化的需求和发展的方法正在重新定义有效实施DevOps实践。 IDC预测显示,未来五年,支持DevOps实践的产品市场继续保持健康且快速增长,2022年-2027年的复合年增长率&#xff0…...

appium控制手机一直从下往上滑动

用于使用Appium和Selenium WebDriver在Android设备上滚动设置应用程序的界面。具体来说,它通过WebDriverWait和expected_conditions等待元素出现,然后使用ActionChains移动到该元素并执行滚动动作。在setUp中,它初始化了Appium的WebDriver和c…...

为什么光伏探勘测绘需要无人机?

随着全球对可再生能源需求的不断增长,光伏产业也迎来了快速发展的机遇。光伏电站作为太阳能发电的主要形式之一,其建设前期的探勘测绘工作至关重要。在这一过程中,无人机技术的应用正逐渐展现出其独特的优势。那么,为什么光伏探勘…...

day10 | 栈与队列 part-2 (Go) | 20 有效的括号、1047 删除字符串中的所有相邻重复项、150 逆波兰表达式求值

今日任务 20 有效的括号 (题目: . - 力扣(LeetCode))1047 删除字符串中的所有相邻重复项 (题目: . - 力扣(LeetCode))150 逆波兰表达式求值 (题目: . - 力扣(LeetCode)) 20 有效的括号 题目: . - 力扣&…...

深入解析Tomcat的工作流程

tomcat解析 Tomcat是一个广泛使用的开源Servlet容器,用于托管Java Web应用程序。理解Tomcat的工作流程对于开发人员和系统管理员来说是非常重要的。本文将深入探讨Tomcat的工作原理,包括请求处理、线程池管理、类加载、以及与Web服务器之间的通信。 ###…...

【web网页制作】html+css旅游家乡山西主题网页制作(3页面)【附源码】

山西旅游网页目录 涉及知识写在前面一、网页主题二、网页效果Page1、景点介绍Page2、酒店精选|出行攻略Page3、景色欣赏 三、网页架构与技术3.1 脑海构思3.2 整体布局3.3 技术说明书 四、网页源码4.1 主页模块源码4.2 源码获取方式 作者寄语 涉及知识 山西旅游主题网页制作&am…...

系统参数指标:QPS、TPS、PV、UV等

QPS QPS:Queries Per Second 是每秒查询率,是一台服务器每秒能够相应的查询次数,是对一个特定的查询服务器在规定时间内所处理流量多少的衡量标准,即每秒的响应请求数,也即是最大吞吐能力。 TPS TPS:Tra…...

模型参数、模型存储精度、参数与显存

模型参数量衡量单位 M:百万(Million) B:十亿(Billion) 1 B 1000 M 1B 1000M 1B1000M 参数存储精度 模型参数是固定的,但是一个参数所表示多少字节不一定,需要看这个参数以什么…...

CentOS下的分布式内存计算Spark环境部署

一、Spark 核心架构与应用场景 1.1 分布式计算引擎的核心优势 Spark 是基于内存的分布式计算框架,相比 MapReduce 具有以下核心优势: 内存计算:数据可常驻内存,迭代计算性能提升 10-100 倍(文档段落:3-79…...

NLP学习路线图(二十三):长短期记忆网络(LSTM)

在自然语言处理(NLP)领域,我们时刻面临着处理序列数据的核心挑战。无论是理解句子的结构、分析文本的情感,还是实现语言的翻译,都需要模型能够捕捉词语之间依时序产生的复杂依赖关系。传统的神经网络结构在处理这种序列依赖时显得力不从心,而循环神经网络(RNN) 曾被视为…...

Aspose.PDF 限制绕过方案:Java 字节码技术实战分享(仅供学习)

Aspose.PDF 限制绕过方案:Java 字节码技术实战分享(仅供学习) 一、Aspose.PDF 简介二、说明(⚠️仅供学习与研究使用)三、技术流程总览四、准备工作1. 下载 Jar 包2. Maven 项目依赖配置 五、字节码修改实现代码&#…...

MySQL 知识小结(一)

一、my.cnf配置详解 我们知道安装MySQL有两种方式来安装咱们的MySQL数据库,分别是二进制安装编译数据库或者使用三方yum来进行安装,第三方yum的安装相对于二进制压缩包的安装更快捷,但是文件存放起来数据比较冗余,用二进制能够更好管理咱们M…...

五子棋测试用例

一.项目背景 1.1 项目简介 传统棋类文化的推广 五子棋是一种古老的棋类游戏,有着深厚的文化底蕴。通过将五子棋制作成网页游戏,可以让更多的人了解和接触到这一传统棋类文化。无论是国内还是国外的玩家,都可以通过网页五子棋感受到东方棋类…...

[特殊字符] 手撸 Redis 互斥锁那些坑

📖 手撸 Redis 互斥锁那些坑 最近搞业务遇到高并发下同一个 key 的互斥操作,想实现分布式环境下的互斥锁。于是私下顺手手撸了个基于 Redis 的简单互斥锁,也顺便跟 Redisson 的 RLock 机制对比了下,记录一波,别踩我踩过…...

Java后端检查空条件查询

通过抛出运行异常&#xff1a;throw new RuntimeException("请输入查询条件&#xff01;");BranchWarehouseServiceImpl.java // 查询试剂交易&#xff08;入库/出库&#xff09;记录Overridepublic List<BranchWarehouseTransactions> queryForReagent(Branch…...

Java设计模式:责任链模式

一、什么是责任链模式&#xff1f; 责任链模式&#xff08;Chain of Responsibility Pattern&#xff09; 是一种 行为型设计模式&#xff0c;它通过将请求沿着一条处理链传递&#xff0c;直到某个对象处理它为止。这种模式的核心思想是 解耦请求的发送者和接收者&#xff0c;…...

MLP实战二:MLP 实现图像数字多分类

任务 实战&#xff08;二&#xff09;&#xff1a;MLP 实现图像多分类 基于 mnist 数据集&#xff0c;建立 mlp 模型&#xff0c;实现 0-9 数字的十分类 task: 1、实现 mnist 数据载入&#xff0c;可视化图形数字&#xff1b; 2、完成数据预处理&#xff1a;图像数据维度转换与…...