搭建高可用OpenStack(Queen版)集群(十一)之OpenStack集成ceph服务

news2024/11/27 8:45:36

一、OpenStack集成ceph服务

  一)Openstack集成Ceph准备

  1、OpenStack存储知识
    1、OpenStack数据存储分类

  Openstack环境中,数据存储可分为临时性存储与永久性存储。

  临时性存储:主要由本地文件系统提供,并主要用于nova虚拟机的本地系统与临时数据盘,以及存储glance上传的系统镜像;

  永久性存储:主要由cinder提供的块存储与swift提供的对象存储构成,以cinder提供的块存储应用最为广泛,块存储通常以云盘的形式挂载到虚拟机中使用。

    2、OpenStack需要进行数据存储的组件

  Openstack中需要进行数据存储的三大项目主要是nova项目(虚拟机镜像文件),glance项目(共用模版镜像)与cinder项目(块存储)。

  下图为cinder,glance与nova访问ceph集群的逻辑图:

  1. ceph与openstack集成主要用到ceph的rbd服务,ceph底层为rados存储集群,ceph通过librados库实现对底层rados的访问;
  2. openstack各项目客户端调用librbd,再由librbd调用librados访问底层rados;
  3. 实际使用中,nova需要使用libvirtdriver驱动以通过libvirt与qemu调用librbd;cinder与glance可直接调用librbd;
  4. 写入ceph集群的数据被条带切分成多个object,object通过hash函数映射到pg(构成pg容器池pool),然后pg通过几圈crush算法近似均匀地映射到物理存储设备osd(osd是基于文件系统的物理存储设备,如xfs,ext4等)。

  

  2、创建pool

  Ceph默认使用pool的形式存储数据,pool是对若干pg进行组织管理的逻辑划分,pg里的对象被映射到不同的osd,因此pool分布到整个集群里。
  可以将不同的数据存入1个pool,但如此操作不便于客户端数据区分管理,因此一般是为每个客户端分别创建pool。
  为cinder,nova,glance分别创建pool,命名为:volumes,vms,images
  创建pool,需要覆盖默认的pg num,官方文档对pg num的数量有如下建议:

  • http://docs.ceph.com/docs/master/rados/operations/placement-groups/;
  • 同时综合考量全部pool的pg num总和的上限:pg num * 副本数量 < mon_max_pg_per_osd(默认200) * num_in_osds(osd总进程数);
    1、pool创建在monitor节点操作,以controller01节点为例;

  这里volumes池是永久性存储,vms是实例临时后端存储,images是镜像存储

su - cephde
$ sudo ceph osd pool create volumes 128
$ sudo ceph osd pool create vms 128
$ sudo ceph osd pool create images 128
    2、查看状态
[cephde@controller01 ~]$ sudo ceph pg stat 
396 pgs: 396 active+undersized; 0B data, 6.03GiB used, 77.9GiB / 84.0GiB avail
[cephde@controller01 ~]$ sudo ceph osd lspools
1 vms,2 volumes,3 images,
  3、安装ceph客户端
    1、控制节点安装python-rbd
  • glance-api服务所在节点需要安装python-rbd
  • 这里glance-api服务运行在3个控制节点上
sudo yum install python-rbd -y
    2、存储节点安装ceph-common
  • cinder-volume与nova-compute服务所在节点需要安装ceph-common;
  • 这里cinder-volume与nova-compute服务运行在3个计算(存储)节点
sudo yum install ceph-common -y
  3、授权设置

    在控制节点controller01操作 (root用户执行)

    1、创建用户
  • ceph默认启用cephx authentication(见ceph.conf),需要为nova/cinder与glance客户端创建新的用户并授权;
  • 可在管理节点上分别为运行cinder-volume与glance-api服务的节点创建client.glance与client.cinder用户并设置权限;
  • 针对pool设置权限,pool名对应创建的pool
