增量导入导出要基于快照

导出的过程当中害怕镜像被修改所以打快照。快照的数据是不会变化的

镜像级别的双向同步

镜像主到备,备到主。一对一 就算是池模式的双向同步,镜像也具有主备关系

双向同步,池模式

[root@clienta ~]# ceph osd pool create rbd
pool 'rbd' created
[root@clienta ~]# rbd pool init rbd
[root@clienta ~]# ceph orch apply rbd-mirror --placement=serverc.lab.example.com
Scheduled rbd-mirror update...
[root@clienta ~]# [root@serverf ~]# ceph osd pool create rbd
pool 'rbd' created
[root@serverf ~]# rbd pool init rbd
[root@serverf ~]# ceph orch apply rbd-mirror --placement=serverf.lab.example.com
Scheduled rbd-mirror update...
[root@serverf ~]#
一个集群任意一个节点安装rbd-mirror就行了 [root@serverf ~]# rbd mirror pool enable rbd pool
[root@serverf ~]# [root@clienta ~]# rbd mirror pool enable rbd pool
[root@clienta ~]#
两边开启池模式 [root@clienta ~]# rbd mirror pool peer bootstrap create --site-name prod rbd > /root/prod
[root@clienta ~]# scp /root/prod root@serverf:~
Warning: Permanently added 'serverf,172.25.250.15' (ECDSA) to the list of known hosts.
prod 100% 253 20.1KB/s 00:00 [root@serverf ~]# rbd mirror pool peer bootstrap create --site-name bup rbd > /root/bup
[root@serverf ~]# scp /root/bup root@clienta:~
Warning: Permanently added 'clienta,172.25.250.10' (ECDSA) to the list of known hosts.
bup 100% 253 8.0KB/s 00:00 [root@serverf ~]# rbd mirror pool peer bootstrap import --site-name bup rbd /root/prod
2022-08-15T11:49:25.186-0400 7f2c0ba292c0 -1 auth: unable to find a keyring on /etc/ceph/..keyring,/etc/ceph/.keyring,/etc/ceph/keyring,/etc/ceph/keyring.bin,: (2) No such file or directory
2022-08-15T11:49:25.202-0400 7f2c0ba292c0 -1 auth: unable to find a keyring on /etc/ceph/..keyring,/etc/ceph/.keyring,/etc/ceph/keyring,/etc/ceph/keyring.bin,: (2) No such file or directory
2022-08-15T11:49:25.202-0400 7f2c0ba292c0 -1 auth: unable to find a keyring on /etc/ceph/..keyring,/etc/ceph/.keyring,/etc/ceph/keyring,/etc/ceph/keyring.bin,: (2) No such file or directory

(这个import导入,做一边就可以,也就是可以省一个scp步骤。还是建议在serverf这里做import)

两个集群建立联系,知晓对方信息

[root@clienta ~]# rbd mirror pool info rbd
Mode: pool
Site Name: prod Peer Sites: UUID: db75b9df-3aad-4d96-9a18-071274e6ca41
Name: bup
Mirror UUID: 5b2135ab-a90a-490f-9e39-7e2d059740f5
Direction: rx-tx
Client: client.rbd-mirror-peer
[root@clienta ~]# [root@serverf ~]# rbd mirror pool info rbd
Mode: pool
Site Name: bup Peer Sites: UUID: 0d1b536e-6e83-49e4-aa9d-2dc4928607be
Name: prod
Mirror UUID: ca13dd9d-79b6-4614-aa5f-c4c8cb300396
Direction: rx-tx
Client: client.rbd-mirror-peer
[root@serverf ~]# [root@clienta ~]# rbd mirror pool status
health: WARNING
daemon health: OK
image health: WARNING
images: 0 total

查看两个池状态。

