1. 程式人生 > >負載與讀寫分離圖片伺服器叢集模型

負載與讀寫分離圖片伺服器叢集模型

對於絕大多數網站,圖片資源是一個非常重要的元素。社群論壇裡面圖片相簿,電子商務線上產品展示圖,移動端應用圖片分享功能等。都在說網際網路正在處於讀圖時代,各大中小型網站都需要保持良好的圖片處理能力。需要支援海量圖片資源儲存時,更加要搭建高可用負載圖片服務叢集支撐網站系統,保證網站上圖片相關功能準確無誤執行,使用者物件訪問頁面體驗流暢。


環境:四臺Linux主機,一臺LVS負載均衡,一臺FastDFS_tracker,兩臺FastDFS_storage,FastDFS_client在FastDFS_tracker上面。

負載:192.168.10.141,安裝LVS
圖片:192.168.10.173,安裝Nginx+FastDFS
圖片:192.168.10.74,安裝Nginx+FastDFS
排程:192.168.10.252,安裝FastDFS


基礎架構分析

基礎架構主要實現負載均衡、讀寫分離、分散式檔案系統、備份功能、高可用性等五個方面功能。備份功能與高可用性沒有新增到下面的架構圖,只在後面進行一些分析。圖片上傳通過分散式檔案系統,儲存在各個圖片伺服器上特定目錄,保證圖片資源同步。圖片訪問通過負載均衡響應請求,按照排程演算法分配到單一圖片伺服器,接受響應返回圖片請求結果。這樣就把圖片的讀寫分離開來,並且多個圖片伺服器組成的檔案系統,自備一定容災能力。當然實現圖片伺服器的備份功能,容災能力最強。在負載均衡上面搭建主從備份服務,實現高可用性功能。主負載宕機時,由從負載頂替繼續執行負載均衡工作。

 


負載均衡:使用LVS實現負載均衡,工作於網路層的代理轉發,支援三個轉發工作方式,提供十種代理排程演算法。

讀寫分離:訪問圖片時通過負載均衡的代理,上傳圖片時通過分散式檔案系統的排程器,訪問與上傳不再經過單一伺服器。
高可用性:使用LVS+Keepalived實現負載均衡高可用性圖片伺服器叢集,搭建兩臺LVS負載伺服器,安裝Keepalived檢測當前LVS健康狀態,隨時準備主從切換。
備份功能:啟用圖片服務的實時備份功能,該備份伺服器只進行圖片的寫操作,不支援檔案系統與客戶端進行圖片刪除、修改、訪問。
分散式檔案系統:使用FastDFS分散式檔案系統,圖片通過排程器寫到優先順序高的儲存器,然後同步到其他儲存器。


系統安裝過程

安裝LVS負載

 命令列方式安裝lvs:
[[email protected]
Desktop]# yum -y install ipvsadm*

驗證lvs安裝是否成功:

[[email protected] Desktop]# ipvsadm
IP Virtual Server version 1.2.1 (size=4096)
Prot LocalAddress:Port Scheduler Flags
  -> RemoteAddress:Port           Forward Weight ActiveConn InActConn
  

安裝Nginx服務

新增Nginx安裝源:
[[email protected] Desktop]# rpm -ivh http://nginx.org/packages/centos/6/noarch/RPMS/nginx-release-centos-6-0.el6.ngx.noarch.rpm
Retrieving http://nginx.org/packages/centos/6/noarch/RPMS/nginx-release-centos-6-0.el6.ngx.noarch.rpm
warning: /var/tmp/rpm-tmp.4MHe6h: Header V4 RSA/SHA1 Signature, key ID 7bd9bf62: NOKEY
Preparing...                ########################################### [100%]
   1:nginx-release-centos   ########################################### [100%]

   
檢視Nginx安裝源是否新增成功:
[[email protected] Desktop]# yum info nginx
Loaded plugins: fastestmirror, refresh-packagekit, security
Loading mirror speeds from cached hostfile
 * base: mirrors.aliyun.com
 * extras: mirrors.aliyun.com
 * updates: mirrors.sina.cn