[root@controller01 ~]# ceph auth get-or-create client.cinder mon 'allow r' osd 'allow class-read object_prefix rbd_children, allow rwx pool=volumes, allow rwx pool=vms, allow rx pool=images' 
[client.cinder]
    key = AQCv3plbaAahKxAAjIsIVNMR++B7X22AkkviPA==
[root@controller01 ~]# ceph auth get-or-create client.glance mon 'allow r' osd 'allow class-read object_prefix rbd_children, allow rwx pool=images'
[client.glance]
    key = AQDB3plbufA/CBAAlFdliGPJbhM1wCgORaZ+3w==
    2、推动client.glance秘钥(可以使用脚本)

  将创建client.glance用户生成的秘钥推送到运行glance-api服务的节点

ceph auth get-or-create client.glance | ssh root@controller01 tee /etc/ceph/ceph.client.glance.keyring
ceph auth get-or-create client.glance | ssh root@controller02 tee /etc/ceph/ceph.client.glance.keyring
ceph auth get-or-create client.glance | ssh root@controller03 tee /etc/ceph/ceph.client.glance.keyring

  同时修改秘钥文件的属主与用户组

ssh root@controller01 chown glance:glance /etc/ceph/ceph.client.glance.keyring
ssh root@controller02 chown glance:glance /etc/ceph/ceph.client.glance.keyring
ssh root@controller03 chown glance:glance /etc/ceph/ceph.client.glance.keyring
    3、推送client.cinder秘钥(nova-volume)

  将创建的client.cinder用户生成的秘钥推送到运行cinder-volume服务的节点(计算节点)

ceph auth get-or-create client.cinder | ssh root@compute01 tee /etc/ceph/ceph.client.cinder.keyring
ceph auth get-or-create client.cinder | ssh root@compute02 tee /etc/ceph/ceph.client.cinder.keyring

  同时修改秘钥文件的属主与用户组

ssh root@compute01 chown cinder:cinder /etc/ceph/ceph.client.cinder.keyring
ssh root@compute02 chown cinder:cinder /etc/ceph/ceph.client.cinder.keyring
    4、推送client.cinder秘钥(nova-compute)

   这里nova-compute服务与nova-volume服务运行在相同节点,不必重复操作

    5、libvirt秘钥 

  nova-compute所在节点需要将client.cinder用户的秘钥文件存储到libvirt中;当基于ceph后端的cinder卷被attach到虚拟机实例时,libvirt需要用到该秘钥以访问ceph集群;

  在管理节点向计算(存储)节点推送client.cinder秘钥文件,生成的文件是临时性的,将秘钥添加到libvirt后可删除

ceph auth get-key client.cinder | ssh root@compute01 tee /etc/ceph/client.cinder.key
ceph auth get-key client.cinder | ssh root@compute02 tee /etc/ceph/client.cinder.key

  在计算(存储)节点将秘钥加入

  1. 首先生成1个uuid,全部计算(存储)节点可共用此uuid(其他节点不用操作)
  2. uuid后续配置nova.conf文件时也会用到,请保持一致。
[root@compute01 ~]# uuidgen
d6addd93-c7ba-43e3-a9dd-ee53677cbd2c

  添加秘钥

cat>/etc/ceph/secret.xml<<EOF
<secret ephemeral='no' private='no'>
  <uuid>d6addd93-c7ba-43e3-a9dd-ee53677cbd2c</uuid>
  <usage type='ceph'>
    <name>client.cinder secret</name>
  </usage>
</secret>
EOF

virsh secret-define --file /etc/ceph/secret.xml
virsh secret-set-value --secret d6addd93-c7ba-43e3-a9dd-ee53677cbd2c  --base64 $(cat /etc/ceph/client.cinder.key)

  

  扩展知识:

  virsh命令详解:virsh 命令_virsh nodesuspend --help csdn-CSDN博客

                         http://virtual.51cto.com/art/201611/520859.htm

  二)glance集成ceph

  控制节点操作

  1、配置glance-api.conf

  在运行glance-api服务的节点修改glance-api.conf文件,含3个控制节点,以controller01节点为例

  以下只列出涉及glance集成ceph的section

     1、修改glance的配置文件

  vim /etc/glance/glance-api.conf

