全能成熟穩定開源分散式儲存Ceph破冰之旅-上

2022-09-08 06:02:22

@

概述

定義

Ceph 官網 https://ceph.com

Ceph 最新官網檔案 https://docs.ceph.com/en/latest

Ceph GitHub原始碼地址 https://github.com/ceph/ceph

Ceph是一個開源的、自我修復和自我管理的統一分散式儲存系統。目前最新版本為Quincy

ceph目前已得到眾多雲端計算廠商的支援並被廣泛應用。RedHat及OpenStack kubernetes都可與Ceph整合以支援虛擬機器器映象的後端儲存。Ceph是統一儲存解決方案,根據場景劃分可以將Ceph分為三大塊,分別是物件儲存(相容swift s3協定)、塊裝置儲存和檔案系統服務。在虛擬化領域裡,比較常用到的是Ceph的塊裝置儲存,比如在OpenStack專案裡,Ceph的塊裝置儲存可以對接OpenStack的cinder後端儲存、Glance的映象儲存和虛擬機器器的資料儲存,比較直觀的是Ceph叢集可以提供一個raw格式的塊儲存來作為虛擬機器器範例的硬碟;SDS 能將儲存軟體與硬體分隔開的儲存架構。

傳統儲存方式及問題

  • 塊儲存:裸磁碟未被格式化的磁碟
    • DAS(直連儲存,usb,硬碟插到電腦):scsi介面、介面數量有限、傳輸距離有限,scsi重新封裝為iscsi,iscsi在ip網路里跑,scsi協定寫資料到硬碟,加了個i可以在san的區域網路中傳輸。
    • SAN(儲存區域網路):ip-san 網路(iscsi) 乙太網 fc-san網路 (fc協定) 光纖模組
    • ceph rbd
  • 檔案系統儲存:共用目錄
    • 集中式
      • NAS:網路附加儲存 通過網路共用目錄
      • nfs:unix nfs
      • cifs:samba 網路上的芳鄰
      • FTP
    • 分散式
      • cephfs
      • glusterfs:屬於紅帽,ceph也屬於紅帽
      • moosefs
      • server共用目錄,client掛載目錄使用
      • hdfs:hadoop分散式檔案系統
  • 物件儲存:一般都是分散式儲存
    • 非結構化資料:備份檔案,上傳和下載檔案。
    • 結構化資料:資料庫 (購物,商品價格數量。有規律,一列一列的)
    • 非結構化資料:多媒體(圖片 視訊 音訊)

傳統儲存存在問題,儲存處理能力不足、儲存空間能力不足、單點問題。傳統儲存 DAS、NAS、SAN、RAID擴容問題不方便,將一堆磁碟,放在一個控制器裡,縱向擴充套件scale up,擴容cpu、記憶體、硬碟可能更貴;分散式儲存 (效能是不如傳統儲存,比如資料庫) 無中心節點 普通伺服器儲存資料(硬碟,cpu,記憶體) ,但可以橫向擴充套件 scale out 擴伺服器,加節點 (節點可以橫向擴充套件,無中心節點,偏向軟體和人才要求 ) ,使用傳統儲存價效比很低,除非對特定效能有需求。

優勢

  • 高擴充套件性:使用普通X86伺服器,支援10~1000臺伺服器,支援TB到EB級的擴充套件。
  • 高可靠性:沒有單點故障,多資料副本,自動管理,自動修復。
  • 高效能:資料分佈均衡。

生產遇到問題

  • 擴容問題

Ceph中資料以PG為單位進行組織,因此當資料池中加入新的儲存單元(OSD)時,通過調整OSDMAP會帶來資料重平衡。正如提到的,如果涉及到多個OSD的擴容是可能導致可用PG中OSD小於min_size,從而發生PG不可用、IO阻塞的情況。為了儘量避免這種情況的出現,只能將擴容粒度變小,比如每次只擴容一個OSD或者一個機器、一個機櫃(主要取決於儲存隔離策略),但是這樣註定會帶來極大的運維工作量,甚至連擴容速度可能都趕不上資料增長速度。

  • 資料遷移過程中的IO爭用問題

在頻繁資料遷移過程中帶來的IO爭用問題。當叢集規模變大後,硬碟損壞、PG數量擴充可能會變得常態化。

  • PG數量調整問題