[root@serverf ~]# rbd create image4 --size 1024 --pool rbd --image-feature exclusive-lock,journaling
[root@serverf ~]# rbd info image4
rbd image 'image4':
size 1 GiB in 256 objects
order 22 (4 MiB objects)
snapshot_count: 0
id: ac7a80f965cd
block_name_prefix: rbd_data.ac7a80f965cd
format: 2
features: exclusive-lock, journaling
op_features:
flags:
create_timestamp: Mon Aug 15 12:01:42 2022
access_timestamp: Mon Aug 15 12:01:42 2022
modify_timestamp: Mon Aug 15 12:01:42 2022
journal: ac7a80f965cd
mirroring state: enabled
mirroring mode: journal
mirroring global id: c3cb1983-508e-4d6c-a2a1-87a04c5cae7b
mirroring primary: true [root@clienta ~]# rbd ls
image1
image2
image4
[root@clienta ~]# rbd info image4
rbd image 'image4':
size 1 GiB in 256 objects
order 22 (4 MiB objects)
snapshot_count: 0
id: fafc8a70d31d
block_name_prefix: rbd_data.fafc8a70d31d
format: 2
features: exclusive-lock, journaling
op_features:
flags:
create_timestamp: Mon Aug 15 12:01:45 2022
access_timestamp: Mon Aug 15 12:01:45 2022
modify_timestamp: Mon Aug 15 12:01:45 2022
journal: fafc8a70d31d
mirroring state: enabled
mirroring mode: journal
mirroring global id: c3cb1983-508e-4d6c-a2a1-87a04c5cae7b
mirroring primary: false
[root@clienta ~]#

在备集群创建镜像,主集群同步

镜像的1对1同步,被同步为false

报错

[root@clienta ~]# rbd mirror pool status
health: WARNING
daemon health: OK
image health: WARNING
images: 8 total
7 unknown
1 replaying 这个错误会让池子变为单向同步,很致命。会报超时。

过程整理

主集群操作
ceph osd pool create rbd
rbd pool init rbd
rbd mirror pool enable rbd pool # 开启池模式同步
ceph orch apply rbd-mirror --placement=serverf.lab.example.com #安装rbd mirror rbd mirror pool peer bootstrap create --site-name prod rbd > /root/prod
rsycn prod root@serverf:~ 备集群操作
ceph osd pool create rbd
rbd pool init rbd
rbd mirror pool enable rbd pool
ceph orch apply rbd-mirror --placement=serverf.lab.example.com #安装rbd mirror
rbd mirror pool peer bootstrap import --site-name bup rbd /root/prod
rbd ls 测试:
在prod和bup集群上各自创建镜像,可以互相同步
rbd create image1 --size 1024 --pool rbd --image-feature exclusive-lock,journaling #创建镜像,开启排他锁和日志功能

主备镜像切换

rbd mirror image demote test1 降级 (备)

rbd mirror image promote test1 升级 (主)

先降级

以前的osd都有xfs文件系统 (filestore)



现在bluestore osd都以逻辑卷的形式作为存储。在裸盘上,未被格式化

对象存储

mon 拥有用户数据,存储池信息,和osd信息。mon与mon之间也会数据同步

mgr 主备部署,可以实现dashboard web服务,可与监控工具对接(收集osd信息,数据统计)

rgw 可以提供web服务,并提供s3 swift接口

rgw对ceph来说为客户端,只要是客户端就要做认证

官方部署文档位置

https://access.redhat.com/documentation/en-us/red_hat_ceph_storage/5/html/object_gateway_guide/deployment#deploying-the-ceph-object-gateway-using-the-command-line-interface_rgw

删除原有rgw

[student@workstation ~]$ lab start  object-radosgw

部署rgw

serverc serverd

两个都 8080 端口 (主备)

[root@clienta ~]# radosgw-admin realm list
{
"default_info": "",
"realms": []
}
[root@clienta ~]# radosgw-admin zonegroup list
{
"default_info": "1dd3f8b5-a9f5-4930-a9f0-62cce8d81e9e",
"zonegroups": [
"default"
]
}
[root@clienta ~]# radosgw-admin zone list
{
"default_info": "8b63d584-9ea1-4cf3-8443-a6a15beca943",
"zones": [
"default"
]
}
[root@clienta ~]#