# 打开copy-on-write功能
[DEFAULT]
show_image_direct_url = True

# 变更默认使用的本地文件存储为ceph rbd存储;
# 注意红色字体部分前后一致
[glance_store]
#stores = file,http
#default_store = file
#filesystem_store_datadir = /var/lib/glance/images/
stores = rbd
default_store = rbd
rbd_store_chunk_size = 8
rbd_store_pool = images
rbd_store_user = glance
rbd_store_ceph_conf = /etc/ceph/ceph.conf
    2、变更配置文件,重启服务
systemctl restart openstack-glance-api.service
systemctl restart openstack-glance-registry.service

systemctl status openstack-glance-api.service openstack-glance-registry.service
  2、上传镜像

  镜像上传后,默认地址为ceph集群(ID)的images pool下

openstack image create "cirros-qcow2" \
 --file ~/cirros-0.3.5-x86_64-disk.img \
 --disk-format qcow2 --container-format bare \
 --public

  

  检查镜像是否存在

[root@controller01 ~]# rbd ls images
bb8ab915-4ba0-4d6b-b8e8-52a4de601bff
  3、定义pool类型

  控制节点操作

    1、images启用后,ceph集群状态变为HEALTH_WARN
[root@controller01 ~]# ceph -s
  cluster:
    id:     7e861d4a-a9ea-46e2-b272-89025cda8ca9
    health: HEALTH_WARN
            application not enabled on 1 pool(s)
 
  services:
    mon: 3 daemons, quorum controller03,controller01,controller02
    mgr: controller01_mgr(active), standbys: controller03_mgr, controller02_mgr
    osd: 6 osds: 6 up, 6 in
 
  data:
    pools:   3 pools, 384 pgs
    objects: 8 objects, 12.7MiB
    usage:   6.05GiB used, 77.9GiB / 84.0GiB avail
    pgs:     384 active+clean
 
  io:
    client:   0B/s rd, 0op/s rd, 0op/s wr
    2、使用”ceph health detail”,能给出解决办法;

  未定义pool池类型,可定义为'cephfs', 'rbd', 'rgw'等

[root@controller01 ~]# ceph health detail
HEALTH_WARN application not enabled on 1 pool(s)
POOL_APP_NOT_ENABLED application not enabled on 1 pool(s)
    application not enabled on pool 'images'
    use 'ceph osd pool application enable <pool-name> <app-name>', where <app-name> is 'cephfs', 'rbd', 'rgw', or freeform for custom applications.
    3、同时解决volumes与vms两个pool的问题
ceph osd pool application enable images rbd
ceph osd pool application enable volumes rbd
ceph osd pool application enable vms rbd

  

    4、查看各个pool中的application
[root@controller01 ~]# ceph health detail
HEALTH_OK

  查看各个pool中的application

ceph osd pool application get images
ceph osd pool application get volumes
ceph osd pool application get vms

  

  三)Cinder集成Ceph

  1、配置cinder.conf
  • cinder利用插件式结构,支持同时使用多种后端存储;
  • 在cinder-volume所在节点设置cinder.conf中设置相应的ceph rbd驱动即可;

  在存储节点操作

    1、修改配置文件,以下只列出涉及cinder集成ceph的section

   vim /etc/cinder/cinder.conf

# 后端使用ceph存储
[DEFAULT]
enabled_backends = ceph

# 新增[ceph] section;
# 注意红色字体部分前后一致
[ceph]
# ceph rbd驱动
volume_driver = cinder.volume.drivers.rbd.RBDDriver
rbd_pool = volumes
rbd_ceph_conf = /etc/ceph/ceph.conf
rbd_flatten_volume_from_snapshot = true
rbd_max_clone_depth = 5
rbd_store_chunk_size = 4
rados_connect_timeout = -1
# 如果配置多后端,则“glance_api_version”必须配置在[DEFAULT] section
glance_api_version = 2
rbd_user = cinder
rbd_secret_uuid = d6addd93-c7ba-43e3-a9dd-ee53677cbd2c
volume_backend_name = ceph
    2、变更配置文件后重启服务

  启动块存储卷服务,并查看服务状态

