การเตรียมเครื่องทำ Lab ceph

วิธีการติดตั้ง lab ceph

Copy file image centos 7.3 ไปยังเครื่องของทุกคนจากนั้นเปิด file image ขึ้นมาโดยใช้ virtualbox 5.1.12 จะได้ดังรูป

จากนั้น click ขวา เลือก clone

Click Next

setting -> network -> adapter 1 -> advanced -> Port Forwarding

เลือก port forwarding

จากนั้นทำการตั้งค่า mon1 โดยทำการ click ขวาเลือก settings -> network -> adapter 3 -> enable network adapter เลือก Bridge adapter

จากนั้นทำการ clone ตัวต่อไปเป็น osd1 โดยทำการ clone จากตัว image ที่เป็น centos7

ต่อไปเลือก full clone รอจนเสร็จ เนื่องจากตัวนี้เป็น osd ดังนั้นจำเป็นต้องทำการเพิ่ม disk ลูกที่ 2 ลูกที่ 3 ลูกที่ 4 เข้าไปโดยเข้าไปที่ setting แล้วเลือกที่ storage

Add hard disk เพิ่มอีก 3 ลูกโดยลูกที่ 2 และลูกที่ 3 ให้เป็นขนาด 15 GB ส่วนลูกที่ 4 ให้มีขนาด 5 GB โดยลูกที่ 2 และลูกที่ 3 จะเป็น disk ที่เก็บ data ส่วน disk ลูกที่ 4 จะเป็น disk ลูกที่ทำ journal

เลือก create new disk

เลือก VDI

เลือก Dynamically allocated

ใส่ชื่อ data1 ขนาด 15 GB แล้ว create จากนั้นก็ทำการ create data2 ขนาด 15 GB เช่นกัน ตอน disk ลูกที่ 3 ให้ create ชื่อ journal แล้วใส่ขนาด 5 GB

จากนั้นทำการ clone osd1 มาเป็น osd2

่แล้วเลือก full clone

จากนั้นเราจะได้ทั้งหมด 3 เครื่อง คือ mon1 osd1 osd2

จากนั้นทำการ start mon1 เมื่อ start เสร็จแล้วให้ secure shell เข้าไปที่ 127.0.0.1 port 2222

[root@localhost ~]# hostnamectl set-hostname mon1
[root@localhost ~]# exit

ทำการแก้ไข ip ของ adapter 2 เนื่องจากตอนนี้เรามีการ add adapter เข้าไป 3 card

card 1 เป็น nat networks อันนี้ไว้ใช้ออก internet

card 2 เป็น host only network เอาไว้ใช้ในการเชื่อมต่อกันระหว่างเครื่องใน cluster

card 3 เป็น bridge เอาไว้ใช้ในการเชื่อมต่อระหว่างตัว host เข้ามาที่ guest os ที่ทำการ share samba

[root@mon1 ~]# cd /etc/sysconfig/network-scripts/
[root@mon1 ~]# vi ifcfg-enp0s8
TYPE=Ethernet
BOOTPROTO=none
DEFROUTE=yes
NAME=enp0s8
UUID=066070c7–8f14–4fd4–95ac-e9fe06b7780d
DEVICE=enp0s8
ONBOOT=yes
IPADDR=192.168.10.10
PREFIX=24

แก้ IPADDR เป็น 192.168.10.10 จากนั้น save

[root@mon1 ~]# ifdown ifcfg-enp0s8
[root@mon1 ~]# ifup ifcfg-enp0s8
[root@mon1 network-scripts]# ip a
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN qlen 1
link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
inet 127.0.0.1/8 scope host lo
valid_lft forever preferred_lft forever
inet6 ::1/128 scope host
valid_lft forever preferred_lft forever
2: enp0s3: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP qlen 1000
link/ether 08:00:27:2d:fb:1c brd ff:ff:ff:ff:ff:ff
inet 10.0.2.15/24 brd 10.0.2.255 scope global dynamic enp0s3
valid_lft 85828sec preferred_lft 85828sec
inet6 fe80::2424:7e01:ea2a:8a67/64 scope link
valid_lft forever preferred_lft forever
3: enp0s8: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP qlen 1000
link/ether 08:00:27:6f:36:86 brd ff:ff:ff:ff:ff:ff
inet 192.168.10.10/24 brd 192.168.10.255 scope global enp0s8
valid_lft forever preferred_lft forever
inet6 fe80::a00:27ff:fe6f:3686/64 scope link
valid_lft forever preferred_lft forever
4: enp0s9: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP qlen 1000
link/ether 08:00:27:8f:3a:91 brd ff:ff:ff:ff:ff:ff
inet 192.168.1.42/24 brd 192.168.1.255 scope global dynamic enp0s9
valid_lft 85829sec preferred_lft 85829sec
inet6 fe80::1b0a:732:c2ad:3599/64 scope link
valid_lft forever preferred_lft forever

จะเห็นว่า card ที่ 2 เปลี่ยนเป็น 192.168.10.10 เรียบร้อยแล้ว

จากนั้นทำการ start osd1 ขึ้นมาแล้วเข้าไป settings -> network adapter -> adapter 1 -> advanced -> port forwarding ให้ set port 2223 ไปที่ port 22

ทำการ shell เข้าไปที่ osd1 แล้วทำเหมือนเครื่อง mon1 โดยทำการแก้ชื่อเครื่องเป็น osd1

[root@localhost ~]# hostnamectl set-hostname osd1
[root@localhost ~]# exit