创建一个realm,设置成默认的realm

[root@clienta ~]# radosgw-admin realm create --rgw-realm=myrealm --default
{
"id": "ddfa65f0-ee1e-4233-b88e-2e5f96faa5ec",
"name": "myrealm",
"current_period": "e19e92b1-9b91-4726-8151-a943f6b650fc",
"epoch": 1
}
[root@clienta ~]# radosgw-admin realm list
{
"default_info": "ddfa65f0-ee1e-4233-b88e-2e5f96faa5ec",
"realms": [
"myrealm"
]
}
[root@clienta ~]#

创建zonegroup 指定realm

    [root@clienta ~]# radosgw-admin zonegroup create --rgw-realm=myrealm --rgw-zonegroup=myzonegroup --master  --default
{
"id": "4bbf15ed-56bb-4bc7-b30e-e70d3b5f2055",
"name": "myzonegroup",
"api_name": "myzonegroup",
"is_master": "true",
"endpoints": [],
"hostnames": [],
"hostnames_s3website": [],
"master_zone": "",
"zones": [],
"placement_targets": [],
"default_placement": "",
"realm_id": "ddfa65f0-ee1e-4233-b88e-2e5f96faa5ec",
"sync_policy": {
"groups": []
}
}
[root@clienta ~]# radosgw-admin realm list
{
"default_info": "ddfa65f0-ee1e-4233-b88e-2e5f96faa5ec",
"realms": [
"myrealm"
]
}
[root@clienta ~]#
id与realm的对应上了

创建zone 指定realm与zonegroup

[root@clienta ~]# radosgw-admin zone create --rgw-realm=myrealm  --rgw-zonegroup=myzonegroup --rgw-zone=myzone  --master  --default
{
"id": "e4a0f422-74de-4c1b-b6f9-1dce56607795",
"name": "myzone",
"domain_root": "myzone.rgw.meta:root",
"control_pool": "myzone.rgw.control",
"gc_pool": "myzone.rgw.log:gc",
"lc_pool": "myzone.rgw.log:lc",
"log_pool": "myzone.rgw.log",
"intent_log_pool": "myzone.rgw.log:intent",
"usage_log_pool": "myzone.rgw.log:usage",
"roles_pool": "myzone.rgw.meta:roles",
"reshard_pool": "myzone.rgw.log:reshard",
"user_keys_pool": "myzone.rgw.meta:users.keys",
"user_email_pool": "myzone.rgw.meta:users.email",
"user_swift_pool": "myzone.rgw.meta:users.swift",
"user_uid_pool": "myzone.rgw.meta:users.uid",
"otp_pool": "myzone.rgw.otp",
"system_key": {
"access_key": "",
"secret_key": ""
},
"placement_pools": [
{
"key": "default-placement",
"val": {
"index_pool": "myzone.rgw.buckets.index",
"storage_classes": {
"STANDARD": {
"data_pool": "myzone.rgw.buckets.data"
}
},
"data_extra_pool": "myzone.rgw.buckets.non-ec",
"index_type": 0
}
}
],
"realm_id": "ddfa65f0-ee1e-4233-b88e-2e5f96faa5ec",
"notif_pool": "myzone.rgw.log:notif"
}
[root@clienta ~]#

提交修改。备集群做同步时,你改了提交了,备集群就知道要同步了

[root@clienta ~]# radosgw-admin period update  --rgw-realm=myrealm --commit
结果太长了省略

创建rgw

[root@clienta ~]# ceph orch apply rgw mqy --realm=myrealm  --zone=myzone --placement="2 serverc.lab.example.com serverd.lab.example.com"  --port=8080
Scheduled rgw.mqy update...

查验