systemctl restart openstack-cinder-volume.service 
systemctl status openstack-cinder-volume.service
  2、验证

  在控制节点验证

  查看cinder服务状态,cinder-volume集成ceph后,状态为“up”

. admin-openrc
方法一:
cinder service-list

方法二:
openstack volume service list

   执行结果如下

[root@controller01 ~]# openstack volume service list
+------------------+----------------+------+---------+-------+----------------------------+
| Binary           | Host           | Zone | Status  | State | Updated At                 |
+------------------+----------------+------+---------+-------+----------------------------+
| cinder-scheduler | controller01   | nova | enabled | up    | 2018-09-19T05:00:20.000000 |
| cinder-scheduler | controller03   | nova | enabled | up    | 2018-09-19T05:00:23.000000 |
| cinder-scheduler | controller02   | nova | enabled | up    | 2018-09-19T05:00:19.000000 |
| cinder-volume    | compute01@ceph | nova | enabled | up    | 2018-09-19T05:00:19.000000 |
| cinder-volume    | compute02@ceph | nova | enabled | up    | 2018-09-19T05:00:21.000000 |
[root@controller01 ~]# cinder service-list
+------------------+----------------+------+---------+-------+----------------------------+-----------------+
| Binary           | Host           | Zone | Status  | State | Updated_at                 | Disabled Reason |
+------------------+----------------+------+---------+-------+----------------------------+-----------------+
| cinder-scheduler | controller01   | nova | enabled | up    | 2018-09-19T04:39:59.000000 | -               |
| cinder-scheduler | controller02   | nova | enabled | up    | 2018-09-19T04:39:59.000000 | -               |
| cinder-scheduler | controller03   | nova | enabled | up    | 2018-09-19T04:40:02.000000 | -               |
| cinder-volume    | compute01@ceph | nova | enabled | up    | 2018-09-19T04:39:59.000000 | -               |
| cinder-volume    | compute02@ceph | nova | enabled | up    | 2018-09-19T04:40:01.000000 | -               |
  3、生成volume
    1、设置卷类型

  在任意控制节点为cinder的ceph后端存储创建对应的type,在配置多存储后端时可区分类型;

  可通过“cinder type-list”查看

[root@controller01 ~]# cinder type-create ceph
+--------------------------------------+------+-------------+-----------+
| ID                                   | Name | Description | Is_Public |
+--------------------------------------+------+-------------+-----------+
| 406ee6a7-9e8f-49c4-b476-f475ab6f4749 | ceph | -           | True      |
+--------------------------------------+------+-------------+-----------+

  为ceph type设置扩展规格,键值” volume_backend_name”,value值”ceph”

[root@controller01 ~]# cinder type-key ceph set volume_backend_name=ceph
[root@controller01 ~]# cinder extra-specs-list
+--------------------------------------+------+---------------------------------+
| ID                                   | Name | extra_specs                     |
+--------------------------------------+------+---------------------------------+
| 406ee6a7-9e8f-49c4-b476-f475ab6f4749 | ceph | {'volume_backend_name': 'ceph'} |
+--------------------------------------+------+---------------------------------+
    2、生成volume

  生成volume:最后的数字”1”代表容量为1G

cinder create --volume-type ceph --name ceph-volume1 1

  

  检查生成的volume

方法一:
cinder list
方法二:
openstack volume list

  

  检查ceph集群的volumes pool

