天天看點

分布式存儲和分布式檔案系統

    分布式系統:

            1、系統的各元件分布于網絡上多個計算機;

            2、各元件彼此之間僅僅通過消息傳遞來通信并協調行動;

    分布式系統存在意義:

            1、向上擴充的成本效益越來越低;

            2、單機擴充存在性能上升臨界點;

            3、出于穩定性及可用性考慮,單機會存在多方面的問題;

    計算機組成:CPU、記憶體、IO

            多CPU:

                    多線程程式設計,(線程間共享程序的資源)

                            互不通信的線程模型

                            基于共享容器協同工作的模型

                            通過事件協調的多線程模型 

                    多程序模型

            網絡IO:

                    多程序:每個程序響應一個請求;

                    多線程、多程序:每程序生成多個線程,每線程響應一個使用者請求

                    多線程:每線程直接響應多個請求

                    基于socket實作網絡通信開發,其實作方式:

                            BIO:Blocking IO:一個程序或一個線程處理一個請求;

                            NIO:Nonblocking IO:基于事件驅動(epoll)思想,采用Reactor模式

                            AIO:基于事件驅動思想,采用Proactor模式

        如何把應用從單機擴充至多機?

                    輸入裝置的變化?

                    輸出裝置的變化?

        控制器的變化?

                    實作的模式:

                            透明代理

                                    lvs的nat

                                    haproxy, nginx

                            旁路代理

                                    lvs的dr、tun

                            名稱服務

                            規則服務

                            Master/slave機制

        運算器的變化:

        存儲器的變化?

        分布式系統實作的難點:

                缺乏全局時鐘?

                面對故障時的獨立性

                處理單點故障

                事務處理

                ACID

2PC、BASE、CAP、Paxos

大型網站站點的架構演進方式:

LAMT, LNMT

應用從資源占用的角度分兩類:

CPU Bound

IO Bound: IO密集型

session sticky

ip based

cookie based

session replication

session server

引用MySQL主從面臨的問題:

1、資料複制的問題

2、應用選擇資料源的問題

引入緩存:

1、頁面緩存

varnish, squid

2、資料緩存

key-value store: memcached

主庫寫操作壓力:資料庫拆分

垂直拆分:把資料庫中不同的業務的資料拆分到不同的資料庫伺服器中

水準拆分:把一個單獨的表中的資料拆分到多個不同的資料庫伺服器上

NoSQL: 非關系資料

文檔資料庫

列式資料庫

... ...

應用拆分:

根據業務特性拆分

根據使用者拆分:

使用者注冊

使用者登入

使用者資訊維護

根據對底層應用的調用進行拆分

異步:解耦

消息中間件:在分布式系統中,完成消息發送和接收的基礎性軟體;

MOM:Message-oriented middleware

RabbitMQ, ActiveMQ, ZMQ

分布式存儲:

    資料類型:

            結構化資料:SQL,TPS,MYSQL(主從複制、分庫分表);

            半結構化資料:json,xml(document store,mongodb、elasticsearch)

            非結構化資料:k-v

    CAP:一緻性、可用性、網絡分區容錯性;

    通用分布式存儲:分布式存儲,不可直接挂載,需通過api:mogilefs,fastdfs 等等

    專用分布式存儲:分布式檔案系統,可直接挂載:moosefs,ceph等等

常見的分布式檔案系統:

GlusterFS:适用于存儲少量大檔案

MogileFS:适用存儲海量小檔案

使用MySQL存儲中繼資料

FastDFS

MooseFS:

Ceph:核心級别,支援PB級别存儲的分布式檔案系統;

HDFS:Lucene, MapReduce + HDFS = Hadoop (平台),  HBase(NoSQL)

GFS:Google FS

MapReduce 

Bigtable

TFS: 适用于存儲海量小檔案

Lustre: Oracle的開源的分布式檔案

MogileFS:

開源的分布式存儲,由LiveJournal旗下的Danga Interactive;

memcached, MogileFS, Perlbal

MogileFS的特性:

1、應用層:運作于使用者空間;

2、無單點失敗:

        mogstored:存儲多個資料副本;

        tracker:多節點;

        database:mysql等等

3、自動檔案複制

4、不需要RAID;

5、傳輸中立,無特殊協定(HTTP或NFS)

6、簡單的名稱空間:

        domain,class,fid(key);

7、不用共享任何資料:

        中繼資料:db;

        資料:mogstored,副本;