ceph orch ps
rgw.mqy.serverc.xmynyy serverc.lab.example.com running (10s) 1s ago 10s *:8080 16.2.0-117.el8cp 2142b60d7974 c656e4a3f1ba
rgw.mqy.serverd.soqmhn serverd.lab.example.com running (24s) 3s ago 24s *:8080 16.2.0-117.el8cp 2142b60d7974 8e326dbbe1c9
[root@clienta ~]# [root@clienta ~]# ceph auth ls | grep rgw
installed auth entries:
client.bootstrap-rgw
caps: [mon] allow profile bootstrap-rgw
client.rgw.mqy.serverc.xmynyy
caps: [osd] allow rwx tag rgw *=*
client.rgw.mqy.serverd.soqmhn
caps: [osd] allow rwx tag rgw *=*
[root@clienta ~]#

访问一下

[root@clienta ~]# curl http://serverc.lab.example.com:8080
<?xml version="1.0" encoding="UTF-8"?><ListAllMyBucketsResult xmlns="http://s3.amazonaws.com/doc/2006-03-01/"><Owner><ID>anonymous</ID><DisplayName></DisplayName></Owner><Buckets></Buckets></ListAllMyBucketsResult>[root@clienta ~]#

查看服务

[root@clienta ~]#
[root@clienta ~]# ceph orch ls
NAME RUNNING REFRESHED AGE PLACEMENT
alertmanager 1/1 4m ago 10M count:1
crash 4/4 7m ago 10M *
grafana 1/1 4m ago 10M count:1
mgr 4/4 7m ago 10M clienta.lab.example.com;serverc.lab.example.com;serverd.lab.example.com;servere.lab.example.com
mon 4/4 7m ago 10M clienta.lab.example.com;serverc.lab.example.com;serverd.lab.example.com;servere.lab.example.com
node-exporter 4/4 7m ago 10M *
osd.default_drive_group 9/12 7m ago 10M server*
prometheus 1/1 4m ago 10M count:1
rgw.mqy 2/2 4m ago 4m serverc.lab.example.com;serverd.lab.example.com;count:2

删除服务

[root@clienta ~]# ceph orch rm rgw.mqy
Removed service rgw.mqy

2/2都会被删掉

ceph orch ps 查看进程

进程也会没有

再次创建

placement为数量

这个命令可以动态修改

[root@clienta ~]# ceph orch apply rgw mqy --realm=myrealm  --zone=myzone --placement="4 serverc.lab.example.com serverd.lab.example.com"  --port=8080

查验

[root@clienta ~]# ceph orch ps | tail
osd.4 servere.lab.example.com running (74m) 46s ago 9M - 16.2.0-117.el8cp 2142b60d7974 1b89696479d7
osd.5 serverd.lab.example.com running (74m) 3s ago 9M - 16.2.0-117.el8cp 2142b60d7974 a00346d7b07b
osd.6 servere.lab.example.com running (74m) 46s ago 9M - 16.2.0-117.el8cp 2142b60d7974 ef718e21063d
osd.7 serverd.lab.example.com running (74m) 3s ago 9M - 16.2.0-117.el8cp 2142b60d7974 463646452da7
osd.8 servere.lab.example.com running (74m) 46s ago 9M - 16.2.0-117.el8cp 2142b60d7974 ba2977e9530e
prometheus.serverc serverc.lab.example.com running (74m) 2s ago 10M *:9095 2.22.2 deca4dcb80bb d63e1b8d813e
rgw.mqy.serverc.gddkwr serverc.lab.example.com running (11s) 2s ago 11s *:8081 16.2.0-117.el8cp 2142b60d7974 d550e449cd72
rgw.mqy.serverc.svktdz serverc.lab.example.com running (23s) 2s ago 23s *:8080 16.2.0-117.el8cp 2142b60d7974 f1783a8a3b16
rgw.mqy.serverd.myvikk serverd.lab.example.com running (17s) 3s ago 17s *:8081 16.2.0-117.el8cp 2142b60d7974 6ef750d279e8
rgw.mqy.serverd.vdajmd serverd.lab.example.com running (29s) 3s ago 29s *:8080 16.2.0-117.el8cp 2142b60d7974 dd1959871603
[root@clienta ~]#

查看rgw服务和进程

ceph orch ps 查看进程 daemon

ceph orch ls 查看service