rbd ls volumes

   

  四)Nova集成Ceph

  1、配置ceph.conf
  • 如果需要从ceph rbd中启动虚拟机,必须将ceph配置为nova的临时后端;
  • 推荐在计算节点的配置文件中启用rbd cache功能;
  • 为了便于故障排查,配置admin socket参数,这样每个使用ceph rbd的虚拟机都有1个socket将有利于虚拟机性能分析与故障解决;

  相关配置只涉及全部计算节点ceph.conf文件的[client]与[client.cinder]字段,以compute01节点为例

    1、更改配置文件

  vim /etc/ceph/ceph.conf

[client]
rbd cache = true
rbd cache writethrough until flush = true
admin socket = /var/run/ceph/guests/$cluster-$type.$id.$pid.$cctid.asok
log file = /var/log/qemu/qemu-guest-$pid.log
rbd concurrent management ops = 20

[client.cinder]
keyring = /etc/ceph/ceph.client.cinder.keyring
    2、创建ceph.conf文件中指定的socker与log相关的目录,并更改属主
mkdir -p /var/run/ceph/guests/ /var/log/qemu/
chown qemu:libvirt /var/run/ceph/guests/ /var/log/qemu/ 
  2、配置nova.conf

  在全部计算节点配置nova后端使用ceph集群的vms池,以compute01节点为例

    1、修改配置

  vim /etc/nova/nova.conf

[libvirt]
images_type = rbd
images_rbd_pool = vms
images_rbd_ceph_conf = /etc/ceph/ceph.conf
rbd_user = cinder
# uuid前后一致
rbd_secret_uuid = d6addd93-c7ba-43e3-a9dd-ee53677cbd2c
disk_cachemodes="network=writeback"
live_migration_flag="VIR_MIGRATE_UNDEFINE_SOURCE,VIR_MIGRATE_PEER2PEER,VIR_MIGRATE_LIVE,VIR_MIGRATE_PERSIST_DEST,VIR_MIGRATE_TUNNELLED"
# 禁用文件注入
inject_password = false
inject_key = false
inject_partition = -2
# 虚拟机临时root磁盘discard功能,”unmap”参数在scsi接口类型磁盘释放后可立即释放空间
hw_disk_discard = unmap
# 通过“egrep -c '(vmx|svm)' /proc/cpuinfo”命令查看主机是否支持硬件加速,返回1或者更大的值表示支持,返回0表示不支持;
# # 支持硬件加速使用”kvm”类型,不支持则使用”qemu”类型;
# # 一般虚拟机不支持硬件加速
# 原有配置
virt_type=kvm
    2、重启服务
systemctl restart libvirtd.service
systemctl restart openstack-nova-compute.service
systemctl status libvirtd.service openstack-nova-compute.service 
  3、配置live-migration
    1、修改/etc/libvirt/libvirtd.conf

  在全部计算节点操作

  注意:根据不同主机,将监听地址改成对应的IP地址

  egrep -vn "^$|^#" /etc/libvirt/libvirtd.conf 

# 取消以下三行的注释
22:listen_tls = 0
33:listen_tcp = 1
45:tcp_port = "16509"
# 取消注释,并修改监听端口
55:listen_addr = "10.20.9.46"
# 取消注释,同时取消认证
158:auth_tcp = "none" 
    2、修改/etc/sysconfig/libvirtd

   在全部计算节点操作

  egrep -vn "^$|^#" /etc/sysconfig/libvirtd

# 取消注释
9:LIBVIRTD_ARGS="--listen" 
    3、设置防火墙iptables
  • live-migration时,源计算节点主动连接目的计算节点tcp16509端口,可以使用”virsh -c qemu+tcp://{node_ip or node_name}/system”连接目的计算节点测试;
  • 迁移前后,在源目计算节点上的被迁移instance使用tcp49152~49161端口做临时通信;
  • 因虚拟机已经启用iptables相关规则,此时切忌随意重启iptables服务,尽量使用插入的方式添加规则;
  • 同时以修改配置文件的方式写入相关规则,切忌使用”iptables saved”命令;

  在全部计算节点操作(若开了防火墙,需要设置)