nginx                                                    | 2.9 kB     00:00     
nginx/primary_db                                         | 8.3 kB     00:00     
Available Packages
Name        : nginx
Arch        : x86_64
Version     : 1.8.1
Release     : 1.el6.ngx
Size        : 352 k
Repo        : nginx
Summary     : High performance web server
URL         : http://nginx.org/
License     : 2-clause BSD-like license
Description : nginx [engine x] is an HTTP and reverse proxy server, as well as
            : a mail proxy server.


命令列安裝Nginx:

[[email protected] Desktop]# yum install nginx 

啟動Nginx命令:
[[email protected] Desktop]# nginx

瀏覽器訪問出現nginx歡迎資訊,即安裝成功
   

安裝FastDFS檔案系統

前期準備與安裝libevent:
[[email protected] Desktop]# mkdir FastNFS
[[email protected] Desktop]# cd FastNFS/
[[email protected] FastNFS]# git clone https://github.com/libevent/libevent.git
[[email protected] libevent]# rpm -qa libevent
[[email protected] libevent]# rpm -qa|grep libevent rpm -e libevent*
[[email protected] FastNFS]# cd libevent
[[email protected] libevent]# cd cmake
[[email protected] cmake]# yum install cmake
[[email protected] cmake]# cmake ..
[[email protected] cmake]# make
[[email protected] cmake]# make install

安裝libfastcommon依賴:
[[email protected] FastNFS]# git clone https://github.com/happyfish100/libfastcommon.git
[[email protected] FastNFS]# cd libfastcommon
[[email protected] libfastcommon]# ./make.sh
[[email protected] libfastcommon]# ./make.sh install
mkdir -p /usr/lib64
mkdir -p /usr/lib
install -m 755 libfastcommon.so /usr/lib64
install -m 755 libfastcommon.so /usr/lib
mkdir -p /usr/include/fastcommon
install -m 644 common_define.h hash.h chain.h logger.h base64.h shared_func.h pthread_func.h ini_file_reader.h _os_define.h sockopt.h sched_thread.h http_func.h md5.h local_ip_func.h avl_tree.h ioevent.h ioevent_loop.h fast_task_queue.h fast_timer.h process_ctrl.h fast_mblock.h connection_pool.h fast_mpool.h fast_allocator.h fast_buffer.h skiplist.h multi_skiplist.h flat_skiplist.h skiplist_common.h system_info.h fast_blocked_queue.h php7_ext_wrapper.h /usr/include/fastcommon

安裝fastdfs分散式檔案系統:
[[email protected] FastNFS]# wget https://github.com/happyfish100/fastdfs/archive/V5.05.tar.gz
[[email protected] FastNFS]# tar -zxvf V5.05.tar.gz
[[email protected] FastNFS]# cd fastdfs-5.05
[[email protected] fastdfs-5.05]# ./make.sh
[[email protected] fastdfs-5.05]# ./make.sh install
mkdir -p /usr/bin
mkdir -p /etc/fdfs
cp -f fdfs_trackerd /usr/bin
if [ ! -f /etc/fdfs/tracker.conf.sample ]; then cp -f ../conf/tracker.conf /etc/fdfs/tracker.conf.sample; fi
mkdir -p /usr/bin
mkdir -p /etc/fdfs
cp -f fdfs_storaged  /usr/bin
if [ ! -f /etc/fdfs/storage.conf.sample ]; then cp -f ../conf/storage.conf /etc/fdfs/storage.conf.sample; fi
mkdir -p /usr/bin
mkdir -p /etc/fdfs
mkdir -p /usr/lib64
cp -f fdfs_monitor fdfs_test fdfs_test1 fdfs_crc32 fdfs_upload_file fdfs_download_file fdfs_delete_file fdfs_file_info fdfs_appender_test fdfs_appender_test1 fdfs_append_file fdfs_upload_appender /usr/bin
if [ 0 -eq 1 ]; then cp -f libfdfsclient.a /usr/lib64; fi
if [ 1 -eq 1 ]; then cp -f libfdfsclient.so /usr/lib64; fi
mkdir -p /usr/include/fastdfs
cp -f ../common/fdfs_define.h ../common/fdfs_global.h ../common/mime_file_parser.h ../common/fdfs_http_shared.h ../tracker/tracker_types.h ../tracker/tracker_proto.h ../tracker/fdfs_shared_func.h ../storage/trunk_mgr/trunk_shared.h tracker_client.h storage_client.h storage_client1.h client_func.h client_global.h fdfs_client.h /usr/include/fastdfs
if [ ! -f /etc/fdfs/client.conf.sample ]; then cp -f ../conf/client.conf /etc/fdfs/client.conf.sample; fi

 驗證fastdfs安裝是否成功:
