使用docker完成minio服务部署扩容备份迁移生产实践文档

news2024/11/26 14:36:37

一、minio服务扩容方案

当服务器存储空间不足的时候,需要进行扩容,扩容过程中需要短暂停机时间,预计在一小时内能够完成和恢复

统一注意事项

强烈建议为部署中的所有节点选择基本相似的硬件配置。确保硬件(CPU、内存、主板、存储适配器)和软件(操作系统、内核设置、系统服务)在所有节点上保持一致。

由于文件服务用于文件上传与下载,需要选择一个存储空间大的磁盘(生产环境可能不一样,因此需要检查),查看服务器的最大磁盘空间:df -h 例如

img

由上图可以看出,/opt 目录磁盘空间最大,检查docker-compose的minio映射目录,若生产磁盘目录也是/opt最大,则用默认的docker-compose;

若生产的最大磁盘目录为其他,例如发现磁盘空间最大根目录为 /usr 则需要修改docker-compose中的对应数据映射目录

# minio集群部署模式下
- /opt/CommandCenter/minio/data1:/data1  [修改为]  - /usr/CommandCenter/minio/data1:/data1
- /opt/CommandCenter/minio/data2:/data2  [修改为]  - /usr/CommandCenter/minio/data2:/data2

1.1 第一阶段 部署[3]个节点

首先检查部署所在服务器的是否开放 9000、9001 端口,若没有开放则需要开放9000、9001 端口

# 查看开放的端口号,若列表中没有9000、9001则需要开放9000、9001 端口
firewall-cmd --list-ports

#开放9000端口,为minio后端代码访问端口
firewall-cmd --zone=public --add-port=9000/tcp --permanent
#开放9001端口,为minio后台管理界面端口
firewall-cmd --zone=public --add-port=9001/tcp --permanent

# 重启防火墙,使开放端口生效
firewall-cmd --reload

这里以部署3台服务器为示例演示集群部署,生产以实际环境服务器为准:

服务器别名服务器ip地址后端代码访问端口号后台管理界面端口号
minio0116.123.11.1690009001
minio0216.123.11.1590009001
minio0316.123.11.1490009001

在【portainer】中分别在【3】台服务器上运行此 docker-compose 文件(集群中每个docker-compose内容稍有不同)即可完 minio 的集群部署;

每台服务器的minio的docker-compose.yml文件为:主要按照实际文件修改: hostname 、 container_name 、 extra_hosts

注意:每台服务器中的 docker-compose.yaml 文件有 hostname 、 container_name 、 extra_hosts属性有区别,集群中每台minio的用户名和密码需要保持一致

version: "3.0"
services:
  minio:
    # 最新版的minio
    image: quay.io/minio/minio
    # 这里的 minio0{1...3}代表:部署3个节点(即3台服务器), data{1...2}代表:每个节点分别映射两个存储文件夹
    command: server --address ":9000" --console-address ":9001" http://minio0{1...3}/data{1...2}
    restart: always
    hostname: minio01 # 注意:每个节点修改成不同的名字,与下面的 extra_hosts 保持名称一致
    container_name: minio01 # 注意:每个节点修改成不同的名字,与下面的 extra_hosts 保持名称一致
    environment:
      # 集群中每个节点的用户名和密码需保持一致
      MINIO_ROOT_USER: xxxxxx
      MINIO_ROOT_PASSWORD: xxxxxxx
      MINIO_PROMETHEUS_AUTH_TYPE: public
      TZ: Asia/Shanghai
    extra_hosts:
      # 这里分别填写,集群中每台服务器的ip以及自定义hostname
      - "minio01:16.123.11.16"
      - "minio02:16.123.11.15"
      - "minio03:16.123.11.14"
    volumes:
      - /opt/CommandCenter/minio/data1:/data1
      - /opt/CommandCenter/minio/data2:/data2
      #将外边时间直接挂载到容器内部,权限只读
      - /etc/localtime:/etc/localtime:ro
      #将外面的时间挂载到容器内部,权限只读,容器内不可修改
      - /etc/timezone:/etc/timezone:ro
    network_mode: "host"
    logging:
      driver: "json-file"
      options:
        max-size: "50M"
        max-file: "10"
    deploy:
      resources:
        limits:
          cpus: "4"
          memory: 4096M
        reservations:
          memory: 2048M