iptables -I INPUT -p tcp -m state --state NEW -m tcp --dport 16509 -j ACCEPT
iptables -I INPUT -p tcp -m state --state NEW -m tcp --dport 49152:49161 -j ACCEPT 
    4、重启服务

  libvirtd与nova-compute服务都需要重启

systemctl restart libvirtd.service
systemctl restart openstack-nova-compute.service

systemctl status libvirtd.service openstack-nova-compute.service
netstat -tunlp | grep 16509 
  4、验证

  在任意控制节点操作

  如果使用ceph提供的volume做启动盘,即虚拟机运行镜像文件存放在共享存储上,此时可以方便地进行live-migration。

    1、创建基于ceph存储的bootable存储卷

  当nova从rbd启动instance时,镜像格式必须是raw格式,否则虚拟机在启动时glance-api与cinder均会报错;

  首先进行格式转换,将*.img文件转换为*.raw文件(这个没有返回值,执行完在指定的目录下生成指定格式的文件)

qemu-img convert -f qcow2 -O raw ~/cirros-0.3.5-x86_64-disk.img ~/cirros-0.3.5-x86_64-disk.raw

  生成raw格式镜像

openstack image create "cirros-raw" \
--file ~/cirros-0.3.5-x86_64-disk.raw \
--disk-format raw --container-format bare \
--public 

  

  使用新镜像创建bootable卷(注意image-id根据自己的做出更改)

cinder create --image-id 93e3535c-09dd-4095-82fc-69a1125ae3f9 --volume-type ceph --name ceph-bootable1 2

 #查看新创建的bootable卷

cinder list 

  从基于ceph后端的volumes新建实例;
  “--boot-volume”指定具有”bootable”属性的卷,启动后,虚拟机运行在volumes卷

[root@controller01 ~]# nova boot --flavor m1.tiny \
 --boot-volume db0f83c0-14f7-4548-8807-4b1f593630a4 \
 --nic net-id=91e78b9c-cfcd-4af2-851a-a27839edf571 \
 --security-group default \
 cirros-cephvolumes-instance1 
    2、从ceph rbd启动虚拟机(命令行创建实例)

   --nic:net-id指网络id,非subnet-id;

  最后“cirros-cephrbd-instance1”为instance名

nova boot --flavor m1.tiny --image cirros-raw --nic net-id=91e78b9c-cfcd-4af2-851a-a27839edf571 --security-group default cirros-cephrbd-instance1

  查询生成的instance

nova list 

  查看生成的instance的详细信息

nova show 7648251c-62a1-4f98-ba3f-e5f30f5804b4 

  验证是否从ceph rbd启动

rbd ls vms 
    3、对rbd启动的虚拟机进行live-migration

  使用”nova show 7648251c-62a1-4f98-ba3f-e5f30f5804b4”得知从rbd启动的instance在迁移前位于compute02节点;
  或使用”nova hypervisor-servers compute02”进行验证;

nova live-migration cirros-cephrbd-instance1 compute01

  迁移过程中可查看状态

nova list 

  迁移完成后,查看instacn所在节点;
  或使用”nova show 7648251c-62a1-4f98-ba3f-e5f30f5804b4”命令查看”hypervisor_hostname”

nova hypervisor-servers compute02
nova hypervisor-servers compute0

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

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

相关文章

开放式耳机哪种好用又实用?五款爆火单品推荐

现在市面上的开放式耳机真的参差不齐&#xff0c;而且想要挑选到一款适合自己的开放式耳机&#xff0c;那真的很难&#xff0c;要做很多功课&#xff0c;现在购物就像是在大海捞针一样&#xff0c;所以我们该怎么挑选才能选到一款适合自己的开放式耳机呢&#xff1f;这个问题相…

数据库原理面试-核心概念-问题理解