[[email protected] fastdfs-5.05]# ll /etc/fdfs/
total 20
-rw-r--r--. 1 root root 1461 Mar 21 03:01 client.conf.sample
-rw-r--r--. 1 root root 7829 Mar 21 03:01 storage.conf.sample
-rw-r--r--. 1 root root 7102 Mar 21 03:01 tracker.conf.sample

系統配置過程

配置LVS負載

 檢視lvs配置幫助說明:
[[email protected] nginx]# ipvsadm --help
ipvsadm v1.26 2008/5/15 (compiled with popt and IPVS v1.2.1)
Usage:
  ipvsadm -A|E -t|u|f service-address [-s scheduler] [-p [timeout]] [-M netmask] [--pe persistence_engine]
  ipvsadm -D -t|u|f service-address
  ipvsadm -C
  ipvsadm -R
  ipvsadm -S [-n]
  ipvsadm -a|e -t|u|f service-address -r server-address [options]
  ipvsadm -d -t|u|f service-address -r server-address
  ipvsadm -L|l [options]
  ipvsadm -Z [-t|u|f service-address]
  ipvsadm --set tcp tcpfin udp
  ipvsadm --start-daemon state [--mcast-interface interface] [--syncid sid]
  ipvsadm --stop-daemon state
  ipvsadm -h


Commands:
Either long or short options are allowed.
  --add-service     -A        add virtual service with options
  --edit-service    -E        edit virtual service with options
  --delete-service  -D        delete virtual service
  --clear           -C        clear the whole table
  --restore         -R        restore rules from stdin
  --save            -S        save rules to stdout
  --add-server      -a        add real server with options
  --edit-server     -e        edit real server with options
  --delete-server   -d        delete real server
  --list            -L|-l     list the table
  --zero            -Z        zero counters in a service or all services
  --set tcp tcpfin udp        set connection timeout values
  --start-daemon              start connection sync daemon
  --stop-daemon               stop connection sync daemon
  --help            -h        display this help message


Options:
  --tcp-service  -t service-address   service-address is host[:port]
  --udp-service  -u service-address   service-address is host[:port]
  --fwmark-service  -f fwmark         fwmark is an integer greater than zero
  --ipv6         -6                   fwmark entry uses IPv6
  --scheduler    -s scheduler         one of rr|wrr|lc|wlc|lblc|lblcr|dh|sh|sed|nq,
                                      the default scheduler is wlc.
  --pe            engine              alternate persistence engine may be sip,
                                      not set by default.
  --persistent   -p [timeout]         persistent service
  --netmask      -M netmask           persistent granularity mask
  --real-server  -r server-address    server-address is host (and port)
  --gatewaying   -g                   gatewaying (direct routing) (default)
  --ipip         -i                   ipip encapsulation (tunneling)
  --masquerading -m                   masquerading (NAT)
  --weight       -w weight            capacity of real server
  --u-threshold  -x uthreshold        upper threshold of connections
  --l-threshold  -y lthreshold        lower threshold of connections
  --mcast-interface interface         multicast interface for connection sync
  --syncid sid                        syncid for connection sync (default=255)
  --connection   -c                   output of current IPVS connections
  --timeout                           output of timeout (tcp tcpfin udp)
  --daemon                            output of daemon information
  --stats                             output of statistics information
  --rate                              output of rate information
  --exact                             expand numbers (display exact values)
  --thresholds                        output of thresholds information
  --persistent-conn                   output of persistent connection info
  --nosort                            disable sorting output of service/server entries
  --sort                              does nothing, for backwards compatibility
  --ops          -o                   one-packet scheduling
  --numeric      -n                   numeric output of addresses and ports