在解決了資料遷移過程中的PG可用性問題和IO爭用問題後,提到的PG數量調整問題自然也就解決了。

  • 叢集利用率問題

儲存成本問題主要是講叢集可用率問題,即Ceph叢集規模增大後,偽隨機演演算法導致了儲存資源分佈不均衡,磁碟利用率方差過大的問題。

  • 運維複雜度問題

Ceph本身是一個十分複雜的體系,要做到穩定運維非常看重團隊的實力。

架構

總體架構

Ceph在實現統一儲存,支援物件、塊和檔案儲存。Ceph非常可靠,易於管理且免費。Ceph具有管理大量資料的能力和可伸縮性,支援數以千計的使用者端存取pb到eb的資料。Ceph節點利用普通硬體和智慧守護行程,Ceph儲存叢集容納大量節點,這些節點相互通訊以動態地複製和重分發資料。通過ceph面板或使用者端登入到ceph叢集後看到3個服務:RADOSGW、RBD、CEPH FS。

  • RADOS GW:全稱是RADOS Gateway,顧名思義,是個閘道器。它提供物件儲存服務,像華為雲、騰訊雲網頁上花錢買到的物件儲存伺服器基本上就是它提供的。它將RADOS物件儲存服務封裝成了一個一個bucket,顧客能買到的就是bucket。注意GW本身沒有物件儲存功能,它只是基於RADOS,在RADOS基礎之上提供了一個簡單的名稱空間隔離功能(bucket)。物件儲存功能完完全全是RADOS提供的。
  • RBD: reliable block device。它提供塊儲存服務。雲伺服器系統磁碟在後臺實際上是一個大檔案,塊儲存相比普通硬碟的優勢是,它適合儲存超大檔案。
  • CEPH FS :它提供檔案系統服務。說白了,通過網路連線FS就能建立資料夾、存放檔案了。你可以把它理解成百度網路硬碟。檔案系統擅長處理和儲存小檔案。
  • Ceph Storage Cluster:中文名是Ceph儲存叢集,前面的三大服務的安裝需要基於Ceph儲存叢集。一個Ceph儲存叢集包括OSD裝置、MON裝置、librados介面。所以Ceph儲存叢集包含的守護行程有osd程序、mon程序、ceph-manager程序。
  • Ceph Cluster:在Ceph儲存叢集中,去掉所有的OSD裝置,剩下的部分就是Ceph叢集。Ceph叢集直接由cephadm bootstrap命令建立出來。
  • LIBRADOS:是ceph服務中的基礎介面,以上的三大服務都是基於LIBRADOS中的一堆散碎介面封裝出來的。三大服務和LIBRADOS的關係就相當於系統命令和cpu指令集的關係。LIBRADOS存在的意義就是將RADOS中無數個細小的功能封裝成介面,供後續三大服務和使用者端的再封裝和使用
  • RADOS:A reliable,automomous,distributed object storage.提取首字母就是RADOS。它是ceph最底層的功能模組,是一個無限可擴容的物件儲存服務,能將檔案拆解成無數個物件(碎片)存放在硬碟中,大大提高了資料的穩定性。一個RADOS服務由OSD和Monitor兩個元件組成。OSD和Monitor都可以部署在1-n個硬碟中,這就是ceph分散式的由來,高擴充套件性的由來。
  • OSD:Object Storage Device。是分散式儲存系統的基本單位,物理意義上對應一塊硬碟。這個服務包含作業系統(linux)和守護行程(OSD daemon)。所以一臺伺服器上插了很多塊硬碟,就能建立很多個OSD。
  • Monitor: 很多部落格和檔案裡把它簡寫成Mon。它的功能是提供叢集執行圖。使用者登入ceph使用者端後,首先會連線Mon獲取叢集執行圖,知道某某檔案儲存在哪些OSD上,隨後直接和這些OSD通訊,獲取檔案。叢集執行圖中包含很多資訊,包括:Monitor Map、OSD Map、PG Map、Crush演演算法Map、MDS Map。由於使用者每次讀取檔案,只是從Monitor中拿一個json,所以Monitor程式的壓力不是很大。ceph速度快,硬體開銷小,十分優秀。
  • POOL:多個OSD組成的儲存池。ceph管理員可以將多個OSD組成一個池子,儲存池是軟體層面規劃出來的的,物理上不真實存在。ceph在安裝的時候會自動生成一個default池。你可以根據自己的業務需求分配不同容量的儲存池。你也可以把機械硬碟劃到一個儲存池而把所有SSD劃分到另一個儲存池。Pool中資料儲存方式有多副本和糾刪碼兩種形式。多副本模式下,一個塊檔案預設儲存3分,放在不同的故障域中,可以吧多副本模式用raid1去類比。而糾刪碼更像是raid5,對cpu消耗稍大,但是節約磁碟空間,檔案只有1份。
  • MDS:後設資料伺服器。負責提供CEPH FS檔案系統的後設資料。後設資料記錄了目錄名、檔案所有者、存取模式等資訊。MDS裝置只對Ceph FS服務。如果你不需要部署FS,則無需建立MDS。它存在的意義是保證使用者讀寫檔案時才喚醒OSD,如果使用者只是ls看一下檔案,則不會啟動OSD,這樣減輕ceph叢集的壓力。
  • 心跳:OSD和OSD之間會時刻檢查對方的心跳。OSD和Mon之間也會檢查心跳。以保證服務正常,網路通暢。一旦任何元件心跳異常,就會從叢集中摘除。由其他元件繼續提供服務。