**验证:**部署完成后,在浏览器访问 http://ip:9000 ,ip为集群中的任意一台服务器ip,docker-compose中输入的MINIO_ROOT_USER对应值为用户名,MINIO_ROOT_PASSWORD对应值为密码

登录后选择菜单【Monitoring】—》【Metrics】查看集群情况,Servers对应在线节点数量,Drives代表磁盘在线数量

1.1.1 请检查nginx配置文件中是否包含以下配置,若没有则新增;若新增,则需要重启nginx
 # minio 集群中的节点
	upstream minioCluster{
        server  16.123.11.16:9000; #将127.0.0.1修改为minio服务主节点所在机器IP
        server  16.123.11.15:9000; #将127.0.0.1修改为minio服务备节点所在机器IP
        server  16.123.11.14:9000; #将127.0.0.1修改为minio服务备节点所在机器IP
    }
	
	server {
		listen       9002;
		server_name  127.0.0.1; #此处填写当前nginx服务所在的服务器ip
		client_max_body_size 4096M;
		
		#charset koi8-r;

		#access_log  logs/host.access.log  main;
		
		location / {
			proxy_pass http://minioCluster;
			proxy_set_header x-real-ip $remote_addr;
			proxy_set_header x-forwarded-for $proxy_add_x_forwarded_for;
			proxy_set_header host $http_host;
		}
	}

1.2 第二阶段 当存储容量不足的时候,再部署[3]个节点实现扩容

注意:不支持单独添加一个节点组成新的集群

首先检查部署所在服务器的是否开放 9000、9001 端口,若没有开放则需要开放9000、9001 端口

# 查看开放的端口号,若列表中没有9000、9001则需要开放9000、9001 端口
firewall-cmd --list-ports

#开放9000端口,为minio后端代码访问端口
firewall-cmd --zone=public --add-port=9000/tcp --permanent
#开放9001端口,为minio后台管理界面端口
firewall-cmd --zone=public --add-port=9001/tcp --permanent

# 重启防火墙,使开放端口生效
firewall-cmd --reload

这里以部署3台服务器为示例演示集群部署,生产以实际环境服务器为准:

服务器别名服务器ip地址后端代码访问端口号后台管理界面端口号
minio0416.123.11.1390009001
minio0516.123.11.1290009001
minio0616.123.11.1190009001

在【portainer】中分别在【3】台服务器上运行此 docker-compose 文件(集群中每个docker-compose内容稍有不同)即可完 minio 的集群部署;

每台服务器的minio的docker-compose.yml文件为:

注意:每台服务器中的 docker-compose.yaml 文件有 hostname 、 container_name 、 extra_hosts属性有区别,集群中每台minio的用户名和密码需要保持一致

注意 **command、extra_hosts、**hostname 、 container_name 对内的变化。

扩容的时候【每个节点(包含之前的节点)】都需要按照此处来修改,然后重新部署每个节点

version: "3.0"
services:
  minio:
    # minio最新版
     quay.io/minio/minio
    # 这里的 minio0{1...3}代表:部署3个节点(即2台服务器), data{1...2}代表:每个节点分别映射两个存储文件夹
    command: server --address ":9000" --console-address ":9001" http://minio0{1...3}/data{1...2} http://minio0{4...6}/data{1...2}
    restart: always
    hostname: minio03 # 注意:每个节点修改成不同的名字,与下面的 extra_hosts 保持名称一致
    container_name: minio03 # 注意:每个节点修改成不同的名字,与下面的 extra_hosts 保持名称一致
    environment:
      # 集群中每个节点的用户名和密码需保持一致
      MINIO_ROOT_USER: xxxxxxxx
      MINIO_ROOT_PASSWORD: xxxxxxxxxx
      MINIO_PROMETHEUS_AUTH_TYPE: public
      TZ: Asia/Shanghai
    extra_hosts:
      # 这里分别填写,集群中每台服务器的ip以及自定义hostname
      - "minio01:16.123.11.16"
      - "minio02:16.123.11.15"
      - "minio03:16.123.11.14"
      - "minio04:16.123.11.13"
      - "minio05:16.123.11.12"
      - "minio06:16.123.11.11"
    volumes:
      - /opt/CommandCenter/minio/data1:/data1
      - /opt/CommandCenter/minio/data2:/data2
      #将外边时间直接挂载到容器内部,权限只读
      - /etc/localtime:/etc/localtime:ro
      #将外面的时间挂载到容器内部,权限只读,容器内不可修改
      - /etc/timezone:/etc/timezone:ro
    network_mode: "host"
    logging:
      driver: "json-file"
      options:
        max-size: "50M"
        max-file: "10"
    deploy:
      resources:
        limits:
          cpus: "4"
          memory: 4096M
        reservations:
          memory: 2048M