配置LVS排程器

在LVS排程器執行如下指令碼,VIP為對外虛擬IP,注意修改網絡卡資訊:
VIP=192.168.10.251
  /sbin/ifconfig eth2:0 $VIP broadcast $VIP netmask 255.255.255.255 up  
  /sbin/route add -host $VIP dev eth2:0  
  echo 1 > /proc/sys/net/ipv4/ip_forward
  echo 1 > /proc/sys/net/ipv4/conf/all/send_redirects
  echo 1 > /proc/sys/net/ipv4/conf/default/send_redirects
  echo 1 > /proc/sys/net/ipv4/conf/eth2/send_redirects
  /sbin/ipvsadm -C  
  ipvsadm -A -f 1 -s rr
  ipvsadm -a -f 1 -r $RIP1:80 -g
  ipvsadm -a -f 1 -r $RIP2:80 -g


      檢視ipvsadm配置:
  [[email protected] ipvsadm]# ipvsadm -ln
IP Virtual Server version 1.2.1 (size=4096)
Prot LocalAddress:Port Scheduler Flags
  -> RemoteAddress:Port           Forward Weight ActiveConn InActConn
FWM  1 rr
  -> 192.168.10.98:80             Route   1      0          0         
  -> 192.168.10.128:80            Route   1      0          0    

配置真實服務 

在真實圖片伺服器上執行如下指令碼:
  VIP=192.168.10.251
  ifconfig lo down  
  ifconfig lo up  
  echo 1 > /proc/sys/net/ipv4/conf/lo/arp_ignore  
  echo 2 > /proc/sys/net/ipv4/conf/lo/arp_announce  
  echo 1 > /proc/sys/net/ipv4/conf/all/arp_ignore  
  echo 2 > /proc/sys/net/ipv4/conf/all/arp_announce  
  /sbin/ifconfig lo:0 $VIP broadcast $VIP netmask 255.255.255.255 up  
  /sbin/route add -host $VIP dev lo:0  


配置FastDFS檔案系統

參照之前FastDFS配置文章,主要是配置地址、埠、目錄等一下標籤,其他配置根據需求增加即可。http://blog.csdn.net/a821478424/article/details/51067153
   

配置Nginx服務

配合負載均衡測試

修改nginx預設頁面,使叢集展示不同資訊,以區分頁面來自於不同伺服器,驗證LVS功能是否成功。

配置圖片資源訪問路徑

編譯Nginx預設配置檔案:
[[email protected] html]# vi /etc/nginx/conf.d/default.conf

 找到下面網站根目錄內容:
    location / {
        root   /usr/share/nginx/html;
        index  index.html index.htm;
    }


修改成下面的內容:
    location / {
        #root   /usr/share/nginx/html;
        root /home/yuqing/fastdfs/data/00/00;
        index  index.html index.htm;
    }


防火牆配置

允許80、23000、22122埠,支援Nginx、FastDFS等服務執行。

功能測試

負載均衡功能

瀏覽器中訪問LVS提供的虛擬IP,返回來自Nginx叢集服務預設頁面。多重新整理幾遍url,或者使用不同瀏覽器訪問,發現預設頁面並不唯一,證明負載均衡功能正常。


圖片叢集功能

使用客戶端上傳圖片:
[[email protected] Desktop]$ fdfs_upload_file /etc/fdfs/client.conf ./linux.jpg 
group1/M00/00/00/wKgKYlcgVEGAfRLhAAAX6oV41fw051.jpg

檢視圖片是否上傳成功:
[[email protected] html]# ll /home/yuqing/fastdfs/data/00/00/
total 32
-rw-r--r--. 1 root root  6122 Apr 26 22:55 wKgKYlcgVEGAfRLhAAAX6oV41fw051.jpg
-rw-r--r--. 1 root root 11336 Mar 22 00:59 wKjVh1bw-1KADEceAAAsSKZJhlk53.html
-rw-r--r--. 1 root root 11336 Mar 22 01:05 wKjViFbw_LyAIv-oAAAsSKZJhlk82.html


 瀏覽器中訪問虛擬IP後面加上圖片路徑與標識,如:http://192.168.10.251/wKgKYlcgVEGAfRLhAAAX6oV41fw051.jpg。瀏覽器展示所上傳圖片,證明圖片叢集功能正常。