組成部分

ceph儲存叢集,提供了一個基於RADOS的無限可延伸的Ceph儲存叢集,基於RADOS儲存可延伸的,可靠的儲存 pb級叢集服務。Ceph儲存叢集由多種守護行程組成:

  • Ceph Monitor:維護叢集對映的主副本,Ceph監控器叢集可以確保在監控器守護行程發生故障時的高可用性。
    • 儲存叢集使用者端從Ceph Monitor檢索叢集對映的副本。Ceph Monitor (Ceph -mon)維護叢集狀態的對映,包括監視器對映、管理器對映、OSD對映、MDS對映和CRUSH對映。
    • 這些對映是Ceph守護行程相互協調所需的關鍵叢集狀態。監視器還負責管理守護行程和客戶機之間的身份驗證。
    • 為了實現冗餘和高可用性,通常需要至少三個監視器。
  • Ceph OSD Daemon:守護行程檢查自己的狀態和其他OSD的狀態,並向監視器報告。
    • Ceph Manager守護行程(Ceph -mgr)負責跟蹤執行時指標和Ceph叢集的當前狀態,包括儲存利用率、當前效能指標和系統負載。
    • Ceph Manager守護行程還託管基於python的模組來管理和公開Ceph叢集資訊,包括基於web的Ceph儀表板和REST API。
    • 高可用性通常需要至少兩個管理器。多個監視器範例之間就叢集的狀態達成一致,利用Paxos演演算法大多數的監視器原則來在監視器之間建立關於叢集當前狀態的共識。
  • Ceph Manager:充當監視、編制和外掛模組的端點。
    • 物件儲存守護行程(Ceph OSD, Ceph - OSD)負責儲存資料、處理資料複製、恢復、再平衡,並通過檢查其他Ceph OSD守護行程的心跳情況,向Ceph Monitors和manager提供一些監控資訊。
    • 通常至少需要三個Ceph osd來實現冗餘和高可用性。
  • Ceph Metadata Server:使用Ceph fs提供檔案服務時,通過MDS (Ceph Metadata Server)管理檔案後設資料。
    • Ceph後設資料伺服器(MDS, Ceph - MDS)代表Ceph檔案系統儲存後設資料(例如,Ceph塊裝置和Ceph物件儲存不使用MDS)。
    • Ceph後設資料伺服器使用POSIX檔案系統使用者執行基本命令(如ls、find等),而不會給Ceph儲存叢集帶來巨大的負擔。

CRUSH演演算法

Ceph將資料作為物件儲存在邏輯儲存池中。Ceph使用CRUSH演演算法計算出哪個放置組(PG)應該包含該物件,哪個OSD應該儲存該放置組。

CRUSH演演算法使Ceph儲存叢集能夠動態地擴充套件、平衡和恢復。儲存叢集使用者端和每個Ceph OSD Daemon使用CRUSH演演算法高效地計算資料位置資訊,而不是依賴於一箇中央查詢表。

Ceph的高階特性包括一個通過librados與Ceph儲存叢集的本地介面,以及許多構建在librados之上的服務介面。