MogileFS的角色:

        Tracker:Mogilefsd程序;其實作的功能包括Replication,Deletion, Query, Monitor等等;

        Storage Nodes: mogstored程序;檔案實際存儲的位置,其實質上是一個http伺服器,基于WebDAV模式工作,能完成檔案建立、删除、重命名等操作;

        MySQL節點:用于為tracker存儲中繼資料資訊;mogilefs的名稱空間及檔案名;

服務程序有兩個:

    tracker: mogilefsd

    storage nodes: mogstored

perl子產品的安裝方式:

        線上安裝:自動解決依賴關系

                cpan> install module_name::name

        離線安裝:

                編譯:

                # perl Makefile.PL

                # make

                # make install

                rpm包:

                # yum install

安裝tracker:

1、安裝相關的包:

MogileFS-Server-2.46-2.el6.noarch.rpm  MogileFS-Server-mogilefsd-2.46-2.el6.noarch.rpm  perl-Net-Netmask-1.9015-8.el6.noarch.rpm MogileFS-Server-mogstored-2.46-2.el6.noarch.rpm  perl-Perlbal-1.78-1.el6.noarch.rpm

2、授權資料庫使用者,并初始mysql資料庫

mysql> CREATE DATABASE mogdb CHARSET ‘utf8';

mysql> GRANT ALL ON mogdb.* TO 'moguser'@'127.0.0.1' IDENTIFIED BY 'mogpass';

mysql> GRANT ALL ON mogdb.* TO 'moguser'@'localhost' IDENTIFIED BY 'mogpass';

mysql> flush privileges;

# mogdbsetup --dbname=mogdb --dbuser=moguser --dbpass=mogpass

3、修改配置檔案mogilefsd.conf

db_dsn = DBI:mysql:DBNAME:host=172.16.100.7

4、啟動mogilefsd程序

# service mogilefsd start

安裝mogstored:

1、安裝相關的包

MogileFS-Server-2.46-2.el6.noarch.rpm  MogileFS-Server-mogilefsd-2.46-2.el6.noarch.rpm  perl-Net-Netmask-1.9015-8.el6.noarch.rpm MogileFS-Server-mogstored-2.46-2.el6.noarch.rpm  perl-Perlbal-1.78-1.el6.noarch.rpm  perl-IO-AIO

2、準備儲存設備

挂載至某路徑下,确認此路徑下存在檔案devN

此路徑的屬主和屬組為mogilefs.mogilefs

3、修改配置檔案/etc/mogilefs/mogstored.conf

docRoot=

前面的挂載路徑;

4、啟動mogstored程序

# service mogtored start

配置mogielfs:mogadm --help檢視幫助資訊

1、向tracker添加各mogstored主機

mogadm --trackers=TRACKER_NODE host add 

2、向tracker添加各裝置

mogadm --trackers=TRACKER_NODE device add 

3、為tracker定義名稱空間domain

mogadm --trackers=TRACKER_NODE domain add 

4、為domain添加一個或多個class

mogadm --trackers=TRACKER_NODE class add

可同時副本的最少個數;

上傳檔案:mogupload

下載下傳檔案:mogfeatch

檢視檔案資訊:mogfileinfo 