說明

LVS提供多種排程模式與演算法,工作於網路四層支援海量請求,配置比起Haproxy、nginx稍微複雜,速度與穩定性各方面效能更加好。FastDFS分散式檔案系統,模組劃分明確,結構清晰,提供各種語言客戶端API開發介面,便於與專案整合。而Hadoop功能更加強大,架構算是複雜,常用於大資料分析。淘寶也有開源分散式圖片系統,主要用於電商,且為自身特性定做。所以,選擇LVS實現負載功能,選擇FastDFS實現分散式圖片系統。

相關推薦

負載分離圖片伺服器叢集模型

對於絕大多數網站,圖片資源是一個非常重要的元素。社群論壇裡面圖片相簿,電子商務線上產品展示圖,移動端應用圖片分享功能等。都在說網際網路正在處於讀圖時代,各大中小型網站都需要保持良好的圖片處理能力。需要支援海量圖片資源儲存時,更加要搭建高可用負載圖片服務叢集支撐網站系統,保證

一步一圖搭建-分散式伺服器部署之mysql叢集-主從複製分離

傳統專案模型: 1.傳統的裝置搭建時,如果採用單臺伺服器.則會出現很多的問題.如果伺服器出現宕機/斷電/硬體裝置的損壞,都會直接影響使用者體驗. 2.如果傳統專案中遇到了高併發的情況.單臺伺服器不足以支援 分散式的處理: 傳統資料庫中存在

MySQL搭建主從伺服器分離的實現

一 丶為什麼要搭建主從伺服器和實現讀寫分離 1.總結起來就一點,實現併發吞吐和負載能力。通過搭建主從伺服器實現讀寫分離,提高MySQL的負載能力 2.主從的基本實現原理 (本例 主伺服器ip: 192.168.2.187,後面簡稱 master;從伺服器ip: 192.168

MySQL主從伺服器的配置分離實現

1.1.          MySQL的Master和Slave配置MySQL主從同步是目前使用比較廣泛的資料庫架構,技術比較成熟,配置也不復雜,特別是對於負載比較大的網站,主從同步能夠有效緩解資料庫讀寫的壓力。1.1.1.   MySQL主從同步的機制1. Slave 上面

MySQL主從復制分離

$0 get 登錄 nice ica oca kcon 過程 ads 主從復制(Master-Slave)與讀寫分離(Mysql作為目前世界上使用最廣泛的免費數據庫,相信所有從事系統運維的工程師都一定接觸過。但在實際的生產環境中,由單臺主從復制(Master-Slave)

48.MYSQL的主從分離

linuxlinux企業級知識點總結Mysql主從復制與讀寫分離原理圖 Mysql的主從復制:從服務器在主服務器上自動同步數據。Mysql的讀寫分離:通過amoeba服務器控制用戶讀數據在從服務器上進行,寫數據從主服務器上進行,這樣可以做到負載均衡。 搭建mysql主從復制:v 建立時間同步環境#yum -y

MySQL主從復制技術分離技術amoeba應用

buffer chan lns -a query rep 下載 高可用性 tab MySQL主從復制技術與讀寫分離技術amoeba應用 前言:眼下在搭建一個人才站點,估計流量會非常大,須要用到分布式數據庫技術,MySQL的主從復制+讀寫分

MySQL的主從復制分離原理

訂單 中繼 運維 提交 磁盤 com 引擎 庫服務器 文件 前言:我們前面搭建過LAMP和LNMP,做過了web服務器群集和熱備,web服務器壞了我們是不怕了,但是我們要知道,網站的數據有很多是存儲在數據庫裏面的,例如註冊的會員,發的文章,購物的訂單等信息。當然我們可以給數

MySQL主從同步分離

修改配置 monit 相關 流量 修改配置文件 l數據庫 cli 授權 san MySQL主從同步MySQL AB復制1.對指定庫的異地同步。2.MySQL主-->從復制架構的實現。3.MySQL服務器的只讀控制。 主從:單向復制時,建議將從庫設置為只讀。 主從復制

MySQL主從復制分離的工作原理

MySQL 主從復制 讀寫分離 一、mysql主從復制的工作原理1、mysq支持的復制類型1)基於語句的復制。在服務器上執行sql語句,在從服務器上執行同樣的語句,mysql默認采用基於語句的復制,執行效率高。2)基於行的復制。把改變的內容復制過去,而不是把命令在從服務器上執行一遍。3)混合類型的