ceph orch rm rgw.mqy

rgw用户管理

创建s3用户,访问rgw

默认就是创建s3

[root@clienta ~]# radosgw-admin user create --uid=user1  --access-key=123  --secret=456 --email=user1@example.com --display-name=user1
{
"user_id": "user1",
"display_name": "user1",
"email": "user1@example.com",
"suspended": 0, # 1就是禁用
"max_buckets": 1000, # 最大bucket
"subusers": [],
"keys": [
{
"user": "user1",
"access_key": "123",
"secret_key": "456"
}
],
"swift_keys": [],
"caps": [],
"op_mask": "read, write, delete",
"default_placement": "",
"default_storage_class": "",
"placement_tags": [],
"bucket_quota": {
"enabled": false,
"check_on_raw": false,
"max_size": -1,
"max_size_kb": 0,
"max_objects": -1
},
"user_quota": {
"enabled": false,
"check_on_raw": false,
"max_size": -1,
"max_size_kb": 0,
"max_objects": -1
},
"temp_url_keys": [],
"type": "rgw",
"mfa_ids": []
}

s3 bucket(container) object

对象存储是扁平化的

对用户的操作

查看用户

radosgw-admin user info --uid=user1

修改

[root@clienta ~]# radosgw-admin user modify --uid=user1 --display-name='user1 li'   --max_buckets=500

设置过默认值所以不需要指定,特定的区域

[root@clienta ~]# radosgw-admin zonegroup list
{
"default_info": "4bbf15ed-56bb-4bc7-b30e-e70d3b5f2055",
"zonegroups": [
"myzonegroup",
"default"
]
}

创建key

radosgw-admin user create/modify --uid=user1 --access-key=abc --secret=def

删除key

radosgw-admin key rm --uid=user1 --access-key=abc

自动生成key

radosgw-admin key create --uid=user1 --gen-access-key --gen-secret

设置用户配额

基于用户或基于bucket

用户可以创建多个bucket

[root@clienta ~]# radosgw-admin quota set --quota-scope=user --uid=user1  --max-objects=1024 --max-size=1G
[root@clienta ~]# radosgw-admin user info --uid=user1
{
"user_id": "user1",
"display_name": "user1 li",
"email": "user1@example.com",
"suspended": 0,
"max_buckets": 500,
"subusers": [],
"keys": [
{
"user": "user1",
"access_key": "123",
"secret_key": "456"
}
],
"swift_keys": [],
"caps": [],
"op_mask": "read, write, delete",
"default_placement": "",
"default_storage_class": "",
"placement_tags": [],
"bucket_quota": {
"enabled": false,
"check_on_raw": false,
"max_size": -1,
"max_size_kb": 0,
"max_objects": -1
},
"user_quota": {
"enabled": false,
"check_on_raw": false,
"max_size": 1073741824,
"max_size_kb": 1048576,
"max_objects": 1024
},
"temp_url_keys": [],
"type": "rgw",
"mfa_ids": []
} [root@clienta ~]#

设置配额,但未启用

[root@clienta ~]# radosgw-admin  quota enable --quota-scope=user --uid=user1
[root@clienta ~]# radosgw-admin quota enable --quota-scope=bucket --uid=user1

启用用户和bucket配额

[root@clienta ~]# radosgw-admin quota set --quota-scope=bucket --uid=user1  --max-objects=1024 --max-size=200M

设置bucket 虽然你用户能有1G的对象大小,但你每个bucket只能存200M(你不能把1G存在一个bucket里)

用户访问rgw

clienta为ceph集群的客户端 (集群管理范围内)

安装

[root@clienta ~]# yum -y install awscli
aws configure --profile=ceph 输入用户ak和sk
[root@clienta ~]# aws --profile=ceph configure
AWS Access Key ID [None]: 123
AWS Secret Access Key [None]: 456
Default region name [None]:
Default output format [None]:
[root@clienta ~]# [root@clienta ~]# cd .aws/
[root@clienta .aws]# ls
config credentials
[root@clienta .aws]# cat config
[profile ceph]
[root@clienta .aws]# cat credentials
[ceph]
aws_access_key_id = 123
aws_secret_access_key = 456
[root@clienta .aws]#

