1. 程式人生 > >CentOS7.2離線部署Ceph

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克隆虛擬機器tj02tj03

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驗證如下

這裡寫圖片描述