搭建MySql主從復制分離

單向 replicate from 命令 bec 方便 命令行 balance 之前 一、實驗名稱:?mysql主從復制讀寫分離二、實驗目的:??熟悉mysql主從復制的原理?熟悉mysql讀寫分離的原理?學會配置mysql主從復制?學會配置mysql讀寫分離三、實驗環境:

MySQL 主從復制分離

mes 讀取數據 int tab pad 環境變量 values zxvf wall Mysql主從復制作用原理 1、在業務復雜的系統中,有這麽一個情景,有一句sql語句需要鎖表,導致暫時不能使用讀的服務,那麽就很影響運行中的業務,使用主從復制,讓主庫負責寫,從庫負責讀

搭建 MySQL主從復制分離

ast round running mysql配置 一個表 mysql主從 安全性 配置 tab 搭建 MySQL主從復制與讀寫分離 案例概述 : 在實際環境中 ,如果對數據庫的讀和寫都在同一個數據庫服務中操作 ,無論實在安全性、高可用性, 還是高並發等各個方面都是完全不

【純幹貨】Amoeba實現MySQL主從同步分離

exec strong arc all abstract a star status utf prop 【純幹貨】Amoeba實現MySQL主從同步與讀寫分離 一、簡介 amoeba簡介 Amoeba(變形蟲)項目,該開源框架於2008年開始發布一款 Amoeba f

MySQL 數據庫的主從復制分離

用戶 用戶訪問 sch ltp sys pro ffffff 需求 一個數 在實際生產環境中,如果對數據庫的讀和寫都在同一個數據庫服務器中操作,無論是安全性、高可用性,還是高並發等各個方面都是完全不能滿足實際需求的,因此,一般來說都是通過主從復制(Master-Slave)

微服務化的數據庫設計分離

邏輯 例子 origin sele 持久化 能夠 ODB ima 來看 數據庫永遠是應用最關鍵的一環,同時越到高並發階段,數據庫往往成為瓶頸,如果數據庫表和索引不在一開始就進行良好的設計,則後期數據庫橫向擴展,分庫分表都會遇到困難。 對於互聯網公司來講,一般都會使用Mysq

MYSQL的主從復制分離

amp pan 滿足 art 5.1 tap sta 訪問服務器 方式 在實際生產環境中,如果對數據庫的讀和寫都在同一個數據庫服務器中操作,無論是安全性,高可用性,還是高並發性等各個方面都是不能滿足實際需求,因此,一般來說都是通過主從復制的方式來同步詩句,再通過讀寫分離來提

Mycat的安裝分離配置

Mycat: 一個可以用於MySQL讀寫分離和高可用的中介軟體 一個模擬為MySQL Server的超級資料庫 一個能平滑擴充套件支援1000億大表的分散式資料庫系統 一個可管控多種關係資料庫的資料庫路由器 一個平滑從關係資料升級到大資料的應用中介軟體   準備工作: 兩臺mys

MySQL負載均衡分離

在瞭解《MySQL主從複製原理》和《MySQL主從同步配置》之後就要考慮的是,既然我MySQL的架構是一主兩從,那麼該如何做到負載均衡,是寫操作在Master上執行,讀操作在Slave上操作。 -------- 這種負載均衡的解決方案有:     &

MySQL高可用--主從複製分離

一、Mysql高可用概念  二、MySQL主從複製原理  叢集目的,減輕單臺伺服器壓力 三、MySQL主從複製配置 實際操作mysql伺服器叢集,主從複製的過程 master   192.168.230.128 slav