分佈式存儲和分佈式文件系統

    分佈式系統:node

            一、系統的各組件分佈於網絡上多個計算機;mysql

            二、各組件彼此之間僅僅經過消息傳遞來通訊並協調行動;nginx


    分佈式系統存在乎義:c++

            一、向上擴展的性價比愈來愈低;git

            二、單機擴展存在性能上升臨界點;github

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

        

    計算機組成:CPU、內存、IOmongodb

            多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主從面臨的問題:

一、數據複製的問題

二、應用選擇數據源的問題


引入緩存:

一、頁面緩存

varnish, squid

二、數據緩存

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的特性:

一、應用層:運行於用戶空間;

二、無單點失敗:

        mogstored:存儲多個數據副本;

        tracker:多節點;

        database:mysql等等

三、自動文件複製

四、不須要RAID;

五、傳輸中立,無特殊協議(HTTP或NFS)

六、簡單的名稱空間:

        domain,class,fid(key);

七、不用共享任何數據:

        元數據: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:

一、安裝相關的包:

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

二、受權數據庫用戶,並初始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

三、修改配置文件mogilefsd.conf

db_dsn = DBI:mysql:DBNAME:host=172.16.100.7

四、啓動mogilefsd進程

# service mogilefsd start


安裝mogstored:

一、安裝相關的包

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

二、準備存儲設備

掛載至某路徑下,確認此路徑下存在文件devN

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

三、修改配置文件/etc/mogilefs/mogstored.conf

docRoot=

前面的掛載路徑;

四、啓動mogstored進程

# service mogtored start


配置mogielfs:mogadm --help查看幫助信息

一、向tracker添加各mogstored主機

mogadm --trackers=TRACKER_NODE host add 


二、向tracker添加各設備

mogadm --trackers=TRACKER_NODE device add 


三、爲tracker定義名稱空間domain

mogadm --trackers=TRACKER_NODE domain add 


四、爲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;

                        }

                }

                測試驗證手動驗證:

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

                        二、手動查看mogfileinfo --trackers=172.20.120.22 --domain=imgs --key='dune.jpg'

                        三、經過瀏覽器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

    # less INSTALL

    #  ./make.sh

    # ./make.sh install

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

    # less INSTALL   

    #  ./make.sh

    # ./make.sh install


    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

                    run_by_group=fastdfs

                    run_by_user=fastdfs

            # service fdfs_storaged restart

            # cp client.conf.sample client.conf

            # vim client.conf

                    base_path=/data/fdfs/client

                    tracker_server=192.168.71.41:22122

            # 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

                    store_path0=/data/fdfs/storage

                    tracker_server=192.168.71.41:22122

                    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,測試驗證

相關文章
相關標籤/搜索