--profile 也可以不加,指定就是ceph,不指定就为ceph

[root@clienta .aws]# aws s3 ls --profile=ceph --endpoint=http://serverc:8080
[root@clienta .aws]#
[root@clienta .aws]# aws s3 --profile=ceph --endpoint=http://serverc:8080 mb s3://bucket1
make_bucket: bucket1
[root@clienta .aws]# aws s3 ls --profile=ceph --endpoint=http://serverc:8080
2022-08-16 05:58:31 bucket1
[root@clienta .aws]#

上传对象到bucket

[root@clienta .aws]# aws s3 cp /etc/ceph/ceph.conf  s3://bucket1/ceph2  --profile=ceph --endpoint=http://serverc:8080
upload: ../../etc/ceph/ceph.conf to s3://bucket1/ceph2
[root@clienta .aws]# aws s3 ls s3://bucket1 --profile=ceph --endpoint=http://serverc:8080
2022-08-16 06:00:02 177 ceph2

上传一个公共文件(不需要验证秘钥)

[root@clienta .aws]# aws --profile=ceph --endpoint=http://serverc:8080 --acl=public-read-write s3 cp /etc/passwd  s3://bucket1/
upload: ../../etc/passwd to s3://bucket1/passwd
[root@clienta .aws]#

第一种访问方式

[root@foundation0 ~]# wget http://serverc:8080/bucket1/passwd

第二种

[root@foundation0 tmp]# wget http://bucket1.serverc:8080/passwd
这种方式得做域名解析
*.serverc 172.25.250.12 泛域名解析
红帽文档有详情
还得开启bucket功能
[student@workstation ~]$ ping aca.serverc
PING aca.serverc (172.25.250.12) 56(84) bytes of data.
64 bytes from serverc.lab.example.com (172.25.250.12): icmp_seq=1 ttl=64 time=6.67 ms

管理员权限命令

[root@clienta .aws]# radosgw-admin bucket rm --bucket=bucket1
2022-08-16T06:17:18.744-0400 7f9f237a8380 -1 ERROR: could not remove non-empty bucket bucket1

有点潦草

