Ubuntu 18.04.5 LTS Ceph集群之 cephx 认证及使用普通用户挂载RBD和CephFS
1.cephx认证和授权
1.1 CephX认证机制
1.2 认证与授权:
1.3 授权和使能
1.4 各项使能的意义:
1.5 认证和授权过程
ceph auth get-or-create-keyauthclient.admin
2.客户端向mon节点进行身份验证过程
1.6 管理用户
1.6.1 列出用户
cephuser@ceph-deploy:~/ceph-cluster$ ceph auth ls
请注意,TYPE.IDusers的表示法适用于osd.0用户类型osd,其 ID 为0,client.admin用户类型为 client,其 ID 为admin(即默认client.admin用户)。另请注意,每个条目都有一个条目,以及一个或多个 条目。key: <value>caps:
1.6.2 查看用户
cephuser@ceph-deploy:~/ceph-cluster$ ceph auth get client.admin
[client.admin] key = AQBy1x1hqZ/xEBAAMTbpjTvoOUJMLZw6YHB63A== caps mds = "allow *" caps mgr = "allow *" caps mon = "allow *" caps osd = "allow *"
您还可以使用-o {filename}选项将输出保存到文件中。开发人员还可以执行以下操作:
cephuser@ceph-deploy:~/ceph-cluster$ ceph auth get client.admin -o c.a.key
exported keyring for client.admin cephuser@ceph-deploy:~/ceph-cluster$ cat c.a.key
[client.admin] key = AQBy1x1hqZ/xEBAAMTbpjTvoOUJMLZw6YHB63A== caps mds = "allow *" caps mgr = "allow *" caps mon = "allow *" caps osd = "allow *"
还可以使用 export选项 ceph auth export {TYPE.ID}
cephuser@ceph-deploy:~/ceph-cluster$ ceph auth export client.admin
[client.admin] key = AQBy1x1hqZ/xEBAAMTbpjTvoOUJMLZw6YHB63A== caps mds = "allow *" caps mgr = "allow *" caps mon = "allow *" caps osd = "allow *"
export auth(key=AQBy1x1hqZ/xEBAAMTbpjTvoOUJMLZw6YHB63A==)
1.6.3 添加用户
- ceph auth add:此命令是添加用户的规范方式。它将创建用户、生成密钥并添加任何指定的功能。
- ceph auth get-or-create: 这个命令通常是创建用户最方便的方式,因为它返回一个包含用户名(在括号中)和密钥的密钥文件格式。如果用户已存在,此命令仅以密钥文件格式返回用户名和密钥。您可以使用该 选项将输出保存到文件中。-o {filename}
- ceph auth get-or-create-key: 此命令是创建用户并返回用户密钥的便捷方式(仅限)。这对于只需要密钥的客户端很有用(例如,libvirt)。如果用户已经存在,则此命令仅返回密钥。您可以使用该选项将输出保存到文件中。-o {filename}
cephuser@ceph-deploy:~/ceph-cluster$ ceph auth add client.rbduser1 mon 'allow r' osd 'allow rw pool=rbd-test1'
added key for client.rbduser1 cephuser@ceph-deploy:~/ceph-cluster$ ceph auth get-or-create client.rbduser2 mon 'allow r' osd 'allow rw pool=rbd-test1'
[client.rbduser2] key = AQBP2SVhoQcHDxAAfmq8XkBVAxBCIBi6RHHWkw== cephuser@ceph-deploy:~/ceph-cluster$ ceph auth get-or-create-key client.rbduser3 mon 'allow r' osd 'allow rw pool=rbd-test1' -o client.rbduser3.key
cephuser@ceph-deploy:~/ceph-cluster$ cat !$
cat client.rbduser3.key
AQCc2SVhNaFMChAAyz+OUTGLKrN9V8dP5BaVcQ==
重要的:如果您为用户提供 OSD 功能,但您不限制对特定池的访问,则该用户将有权访问集群中的所有池!
1.6.4 修改用户权限
# client.rbduser1 增加osd的x(执行)权限
cephuser@ceph-deploy:~/ceph-cluster$ ceph auth caps client.rbduser1 mon 'allow r' osd 'allow rwx pool=rbd-test1'
updated caps for client.rbduser1 cephuser@ceph-deploy:~/ceph-cluster$ ceph auth get client.rbduser1
[client.rbduser1] key = AQAp2SVh/mg7BhAAUn1znkL/X9qmMtOW3fBDIg== caps mon = "allow r" caps osd = "allow rwx pool=rbd-test1"
exported keyring for client.rbduser1 # client.rbduser2 # 增加mon的w(写)权限
cephuser@ceph-deploy:~/ceph-cluster$ ceph auth caps client.rbduser2 mon 'allow rw' osd 'allow rwx pool=rbd-test1'
updated caps for client.rbduser2 cephuser@ceph-deploy:~/ceph-cluster$ ceph auth get client.rbduser2
[client.rbduser2] key = AQBP2SVhoQcHDxAAfmq8XkBVAxBCIBi6RHHWkw== caps mon = "allow rw" caps osd = "allow rwx pool=rbd-test1"
exported keyring for client.rbduser2 # client.rbduser3 # 修改为mon,osd的*(所有)权限
cephuser@ceph-deploy:~/ceph-cluster$ ceph auth caps client.rbduser3 mon 'allow *' osd 'allow *'
updated caps for client.rbduser3 cephuser@ceph-deploy:~/ceph-cluster$ ceph auth get client.rbduser3
[client.rbduser3] key = AQCc2SVhNaFMChAAyz+OUTGLKrN9V8dP5BaVcQ== caps mon = "allow *" caps osd = "allow *"
exported keyring for client.rbduser3
1.6.5 删除用户
cephuser@ceph-deploy:~/ceph-cluster$ ceph auth del client.rbduser3
1.6.6 打印用户的密钥
cephuser@ceph-deploy:~/ceph-cluster$ ceph auth print-key client.rbduser1
AQAp2SVh/mg7BhAAUn1znkL/X9qmMtOW3fBDIg==
当您需要使用用户的密钥(例如,libvirt)填充客户端软件时,打印用户的密钥非常有用。
1.6.7 导入用户
# 查看用户client.rbduser2的key 和权限
cephuser@ceph-deploy:~/ceph-cluster$ ceph auth get client.rbduser2
[client.rbduser2] key = AQBP2SVhoQcHDxAAfmq8XkBVAxBCIBi6RHHWkw== caps mon = "allow rw" caps osd = "allow rwx pool=rbd-test1" # 将用户client.rbduser2的key和权限导出到client.rbduser2.keyring文件
cephuser@ceph-deploy:~/ceph-cluster$ ceph auth get client.rbduser2 -o client.rbduser2.keyring # 查看导出的文件内容和get 查看的相同
cephuser@ceph-deploy:~/ceph-cluster$ cat !$ cat client.ebduser2.keyring
[client.rbduser2] key = AQBP2SVhoQcHDxAAfmq8XkBVAxBCIBi6RHHWkw== caps mon = "allow rw" caps osd = "allow rwx pool=rbd-test1" # 删除client.rbduser2用户
cephuser@ceph-deploy:~/ceph-cluster$ ceph auth del client.rbduser2 # 通过导入备份文件恢复用户及其权限
cephuser@ceph-deploy:~/ceph-cluster$ ceph auth import -i client.ebduser2.keyring # 验证恢复后的用户key、权限和被删除前一致。
cephuser@ceph-deploy:~/ceph-cluster$ ceph auth get client.rbduser2
[client.rbduser2] key = AQBP2SVhoQcHDxAAfmq8XkBVAxBCIBi6RHHWkw== caps mon = "allow rw" caps osd = "allow rwx pool=rbd-test1"
2.普通用户使用客户端使用块存储
2.1 创建给普通用户使用的pool,开启rbd功能,并创建镜像img
$ ceph osd pool create rbd-test2 16 16
pool 'rbd-test2' created $ ceph osd pool application enable rbd-test2 rbd
enabled application 'rbd' on pool 'rbd-test2' $ rbd pool init -p rbd-test2 $ rbd create img-test3 --size 5G --pool rbd-test2 --image-format 2 --image-feature layering $ rbd ls --pool rbd-test2
img-test3
2.2 创建普通账户并授权
$ ceph auth add client.rbd_user_01 mon 'allow r' osd 'allow rwx pool=rbd-test2'
added key for client.rbd_user_01
2.3 导出用户权限到 keyring 文件
$ ceph auth get client.rbd_user_01 -o ceph.client.rbd_user_01.keyring
exported keyring for client.rbd_user_01
2.4 客户端安装ceph-common
~# wget -q -O- 'https://mirrors.tuna.tsinghua.edu.cn/ceph/keys/release.asc' | sudo apt-key add -
~# echo "deb https://mirrors.tuna.tsinghua.edu.cn/ceph/debian-pacific bionic main" >> /etc/apt/sources.list
~# apt install ceph-common
2.5 同步普通用户认证文件
$ sscp ceph.conf ceph.client.admin.keyring ceph.client.rbd_user_01.keyring root@client1:/etc/ceph/
ceph.client.rbd_user_01.keyring
2.6 在客户端上查看映射rbd并映射
root@client1:~# rbd ls --pool rbd-test2
img-test3 root@client1:~# rbd --image img-test3 --pool rbd-test2 info
rbd image 'img-test3':
size 5 GiB in 1280 objects
order 22 (4 MiB objects)
snapshot_count: 0
id: d65187c1e104
block_name_prefix: rbd_data.d65187c1e104
format: 2
features: layering
op_features:
flags:
create_timestamp: Wed Aug 25 16:25:22 2021
access_timestamp: Wed Aug 25 16:25:22 2021
modify_timestamp: Wed Aug 25 16:25:22 2021 root@client1:~# rbd --user rbd_user_01 --pool rbd-test2 map img-test3
/dev/rbd0
rbd: --user is deprecated, use --id
2.7 格式化并挂载 rbd磁盘分区
~# mkfs.xfs /dev/rbd0
~# mount /dev/rbd0 /mnt/rbd0/
~# df -h
Filesystem Size Used Avail Use% Mounted on
/dev/rbd0 5.0G 39M 5.0G 1% /mnt/rbd0
2.8 卸载并删除镜像映射
root@client1:~# umount /mnt/rbd0
root@client1:~# rbd --user rbd_user_01 --pool rbd-test2 unmap img-test3
rbd: --user is deprecated, use --id
2.9 删除rbd镜像
cephuser@ceph-deploy:~/ceph-cluster$ rbd rm --pool rbd-test2 --image img-test3
Removing image: 100% complete...done.
3.Ceph-FS 文件存储
3.1 部署MDS 服务
3.1.1 所有mds节点安装ceph-mds
root@mds1:~# wget -q -O- 'https://mirrors.tuna.tsinghua.edu.cn/ceph/keys/release.asc' | sudo apt-key add -
root@mds1:~# echo "deb https://mirrors.tuna.tsinghua.edu.cn/ceph/debian-pacific bionic main" >> /etc/apt/sources.list
root@mds1:~# apt install ceph-mds
3.1.2 mds所有节点创建账号普通账号并赋予sudo权限
root@mds1:~# groupadd -r -g 2023 cephuser && useradd -r -m -s /bin/bash -u 2023 -g 2023 cephuser && echo cephuser:sa@123.. | chpasswd
root@mds1:~# echo "cephuser ALL=(ALL) NOPASSWD: ALL" >> /etc/sudoers
3.1.3 原集群节点增加mds的hosts配置
192.168.2.61 mds1
192.168.2.62 mds2
192.168.2.64 mds3
192.168.2.64 mds4
3.1.4 所有mds节点配置集群中所有节点解析的hosts
192.168.2.2 ceph-deploy
192.168.2.21 mon1
192.168.2.22 mon2
192.168.2.23 mon3
192.168.2.31 mgr1
192.168.2.32 mgr2
192.168.2.41 osd1
192.168.2.42 osd2
192.168.2.43 osd3
192.168.2.44 osd4
192.168.2.50 client1
192.168.2.61 mds1
192.168.2.62 mds2
192.168.2.64 mds3
192.168.2.64 mds4
3.1.5 管理节点配置cephuser普通用户ssh免密ssh信任
$ ssh-copy-id cephuser@mds1
$ ssh-copy-id cephuser@mds2
$ ssh-copy-id cephuser@mds3
$ ssh-copy-id cephuser@mds4
3.1.6 同步集群key
$ scp ceph.conf ceph.client.admin.keyring root@mds1:/etc/ceph/
$ scp ceph.conf ceph.client.admin.keyring root@mds2:/etc/ceph/
$ scp ceph.conf ceph.client.admin.keyring root@mds3:/etc/ceph/
$ scp ceph.conf ceph.client.admin.keyring root@mds4:/etc/ceph/
3.1.7 需要单独安装Python2
# apt install python2.7 -y
# ln -sv /usr/bin/python2.7 /usr/bin/python2
3.1.8 在管理节点部署mds服务
$ ceph-deploy mds create mds1
$ ceph-deploy mds create mds2
$ ceph-deploy mds create mds3
$ ceph-deploy mds create mds4
3.2 创建CephFS metadata 和data 存储池
$ ceph osd pool create cephfs-t1-metadata 32 32
pool 'cephfs-t1-metadata' created $ ceph osd pool create cephfs-t1-data 64 64
pool 'cephfs-t1-data' created
3.3 创建cephFS 并验证
$ ceph fs new cephfs-t1 cephfs-t1-metadata cephfs-t1-data
new fs with metadata pool 8 and data pool 9
3.4 查看文件系统状态
$ ceph fs status cephfs-t1
cephfs-t1 - 0 clients
=========
RANK STATE MDS ACTIVITY DNS INOS DIRS CAPS
0 active mds1 Reqs: 0 /s 10 13 12 0
POOL TYPE USED AVAIL
cephfs-t1-metadata metadata 96.0k 629G
cephfs-t1-data data 0 629G
STANDBY MDS
mds2
mds3
mds4
MDS version: ceph version 16.2.5 (0883bdea7337b95e4b611c768c0279868462204a) pacific (stable)
$ ceph fs get cephfs-t1
Filesystem 'cephfs-t1' (1)
fs_name cephfs-t1
epoch 5
flags 12
created 2021-08-26T14:47:28.599590+0800
modified 2021-08-26T14:54:22.906615+0800
tableserver 0
root 0
session_timeout 60
session_autoclose 300
max_file_size 1099511627776
required_client_features {}
last_failure 0
last_failure_osd_epoch 0
compat compat={},rocompat={},incompat={1=base v0.20,2=client writeable ranges,3=default file layouts on dirs,4=dir inode in separate object,5=mds uses versioned encoding,6=dirfrag is stored in omap,8=no anchor table,9=file layout v2,10=snaprealm v2}
max_mds 1
in 0
up {0=4983}
failed
damaged
stopped
data_pools [8]
metadata_pool 7
inline_data disabled
balancer
standby_count_wanted 1
[mds.mds1{0:4983} state up:active seq 3 addr [v2:192.168.2.61:6800/1159603360,v1:192.168.2.61:6801/1159603360]]
3.5 设置处于激活状态mds 的数量
cephuser@ceph-deploy:~/ceph-cluster$ ceph fs set cephfs-t1 max_mds 2 cephuser@ceph-deploy:~/ceph-cluster$ ceph fs status cephfs-t1
cephfs-t1 - 0 clients
=========
RANK STATE MDS ACTIVITY DNS INOS DIRS CAPS
0 active mds1 Reqs: 0 /s 10 13 12 0
1 active mds4 Reqs: 0 /s 10 13 12 0
POOL TYPE USED AVAIL
cephfs-t1-metadata metadata 168k 629G
cephfs-t1-data data 0 629G
STANDBY MDS
mds2
mds3
MDS version: ceph version 16.2.5 (0883bdea7337b95e4b611c768c0279868462204a) pacific (stable)
3.6 MDS 高可用优化
$ vim ceph.conf
[global]
fsid = 54ed6318-9830-4152-917c-f1af7fa1002a
public_network = 192.168.2.0/24
cluster_network = 172.1.0.0/24
mon_initial_members = mon1, mon2, mon3
mon_host = 192.168.2.21,192.168.2.22,192.168.2.23
auth_cluster_required = cephx
auth_service_required = cephx
auth_client_required = cephx [mds.mds1]
#mds_standby_for_fscid = cephfs-t1
mds_standby_for_name = mds2
mds_standby_replay = true [mds.mds3]
mds_standby_for_name = mds4
mds_standby_replay = true
3.7 分发配置文件并重启mds服务
$ ceph-deploy --overwrite-conf config push mds1
$ ceph-deploy --overwrite-conf config push mds2
$ ceph-deploy --overwrite-conf config push mds3
$ ceph-deploy --overwrite-conf config push mds4
root@mds1:~# systemctl restart ceph-mds@mds1.service
root@mds2:~# systemctl restart ceph-mds@mds2.service
root@mds3:~# systemctl restart ceph-mds@mds3.service
root@mds4:~# systemctl restart ceph-mds@mds4.service
3.8 查看主备状态
$ ceph fs status
cephfs-t1 - 0 clients
=========
RANK STATE MDS ACTIVITY DNS INOS DIRS CAPS
0 active mds4 Reqs: 0 /s 10 13 12 0
1 active mds3 Reqs: 0 /s 10 13 11 0
POOL TYPE USED AVAIL
cephfs-t1-metadata metadata 168k 629G
cephfs-t1-data data 0 629G
STANDBY MDS
mds2
mds1
MDS version: ceph version 16.2.5 (0883bdea7337b95e4b611c768c0279868462204a) pacific (stable)
3.9 给客户端创建用于cephfs文件系统挂载的普通用户
# 创建账号并授权
$ ceph auth add client.cephfs_user02 mon 'allow r' mds 'allow rw' osd 'allow rwx pool=cephfs-t1-data'
added key for client.cephfs_user02 # 创建用keyring 文件
$ ceph auth get client.cephfs_user02 -o ceph.client.cephfs_user02.keyring
exported keyring for client.cephfs_user02 $ $ ceph auth print-key client.cephfs_user02 > cephfs_user02.key
3.10 客户端安装ceph-common
~# wget -q -O- 'https://mirrors.tuna.tsinghua.edu.cn/ceph/keys/release.asc' | sudo apt-key add -
~# echo "deb https://mirrors.tuna.tsinghua.edu.cn/ceph/debian-pacific bionic main" >> /etc/apt/sources.list
~# apt install ceph-common
3.11 将生成的cephfs客户端使用的普通用户的认证文件同步到客户端节点
$ scp ceph.conf ceph.client.cephfs_user02.keyring cephfs_user02.key root@client1:/etc/ceph/
root@client1's password:
ceph.conf 100% 461 141.0KB/s 00:00
ceph.client.cephfs_user02.keyring 100% 160 59.3KB/s 00:00
cephfs_user02.key 100% 40 16.3KB/s 00:00
3.12 内核空间挂载ceph-fs
3.12.1 客户端通过key文件挂载
~# mount -t ceph mon1:6789,mon2:6789,mon3:6789:/ /mnt/ceph-fs-t1/ -o name=cephfs_user02,secretfile=/etc/ceph/cephfs_user02.key
root@client1:/etc/ceph# df -h
Filesystem Size Used Avail Use% Mounted on
...
192.168.2.21:6789,192.168.2.22:6789,192.168.2.23:6789:/ 629G 0 629G 0% /mnt/ceph-fs-t1 root@client1:/etc/ceph# cd /mnt/ceph-fs-t1/ root@client1:/mnt/ceph-fs-t1# dd if=/dev/zero of=/mnt/ceph-fs-t1/file1 bs=4MB count=200
200+0 records in
200+0 records out
800000000 bytes (800 MB, 763 MiB) copied, 0.925139 s, 865 MB/s root@client1:/mnt/ceph-fs-t1# cp /var/log/syslog .
root@client1:/mnt/ceph-fs-t1# ll
total 781427
drwxr-xr-x 1 root root 3 Aug 26 17:14 ./
drwxr-xr-x 4 root root 36 Aug 26 16:48 ../
-rw-r--r-- 1 root root 800000000 Aug 26 17:14 file1
-rw-r----- 1 root root 180463 Aug 26 17:14 syslog
3.12.2 客户端通过key挂载
root@client1:~# umount /mnt/ceph-fs-t1
root@client1:~#
root@client1:~# cat /etc/ceph/cephfs_user02.key
AQCZWidhy8IpKBAA9W1tT45tflTM4bpAuT6mcw== root@client1:~# mount -t ceph mon1:6789,mon2:6789,mon3:6789:/ /mnt/ceph-fs-t1/ -o name=cephfs_user02,secret=AQCZWidhy8IpKBAA9W1tT45tflTM4bpAuT6mcw== root@client1:~# cd /mnt/ceph-fs-t1/
root@client1:/mnt/ceph-fs-t1# rm -rf *
3.11.3 开机挂载配置
root@client1:~# vim /etc/fstab
root@client1:~# mon1:6789,mon2:6789,mon3:6789:/ /mnt/ceph-fs-t1 ceph defaults,name=cephfs_user02,secretfile=/etc/ceph/cephfs_user02.key,_netdev 0 0 root@client1:~# mount -a
Ubuntu 18.04.5 LTS Ceph集群之 cephx 认证及使用普通用户挂载RBD和CephFS的更多相关文章
- ubuntu 16.04快速安装ceph集群
准备工作 假设集群: 选一台作管理机 注意: ceph集群引用hostname,而非ip. 172.17.4.16 test16 #hostname必须是test16 172.17.4.17 test ...
- 基于Ubuntu 18.04.5 LTS 部署Ceph集群测试及Ceph RDB的使用。
1.ceph简介 Ceph在一个统一的系统中独特地提供对象.块和文件存储 1.1 ceph官网架构图 1.2 架构解释 CEPH 对象存储 CEPH 块设备 CEPH 文件系统 RESTful 接 ...
- Ubuntu 18.04.1 LTS + kolla-ansible 部署 openstack Rocky all-in-one 环境
1. kolla 项目介绍 简介 kolla 的使命是为 openstack 云平台提供生产级别的.开箱即用的自动化部署能力. kolla 要实现 openetack 部署分为两步,第一步是制作 do ...
- Ubuntu 18.04.2 LTS美化方案
Ubuntu 18.04.2 LTS美化方案记录 根据个人经验,我将Ubuntun美化分为四个部分:1)桌面:2)对话框界面:3)图标:4)登录及锁屏界面:5)终端.由于Ubuntu系统默认采用GNO ...
- Ubuntu 18.04.4 LTS 更换国内系统源
Ubuntu 18.04.4 LTS 更换国内系统源 1.1) 好习惯先做备份在干活: mv /etc/apt/sources.list /etc/apt/sources.list.bak 1.2) ...
- Ubuntu 16.04下搭建kubernetes集群环境
简介 目前Kubernetes为Ubuntu提供的kube-up脚本,不支持15.10以及16.04这两个使用systemd作为init系统的版本. 这里详细介绍一下如何以非Docker方式在Ubun ...
- Ubuntu 16.04下Redis Cluster集群搭建(官方原始方案)
前提:先安装好Redis,参考:http://www.cnblogs.com/EasonJim/p/7599941.html 说明:Redis Cluster集群模式可以做到动态增加节点和下线节点,使 ...
- Ubuntu 16.04 下Redis Cluster集群搭建
实际操作如下: 准备工作 版本:4.0.2 下载地址:https://redis.io/download 离线版本:(链接: https://pan.baidu.com/s/1bpwDtOr 密码: ...
- Ubuntu 18.04.3 LTS Virtualbox提示“Kernel driver not installed (rc=-1908)”问题修复一例
前两天Ubuntu升级了,重启后启动virtualbox保存 从错误报告上反映出来的问题原因是因为某些内核驱动程序没有经过编译,所以Virtualbox无法正常运行.事实上,在Ubuntu上处理这个问 ...
随机推荐
- WPF实现Win10汉堡菜单
WPF开发者QQ群: 340500857 | 微信群 -> 进入公众号主页 加入组织 前言 有小伙伴提出需要实现Win10汉堡菜单效果. 由于在WPF中没有现成的类似UWP的汉堡菜单,所以我们 ...
- 【Java技术专题】「性能优化系列」针对Java对象压缩及序列化技术的探索之路
序列化和反序列化 序列化就是指把对象转换为字节码: 对象传递和保存时,保证对象的完整性和可传递性.把对象转换为有字节码,以便在网络上传输或保存在本地文件中: 反序列化就是指把字节码恢复为对象: 根据字 ...
- Upload-labs通关指南(下) 11-20
承接上篇,这次我们继续做下半部分. 有些题目有其他做法是针对于windows系统特性的,并不能在linux上奏效,因此不在考虑范围之内. Pass-11 制作图片马直接上传 copy a.jpg /a ...
- 让全链路压测变得更简单!Takin2.0重磅来袭!
自Takin社区版1.0发布两个多月以来,有很多测试同学陆续在各自的工作中运用了起来,其中包括金融.电商.物流.出行服务等行业.这个过程中我们收到了很多同学的反馈建议,同时也了解到很多同学在落地全链路 ...
- Java中的函数式编程(七)流Stream的Map-Reduce操作
写在前面 Stream 的 Map-Reduce 操作是Java 函数式编程的精华所在,同时也是最为复杂的部分.但一旦你啃下了这块硬骨头,那你就真正熟悉Java的函数式编程了. 如果你有大数据的编程经 ...
- [no code][scrum meeting] Beta 8
$( "#cnblogs_post_body" ).catalog() 例会时间:5月22日15:30,主持者:赵涛 下次例会时间:5月23日11:30,主持者:肖思炀 一.工作汇 ...
- Github Actions 实践
Github Actions 实践 Github Actions 是 Github 的持续集成服务,通过在 repo 发生特定的行为时执行指定的命令实现自动测试.自动部署等功能. 基本术语 workf ...
- BUAA 软工 个人博客作业(一)
项目 内容 这个作业属于哪个课程 2020春季计算机学院软件工程(罗杰 任健) 这个作业的要求在哪里 个人博客作业 我在这个课程的目标是 通过阅读<构建之法>大致了解软件工程 这个作业在哪 ...
- luogu P2746 [USACO5.3]校园网Network of Schools 题解
前言: 火星题... 但是我调了半天,最后看了题解才明白. Wtcl 解析: 显然先缩个点. 第一问,就是问多少入度为0的点. 第二问,抽象一下就是要添加一些边,让一个DAG变成一个SCC,求最小边数 ...
- LP-DDR 和其他 DDR
一篇技術文檔比較 LP-DDR 和其他 DDR. 就觀念來說,LP-DDR 就是 Low Power 的 DDR:但就架構來說,LP-DDR 和其他 DDR 是截然不同的東西. 他們分屬不同的 JDE ...