**验证:**部署完成后,在浏览器访问 http://ip:9000 ,ip为集群中的任意一台服务器ip,docker-compose中输入的MINIO_ROOT_USER对应值为用户名,MINIO_ROOT_PASSWORD对应值为密码

登录后选择菜单【Monitoring】—》【Metrics】查看集群情况,Servers对应在线节点数量,Drives代表磁盘在线数量

注意:修改nginx的配置,将新增的节点添加到此处,然后重启nginx

 # minio 集群中的节点
	upstream minioCluster{
        server  16.123.11.16:9000; #将127.0.0.1修改为minio服务主节点所在机器IP
        server  16.123.11.15:9000; #将127.0.0.1修改为minio服务备节点所在机器IP
        server  16.123.11.14:9000; #将127.0.0.1修改为minio服务备节点所在机器IP
        server  16.123.11.13:9000; #将127.0.0.1修改为minio服务主节点所在机器IP
        server  16.123.11.12:9000; #将127.0.0.1修改为minio服务备节点所在机器IP
        server  16.123.11.11:9000; #将127.0.0.1修改为minio服务备节点所在机器IP
    }
	
	server {
		listen       9002;
		server_name  127.0.0.1; #此处填写当前nginx服务所在的服务器ip
		client_max_body_size 4096M;
		
		#charset koi8-r;

		#access_log  logs/host.access.log  main;
		
		location / {
			proxy_pass http://minioCluster;
			proxy_set_header x-real-ip $remote_addr;
			proxy_set_header x-forwarded-for $proxy_add_x_forwarded_for;
			proxy_set_header host $http_host;
		}
	}

二、minio数据备份与迁移

文件服务为集群部署,自带数据备份功能:

比如部署了N个节点,当存活的节点有 大于 N/2 的节点存活的时候,都能够获取到完整的数据并且提供服务

多节点/驱动器级别的可靠性,具有可配置的容忍度,最多可丢失 1/2 所有节点/驱动器 。

2.1 检查/安装 mc客户端

数据的备份与迁移都依赖于mc客户端,mc客户端源于minio官方,需要确认mc客户端已经安装

# 查看是否安装mc
mc --help
# 若出现命令未发现,则说明mc没有安装,需要安装mc客户端
[root@localhost minio-binaries]# mc --help
-bash: mc: command not found

# 若出现以下命令则说明已经安装,按键盘q键则可以退出
[root@localhost minio-binaries]# mc --help
───────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────── (q)uit/esc
NAME:                                                                           
  mc - MinIO Client for object storage and filesystems.                         
                                                                                
USAGE:                                                                          
  mc [FLAGS] COMMAND [COMMAND FLAGS | -h] [ARGUMENTS...]                        
                                                                                
COMMANDS:                                                                       
  alias      manage server credentials in configuration file                    
  ls         list buckets and objects                                           
  mb         make a bucket                                                      
  rb         remove a bucket                                                    
  cp         copy objects                                                       
  mv         move objects                                                       
  rm         remove object(s)                                                   
  mirror     synchronize object(s) to a remote site                             
  cat        display object contents                                            
  head       display first 'n' lines of an object                               
  pipe       stream STDIN to an object                                          
  find       search for objects                                                 
  sql        run sql queries on objects                                         
  stat       show object metadata                                               
  tree       list buckets and objects in a tree format                          
  du         summarize disk usage recursively                                   
  retention  set retention for object(s)                                        
  legalhold  manage legal hold for object(s)                                    
  support    support related commands                                           
  license    license related commands                                           
  share      generate URL for temporary access to an object                     
  version    manage bucket versioning                                           
  ilm        manage bucket lifecycle                                            
  quota      manage bucket quota                                                
  encrypt    manage bucket encryption config                                    
  event      manage object notifications                                        
  watch      listen for object notification events                              
  undo       undo PUT/DELETE operations                                         
  anonymous  manage anonymous access to buckets and objects                     
  tag        manage tags for bucket and object(s)                               
  diff       list differences in object name, size, and date between two buckets
  replicate  configure server side bucket replication                           
  admin      manage MinIO servers                                               