mogilefs與nginx結合:nginx_mogilefs_module

        編譯安裝nginx時加上--add-module=子產品的的解壓路徑即可

        配置檔案nginx.conf示例:

            将trackers定義為upstream示例:

                    upstream mogtrackers {

                            server 172.20.120.22:7001;

                            server 172.20.120.23:7001;

                    }

                并且在server段内添加

                location /images {

                        mogilefs_tracker  mogtrackers;

                        mogilefs_domain imgs;

                        mogilefs_pass {

                                proxy_pass $mogilefs_path;

                                proxy_hide_header Content-type;

                                proxy_buffering off;

                        }

                }

                測試驗證手動驗證:

                        1、通過mogupload --trackers=172.20.120.22 --domain=imgs --key='dune.jpg' --file=/usr/share/backgrounds/nature/Dune.jpg

                        2、手動檢視mogfileinfo --trackers=172.20.120.22 --domain=imgs --key='dune.jpg'

                        3、通過浏覽器url驗證   http://nginx-ip/images/dune.jpg

            開啟status示例:

                    location /status {

                            stub_status on;

                            access_log off;

                            allow 172.20.120.0/24;

                            deny all;

FastDFS:開源的輕量級分布式檔案系統,c++

    三個角色:tracker、storage、client

    tacker server:跟蹤伺服器,排程;在記憶體中記錄所有儲存組和儲存伺服器的狀态資訊;

    storage server:存儲伺服器,檔案(data)和檔案屬性(metadata);

    client:用戶端,業務請求發起方,通過專用接口基于tcp協定與tracker以及storage server進行互動;

    擴充示例:如何根據源碼制作rpm包       

    # git clone https://github.com/happyfish100/libfastcommon.git

    # less INSTALL

    # less libfastcommon-1.0.40/libfastcommon.spec   檢視該軟體版本号

    # mv libfastcommon libfastcommon-1.0.40

    # tar zcf libfastcommon-1.0.40.tar.gz libfastcommon-1.0.40/*    打包

    # mkdir -pv rpmbuild/{SOURCES,SPECS}

    # cp libfastcommon-1.0.40.tar.gz rpmbuild/SOURCES/

    # cp libfastcommon-1.0.40/libfastcommon.spec rpmbuild/SPECS/

    # cd rpmbuild/SPECS/

    # rpmbuild -ba libfastcommon.spec

    fastdfs托管在github:https://github.com/happyfish100/fastdfs

    # yum groupinstall "Development Tools" "Server Platform Development" -y

    # yum install git -y 

    # git clone https://github.com/happyfish100/libfastcommon.git

    #  ./make.sh

    # ./make.sh install

    # git clone https://github.com/happyfish100/fastdfs.git

    # less INSTALL   

    #  ./make.sh

    fastdfs配置檔案和測試        

            # group -r fastdfs

            # groupadd -r fastdfs

            # useradd -g fastdfs -r -s /sbin/nologin fastdfs

            # mkdir -pv /data/fdfs/{tracker,storage,client}

            # cd /etc/fdfs/

            # cp tracker.conf.sample tracker.conf

            # vim tracker.conf

                    base_path=/data/fdfs/tracker

                    run_by_group=fastdfs

                    run_by_user=fastdfs

            # service fdfs_trackerd restart

            # cp storage.conf.sample storage.conf

            # vim /etc/fdfs/storage.conf

                    base_path=/data/fdfs/storage

                    store_path0=/data/fdfs/storage

                    tracker_server=192.168.71.41:22122

            # service fdfs_storaged restart

            # cp client.conf.sample client.conf

            # vim client.conf

                    base_path=/data/fdfs/client

            # fdfs_test client.conf upload /usr/share/backgrounds/night.jpg     測試

    fastdfs與nginx結合:借用fastdfs-nginx-module子產品,前提需手動編譯安裝nginx

            # wget http://nginx.org/download/nginx-1.16.0.tar.gz

            # yum install pcre-devel openssl-devel -y

            # git clone https://github.com/happyfish100/fastdfs-nginx-module.git

            # tar xvf nginx-1.16.0.tar.gz

            # cd nginx-1.16.0

            # groupadd -r nginx

            # useradd -g nginx -r -s /sbin/nologin nginx

            # ./configure --prefix=/usr/local/nginx --conf-path=/etc/nginx/nginx.conf --pid-path=/var/run/nginx/nginx.pid --lock

-path=/var/lock/nginx.lock --error-log-path=/var/log/nginx/error.log --http-log-path=/var/log/nginx/access.log --user=nginx --group=nginx --with-http_ssl_module --with-http_stub_status_module --with-pcre --add-module=/root/fastdfs-nginx-module/src

            # ln -sv /data/fdfs/storage/data/ /data/fdfs/storage/data/M00

            # cp /etc/nginx/nginx.conf{,.bak}

            # vim /etc/nginx/nginx.conf        

                    location /M00 {

                        root /data/fdfs/storage/data;

                        ngx_fastdfs_module;

                    }

            # cp fastdfs-nginx-module/src/mod_fastdfs.conf /etc/fdfs/

            # vim /etc/fdfs/mod_fastdfs.conf

                    base_path=/data/fdfs/storage

                    url_have_group_name = true

            # mkdir -pv /var/run/nginx

            # cp fastdfs/conf/{http.conf,mime.types} /etc/fdfs/

            # /usr/local/nginx/sbin/nginx -t

            # vim /etc/profile.d/nginx.sh

                    export PATH=/usr/local/nginx/sbin:$PATH

            # source /etc/profile.d/nginx.sh

            # nginx

            通路URL,測試驗證

繼續閱讀