目录 1.数据库、数据库系统与数据库管理系统 2.理解数据独立性 3.数据模型 4.模式、外模式和内模式 5.关系和关系数据库 6.主键与外键 7.SQL语言 8.索引与视图 9.数据库安全 10.数据库完整性 11.数据依赖和函数依赖 12.范式&#xff1f;三范式&#xff1f;为什么要遵…

Java基础11:JavaDoc生成文档

本节内容教学视频连接&#xff1a;https://www.bilibili.com/video/BV12J41137hu?p32&vd_sourceb5775c3a4ea16a5306db9c7c1c1486b5https://www.bilibili.com/video/BV12J41137hu?p32&vd_sourceb5775c3a4ea16a5306db9c7c1c1486b5 1.什么是JavaDoc&#xff1f; Javado…

双向重发布实验

要求&#xff1a; 1. 如图搭建网络拓扑&#xff0c;所有路由器各自创建一个环回接 口&#xff0c;合理规划 IP 地址 2.R1-R2-R3-R4-R6 之间使用 OSPF 协议&#xff0c; R4-R5-R6 之间使用 RIP 协议 3.R1 环回重发布方式引入 OSPF 网络 4.R4/R6 上进行双点双向重发布 5. …

开发效率翻倍攻略!大学生电脑小白管理秘籍,资料秒搜技巧大公开!C盘满了怎么办?如何快速安全的清理C盘?烦人的电脑问题?一键解决!

如何正确管理自己的第一台电脑&#xff1f;大一新生如何管理自己的电脑&#xff1f;老鸟如何追求快捷操作电脑&#xff1f; 文章目录 如何正确管理自己的第一台电脑&#xff1f;大一新生如何管理自己的电脑&#xff1f;老鸟如何追求快捷操作电脑&#xff1f;前言初级基础分区操…

我开源了一个新项目! Product Hunt 每日中文热榜

Product Hunt 每日中文热榜 大家好&#xff0c;今天非常兴奋地与大家分享一个我刚刚开源的新项目 —— producthunt-daily-hot。这个项目从构思到实现仅花了 1 天时间&#xff0c;希望对大家有所帮助。Product Hunt 每日热榜 已上线&#xff0c;榜单会在每天下午 4 点自动更新…

学习记录——day30 网络编程 端口号port 套接字socket TCP实现网络通信

目录 一、端口号 port 二、套接字 socket 1、原理 2、socket函数介绍 三、TCP实现网络通信 1、原理 2、TCP通信原理图 3、TCP相关函数 1&#xff09;bind 绑定 2&#xff09;listen 监听 3&#xff09;accept 接收连接请求 4&#xff09;recv 接收 5&#xff09;sen…

GitHub的常用操作

目录 GitHub GitHub加速 克隆GitHub上的项目到本地 克隆GitHub上指定分支的项目 把本地项目上传到GitHub上管理 删除分支里的内容 单个仓库管理多个项目 上传项目到新建的分支 目前正在逐步熟悉GitHub&#xff0c;打算把整理好的代码上传到GitHub上&#xff0c;建立属…

EasyRecovery17中文版本重磅发布更新!带你三分钟了最新功能

“你到底删了我什么&#xff1f;&#xff1f;” “我只是把聊天记录清理了下……” “你知不知道里面还有我发你的工作资料啊&#xff01;&#xff01;” …… 每当听到这种对话&#xff0c;我就知道又有人因为删错文件而和另一半/同事/领导吵起来了。 毕竟在这个手机电脑不离手…

超声波清洗机哪个牌子好?四款公认最好的超声波清洗机分享

随着生活水平的提高&#xff0c;人们对于生活有了更高的要求&#xff0c;而我们平时经常使用的一些小产品也要经常清理保持干净&#xff0c;所以针对于这些小产品&#xff0c;超声波清洁机应运而生。超声波清洗机&#xff0c;可能很多小伙伴见过或者使用过&#xff0c;它主要利…

多模态大语言模型的免训练视觉提示学习 ControlMLLM