────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────── 0%   

可以通过 在线/离线 模式根据不同的服务器架构安装mc客户端:

在线安装mc客户端:

当服务架构为linux-amd64的时候,安装mc客户端为:

curl https://dl.minio.org.cn/client/mc/release/linux-amd64/mc \
  --create-dirs \
  -o /usr/local/minio-binaries/mc

chmod +x /usr/local/minio-binaries/mc
export PATH=$PATH:/usr/local/minio-binaries/

mc --help

当服务器架构为linux-arm64的时候,安装mc客户端为:

curl https://dl.minio.org.cn/client/mc/release/linux-arm64/mc \
  --create-dirs \
  -o /usr/local/minio-binaries/mc

chmod +x /usr/local/minio-binaries/mc
export PATH=$PATH:/usr/local/minio-binaries/

mc --help

离线安装mc客户端:

当服务架构为linux-amd64的时候,安装mc客户端为:

1.创建目标文件夹
mkdir -p /usr/local/minio-binaries
2.从安装包中取出linux-amd64对应的 mc 安装包上传到 /usr/local/minio-binaries 目录下
3.赋予mc客户端执行权限
chmod +x /usr/local/minio-binaries/mc
4.添加环境变量
export PATH=$PATH:/usr/local/minio-binaries/

当服务器架构为linux-arm64的时候,安装mc客户端为:

1.创建目标文件夹
mkdir -p /usr/local/minio-binaries
2.从安装包中取出linux-arm64对应的 mc 安装包上传到 /usr/local/minio-binaries 目录下
3.赋予mc客户端执行权限
chmod +x /usr/local/minio-binaries/mc
4.添加环境变量
export PATH=$PATH:/usr/local/minio-binaries/

2.2 minio数据备份与迁移方案

设置存储服务器别名

# 在安装了mc客户端的服务器上执行设置服务别名
mc alias set minio_A http://127.0.0.1:9002 yourusername youruserpassword

说明:
minio_A 为自定义存储服务器别名
需要将127.0.0.1替换 nginx 的ip或vip(vip优先)
yourusername代表minio的用户名
youruserpassword代表minio的密码

# 查看已经设置的别名
mc alias list
2.2.1 将数据【备份】到本地其他磁盘
# 创建本地备份目录,注意备份目录磁盘空间需要大于本次备份的数据 df -h 查看磁盘空间
mkdir -p /opt/minio/bakdata
# 将minio中存储的数据全部备份到本地
mc cp --recursive minio_A/ /opt/minio/bakdata/

说明 minio_A 自定义的别名

若需要【指定备份某个桶】的数据,则执行 mc cp --recursive minio_A/mybucket/ /opt/minio/bakdata/mybucket/
mybucket为桶的名称
2.2.2 将备份的数据上传到新的minio集群上面
# 这里将minio_A备份的数据,上传到minio_B上面,先设置minio_B的别名
mc alias set minio_B http://127.0.0.1:9002 yourusername youruserpassword
# 查看已经设置的别名
mc alias list

# 查看minio_A服务上面所有桶的名称
mc ls  minio_A
# 查看minio_B服务上面所有桶的名称
mc ls  minio_B

若minio_B中缺少minio_A中的桶数据,则需要登录到新的桶后台新增minio_B中缺少的桶

# 将minio_A备份的[全部]数据,上传到minio_B上面,注意备份文件目录路径需以'/'结尾
mc cp --recursive /opt/minio/bakdata/ minio_B
注意:迁移过程中若出现目录不存在,则登录到新的集群去创建(Bucket `xxxxxxxx` does not exist)

# 将minio_A备份[mybucket桶]的数据,上传到minio_B[mybucket桶]上面,注意备份文件目录路径需以'/'结尾
mc cp --recursive /opt/minio/bakdata/mybucket/ minio_B/mybucket/
注意:迁移过程中若出现目录不存在,则登录到新的集群去创建(Bucket `xxxxxxxx` does not exist)

注意:迁移过程中若出现提示目录不存在,则登录到新的集群去创建(Bucket xxxxxxxx does not exist)

