CentOS7.2離線部署Ceph
系統網路配置
1、安裝centos7.2在tj01節點上(略),修改網路連線為NAT
systemctl start NetworkManager.service
systemctl disable NetworkManager.service
ip addr
檢視除了lo的另一張網絡卡的mac地址,記錄下來
cd /etc/sysconfig/network-scripts/
mv ifcfg-eno16777736 ifcfg-eth100
vi ifcfg-eth100
按以下修改ifcfg-eth100
檔案
刪除檔案rm -f /etc/udev/rules.d/*fix.rules
關閉NetworkManage
systemctl stop NetworkManager.service
重啟網路服務systemctl restart network.service
(出現問題可以先reboot
,然後檢視網絡卡狀態service network status
)
建立ceph-deploy使用者
在叢集內的所有 Ceph 節點上給 ceph-deploy 建立一個特定的使用者,這裡我們建立使用者名稱iflyceph
,設定密碼
sudo useradd -d /home/iflyceph -m iflyceph
sudo passwd iflyceph
確保各 Ceph 節點上新建立的使用者都有 sudo 許可權(三個節點)
su root
touch /etc/sudoers.d/iflyceph
vi /etc/sudoers.d/iflyceph
新增如下內容
iflyceph ALL = (root) NOPASSWD:ALL
執行sudo chmod 0440 /etc/sudoers.d/iflyceph
配置yum源
1、下載離線安裝包,這裡安裝luminous12.2.6版本,只需要下載12.2.6相關的包即可:
yum install wget
su iflyceph
cd ~
mkdir cephyumsource
cd cephyumsource
#這裡我們提供所有的包
wget http://eu.ceph.com/rpm-luminous/el7/x86_64/{某版本包名}
...
...
#下載完後,安裝`createrepo`
yum install createrepo
#生成符合要求的yum倉庫,資料夾裡面會多出一個repodata倉庫資料資料夾,此時建立庫成功
createrepo /home/iflyceph/cephyumsource
下載好的包如下圖所示
su root
cd /etc/yum.repos.d/
mkdir backup
mv ./* ./backup
#使用阿里源
wget -O ./CentOS-Base.repo http://mirrors.aliyun.com/repo/Centos-7.repo
wget -O ./epel-7.repo http://mirrors.aliyun.com/repo/epel-7.repo
vim CentOS-Base.repo
在最後面新增以下內容,儲存
[LocalCeph]
name=CentOS-$releasever - LocalCeph
baseurl=file:///home/iflyceph/cephyumsource/
gpgcheck=0
enabled=1
gpgkey=
執行下面命令
yum clean all
rm -rf /var/cache/yum
yum makecache
#離線安裝ceph
yum install ceph
#檢視安裝版本
ceph -v
至此,ceph12.2.6已經在單節點安裝完畢,為減少工作量,後面我們先在單節點上做些準備工作,然後克隆另外的兩個節點
安裝ntp時間同步服務
#安裝ntp
yum install ntp ntpdate ntp-doc
#啟動ntp
systemctl start ntpd
#驗證
ps -ef|grep ntpd
#設定開機啟動
systemctl enable ntpd
配置防火牆(使用firewalld)
#安裝
yum install firewalld
#新增規則,以下服務使用的埠允許
sudo firewall-cmd --zone=public --add-service=ceph-mon --permanent
sudo firewall-cmd --zone=public --add-service=ceph --permanent
sudo firewall-cmd --zone=public --add-service=http --permanent
sudo firewall-cmd --zone=public --add-service=https --permanent
sudo firewall-cmd --zone=public --add-service=ssh --permanent
#ceph-mgr的tcp埠允許
sudo firewall-cmd --zone=public --add-port=6800/tcp --permanent
#啟動防火牆
systemctl start firewalld
#檢視防火牆規則
firewall-cmd --list-all
#開機啟動
systemctl enable firewalld
#檢視服務狀態
systemctl status firewalld
#若修改規則後,使用reload立即生效
firewall-cmd --reload
#禁用SELINUX
setenforce 0
克隆另外兩臺虛擬機器,並完成配置
此時,基礎配置工作基本完成
1、vmware
克隆虛擬機器tj02
和tj03
2、按系統網路配置中配置虛擬機器網路(參考上面第一節)
3、以root使用者分別在三個節點上修改hostname
#節點1上執行
hostnamectl set-hostname tj01
#節點2上執行
hostnamectl set-hostname tj02
#節點3上執行
hostnamectl set-hostname tj03
#三個節點均執行
vi /etc/hosts
#根據實際ip新增下面行
192.168.79.100 tj01
192.168.79.101 tj02
192.168.79.102 tj03
修改完後重新登入生效
4、切換使用者iflyceph生成免密登入(三個節點)
#tj01、tj02、tj03均執行
su iflyceph
cd ~
#生成ssh登入祕鑰
ssh-keygen
#均使用預設一直回車,結束後/home/iflyceph/.ssh下會生成兩個檔案id_rsa,id_rsa.pub
#在tj01,tj02,tj03均上執行
ssh-copy-id [email protected]
ssh-copy-id [email protected]
ssh-copy-id [email protected]
#驗證免密登入
ssh tj01 uptime
ssh tj02 uptime
ssh tj03 uptime
節點tj01
上安裝ceph-deploy
sudo yum install ceph-deploy
sudo ceph-deploy --version
安裝及搭建ceph叢集
su iflyceph
cd ~
#建立目錄用於存放admin節點ceph配置資訊
mkdir ceph-cluster
cd ceph-cluster
#執行下面語句,當前資料夾下生成ceph.conf和ceph.mon.keyring檔案
ceph-deploy new tj01
可能會出現如下錯誤提示
[iflyceph@tj01 ceph-cluster]$ ceph-deploy new tj01
Traceback (most recent call last):
File "/usr/bin/ceph-deploy", line 18, in <module>
from ceph_deploy.cli import main
File "/usr/lib/python2.7/site-packages/ceph_deploy/cli.py", line 1, in <module>
import pkg_resources
ImportError: No module named pkg_resources
python問題,執行以下解決
su root
wget https://bootstrap.pypa.io/ez_setup.py -O - | python
解決後再次執行ceph-deploy new tj01
無提示錯誤,接著
vi ceph.conf
#新增以下內容
osd pool default size = 3
public network = 192.168.79.0/24
osd pool default pg num = 128
osd pool default pgp num = 128
mon_max_pg_per_osd = 1000
#初始化ceph-mon,當前資料夾下生成一系列keyring
ceph-deploy mon create-initial
#寫入當前資料夾配置(當作admin)到tj01、tj02、tj03節點
ceph-deploy admin tj01 tj02 tj03
#建立mgr用於系統監控,提供儀表盤(注意mgr需要高可用,官方文件建議一個mon節點啟動一個mgr)
ceph-deploy mgr create tj01
ceph-deploy mgr create tj02
ceph-deploy mgr create tj03
#新增osd,為保證效能,最好以單獨的硬碟做osd,這裡添加了一個硬碟/dev/vdb,(別掛載目錄)
ceph-deploy osd create --data /dev/vdb tj01
ceph-deploy osd create --data /dev/vdb tj02
ceph-deploy osd create --data /dev/vdb tj03
#檢查叢集狀態
sudo ceph health
sudo ceph –s
#擴充套件叢集,新增多個mon,mon需要高可用
ceph-deploy mon add tj02
ceph-deploy mon add tj03
#檢查結果狀態:
sudo ceph quorum_status --format json-pretty
至此,ceph叢集搭建完畢,執行ps -ef|grep ceph
檢視ceph程序
安裝啟動閘道器rgw
yum install ceph-radosgw
#閘道器管理員節點
ceph-deploy admin tj01 tj02 tj03
#建立閘道器例項
ceph-deploy rgw create tj01
#檢視程序
ps -ef|grep gw
如閘道器啟動失敗,可在/var/log/ceph/
下檢視閘道器啟動日誌,可能碰到問題
#[問題]
this can be due to a pool or placement group misconfiguration, e.g. pg_num < pgp_num or mon_max_pg_per_osd exceeded
#[解決]
#ceph.conf新增一行
mon_max_pg_per_osd = 1000
#執行
ceph-deploy admin tj01 tj02 tj03
#重啟ceph所有程序(從tj01、tj02、tj03依次執行)
sudo systemctl restart ceph.target
訪問驗證
http://client-node:7480
使用rados -h
檢視rados命令用法,執行sudo rados lspools
檢視叢集儲存池如下
建立物件閘道器使用者(S3介面需要)
為了使用 REST 介面,首先需要為S3介面建立一個初始 Ceph 物件閘道器使用者。然後,為 Swift 介面建立一個子使用者。然後你需要驗證建立的使用者是否能夠訪問閘道器。
#格式如下:
radosgw-admin user create --uid={username} --display-name="{display-name}" [--email={email}]
#這裡我們執行
sudo radosgw-admin user create --uid=tjwy --display-name="tjwy" [--[email protected].com]
使用java測試S3介面
public class TestCeph {
private static final Logger LOGGER = LoggerFactory.getLogger(TestCeph.class);
private static AmazonS3 amazonS3 = null;
@Before
public void initClient() {
final String hosts = "192.168.79.100:7480";
final String accessKey = "6DLM20O4E23QNEXDY6ZM";
final String secretKey = "v80dbNDduag5CPCXJ73J7IfaD0Nziqs0jmG6D17x";
AWSCredentialsProvider credentialsProvider = new AWSCredentialsProvider() {
public AWSCredentials getCredentials() {
return new BasicAWSCredentials(accessKey, secretKey);
}
public void refresh() {
}
};
ClientConfiguration clientConfiguration = new ClientConfiguration();
clientConfiguration.setProtocol(Protocol.HTTP);
EndpointConfiguration endpointConfiguration = new EndpointConfiguration(hosts, null);
amazonS3 = AmazonS3ClientBuilder.standard().withCredentials(credentialsProvider)
.withEndpointConfiguration(endpointConfiguration)
.withClientConfiguration(clientConfiguration).build();
LOGGER.info("ceph client init success!");
}
@Test
public void testBucket() {
Bucket bucket1 = amazonS3.createBucket("my-new-bucket3");
Bucket bucket2 = amazonS3.createBucket("my-new-bucket2");
List<Bucket> buckets = amazonS3.listBuckets();
for (Bucket bucket : buckets) {
LOGGER.info(bucket.getName() + "\t" + com.amazonaws.util.StringUtils.fromDate(bucket.getCreationDate()));
}
}
/**
* @Description: ACL控制,上傳,下載,刪除,生成簽名URL
* @Auther: minyu
* @Date: 2018/7/12 11:31
*/
@Test
public void testObject() throws IOException {
String infile = "D://Download/export.csv";
// String outfile = "D://hello.txt";
//新建物件
String bucketName = "my-new-bucket2";
String fileName = "export.csv";
ByteArrayInputStream inputStream = new ByteArrayInputStream(FileUtils.inputStream2ByteArray(infile));
amazonS3.putObject(bucketName, fileName, inputStream, new ObjectMetadata());
//修改物件ACL
amazonS3.setObjectAcl(bucketName, fileName, CannedAccessControlList.PublicReadWrite);
// amazonS3.setObjectAcl(bucketName,fileName, CannedAccessControlList.Private);
//下載物件
// amazonS3.getObject(new GetObjectRequest(bucketName,fileName), new File(outfile));
// S3Object s3Object = amazonS3.getObject(bucketName, fileName);
// new FileInputStream(s3Object.getObjectContent());
//刪除物件
// amazonS3.deleteObject(bucketName,fileName);
//生成物件的下載 URLS (帶簽名和不帶簽名)
GeneratePresignedUrlRequest request = new GeneratePresignedUrlRequest(bucketName, fileName);
URL url = amazonS3.generatePresignedUrl(request);
LOGGER.info(url.toString());
// amazonS3.getObject()
}
/**
* @Description: 非同步分片上傳測試
* @Auther: minyu
* @Date: 2018/7/12 11:30
*/
@Test
public void multipartUploadUsingHighLevelAPI() {
String filePath = "E://學習ppt/test.pptx";
String bucketName = "my-new-bucket2";
String keyName = "spark3";
TransferManager tm = TransferManagerBuilder.standard()
.withMultipartUploadThreshold(5L).withS3Client(amazonS3).build();
LOGGER.info("start uploading...");
long start = System.currentTimeMillis();
// TransferManager processes all transfers asynchronously,
// so this call will return immediately.
Upload upload = tm.upload(
bucketName, keyName, new File(filePath));
LOGGER.info("asynchronously return ...go on other opration");
try {
// Or you can block and wait for the upload to finish
upload.waitForCompletion();
LOGGER.info("Upload complete.");
LOGGER.info("檔案描述:" + upload.getDescription());
LOGGER.info("耗時:" + (System.currentTimeMillis() - start) + "ms");
GeneratePresignedUrlRequest request = new GeneratePresignedUrlRequest(bucketName, keyName);
URL url = amazonS3.generatePresignedUrl(request);
LOGGER.info("下載地址:" + url);
} catch (AmazonClientException e) {
LOGGER.info("Unable to upload file, upload was aborted.");
e.printStackTrace();
} catch (InterruptedException e) {
LOGGER.info("Unable to upload file, upload was aborted.");
e.printStackTrace();
} catch (Exception e) {
e.printStackTrace();
}
}
}
執行程式新建兩個bucket後,檢視儲存池變化
執行程式寫入物件後,檢視儲存池變化
執行程式測試非同步分片上傳之後,檢視儲存池變化
配置mgr儀表盤
#主節點上執行
ceph config-key put mgr/dashboard/server_addr 192.168.79.100
#列出mgr所有外掛模組
ceph mgr module ls
#開啟儀表盤模組
ceph mgr module enable dashboard
#檢視mgr相關的http/https服務地址
ceph mgr services
訪問http://192.168.79.100:7000
驗證如下