Ceph client和Ceph OSD Daemons都使用CRUSH演演算法來高效地計算物件位置資訊,而不是依賴於一箇中央查詢表,提供了更好的資料管理機制,工作分配給叢集中的所有使用者端和OSD守護行程來實現大規模擴充套件;CRUSH使用智慧資料複製來確保彈性更適合超規模儲存。

資料讀寫過程

  • client建立cluster handler;
  • client讀取組態檔;
  • client連線上monitor,獲取叢集map資訊;
  • client讀寫io根據crshmap演演算法請求對應的主osd資料節點。
  • 主osd資料節點同時寫入另外兩個副本節點資料;
  • 等待主節點以及另外兩個副本節點寫完資料狀態;
  • 主節點及副本節點寫入狀態都成功後,返回給client,io寫入完成。【強一致性】

CLUSTER MAP

Ceph依賴於Ceph使用者端和Ceph OSD守護行程對叢集拓撲的瞭解,包括5個地圖,統稱為「叢集地圖」:

  • The Monitor Map:包含每個監視器的叢集fsid、位置、名稱地址和埠。表示當前的時代、地圖建立的時間以及最後一次更改的時間。要檢視監視器對映,請執行ceph mon dump。
  • OSD Map:包含叢集fsid,當Map被建立和最後一次修改時,一個池列表,副本大小,PG號,一個OSD列表和它們的狀態(例如up, in)。可通過執行ceph OSD dump命令檢視OSD地圖。
  • PG Map:包含PG版本,它的時間戳,最後的OSD地圖epoch,完整的比率,以及每個放置組的詳細資訊,如PG ID, Up Set, Acting Set, PG的狀態(例如,active + clean),以及每個池的資料使用統計。
  • CRUSH Map:包含儲存裝置列表、故障域層次結構(例如,裝置、主機、機架、行、房間等),以及儲存資料時遍歷層次結構的規則。檢視CRUSH地圖,執行ceph osd getcrushmap -o {filename};然後執行crushtool -d {comp-crushmap-filename} -o {decomp-crushmap-filename}反編譯。可在文字編輯器中或使用cat檢視反編譯的對映。
  • MDS Map:包含當前MDS Map epoch、Map建立的時間和最後一次更改的時間。它還包含用於儲存後設資料的池、後設資料伺服器列表以及啟動和執行的後設資料伺服器。執行ceph fs dump命令,檢視MDS的map資訊。

每個對映維護其操作狀態更改的迭代歷史。Ceph Monitors維護叢集對映的主副本,包括叢整合員、狀態、更改和Ceph儲存叢集的總體健康狀況。

部署

部署建議

Ceph儲存叢集部署都要從設定每個Ceph節點、網路和Ceph儲存叢集開始。一個Ceph儲存叢集至少需要一個Ceph Monitor、Ceph Manager和Ceph OSD (Object Storage Daemon)。執行Ceph檔案系統使用者端時也需要Ceph後設資料伺服器。如果是在生產中使用Ceph,官方有提供硬體建議(CPU、RAM、記憶體、資料儲存、網路、故障最低硬體建議)和作業系統建議(Ceph的依賴性、平臺),詳細可以查閱官方檔案。比如推薦若干條件

  • 儲存叢集採用全萬兆網路。
  • 叢集網路與公共網路分離。這也是ceph網路模型需求
  • mon、mds與osd分離部署在不同機器上。
  • osd使用SATA。
  • 根據容量規劃叢集
  • 至強E5 2620 V3或以上cpu,64GB或更高記憶體。
  • 叢集主機分散部署,避免機櫃故障(電源、網路)

部署版本

Ceph官方釋出版本號目前按照英文字母大寫開頭的單詞編排,有三個組成部分,生產使用要選擇x.2後面越大越好,代表解決問題越多越穩定。x.y.z. x表示釋出週期(例如,13表示Mimic)。Y表示釋出型別:

  • x.0。Z -開發版本
  • x.1。Z -釋出候選版本(用於測試叢集,勇敢的使用者)
  • x.2。Z -穩定/bug修復版本(供使用者使用)

部署方式