**创建桶:**浏览器登录管理后台 http://ip:9000 ip为新集群中的任意一台minio所在服务的ip,在docker-compose中的 MINIO_ROOT_USER和MINIO_ROOT_PASSWORD分别对应登录的用户名和密码

img

2.2.3 将一个minio中的数据区【迁移】到另外一个新的minio集群
# 查看minio_A服务上面所有桶的名称
mc ls  minio_A
# 查看minio_B服务上面所有桶的名称
mc ls  minio_B

若minio_B中缺少minio_A中的桶数据,则需要登录到新的桶后台新增minio_B中缺少的桶


#将服务器A上名为“mybucket”的桶的数据迁移到服务器B的“mybucket”桶中
mc cp --recursive minio_A/mybucket/ minio_B/mybucket/
注意:若提示(Bucket `xxxxxxxx` does not exist)则需要登录到新的集群去创建名为mybucket的桶

#将服务器A上面的所有数据迁移到服务器B上面
mc cp --recursive minio_A minio_B
注意:若提示(Bucket `xxxxxxxx` does not exist)则需要登录到新的集群去创建名为mybucket的桶

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

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

相关文章

【Spring Boot】操作Redis数据结构

🌿欢迎来到@衍生星球的CSDN博文🌿 🍁本文主要学习【Spring Boot】操作Redis数据结构 🍁 🌱我是衍生星球,一个从事集成开发的打工人🌱 ⭐️喜欢的朋友可以关注一下🫰🫰🫰,下次更新不迷路⭐️💠作为一名热衷于分享知识的程序员,我乐于在CSDN上与广大开发者…

OOTD耳机 | 国庆出游头戴式耳机推荐|轻装上阵出片神器

国庆假期马上就要来啦~ 今天就来分享一款数码神器——头戴式耳机,穿搭拍照必备,特别适合假期出游哦!轻装上阵出片神器——轻律Umelody U1头戴式蓝牙耳机! 整个设计简约低调,棕色的为主调的包身,…

JMeter 设置请求头信息的详细步骤

在使用 JMeter 的过程中,我们会遇到需要设置请求头信息的场景。比如: POST 传过去的 Body 数据是 json 格式的。需要填添加头信息:Content-Type:application/json。 在 header 中用 token 来传用户的认证信息。 下面,…

服务器vs普通电脑

服务器,是一种高性能计算机,作为网络的节点,存储、处理网络上80%的数据、信息,因此也被称为网络的灵魂。那么,服务器与普通电脑有什么不一样呢? 服务器VS普通电脑 普通电脑,通过终…

常用中间件-OAuth2

1. 微服务权限校验Session共享 1.1 微服务权限校验 实现2号方案。使用Redis作为Session统一存储。 首先配置一下Nacos&#xff0c;参考https://blog.csdn.net/weixin_43917045/article/details/132852850 然后为每个服务添加验证机制&#xff0c;先导入依赖 <!-- SpringS…

vs2019配置libcurl环境

一、libcurl下载地址&#xff1a;curl - Download 二、解压下载的压缩包&#xff0c;进入projects\Windows\VC14目录 三、用vs2019打开curl-all.sln工程&#xff0c;选择LIB Debug&#xff0c;x64进行编译 编译后的文件为&#xff1a;curl-8.2.1\build\Win64\VC14\LIB Debug\li…

【c语言中的字符串相关方法介绍】

C语言中有许多字符串相关的函数&#xff0c;用于处理字符串的创建、修改、查找和比较等操作。以下是一些常见的字符串相关函数以及它们的使用方法&#xff1a; strlen&#xff08;字符串长度&#xff09;&#xff1a;用于计算字符串的长度&#xff0c;不包括字符串末尾的空字符…

【AI视野·今日Robot 机器人论文速览 第四十三期】Thu, 28 Sep 2023

AI视野今日CS.Robotics 机器人学论文速览 Thu, 28 Sep 2023 Totally 37 papers &#x1f449;上期速览✈更多精彩请移步主页 Interesting: &#x1f4da;****触觉力控学习策略,基于触觉的主动推理与力控用于小孔插入任务。提出了姿态控制与插入控制双策略模型。 (from 东京大学…

京东数据平台:2023年8月京东白酒行业品牌销售排行榜