ControlMLLM: Training-Free Visual Prompt Learning for Multimodal Large Language Models github paper 在本研究中&#xff0c;提出了一种无需进行训练的方法&#xff0c;通过可学习的潜变量优化将视觉提示注入到多模态大型语言模型&#xff08;MLLMs&#xff09;中。 在…

PPSSPP Gold 1.17 psp模拟器黄金版最新免费修改版

这是您在安卓设备上体验原汁原味PSP游戏魅力的最佳选择——唯一正版的PSP模拟器。借助它&#xff0c;您可以在高清画质下畅玩PSP游戏&#xff0c;并享受额外的功能特性。大多数游戏都能流畅运行&#xff0c;不过具体表现还需视您的设备性能而定&#xff0c;部分游戏可能无法达到…

【数据结构与算法】哈希表——字符串匹配

目录 一.引入二.哈希表结构三.SDBMHash算法(字符->数字)★四.哈希表的算法实现1.哈希函数2.初始化3.查找4.插入5.删除6.获取数据7.销毁 五.完整代码1.头文件2.源文件3.运行结果 一.引入 原来我们讲的都是以整数作为关键码,那么我们可不可以用字符串来作为关键码呢? 有的时…

如何选择适合自己的编程语言,为什么R是非计算机专业数据分析的最佳选择,五大点告诉你

在如今的数据驱动世界中&#xff0c;编程语言已成为希望在行业中进行数据分析的专业人士不可或缺的技能。对于非计算机专业背景的学者和学生来说&#xff0c;选择适合自己的编程语言可能看似困难。本文将探讨为什么对于那些需要进行本科生论文、研究生论文、或者发表学术成果的…

4款伪原创文章生成器软件,为创作者在线生成原创文章

在当今内容创作需求旺盛的时代&#xff0c;创作者们常常面临着时间紧迫、灵感枯竭等挑战。而伪原创文章生成器软件的出现&#xff0c;为创作者们提供了一定的帮助。以下将为你详细介绍4款具有特色的伪原创文章生成器软件。 1、智媒ai伪原创工具 对于创作者来说&#xff0c;这款…

redis模块和ioredis的注意事项

redis模块和ioredis的注意事项 文章目录 redis模块和ioredis的注意事项前言一、ioredis和redis使用zrange的比较二、出现zrange结果不同的原因总结 前言 node.js在使用redis的时候有两个库可以选择&#xff0c;一个是redis、另一个是ioredis&#xff0c;我一直以来也没有太大关…

小红书js逆向x-s之补环境

请求参数分析 数据文件在homefeed里&#xff0c;直接复制header参数在Convert curl commands 生成python代码跑一下 &#xff08;注意curlconverter生成的respond的输入参数里有一个是json&#xff0c;这个是不对的&#xff0c;需要改为data&#xff09; 结果发现报错&…

netcore-https证书配置

一、新建项目&#xff1a;WebHtpsDemo 二、生成pfx证书 拷贝到项目中 三、修改配置文件appsettings.Development.json {"KestrelSettings": {"IP": "192.168.31.68","Port": 8189,"CerPath": "xxxCert.pfx",&qu…

“艾”公益——微笑行动「文山站」为艾祝福,让笑起舞

艾多美“微笑行动”文山站拉开帷幕 此次爱心帮助71名唇腭裂患儿 重新绽放微笑 ♥ ♥ ♥ 不让笑容留有缺憾 每个孩子都有微笑的权利 艾多美向唇腭裂儿童伸出援手 绽放笑容&#xff0c;拥抱全新的未来 2024年8月6日-8月12日&#xff0c;云南省文山康复医院迎来了艾多美--微笑行动…

C语言典型例题35

《C程序设计教程&#xff08;第四版&#xff09;——谭浩强》 例题3.3 有一函数&#xff1a;y{-1&#xff08;x<0&#xff09;;0(x0);1(x>0);编程序&#xff0c;要求输入一个x值后&#xff0c;输出y值。 代码&#xff1a; //《C程序设计教程&#xff08;第四版&#xff…