ทำการแก้ ip address ifcfg-enp0s8 ให้เป็น ip 192.168.10.11

[root@osd1 ~]# vi /etc/sysconfig/network-scripts/ifcfg-enp0s8

[root@osd1 ~]# ifdown ifcfg-enp0s8

[root@osd1 ~]# ifup ifcfg-enp0s8

จากนั้นทำการ start osd2 ขึ้นมาแล้วเข้าไป settings -> network adapter -> adapter 1 -> advanced -> port forwarding ให้ set port 2224 ไปที่ port 22

ทำการ shell เข้าไปที่ osd2 แล้วทำเหมือนเครื่อง mon1 โดยทำการแก้ชื่อเครื่องเป็น osd2

# hostnamectl set-hostname osd2
# exit

[

ทำการแก้ ip address ifcfg-enp0s8 ให้เป็น ip 192.168.10.12

# vi /etc/sysconfig/network-scripts/ifcfg-enp0s8

[root@osd2 ~]# ifdown ifcfg-enp0s8

[root@osd2 ~]# ifup ifcfg-enp0s8

จากนั้นทำการ add user cephuser แต่กรณีนี้ตัวเครื่องที่เป็น ต้นฉบับทำการ add ให้เรียบร้อยแล้วจึง ไม่ต้องทำในส่วนนี้
ติดตั้งทุกเครื่องที่เป็น mon , osd
# useradd -d /home/cephuser -m cephuser
# passwd cephuser
# echo “cephuser ALL = (root) NOPASSWD:ALL” | sudo tee /etc/sudoers.d/cephuser
# chmod 0440 /etc/sudoers.d/cephuser

ให้ทุกคนเริ่มทำในส่วนนี้

เครื่อง mon1

[root@mon1 /]# su  - cephuser
Last login: Fri Dec 30 10:06:53 ICT 2016 on pts/0

[cephuser@mon1 ~]$ ssh-keygen -t rsa -b 4096
Generating public/private rsa key pair.
Enter file in which to save the key (/home/cephuser/.ssh/id_rsa):
Enter passphrase (empty for no passphrase):
Enter same passphrase again:
Your identification has been saved in /home/cephuser/.ssh/id_rsa.
Your public key has been saved in /home/cephuser/.ssh/id_rsa.pub.
The key fingerprint is:
36:d8:a1:36:fe:86:d0:20:1e:fc:a7:1b:96:35:1b:f5 cephuser@mon1
The key’s randomart image is:
+ — [ RSA 4096] — — +
| |
| |
| . o |
| + . = o |
| . + oO S E |
| . o=o* . |
| ++o. |
| …… |
| .. .. |
+ — — — — — — — — -+
[cephuser@mon1 ~]$ ssh-copy-id osd1
The authenticity of host ‘osd1 (192.168.10.11)’ can’t be established.
ECDSA key fingerprint is 7b:1f:d1:c5:fb:61:ca:09:2b:60:f9:ea:4a:98:f8:d3.
Are you sure you want to continue connecting (yes/no)? yes
/bin/ssh-copy-id: INFO: attempting to log in with the new key(s), to filter out any that are already installed
/bin/ssh-copy-id: INFO: 1 key(s) remain to be installed — if you are prompted now it is to install the new keys
cephuser@osd1’s password:
Number of key(s) added: 1
Now try logging into the machine, with: “ssh ‘osd1’”
and check to make sure that only the key(s) you wanted were added.
[cephuser@mon1 ~]$ ssh-copy-id osd2
The authenticity of host ‘osd2 (192.168.10.12)’ can’t be established.
ECDSA key fingerprint is 7b:1f:d1:c5:fb:61:ca:09:2b:60:f9:ea:4a:98:f8:d3.
Are you sure you want to continue connecting (yes/no)? yes
/bin/ssh-copy-id: INFO: attempting to log in with the new key(s), to filter out any that are already installed
/bin/ssh-copy-id: INFO: 1 key(s) remain to be installed — if you are prompted now it is to install the new keys
cephuser@osd2’s password:
Number of key(s) added: 1
Now try logging into the machine, with: “ssh ‘osd2’”
and check to make sure that only the key(s) you wanted were added.
[cephuser@mon1 ceph-deploy]$ ssh-copy-id mon1
The authenticity of host ‘mon1 (192.168.10.10)’ can’t be established.
ECDSA key fingerprint is 7b:1f:d1:c5:fb:61:ca:09:2b:60:f9:ea:4a:98:f8:d3.
Are you sure you want to continue connecting (yes/no)? yes
/bin/ssh-copy-id: INFO: attempting to log in with the new key(s), to filter out any that are already installed
/bin/ssh-copy-id: INFO: 1 key(s) remain to be installed — if you are prompted now it is to install the new keys
cephuser@mon1’s password:
Number of key(s) added: 1
Now try logging into the machine, with: “ssh ‘mon1’”
and check to make sure that only the key(s) you wanted were added.

จากนั้นเข้าไปที่ mon1 osd1 และ osd2

[root@mon1 ~]# chmod 0700 /home/cephuser/.ssh

[root@osd1 ~]# chmod 0700 /home/cephuser/.ssh

[root@osd2 ~]# chmod 0700 /home/cephuser/.ssh

กลับมาที่ mon1 ลองทดสอบ ssh osd1 และ ssh osd2

[root@mon1 ~]# su — cephuser
[cephuser@mon1 ~]$ ssh osd1
Last login: Fri Dec 30 10:06:53 2016
[cephuser@osd1 ~]$
[cephuser@mon1 ~]$ ssh osd2
Last login: Fri Dec 30 10:06:53 2016
[cephuser@osd2 ~]$
[cephuser@mon1 ~]$ pwd
/home/cephuser
[cephuser@mon1 ~]$ mkdir ceph-deploy
[cephuser@mon1 ~]$ cd ceph-deploy
[cephuser@mon1 ceph-deploy]$ sudo rpm -Uhv http://download.ceph.com/rpm-jewel/el7/noarch/ceph-release-1-1.el7.noarch.rpm
warning: /var/tmp/rpm-tmp.i2Y6MT: Header V4 RSA/SHA1 Signature, key ID 460f3994: NOKEY
Preparing… ################################# [100%]
Updating / installing…
1:ceph-release-1–1.el7 ################################# [100%]


จากนั้นทำการติดตั้ง ceph-deploy packages

[cephuser@mon1 ceph-deploy]$ sudo yum update -y && sudo yum install ceph-deploy -y

[cephuser@mon1 ceph-deploy]$ cd /home/cephuser/ceph-deploy
[cephuser@mon1 ceph-deploy]$ ceph-deploy new mon1
[ceph_deploy.conf][DEBUG ] found configuration file at: /home/cephuser/.cephdeploy.conf
[ceph_deploy.cli][INFO ] Invoked (1.5.36): /bin/ceph-deploy new mon1
[ceph_deploy.cli][INFO ] ceph-deploy options:
[ceph_deploy.cli][INFO ] username : None
[ceph_deploy.cli][INFO ] func : <function new at 0x1edb320>
[ceph_deploy.cli][INFO ] verbose : False
[ceph_deploy.cli][INFO ] overwrite_conf : False
[ceph_deploy.cli][INFO ] quiet : False
[ceph_deploy.cli][INFO ] cd_conf : <ceph_deploy.conf.cephdeploy.Conf instance at 0x1f37fc8>
[ceph_deploy.cli][INFO ] cluster : ceph
[ceph_deploy.cli][INFO ] ssh_copykey : True
[ceph_deploy.cli][INFO ] mon : [‘mon1’]
[ceph_deploy.cli][INFO ] public_network : None
[ceph_deploy.cli][INFO ] ceph_conf : None
[ceph_deploy.cli][INFO ] cluster_network : None
[ceph_deploy.cli][INFO ] default_release : False
[ceph_deploy.cli][INFO ] fsid : None
[ceph_deploy.new][DEBUG ] Creating new cluster named ceph
[ceph_deploy.new][INFO ] making sure passwordless SSH succeeds
[mon1][DEBUG ] connection detected need for sudo
[mon1][DEBUG ] connected to host: mon1
[mon1][DEBUG ] detect platform information from remote host
[mon1][DEBUG ] detect machine type
[mon1][DEBUG ] find the location of an executable
[mon1][INFO ] Running command: sudo /usr/sbin/ip link show
[mon1][INFO ] Running command: sudo /usr/sbin/ip addr show
[mon1][DEBUG ] IP addresses found: [u’192.168.10.10', u’10.0.2.15', u’192.168.1.42']
[ceph_deploy.new][DEBUG ] Resolving host mon1
[ceph_deploy.new][DEBUG ] Monitor mon1 at 192.168.10.10
[ceph_deploy.new][DEBUG ] Monitor initial members are [‘mon1’]
[ceph_deploy.new][DEBUG ] Monitor addrs are [‘192.168.10.10’]
[ceph_deploy.new][DEBUG ] Creating a random mon key…
[ceph_deploy.new][DEBUG ] Writing monitor keyring to ceph.mon.keyring…
[ceph_deploy.new][DEBUG ] Writing initial config to ceph.conf…

[cephuser@mon1 ceph-deploy]$ vi ceph.conf
osd journal size = 1024
osd pool default size = 2
osd pool default min size = 1
osd pool default pg num = 256
osd pool default pgp num = 256
[mon]
mon osd allow primary affinity = 1

เพื่มในส่วนนี้เข้าไป ต่อไปเป็นขั้นตอนการทำการ install packages ceph ทั้ง 3 เครื่อง (ต้องสั่งที่ /home/cephuser/ceph-deploy เท่านั้น)

[cephuser@mon1 ceph-deploy]$ ceph-deploy install mon1 osd1 osd2

เมื่อ install packages ceph เสร็จเรียบร้อยแล้ว ขั้นตอนต่อไปเป็นการ create initial

[cephuser@mon1 ceph-deploy]$ ceph-deploy mon create-initial

[cephuser@mon1 ceph-deploy]$ ls
ceph.bootstrap-mds.keyring ceph.client.admin.keyring ceph.mon.keyring
ceph.bootstrap-osd.keyring ceph.conf
ceph.bootstrap-rgw.keyring ceph-deploy-ceph.log

ขั้นตอนนี้เป็นการเอา key ที่ generated ได้มาเก็บไว้ที่เครื่อง mon1 แต่ในกรณีนี้เรา initial จากเครื่องนี้ก็ไม่ต้องทำคำสั่งนี้ แต่ในกรณีที่เรามี mon หลายเครื่องต้องสั่ง gatherkeys ไปให้เครื่อง mon ทุกเครื่อง

[cephuser@mon1 ceph-deploy]$ sudo chmod +r /etc/ceph/ceph.client.admin.keyring

ถึงขึ้นตอนนี้เป็นการเสร็จสิ้นตัว mon ต่อไปเป็นการทำเครื่องที่เป็น osd

จากนั้นให้ทำการเตรียมเครื่องที่เป็น osd โดยทำการแบ่ง partition โดยให้แต่ละ host มี partition อยู่ทั้งหมด 3 partition โดยเป็น partition b,c,d โดยเราจะทำ partition b,c เป็น osd และจะทำ partition d เป็น journal โดยปกติแล้ว partition ที่เป็น journal นั้นควรจะเป็น disk ที่เป็น ssd กรณีของ journal นั้นไม่ควรเป็น disk ลูกเดียวกันกับ osd เพราะจะไม่ได้ช่วยอะไรเลย เพราะทุกครั้งที่เขียน disk นั้นมันต้องมา write journal ก่อนเป็น log ก่อนที่จะทำการ write ลง osd

############################################

วิธีการเตรียม osd ในแต่ละ host ที่จะทำเป็น osd ให้ ssh เข้าไปที่ osd แต่ละเครื่องแล้วใช้คำสั่ง parted

[root@osd1 ~]# lsblk
NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINT
sda 8:0 0 10G 0 disk
โ”œโ”€sda1 8:1 0 1G 0 part /boot
โ””โ”€sda2 8:2 0 9G 0 part
โ”œโ”€cl-root 253:0 0 8G 0 lvm /
โ””โ”€cl-swap 253:1 0 1G 0 lvm [SWAP]
sdb 8:16 0 15G 0 disk
sdc 8:32 0 15G 0 disk
sdd 8:48 0 5G 0 disk
sr0 11:0 1 1024M 0 rom

จะสังเกตุเห็นว่ามี disk ที่เราเพิ่มเข้าไปทั้งหมด 3 ลูก 2 ลูกมีขนาด 15 GB ที่เป็น data ส่วนอีกลูกเป็น journal ที่มีขนาด 5 GB

[root@osd1 ~]# parted -s /dev/sdb mklabel GPT mkpart primary xfs 0% 100%
[root@osd1 ~]# parted -s /dev/sdc mklabel GPT mkpart primary xfs 0% 100%
[root@osd1 ~]# parted -s /dev/sdd mklabel GPT mkpart primary 0% 50% mkpart primary 51% 100%
[root@osd1 ~]# mkfs.xfs /dev/sdb -f
meta-data=/dev/sdb isize=512 agcount=4, agsize=983040 blks
= sectsz=512 attr=2, projid32bit=1
= crc=1 finobt=0, sparse=0
data = bsize=4096 blocks=3932160, imaxpct=25
= sunit=0 swidth=0 blks
naming =version 2 bsize=4096 ascii-ci=0 ftype=1
log =internal log bsize=4096 blocks=2560, version=2
= sectsz=512 sunit=0 blks, lazy-count=1
realtime =none extsz=4096 blocks=0, rtextents=0


[root@osd1 ~]# mkfs.xfs /dev/sdc -f
meta-data=/dev/sdc isize=512 agcount=4, agsize=983040 blks
= sectsz=512 attr=2, projid32bit=1
= crc=1 finobt=0, sparse=0
data = bsize=4096 blocks=3932160, imaxpct=25
= sunit=0 swidth=0 blks
naming =version 2 bsize=4096 ascii-ci=0 ftype=1
log =internal log bsize=4096 blocks=2560, version=2
= sectsz=512 sunit=0 blks, lazy-count=1
realtime =none extsz=4096 blocks=0, rtextents=0


[root@osd1 ~]# lsblk
NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINT
sda 8:0 0 10G 0 disk
โ”œโ”€sda1 8:1 0 1G 0 part /boot
โ””โ”€sda2 8:2 0 9G 0 part
โ”œโ”€cl-root 253:0 0 8G 0 lvm /
โ””โ”€cl-swap 253:1 0 1G 0 lvm [SWAP]
sdb 8:16 0 15G 0 disk
sdc 8:32 0 15G 0 disk
sdd 8:48 0 5G 0 disk
โ”œโ”€sdd1 8:49 0 2.5G 0 part
โ””โ”€sdd2 8:50 0 2.5G 0 part
sr0 11:0 1 1024M 0 rom

จากการ แบ่ง partition แล้วนั้นจะเห็นว่ามี sdb sdc และ sdd1 และ sdd2

[root@osd1 ~]# ls -l /dev/sdd1
brw-rw — — 1 root disk 8, 49 Jan 2 11:06 /dev/sdd1
[root@osd1 ~]# ls -l /dev/sdd2
brw-rw — — 1 root disk 8, 50 Jan 2 11:06 /dev/sdd2

จะเห็นว่า partition ที่เป็น /dev/sdd1 และ /dev/sdd2 owner เป็น root:disk ซึ่งตอน install ceph partition นี้ owner จะต้องเป็น ceph:ceph ซึ่งจะใช้วิธีการ chown ก็ได้แต่ถ้า chown เวลา reboot เครื่องก็จะกลับมาเป็น root:disk อีกจะทำให้ระบบใช้ไม่ได้จึงต้องสั่ง ดังนี้

[root@osd1 ~]# sgdisk -t 1:45b0969e-9b03–4f30-b4c6-b4b80ceff106 /dev/sdd
[[root@osd1 ~]# sgdisk -t 2:45b0969e-9b03–4f30-b4c6-b4b80ceff106 /dev/sdd

Warning: The kernel is still using the old partition table.
The new table will be used at the next reboot.
The operation has completed successfully.

จากนั้นทำขั้นตอนเดียวกัน ที่เครื่อง osd2 เหมือนกับ osd1 ##########

ขั้นตอนต่อไปให้เข้าไปที่เครื่อง mon1

[cephuser@mon1 ceph-deploy]$ ceph-deploy disk zap osd1:sdb osd1:sdc osd2:sdb osd2:sdc

คำสั่งนี้จะทำการ clear disk ให้เป็น disk ว่างๆและทำ partition เป็น GPT

จากนั้นทำการ deploy osd โดยใช้คำสั่ง

[cephuser@mon1 ceph-deploy]$ceph-deploy osd create osd1:sdb:/dev/sdd1 osd1:sdc:/dev/sdd2 osd2:sdb:/dev/sdd1 osd2:sdc:/dev/sdd2

พอเสร็จให้ลองทำการสั่ง

[cephuser@mon1 ceph-deploy]$ ceph -s
cluster 28805458–9766–4c19–9339–84cbf5102e0b
health HEALTH_OK
monmap e1: 1 mons at {mon1=192.168.10.10:6789/0}
election epoch 3, quorum 0 mon1
osdmap e21: 4 osds: 4 up, 4 in
flags sortbitwise,require_jewel_osds
pgmap v36: 64 pgs, 1 pools, 0 bytes data, 0 objects
134 MB used, 61261 MB / 61395 MB avail
64 active+clean

จะเห็นว่า status HEALTH_OK แล้วตรง osdmaps มีทั้งหมดอยู่ 4 osds

cephuser@mon1 ceph-deploy]$ ceph osd tree
ID WEIGHT TYPE NAME UP/DOWN REWEIGHT PRIMARY-AFFINITY 
-1 0.05835 root default 
-2 0.02917 host osd1 
 0 0.01459 osd.0 up 1.00000 1.00000 
 1 0.01459 osd.1 up 1.00000 1.00000 
-3 0.02917 host osd2 
 2 0.01459 osd.2 up 1.00000 1.00000 
 3 0.01459 osd.3 up 1.00000 1.00000

เสร็จสิ้นการติดตั้ง ceph ต่อไปจะเป็นการใช้งาน ceph

[cephuser@mon1 ceph-deploy]$ ceph osd lspools
0 rbd,

โดย default จะมี pool rbd เป็น default มาให้ เราสามารถจะ create pool ขึ้นมาใหม่ก็ได้หรือเราจะใช้ pool rbd ที่เป็น default มาเลยก็ได้ ซึ่งถ้าใช้ pool default ก็สามารถสร้าง image ขึ้นมาได้เลยโดยใช้คำสั่ง

[cephuser@mon1 ceph-deploy]$ rbd create test_image --size 5G
[cephuser@mon1 ceph-deploy]$ rbd ls -l
NAME SIZE PARENT FMT PROT LOCK
test_image 5120M 2

ต่อไปเป็นขั้นตอนการ map ขึ้นมาใช้งาน

[cephuser@mon1 ceph-deploy]$ sudo rbd feature disable test_image exclusive-lock, object-map, fast-diff, deep-flatten
[cephuser@mon1 ceph-deploy]$ sudo rbd map test_image
/dev/rbd0
[cephuser@mon1 ceph-deploy]$ rbd showmapped
id pool image snap device
0 rbd test_image — /dev/rbd0

จะเห็นว่า pool rbd มี image ชื่อ test_image map อยู่กับ device /dev/rbd0

[cephuser@mon1 ceph-deploy]$ lsblk
NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINT
sda 8:0 0 10G 0 disk
โ”œโ”€sda1 8:1 0 1G 0 part /boot
โ””โ”€sda2 8:2 0 9G 0 part
โ”œโ”€cl-root 253:0 0 8G 0 lvm /
โ””โ”€cl-swap 253:1 0 1G 0 lvm [SWAP]
sr0 11:0 1 1024M 0 rom
rbd0 252:0 0 5G 0 disk

จะสังเกตุเห็นว่ามี rbd0 เป็น disk ขนาด 5G ขึ้นมา จากนั้นทำการ format โดยใช้ fdisk หรือ parted ก็ได้

[cephuser@mon1 ceph-deploy]$ sudo parted -s /dev/rbd0 mklabel GPT mkpart primary xfs 0% 100%
[cephuser@mon1 ceph-deploy]$ lsblk
NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINT
sda 8:0 0 10G 0 disk
โ”œโ”€sda1 8:1 0 1G 0 part /boot
โ””โ”€sda2 8:2 0 9G 0 part
โ”œโ”€cl-root 253:0 0 8G 0 lvm /
โ””โ”€cl-swap 253:1 0 1G 0 lvm [SWAP]
sr0 11:0 1 1024M 0 rom
rbd0 252:0 0 5G 0 disk
โ””โ”€rbd0p1 252:1 0 5G 0 part

จะมี partition rbd0p1 ขึ้นมาทำการ format เป็น xfs

[cephuser@mon1 ceph-deploy]$ sudo mkfs.xfs /dev/rbd0p1 -f
meta-data=/dev/rbd0p1 isize=512 agcount=9, agsize=162816 blks
= sectsz=512 attr=2, projid32bit=1
= crc=1 finobt=0, sparse=0
data = bsize=4096 blocks=1308672, imaxpct=25
= sunit=1024 swidth=1024 blks
naming =version 2 bsize=4096 ascii-ci=0 ftype=1
log =internal log bsize=4096 blocks=2560, version=2
= sectsz=512 sunit=8 blks, lazy-count=1
realtime =none extsz=4096 blocks=0, rtextents=0

หลังจากนั้นทำการ create mount point

[cephuser@mon1 ceph-deploy]$ sudo mkdir /mnt/rbd0
[cephuser@mon1 ceph-deploy]$ sudo mount /dev/rbd0p1 /mnt/rbd0
[cephuser@mon1 ceph-deploy]$ df -h
Filesystem Size Used Avail Use% Mounted on
/dev/mapper/cl-root 8.0G 1.4G 6.7G 18% /
devtmpfs 367M 0 367M 0% /dev
tmpfs 377M 0 377M 0% /dev/shm
tmpfs 377M 5.1M 372M 2% /run
tmpfs 377M 0 377M 0% /sys/fs/cgroup
/dev/sda1 1014M 182M 833M 18% /boot
tmpfs 76M 0 76M 0% /run/user/0
/dev/rbd0p1 5.0G 33M 5.0G 1% /mnt/rbd0

ทดสอบการ access file โดยการ copy data ใส่เข้าไป

[cephuser@mon1 ceph-deploy]$ sudo cp -R /etc/* /mnt/rbd0

จากนั้นดู data ที่ใส่ไป

[cephuser@mon1 ceph-deploy]$ ls /mnt/rbd0

กรณีที่ต้องการให้ windows สามารถ access ได้นั้นสามารถทำได้โดยผ่าน smb ดังนี้

[root@mon1 ~]# yum -y install samba

ทำการ create share folder ให้ windows มองเห็น

[root@mon1 ~]# vi /etc/samba/smb.conf
[cephshare]
path = /mnt/rbd0
browsable = yes
writable = yes
read only = no
guest ok = no
create mask = 0644
force user = cephuser
[root@mon1 ~]# systemctl enable smb
Created symlink from /etc/systemd/system/multi-user.target.wants/smb.service to /usr/lib/systemd/system/smb.service.
[root@mon1 ~]# systemctl start smb

ทำการ add smb user ชื่อ cephuser

[root@mon1 ~]# smbpasswd -a cephuser
New SMB password:
Retype new SMB password:
Added user cephuser.

ดู IP Address ขา bridge interface เพื่อทำการ Access ผ่าน Windows

[root@mon1 ~]# ip a
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN qlen 1
link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
inet 127.0.0.1/8 scope host lo
valid_lft forever preferred_lft forever
inet6 ::1/128 scope host
valid_lft forever preferred_lft forever
2: enp0s3: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP qlen 1000
link/ether 08:00:27:2d:fb:1c brd ff:ff:ff:ff:ff:ff
inet 10.0.2.15/24 brd 10.0.2.255 scope global dynamic enp0s3
valid_lft 82118sec preferred_lft 82118sec
inet6 fe80::2424:7e01:ea2a:8a67/64 scope link
valid_lft forever preferred_lft forever
3: enp0s8: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP qlen 1000
link/ether 08:00:27:6f:36:86 brd ff:ff:ff:ff:ff:ff
inet 192.168.10.10/24 brd 192.168.10.255 scope global enp0s8
valid_lft forever preferred_lft forever
inet6 fe80::a00:27ff:fe6f:3686/64 scope link
valid_lft forever preferred_lft forever
4: enp0s9: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP qlen 1000
link/ether 08:00:27:8f:3a:91 brd ff:ff:ff:ff:ff:ff
inet 192.168.1.42/24 brd 192.168.1.255 scope global dynamic enp0s9
valid_lft 82119sec preferred_lft 82119sec
inet6 fe80::1b0a:732:c2ad:3599/64 scope link
valid_lft forever preferred_lft forever

จากนั้นลองดู ip ที่เป็น adapter 3 ที่เป็น bridge mode ที่เคย add ไว้ตอนแรก

ลองสั่งที่ windows

start -> run

\\192.168.1.42

จะเห็น cephshare เมื่อเข้าไปดูก็จะเห็น data ทั้งหมด ถ้าจะให้ เพิ่มลบได้ก็ต้องให้ folder ที่ share นั้น cephuser write ได้

[root@mon1]# chown cephuser:cephuser /mnt/rbd0

อีกวิธีหนึ่งในการ access จาก windows ผ่าน iscsi ซึ่งเราจะต้องติดตั้ง iscsi target ดังนี้

เริ่มจากทำการ create image ที่เป็น iscsi ขึ้นมาก่อน

[root@mon1 /]# rbd create iscsi --size 5G
[root@mon1 /]# rbd ls -l
NAME SIZE PARENT FMT PROT LOCK
iscsi 5120M 2
test_image 5120M 2
[root@mon1 /]# sudo rbd feature disable iscsi exclusive-lock, object-map, fast-diff, deep-flatten
[root@mon1 /]# sudo rbd map iscsi
/dev/rbd1
[root@mon1 /]# rbd showmapped
id pool image snap device
0 rbd test_image — /dev/rbd0
1 rbd iscsi — /dev/rbd1
[root@mon1 /]# yum install -y targetcli targetd iscsi-target-utils

ใช้คำสั่ง targetcli ในการ config iscsi target

[root@mon1 ~]# targetcli
/> cd backstores/block
/backstores/block> create iscsi /dev/rbd1
Created block storage object iscsi using /dev/rbd1.
/backstores/block> ls
o- block ………………………………………….. [Storage Objects: 1]
o- iscsi ……………………. [/dev/rbd1 (5.0GiB) write-thru deactivated]
/backstores/block> cd ..
/backstores> ls
o- backstores …………………………………………………… […]
o- block ………………………………………… [Storage Objects: 1]
| o- iscsi ………………….. [/dev/rbd1 (5.0GiB) write-thru deactivated]
o- fileio ……………………………………….. [Storage Objects: 0]
o- pscsi ………………………………………… [Storage Objects: 0]
o- ramdisk ………………………………………. [Storage Objects: 0]
/backstores> cd ..
/> cd iscsi
/iscsi> ls

o- iscsi ……………………………………………….. [Targets: 0]

/iscsi> set discovery_auth enable=0
Parameter enable is now ‘False’.
/iscsi> create
Created target iqn.2003–01.org.linux-iscsi.mon1.x8664:sn.bea00777b527.
Created TPG 1.
Global pref auto_add_default_portal=true
Created default portal listening on all IPs (0.0.0.0), port 3260.
/iscsi> cd iqn.2003–01.org.linux-iscsi.mon1.x8664:sn.bea00777b527/
/iscsi/iqn.20….bea00777b527> ls
o- iqn.2003–01.org.linux-iscsi.mon1.x8664:sn.bea00777b527 ………… [TPGs: 1]
o- tpg1 ……………………………………….. [no-gen-acls, no-auth]
o- acls …………………………………………………. [ACLs: 0]
o- luns …………………………………………………. [LUNs: 0]
o- portals ……………………………………………. [Portals: 1]
o- 0.0.0.0:3260 …………………………………………….. [OK]
/iscsi/iqn.20….bea00777b527> cd tpg1
/iscsi/iqn.20…0777b527/tpg1> cd luns
/iscsi/iqn.20…527/tpg1/luns> create /backstores/block/iscsi 
Created LUN 0.
/iscsi/iqn.20…527/tpg1/luns> cd ../acls
/iscsi/iqn.20…527/tpg1/acls> ls
o- acls …………………………………………………….. [ACLs: 0]
/iscsi/iqn.20…527/tpg1/acls> cd /
/> saveconfig
Last 10 configs saved in /etc/target/backup.
Configuration saved to /etc/target/saveconfig.json

กรณีที่ windows ต้องการที่จะ access จำเป็นจะต้องรู้ iSCSI initiator name เพื่อที่จะให้ windows map กับ iSCSI LUN

เปิดโปรแกรม iSCSI initiator ขึ้นมาบน windows

เลือกที่ menu configuration

นำค่า Initiator name มาใส่

/iscsi/iqn.20…527/tpg1/acls> create iqn.1991–05.com.microsoft:cc
Created Node ACL for iqn.1991–05.com.microsoft:cc
Created mapped LUN 0.
/iscsi/iqn.20…527/tpg1/acls> cd /
/>saveconfig
/iscsi/iqn.20…527/tpg1/acls> exit
Global pref auto_save_on_exit=true
Last 10 configs saved in /etc/target/backup.
Configuration saved to /etc/target/saveconfig.json

ทำการ enable target และทำการ restart service

[root@mon1 /]# systemctl enable target
Created symlink from /etc/systemd/system/multi-user.target.wants/target.service to /usr/lib/systemd/system/target.service.
[root@mon1 /]# systemctl start target

กด quick connect

จากนั้นมาที่ computer management เลือกที่ storage -> disk management

จะเห็นว่ามี disk 2 ที่มีขนาด 5 GB ขึ้นมา click ขวาที่ disk 2 -> new simple volume

จะเห็น drive E: ขึ้นมาล่ะ เสร็จสิ้นการติดตั้ง

กรณีที่ต้องการ mount จากเครื่องที่เป็นเครื่อง client ที่ไม่ได้ลง ceph ไว้ทำได้ดังนี้

[root@client ~]# modprobe rbd

ตัว kernel ที่มี rbd module มาแล้วจะเป็น kernel 2.6.34 เป็นต้นไป

จะมี file /sys/bus/rbd/add

$ /bin/echo “ceph_monitor_ip name=admin,secret=ceph_key ceph_pool ceph_image” >/sys/bus/rbd/add

วิธีการดู ceph_key ให้เข้าไปที่เครื่อง mon แล้วสั่ง

จากตัวอย่างข้างบนสามารถสั่งได้ดังนี้

[root@mon1 ~]# ceph auth list
client.admin
key: AQBSz2lYNfJ7OhAAf3tmASgFy+ujQ9l90zR7nQ==
caps: [mds] allow *
caps: [mon] allow *
caps: [osd] allow *

จะเห็น key นี้ให้เอา key นี้ไปใส่

[root@client /]# /bin/echo “192.168.10.10 name=admin,secret=AQBSz2lYNfJ7OhAAf3tmASgFy+ujQ9l90zR7nQ== rbd test_image” > /sys/bus/rbd/add
[root@client /]# lsblk
NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINT
sda 8:0 0 10G 0 disk
โ”œโ”€sda1 8:1 0 1G 0 part /boot
โ””โ”€sda2 8:2 0 9G 0 part
โ”œโ”€cl-root 253:0 0 8G 0 lvm /
โ””โ”€cl-swap 253:1 0 1G 0 lvm [SWAP]
sr0 11:0 1 1024M 0 rom
rbd0 252:0 0 5G 0 disk
โ””โ”€rbd0p1 252:1 0 5G 0 part

จากนั้นทำการ mount ขึ้นมาโดยใช้คำสั่ง

[root@client /]# mkdir /mnt/rbd0
[root@client /]# mount /dev/rbd0p1 /mnt/rbd0

การใช้งาน Cephfs ผ่าน kernel driver

เริ่มต้นการใช้งาน cephfs นั้นจะต้องมี MDS ขึ้นมาก่อนจากนั้นจึงจะทำการ mount

cephfs ขึ้นมาใช้งานได้โดยมีขั้นตอนดังนี้

[cephuser@mon1 ceph-deploy]$ ceph-deploy mds create mon1
[cephuser@mon1 ceph-deploy]$ ceph osd pool create cephfs_data 256
pool ‘cephfs_data’ created
[cephuser@mon1 ceph-deploy]$ ceph osd pool create cephfs_metadata 256
pool ‘cephfs_metadata’ created
[cephuser@mon1 ceph-deploy]$ ceph fs new mycephfs cephfs_metadata cephfs_data
new fs with metadata pool 2 and data pool 1

ในการเชื่อมต่อกับ cephfs ต้องผ่านการ authentication โดย default ดังนั้นจะต้องมีสิทธิในการเชื่อมต่อ เราจึงต้องใช้ key มาโดยใช้คำสั่ง

[cephuser@mon1 ceph-deploy]$ ceph auth list
installed auth entries:
osd.0
key: AQCF1WlYP6cMLhAAEHEAK2jkA58GkQ1o55EoGw==
caps: [mon] allow profile osd
caps: [osd] allow *
osd.1
key: AQCR1WlYgUQ7ABAAfkmEfz757Md8pqDm9PLzzw==
caps: [mon] allow profile osd
caps: [osd] allow *
osd.2
key: AQCc1WlYcBd3HhAALJ+lhPd8cACcu78PEJWApQ==
caps: [mon] allow profile osd
caps: [osd] allow *
osd.3
key: AQCo1WlY3vsPKRAAm+xmhZITHyILMJ8VOxz96w==
caps: [mon] allow profile osd
caps: [osd] allow *
client.admin
key: AQBSz2lYNfJ7OhAAf3tmASgFy+ujQ9l90zR7nQ==
caps: [mds] allow *
caps: [mon] allow *
caps: [osd] allow *

จากนั้นทำการ copy key ของ admin ไปใส่ที่เครื่อง client

[root@client ~]# vi admin.secret
AQBSz2lYNfJ7OhAAf3tmASgFy+ujQ9l90zR7nQ==
[root@client mnt]# mkdir /mnt/mycephfs
[root@client ~]# mount -t ceph 192.168.10.10:6789:/ /mnt/mycephfs -o name=admin,secretfile=admin.secret

ถ้าในกรณีที่สั่ง mount -t ceph แล้วขึ้น wrong fs type แสดงว่าไม่มี file /usr/sbin/mount.ceph ซึ่ง file นี้จะมีก็ต่อเมื่อ install ceph บนเครื่อง client ดังนั้นก่อนที่จะสั่ง mount -t ceph ได้ต้อง deploy ceph ไปในเครื่อง client ก่อน

[cephuser@mon1 ceph-deploy]$ ceph-deploy install client

กรณีที่ใช้ cephfs ผ่าน fuse (file system in user space)

จะใช้คำสั่ง ceph-fuse ซึ่งจะต้อง install packages ceph-fuse ก่อน

[root@client cephfs]# yum -y install ceph-fuse*

จากนั้นทำการ copy file ceph.client.admin.keyring จากเครื่อง mon1 มาที่เครื่อง client ที่ /etc/ceph

[root@mon1 ceph]# scp /etc/ceph/ceph.client.admin.keyring root@192.168.10.13:/etc/ceph/.
[root@client ~]# ceph-fuse -k /etc/ceph/ceph.client.admin.keyring -m 192.168.10.10:6789 /mnt/mycephfs
2017-01-09 11:26:59.893541 7f88fa47eec0 -1 did not load config file, using default settings.
ceph-fuse[2743]: starting ceph client
2017-01-09 11:26:59.916382 7f88fa47eec0 -1 init, newargv = 0x7f8904fb2720 newargc=11
ceph-fuse[2743]: starting fuse
[root@client ~]# df -h
Filesystem Size Used Avail Use% Mounted on
/dev/mapper/cl-root 8.0G 1.4G 6.7G 18% /
devtmpfs 367M 0 367M 0% /dev
tmpfs 377M 0 377M 0% /dev/shm
tmpfs 377M 5.1M 372M 2% /run
tmpfs 377M 0 377M 0% /sys/fs/cgroup
/dev/sda1 1014M 182M 833M 18% /boot
tmpfs 76M 0 76M 0% /run/user/0
/dev/rbd0p1 5.0G 64M 5.0G 2% /mnt/rbd0
ceph-fuse 60G 268M 60G 1% /mnt/mycephfs

กรณีสั่ง ceph -s แล้วขึ้น Too many PGs per OSD ให้เข้าไปที่ ceph.conf เพิ่ม

[root@mon1 ~]# vi ceph.conf
mon_pg_warn_max_per_osd = 0
[root@mon1 ~]#su - cephuser
[cephuser@mon1 ~]$ cd ceph-deploy
[cephuser@mon1 ~]$ ceph-deploy --overwrite-conf admin mon1 osd1 osd2
[root@mon1 ~]#systemctl restart ceph-mon@mon1.service
One clap, two clap, three clap, forty?

By clapping more or less, you can signal to us which stories really stand out.