鲸参谋监测的京东平台8月份白酒市场销售数据已出炉&#xff01; 根据鲸参谋平台的数据显示&#xff0c;今年8月份&#xff0c;白酒市场的销量为198万&#xff0c;环比下滑约6%&#xff0c;同比下滑不足1%&#xff1b;销售额为15亿&#xff0c;环比下滑约18%&#xff0c;同比则…

c++ | makefile | 编译 | 链接库

简单记一下 看着人家总结的挺好的 点这

面试问到MySQL模块划分与架构体系怎么办

面试问到Mysql模块划分与架构体系怎么办 文章目录 1. 应用层连接管理器&#xff08;Connection Manager&#xff09;安全性和权限模块&#xff08;Security and Privilege Module&#xff09; 2. MySQL服务器层2.1. 服务支持和工具集2.2. SQL Interface2.3. 解析器举个解析器 …

ChatGPT社交时代降临!Meta在三大平台,集成28个生成式AI!

9月28日&#xff0c;全球社交、科技巨头Meta&#xff08;前身是Facebook&#xff09;在官网宣布&#xff0c;在旗下的Instagram、WhatsApp和Messenger三大社交平台中&#xff0c;集成28个生成式AI聊天机器人。 据悉&#xff0c;这些AI机器人是基于Meta最新发布的大语言模型Lla…

力扣-349.两个数组的交集

Idea 使用两个哈希集合&#xff0c;其中一个用来存储第一个数组&#xff0c;第二个来存储两个数组的交集&#xff0c;因为集合自带去重功能&#xff0c;因此最后用数组来接收就好了 AC Code class Solution { public:vector<int> intersection(vector<int>& n…

自动化测试框架总结

前言 自动化测试框架是一套工具、库和规范的集合&#xff0c;用于支持和简化自动化测试的开发、执行和管理。 提供一种结构化的方法来编写、组织和执行自动化测试用例&#xff0c;并提供一些常用的功能和工具&#xff0c;例如测试用例管理、结果报告生成、测试数据管理、日志…

17周年庆第一弹|中秋·国庆双节大促购物指南,给力狂欢!

随着中秋和国庆双节的来临,百脑汇广州店为了满足消费者的购物需求,特别推出了本次17周年店庆月:双节大促购物指南。本指南将为您介绍百脑汇广州店的优惠购机活动、热门商品等等,帮助您在本次17周年店庆月中获得更好的体验。 百脑汇广州店17周年店庆月第一弹:中秋国庆双节大促中…

【面试经典 150 | 滑动窗口】串联所有单词的子串

文章目录 写在前面Tag题目来源题目解读解题思路方法一&#xff1a;两个哈希表方法二&#xff1a;滑动窗口 写在最后 写在前面 本专栏专注于分析与讲解【面试经典150】算法&#xff0c;两到三天更新一篇文章&#xff0c;欢迎催更…… 专栏内容以分析题目为主&#xff0c;并附带一…

【图论C++】树的重心——教父POJ 3107(链式前向星的使用)

》》》算法竞赛 /*** file * author jUicE_g2R(qq:3406291309)————彬(bin-必应)* 一个某双流一大学通信与信息专业大二在读 * * brief 一直在竞赛算法学习的路上* * copyright 2023.9* COPYRIGHT 原创技术笔记&#xff1a;转载…

$nextTick解决echarts宽度固定为100%的问题

问题描述:vue+element项目中使用到了tab切换选项卡,其中有一个tab下的内容是echarts,出现了echarts宽度缩减为100px无法继承100%属性。 问题: echarts渲染时tab选项卡display为none,所以width:100%没有可继承项,被echarts自带方法切割成100px。 我他喵的解决这个问题还是…

给 shell 自定义快捷键

shell 快捷键原理 本质上对于 shell 来说只有输入输出&#xff0c;它不会监听你系统快捷键的&#xff0c;监听快捷键其实是终端模拟器的责任&#xff0c;他会将你输入的快捷键转换成字符串序列。当我们使用了类似 ctrl -> 这样的快捷键&#xff0c;shell 会根据你输入的字…

QT的ui设计中改变样式表的用法

在QT的ui设计中,我们右键会弹出一个改变样式表的选项,很多人不知道这个是干什么的。 首先我们来看下具体的界面 首先我们说一下这个功能具体是干嘛的, 我们在设置很多控件在界面上之后,常常都是使用系统默认的样式,但是当有些时候为了美化界面我们需要对一些控件进行美化…