由於ceph元件較多,手工安裝步驟較多,因此官方提供幾種不同的快速安裝Ceph的方法,推薦方法有如下兩種

  • Cephadm:使用容器和systemd安裝和管理Ceph叢集,並與CLI和儀表板GUI緊密整合。
    • cephadm只支援Octopus比其更新的版本。
    • cephadm與新的業務流程API完全整合,並完全支援新的CLI和儀表板特性來管理叢集部署。
    • cephadm需要容器支援(podman或docker)和Python 3。
  • Rook:部署和管理執行在Kubernetes中的Ceph叢集,同時通過Kubernetes api支援儲存資源管理和供應。推薦使用Rook在Kubernetes中執行Ceph,或者將現有的Ceph儲存叢集連線到Kubernetes。
    • Rook只支援Nautilus和Ceph的更新版本。
    • Rook是在Kubernetes上執行Ceph的首選方法,或者是將Kubernetes叢集連線到現有(外部)Ceph叢集的首選方法。
    • Rook支援新的編排器API,完全支援CLI和儀表板中的新管理特性。

其他方法有,比較早使用或者目前已在使用大多數都應該使用的是Ceph-deploy方式:

  • Ceph - Ansible:使用Ansible部署和管理Ceph叢集。
    • Ceph-ansible被廣泛使用。
    • ceph-ansible並沒有與Nautlius和Octopus引入的新的編碼器api整合,這意味著新的管理功能和儀表板整合是不可用的。
  • Ceph-deploy:是一個用於快速部署叢集的工具。
    • Ceph-deploy不再被積極維護。它沒有在比Nautilus更新的Ceph上進行測試。不支援RHEL8、CentOS 8或更新的作業系統。
  • Ceph使用Salt和cephadm安裝Ceph。
  • 安裝Ceph 使用 Juju.
  • 安裝Ceph via Puppet.

Cephadm部署

前置條件

cephadm不依賴於外部設定工具如Ansible、Rook和Salt。Cephadm管理Ceph叢集的完整生命週期,cephadm先在單個節點上建立一個由一個監視器和一個管理器組成小型Ceph叢集,後續cephadm使用業務流程介面擴充套件叢集,新增所有主機並提供所有Ceph守護行程和服務。這些都通過Ceph命令列介面(CLI)或儀表板(GUI)來執行。

  • Python 3
  • Systemd
  • Podman或Docker用於執行容器(參考之前的文章部署)
  • 時間同步(如chrony、NTP)
  • LVM2用於發放儲存裝置(yum install lvm2)

Python 3安裝步驟如下

# 官網下載
wget https://www.python.org/ftp/python/3.10.6/Python-3.10.6.tgz
# 解壓
tar -xvf Python-3.10.6.tgz
# 建立安裝部署目錄
mkdir python3
# 進入目錄
cd Python-3.10.6
# 安裝依賴包
yum -y install zlib-devel bzip2-devel openssl-devel ncurses-devel sqlite-devel readline-devel tk-devel libffi-devel gcc make
# 如果需要openssl編譯安裝則選擇下面步驟
wget https://www.openssl.org/source/openssl-1.1.1q.tar.gz --no-check-certificate
tar -xvf openssl-1.1.1q.tar.gz
mkdir /usr/local/openssl
cd openssl-1.1.1
./config --prefix=/usr/local/openssl
make
make installq
# 安裝python3
mkdir -p /home/commons/python3
ln -s /usr/local/openssl/lib/libssl.so.1.1 /usr/lib64/libssl.so.1.1
ln -s /usr/local/openssl/lib/libcrypto.so.1.1 /usr/lib64/libcrypto.so.1.1
# 修改
./configure --prefix=/home/commons/python3
make
make install
# 建立軟連結
ln -s /home/commons/python3/bin/python3.10 /usr/local/bin/python3
ln -s /home/commons/python3/bin/python3.10 /usr/local/bin/pip3
ln -s /home/commons/python3/bin/python3.10 /usr/bin/python3
# 可以加入環境變數
vi ~/.bash_profile
export PYTHON_HOME=/home/commons/python3/
export PATH=$PYTHON_HOME/bin:$PATH
source ~/.bash_profile
# 檢視版本
python3 --version

# 各自linux發行版的特定安裝方法,一些Linux發行版可能已經包含了最新的Ceph包。在這種情況下,您可以直接安裝cephadm。例如:
# Ubuntu:
apt install -y cephadm

# CentOS Stream
dnf search release-ceph
dnf install --assumeyes centos-release-ceph-quincy
dnf install --assumeyes cephadm

