天天看點

CentOS7.2離線部署Ceph

        • 系統網絡配置
        • 建立ceph-deploy使用者
        • 配置yum源
        • 安裝ntp時間同步服務
        • 配置防火牆(使用firewalld)
        • 克隆另外兩台虛拟機,并完成配置
        • 節點tj01上安裝ceph-deploy
        • 安裝及搭建ceph叢集
        • 安裝啟動網關rgw
        • 建立對象網關使用者(S3接口需要)
        • 使用java測試S3接口
        • 配置mgr儀表盤

系統網絡配置

1、安裝centos7.2在tj01節點上(略),修改網絡連接配接為NAT

2、修改網絡為靜态IP,參考https://www.cnblogs.com/leokale-zz/p/7832576.html

systemctl start NetworkManager.service
systemctl disable NetworkManager.service
           

ip addr

檢視除了lo的另一張網卡的mac位址,記錄下來

CentOS7.2離線部署Ceph
cd /etc/sysconfig/network-scripts/
mv ifcfg-eno16777736 ifcfg-eth100
vi ifcfg-eth100
           

按以下修改

ifcfg-eth100

檔案

CentOS7.2離線部署Ceph

删除檔案

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
           

添加如下内容

執行

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
           

下載下傳好的包如下圖所示

CentOS7.2離線部署Ceph
su root
cd /etc/yum.repos.d/
mkdir backup
mv ./* ./backup
#使用阿裡源
wget -O  ./CentOS-Base.repo  http://mirrors.aliyun.com/repo/Centos-repo
wget -O  ./epel-7.repo http://mirrors.aliyun.com/repo/epel-repo
           

vim CentOS-Base.repo

在最後面添加以下内容,儲存

[LocalCeph]
name=CentOS-$releasever - LocalCeph
baseurl=file:///home/iflyceph/cephyumsource/
gpgcheck=
enabled=
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)

參考https://blog.csdn.net/xlgen157387/article/details/52672988

參考https://www.cnblogs.com/moxiaoan/p/5683743.html

#安裝
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=/tcp --permanent
#啟動防火牆
systemctl start firewalld
#檢視防火牆規則
firewall-cmd --list-all
#開機啟動
systemctl enable firewalld
#檢視服務狀态
systemctl status firewalld
#若修改規則後,使用reload立即生效
firewall-cmd --reload
#禁用SELINUX 
setenforce 
           

克隆另外兩台虛拟機,并完成配置

此時,基礎配置工作基本完成

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添加下面行
  tj01
  tj02
  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 , in <module>
    from ceph_deploy.cli import main
  File "/usr/lib/python2.7/site-packages/ceph_deploy/cli.py", line , 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 = /
osd pool default pg num = 128
osd pool default pgp num = 128
mon_max_pg_per_osd = 
           
#初始化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 = 
#執行
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

檢視叢集存儲池如下

CentOS7.2離線部署Ceph

建立對象網關使用者(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(L).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後,檢視存儲池變化

CentOS7.2離線部署Ceph

運作程式寫入對象後,檢視存儲池變化

CentOS7.2離線部署Ceph

運作程式測試異步分片上傳之後,檢視存儲池變化

CentOS7.2離線部署Ceph

配置mgr儀表盤

#主節點上執行
ceph config-key put mgr/dashboard/server_addr .
#列出mgr所有插件子產品
ceph mgr module ls
#開啟儀表盤子產品
ceph mgr module enable dashboard
#檢視mgr相關的http/https服務位址
ceph mgr services
           

通路

http://192.168.79.100:7000

驗證如下

CentOS7.2離線部署Ceph