ceph 007 双向池同步 rgw对象网关配置 s3对象存储的更多相关文章

  1. ceph安装对象网关

    1.概述 安装3个网关节点分别是:controller-03.controller-04和controller-05,使用ceph gw自带的Civetweb提供服务,前端使用nginx作为前端代理. ...

  2. 008 Ceph集群数据同步

    介绍,目前已经创建一个名为ceph的Ceph集群,和一个backup(单节点)Ceph集群,是的这两个集群的数据可以同步,做备份恢复功能 一.配置集群的相互访问 1.1 安装rbd mirror rb ...

  3. JAVA之旅(十四)——静态同步函数的锁是class对象,多线程的单例设计模式,死锁,线程中的通讯以及通讯所带来的安全隐患,等待唤醒机制

    JAVA之旅(十四)--静态同步函数的锁是class对象,多线程的单例设计模式,死锁,线程中的通讯以及通讯所带来的安全隐患,等待唤醒机制 JAVA之旅,一路有你,加油! 一.静态同步函数的锁是clas ...

  4. C# CLR via 对象内存中堆的存储【类型对象指针、同步块索引】

    最近在看书,看到了对象在内存中的存储方式. 讲到了对象存储在内存堆中,分配的空间除了类型对象的成员所需的内存量,还有额外的成员(类型对象指针. 同步块索引 ),看到这个我就有点不懂了,不知道类型对象指 ...

  5. CIL锁,GIL与线程池的区别,进程池和线程池,同步与异步

    一.GIL锁 什么是GIL? 全局解释器锁,是加在解释器上的互斥锁 GC是python自带的内存管理机制,GC的工作原理:python中的内存管理使用的是应用计数,每个数会被加上一个整型的计数器,表示 ...

  6. mysql双向主从同步

    双向主从同步 双方互相主从同步配置 然后再my.cnf中加上如下配置 [mysqld]master1:auto_increment_increment = 2 //自增ID的间隔,如1 3 5间隔为2 ...

  7. 从头认识java-18.6 synchronized在其它对象上同步和ThreadLocal来消除共享对象的同步问题

    这一章节我们来介绍在其它对象上同步与ThreadLocal. 前一章节我们使用了 1.synchronized在其它对象上同步 class ThreadA implements Runnable { ...

  8. unison 双向镜像同步

    unison 双向镜像同步   需要 ocaml 依赖工具(3.0.7) 而且需要机器ssh双向互信 ssh 开启互信 # vi in.sh  直接执行 in.sh 就可以了 mkdir ~/.ssh ...

  9. 电脑桌面与群晖NAS双向实时同步-20210105

      电脑桌面与群晖NAS双向实时同步 2021年1月15日星期五   一.购买群晖DS920+网络存储服务器.NEC超轻笔记本电脑(重量小于800克).小米10至尊版安卓智能手机和intel i9 1 ...

随机推荐

  1. CF1682D Circular Spanning Tree

    题意: 构造题,节点1~n顺时针排列成圆形,告诉你每个点度数奇偶性,让你构造一棵树,树边不相交. 思路: 因为每条边给总度数贡献2,因此如果度数为1的点有奇数个,直接输出no.显然0个度数为1的,也输 ...

  2. Halodoc使用 Apache Hudi 构建 Lakehouse的关键经验

    Halodoc 数据工程已经从传统的数据平台 1.0 发展到使用 LakeHouse 架构的现代数据平台 2.0 的改造.在我们之前的博客中,我们提到了我们如何在 Halodoc 实施 Lakehou ...

  3. 使用PowerShell校验文件MD5

    更新记录 2022年4月16日:本文迁移自Panda666原博客,原发布时间:2021年7月14日. 方法1:使用Get-FileHash命令 (Get-FileHash ".\SQLSer ...

  4. 数字图像处理-基于matlab-直方图均匀化,傅立叶变换,图像平滑,图像锐化

    直方图均匀化 任务:用MATLAB或VC或Delphi等实现图像直方图均匀化的算法. clc;clear;close all; % 清除工作台 % path(path,'..\pics'); % 设置 ...

  5. Idea创建文件夹自动合成一个

    在idea中创建文件夹时,它们总是自动合成一个,如下图: 文件夹自动折叠真的很影响效率,可能会引发一些不经意的失误 解决方法: 取消这个地方的勾选 这样就可以正常创建文件夹了

  6. Spring Security认证器实现

    目录 拦截请求 验证过程 返回完整的Authentication 收尾工作 结论 一些权限框架一般都包含认证器和决策器,前者处理登陆验证,后者处理访问资源的控制 Spring Security的登陆请 ...

  7. 【WPF】CAD工程图纸转WPF可直接使用的xaml代码技巧

    前言:随着工业化的进一步发展,制造业.工业自动化等多领域,都可能用到上位监控系统.而WPF在上位监控系统方面,应该算是当下最流行的前端框架之一了.而随着监控体系的不断完善与更新迭代,监控画面会变得越来 ...

  8. 搭建zabbix及报错处理

    搭建ZABBIX服务器准备工作 1.需要服务器是LAMP 或 LNMP 环境 2.主机名和IP要写在HOST文件里 3.iptables 和 selinux 必须关闭 一.先用最简单的方式搭建lamp ...

  9. Linux IO重定向和管道

    计算机组成部分: 由io . 控制器.计算器.存储器组成 IO: input output 计算机里面通过终端窗口实现输入和输出,键盘鼠标屏幕这些只是手段,真正完成输入输出的是终端窗口 标准输入.出. ...

  10. Java去除字符串中 除数字和逗号以外的符号

    例: public static void main(String[] args) { // 去除字符串中 除数字和逗号以外的符号 String str = "_1066,_1068,_10 ...