# Fedora:
dnf -y install cephadm

# openSUSE或SLES
zypper install -y cephadm

安裝CEPHADM

# 使用curl獲取獨立指令碼的最新版本。
curl --silent --insecure --remote-name --location https://github.com/ceph/ceph/raw/quincy/src/cephadm/cephadm
# 由於官方獲取不到,jsdelivr的地址
curl --silent --remote-name --location https://cdn.jsdelivr.net/gh/ceph/ceph@quincy/src/cephadm/cephadm
#安裝cephadm,ceph需要python3和epel源;在執行安裝步驟有時會報錯無效的gpg金鑰,可以將ceph.repo檔案中gpgcheck引數改成0,表示不適用金鑰驗證
vi /etc/yum.repos.d/ceph.repo
# 使cephadm指令碼可執行
chmod +x cephadm
# 在cephadm指令碼import ssl後面加入下面語句
ssl._create_default_https_context = ssl._create_unverified_context
# 驗證cephadm命令是否可用
./cephadm --help
# 其實到這一步,cephadm就已經能夠部署叢集了,但是沒有安裝全部功能,也沒有把命令安裝成作業系統命令,新增ceph指定版本的系統包映象源,這裡我們安裝octopus版。本地apt或yum庫中會多出一些映象地址。
#使用cephadm指令碼生成需要的yum源(可以替換為國內源提高下載速度) 可選
sed -i 's#download.ceph.com#mirrors.aliyun.com/ceph#' /etc/yum.repos.d/ceph.repo   #可選
rpm --import 'https://download.ceph.com/keys/release.asc'        #可選
# 新增倉庫
./cephadm add-repo --release octopus
# cephadm 安裝
./cephadm install
which cephadm

引導新的叢集

cephadm bootstrap --mon-ip 192.168.5.53

執行上面後在Pulling container image步驟會需要一段時間,出現下面的返回後表示安裝成功,可看到儀表盤存取地址

bootstrap完成後伺服器若干docker容器執行,prometheus+grafana作為監控系統,alertmanager提供告警功能(叢集有異常會傳送郵件或簡訊),node-exporter將主機暴露給ceph叢集,讓別的伺服器直連存取OSD;ceph-mon容器提供Monitor守護行程,為叢集提供叢集執行圖;ceph-mgr其實是ceph manager守護行程,為叢集提供librados介面;ceph-crash是Crush演演算法容器;檢視拉取映象和啟動的容器如下:

一個ceph叢集算是建立出來了,ceph叢集包括了Mon程序+librados介面;只要我們再安裝OSD,一個完全的Ceph儲存叢集就建立好了;目前這個ceph沒有儲存的功能,僅僅是個管理器。存取https://ckserver2:8443/ ,輸入使用者密碼後,先修改密碼然後再登入

# (注)如果儀表盤(dashboard)密碼忘了,可以使用以下命令重置密碼
ceph dashboard ac-user-set-password admin redhat

安裝命令

# 使用ceph命令第一種方法:cephadm安裝需要切換shell才可以使用ceph命令
cephadm shell
ceph -s
ceph -s

# 使用ceph命令第二種方法:要執行ceph命令,也可以執行如下命令:
cephadm shell -- ceph -s
# 使用ceph命令第三種方法:可以安裝ceph-common包,其中包含所有ceph命令,包括ceph、rbd、mount。ceph(用於掛載cepphfs檔案系統),等等:。也即是如果沒有安裝ceph工具包,那麼需要先執行cephadm shell命令,再執行ceph操作
cephadm add-repo --release quincy
cephadm install ceph-common
# 檢驗ceph命令在主機上安裝成功
ceph -v
# 檢驗主機上的ceph命令能成功連線叢集,獲取叢集狀態
ceph status

典型的Ceph叢集在不同的主機上有3到5個監視器守護行程。如果叢集中有5個或更多節點,建議部署5個監視器。

# 首先在新主機的根使用者authorized_keys檔案中安裝叢集的公共SSH金鑰
ssh-copy-id -f -i /etc/ceph/ceph.pub root@node2
ssh-copy-id -f -i /etc/ceph/ceph.pub root@node3

本篇先到此,待續.......

**本人部落格網站 **IT小神 www.itxiaoshen.com