大雜燴

實現MooseFS的高可用

#################################################################javascript

  • 開篇引題php

  • Distributed Replicated Block Devicecss

  • 部署MFShtml

  • 部署Corosync+Pacemaker前端

  • 故障模擬測試java

  • 補充和總結node

#################################################################mysql

 

開篇引題linux

 

   直接上圖,有圖有真相啊!此圖是MFS網絡組成和運行原理,先不說圖中每種角色的做用(下文會有詳細說明),直觀信息告訴咱們客戶端不管是讀寫請求都須要與MasterServer通訊,而圖中MasterServer角色只有一個,所以單點故障的因素就顯而易見了。解決MFS的單點故障正是本文的初衷,接下來就介紹如何利用多種技術解決MFS的單點故障,實現MasterServer的高可用。nginx

 

Distributed Replicated Block Device

   分佈式複製塊設備是Linux內核的存儲層中的一個分佈式存儲系統,可利用DRBD在兩臺Linux服務器之間共享塊設備、文件系統和數據,相似於一個網絡RAID1的功能,內核中的DRBD模塊監聽特定套接字上,複製系統調用產生的寫數據爲副本並經過TCP協議發送至DRBD從節點,由於節點間磁盤設備每個數據位都是相同的,因此DRBD能夠實現廉價塊級別的數據共享。

   DRBD工做模型

       主從模型(primary/secondary),同一時刻只能有一個節點提供服務(不然會產生腦裂),從節點沒法使用磁盤分區(掛載也不能夠)。

       主主模型(primary/primary),須要藉助於集羣文件系統並啓用分佈式文件鎖功能,並且寫性能不會有提高.

   DRBD管理

       內核模塊:drbd用戶空間

       管理工具:drbdadm,drbdsetup,drbdmeta

   工做流程(默認模型是Sync)

       Async:副本交於本地TCP/IP協議棧就返回(性能最高)

       SemiSync:副本交對方TCP/IP協議棧就返回(折中方案)

       Sync:副本被secondary存儲到磁盤中就返回(性能差)

   安裝配置DRBD(drbd內核模塊必須和內核版本徹底匹配)

rpm -ivh drbd-8.4.3-33.el6.x86_64.rpm drbd-kmdl-2.6.32-358.el6-8.4.3-33.el6.x86_64.rpm 

   主配置文件

[root@one packages]# cat /etc/drbd.conf 
# You can find an example in  /usr/share/doc/drbd.../drbd.conf.example 
include "drbd.d/global_common.conf"; 
include "drbd.d/*.res"; 

    全局配置文件

cat /etc/drbd.d/global_common.conf 
global { 
    usage-count yes; 
    # minor-count dialog-refresh disable-ip-verification 

common { 
    handlers { 
        pri-on-incon-degr "/usr/lib/drbd/notify-pri-on-incon-degr.sh; /usr/lib/drbd/notify-emergency-reboot.sh; echo b > /proc/sysrq-trigger ; reboot -f"; 
        pri-lost-after-sb "/usr/lib/drbd/notify-pri-lost-after-sb.sh; /usr/lib/drbd/notify-emergency-reboot.sh; echo b > /proc/sysrq-trigger ; reboot -f"; 
        local-io-error "/usr/lib/drbd/notify-io-error.sh; /usr/lib/drbd/notify-emergency-shutdown.sh; echo o > /proc/sysrq-trigger ; halt -f"; 
        # fence-peer "/usr/lib/drbd/crm-fence-peer.sh"; 
        # split-brain "/usr/lib/drbd/notify-split-brain.sh root"; 
        # out-of-sync "/usr/lib/drbd/notify-out-of-sync.sh root"; 
        # before-resync-target "/usr/lib/drbd/snapshot-resync-target-lvm.sh -p 15 -- -c 16k"; 
        # after-resync-target /usr/lib/drbd/unsnapshot-resync-target-lvm.sh; 
    } 
    startup { 
        # wfc-timeout degr-wfc-timeout outdated-wfc-timeout wait-after-sb 
    } 
    options { 
        # cpu-mask on-no-data-accessible 
    } 
    disk { 
        on-io-error detach; 
        # size max-bio-bvecs on-io-error fencing disk-barrier disk-flushes 
        # disk-drain md-flushes resync-rate resync-after al-extents 
                # c-plan-ahead c-delay-target c-fill-target c-max-rate 
                # c-min-rate disk-timeout 
    } 
    net { 
        cram-hmac-alg "sha1"; 
        shared-secret "soulboy"; 
        # protocol timeout max-epoch-size max-buffers unplug-watermark 
        # connect-int ping-int sndbuf-size rcvbuf-size ko-count 
        # allow-two-primaries cram-hmac-alg shared-secret after-sb-0pri 
        # after-sb-1pri after-sb-2pri always-asbp rr-conflict 
        # ping-timeout data-integrity-alg tcp-cork on-congestion 
        # congestion-fill congestion-extents csums-alg verify-alg 
        # use-rle 
    } 
    syncer { 
        rate 1000M; 
    } 

   定義資源mfs

[root@one packages]# cat /etc/drbd.d/mydata.res 
resource mydata { 
    on one.soulboy.com { 
        device  /dev/drbd0; 
        disk    /dev/sdb2;     #大小要一致 
        address 192.168.1.61:7789; 
        meta-disk internal; 
    } 
    on two.soulboy.com { 
        device  /dev/drbd0; 
        disk    /dev/sdb1;     #大小要一致 
        address 192.168.1.62:7789; 
        meta-disk internal; 
    } 

resource mfs { 
    on one.soulboy.com { 
        device  /dev/drbd1; 
        disk    /dev/sdb3; 
        address 192.168.1.61:7788; 
        meta-disk internal; 
    } 
    on two.soulboy.com { 
        device  /dev/drbd1; 
        disk    /dev/sdb2; 
        address 192.168.1.62:7788; 
        meta-disk internal; 
    } 

   同步配置文件到從節點

scp /etc/drbd.d/* two.soulboy.com:/etc/drbd.d/ 

   初始化資源(分別在兩個節點上執行)

drbdadm create-md mfs 

   啓動資源(分別在兩個節點上執行)

service drbd start 

   將某節點變爲主節點(192.168.1.61爲主節點)

drbdadm primary --force mydata 

   查看狀態肯定同步完畢

[root@one packages]# service drbd status 
1:mfs     Connected  Primary/Secondary  UpToDate/UpToDate  C  /mfs     ext4 

   格式化文件系統(在主節點)

mke2fs -t ext4 /dev/drbd1 

   容許對方搶佔(分別在兩節點上執行)

drbdadm primary mfs 

   開機不要自動啓動

chkconfig drbd off 

部署MFS

   MFS工做原理

       MFS文件系統可以實現RAID功能,節約成本,不遜色於專業的存儲系統,能夠實如今線擴容。

   MFS的四種角色

       MasterServer(元數據服務器):負責管理各個ChunkServer及調度文件讀寫,回收文件空間及恢復多節點拷貝。

       Metalogger(元數據日誌服務器):負責備份管理服務器的變化日誌文件。

       ChunkServer(數據存儲服務器):真正存儲用戶數據的服務器,將文件切塊相互同步,遵從MasterServer的調度爲Client提供數據傳輸,Chunk節點數量越多,可靠性和MFS可用的磁盤空間就會越大。

       Client(客戶端):客戶端經過fuse內核接口遠程管理服務器上所管理的數據存儲服務器,和使用本地文件系統同樣。

   安裝配置元數據服務

mount /dev/drbd1 /mfs               #掛載drbd設備 
groupadd -g 1000 mfs                #兩邊節點的uid要統一 
useradd -u 1000 -g mfs -s /sbin/nologin mfs  #兩邊節點都須要建立 
mkdir -pv /mfs                      #主節點建立數據目錄便可 
chown -R mfs.mfs /mfs               #兩個節點修改目錄屬主和屬組爲mfs 
tar xf mfs-1.6.26.tar.gz 
cd mfs-1.6.26 
./configure --prefix=/mfs --with-default-user=mfs --with-default-group=mfs 
make && make install 
cp /mfs/etc/mfsmaster.cfg.dist  /mfs/etc/mfsmaster.cfg 
cp /mfs/etc/mfsexports.cfg.dist  /mfs/etc/mfsexports.cfg 
cp /mfs/var/mfs/metadata.mfs.empty  /mfs/var/mfs/metadata.mfs 

   主配置文件

vim /mfs/etc/mfsmaster.cfg 
    # WORKING_USER = mfs            #運行用戶 
    # WORKING_GROUP = mfs           #運行組 
    # SYSLOG_IDENT = mfsmaster      #在syslog中標識本身 
    # LOCK_MEMORY = 0               #是否執行mlockall()以免mfsmaster進程溢出(默認爲0) 
    # NICE_LEVEL = -19              #運行的優先級 
    # EXPORTS_FILENAME = /usr/local/mfs/etc/mfsexports.cfg   #目錄控制文件路徑 
    # TOPOLOGY_FILENAME = /usr/local/mfs/etc/mfstopology.cfg #拓撲類型文件路徑 
    # DATA_PATH = /usr/local/mfs/var/mfs    #數據存放路徑(changelog,sessions,stats) 
    # BACK_LOGS = 50                        #元數據的改變日誌文件數量 
    # BACK_META_KEEP_PREVIOUS = 1           # 
    # REPLICATIONS_DELAY_INIT = 300         #延遲複製時間(300秒) 
    # REPLICATIONS_DELAY_DISCONNECT = 3600  #ChunkServer斷開復制的延遲 
    # MATOML_LISTEN_HOST = *                #元數據日誌服務器監聽的IP地址(*表明任何IP) 
    # MATOML_LISTEN_PORT = 9419             #元數據日誌服務器監聽的端口地址(9419) 
    # MATOCS_LISTEN_HOST = *                #用於ChunkServer鏈接的IP地址(*表明任何IP) 
    # MATOCS_LISTEN_PORT = 9420             #用於ChunkServer鏈接的端口(9420) 
    # MATOCL_LISTEN_HOST = *                #用於客戶端鏈接的地址 
    # MATOCL_LISTEN_PORT = 9421             #用於客戶端鏈接的端口 
    # CHUNKS_LOOP_CPS = 100000        
    # CHUNKS_LOOP_TIME = 300                #Chunks迴環頻率 
    # CHUNKS_SOFT_DEL_LIMIT = 10      
    # CHUNKS_HARD_DEL_LIMIT = 25 
    # CHUNKS_WRITE_REP_LIMIT = 2            #在一個循環裏複製到一個ChunkServer的最大Chunks數目 
    # CHUNKS_READ_REP_LIMIT = 10 
    # REJECT_OLD_CLIENTS = 0                #彈出低於1.6.0客戶端的鏈接 

   目錄掛載控制文件

vim /mfs/etc/mfsexports.cfg #分爲三個部分,無需修改 
*                       .           rw 
*                       /           rw,alldirs,maproot=0 
客戶端IP         被掛載目錄       客戶端擁有的權限 

   爲MasterServer提供lsb格式啓動腳本

cat /etc/init.d/mfsmaster 
# chkconfig: 345 91 10 
# description: mfs start. 
. /etc/rc.d/init.d/functions 
. /etc/sysconfig/network 
path="/mfs/sbin" 
[ "${NETWORKING}" = "no" ] && exit 0 
start() { 
$path/mfsmaster start 
$path/mfscgiserv start 

stop() { 
$path/mfsmaster stop 
$path/mfscgiserv start 

restart() { 
$path/mfsmaster restart 
$path/mfscgiserv restart 

status() { 
$path/mfsmaster test 
$path/mfscgiserv test 

case "$1" in 
start) 
     start 
     ;; 
stop) 
     stop 
     ;; 
restart) 
     restart 
     ;; 
status) 
     status 
     ;; 
 *) 
     echo $"Usage: $0 start|stop|restart|status" 
     exit 1 
     esac 
     exit 0 

   修改權限

chmod 755 /etc/init.d/mfsmaster 

   導出命令

echo 'export PATH=$PATH:/mfs/sbin' > /etc/profile.d/mfs.sh 
. /etc/profile.d/mfs.sh 

   同步啓動腳本至從節點

scp -p /etc/init.d/mfsmaster two:/etc/init.d/ 

   關閉服務卸載drbd設備

service mfsmaster stop 
umount /dev/drbd1 

 

部署Corosync+Pacemaker

   Corosync是集羣管理套件的一部分,它在傳遞信息的時候能夠經過一個簡單的配置文件來定義信息傳遞的方式和協議等,RHCS集羣套件就是基於corosync實現。但corosync只提供了message layer的能力。集羣的資源管理則須要Pacemaker,其管理接口有兩個分別是crmsh和pcs。

   環境準備

       service NetworkManager stop

       時間同

       主機名稱解析的結果等於uname -n

   安裝(pacemaker做爲corosync的插件運行)

yum install -y corosync pacemaker 

    資源管理器配置接口基於crmsh

yum install -y crmsh-1.2.6-4.el6.x86_64.rpm pssh-2.3.1-2.el6.x86_64.rpm 

   生成密鑰

corosync-keygen 
cp /etc/corosync/corosync.conf.example /etc/corosync/corosync.conf 

   配置文件

vim /etc/corosync/corosync.conf #添加pacemaker插件 
            compatibility: whitetank    #是否兼容0.8版本的corosync 
            totem {                     #用來定義集羣節點心跳信息傳遞 
                version: 2              #版本號 
                secauth: on             #啓用安全認證機制 
                threads: 0              #啓用多少線程完成心跳信息傳遞 
                interface {                   #定義心跳信息傳遞的接口 
                    ringnumber: 0             #避免循環轉發心跳信息 
                    bindnetaddr: 192.168.2.0  #指定網卡的網絡地址 
                    mcastaddr: 226.194.61.21   #心跳信息使用的組播地址 
                    mcastport: 5405            #組播監聽端口 
                    ttl: 1 
                } 
            } 
            logging {               #心跳信息層日誌 
                fileline: off       # 
                to_stderr: no       #是否把錯誤信息發往屏幕 
                to_logfile: yes     #使用自定義日誌文件logfile 
                to_syslog: no       #是否記錄到系統日誌 
                logfile: /var/log/cluster/corosync.log 
                debug: off          #調試功能 
                timestamp: on       #每次記錄心跳信息是否記錄時間戳 
                logger_subsys { 
                    subsys: AMF 
                    debug: off 
                } 
            } 
            amf { 
                mode: disabled 
            } 
            service {       #添加pacemaker插件 
                ver: 0 
                name: pacemaker 
            } 
            aisexec {       #可省略 
                user: root 
                group: root 
            } 

   複製配置文件到其餘節點

scp -p /etc/corosync/corosync.conf /etc/corosync/authkey two.soulboy.com:/etc/corosync/ 

  分別在兩節點啓動corosync服務

service corosync start 

   使用crmsh接口定義drbd資源(忽略法定票數、禁用stonith設備)

crm(live)configure# property no-quorum-policy=ignore 
crm(live)configure# property stonith-enabled=false 

   定義原始資源

crm(live)configure# primitive mfs_drbd ocf:linbit:drbd params drbd_resource=mfs op monitor role=Master interval=10 timeout=20 op monitor role=Slave interval=20 timeout=20 op start timeout=240 op stop timeout=100   #定義drbd資源 
crm(live)configure# ms ms_mfs_drbd mfs_drbd meta master-max="1" master-node-max="1" clone-max="2" clone-node-max="1" notify="true"   #定義drbd的克隆資源、克隆屬性 
crm(live)configure# primitive mfsstore ocf:heartbeat:Filesystem params device="/dev/drbd1" directory="/mfs" fstype="ext4" op monitor interval=40 timeout=40 op start timeout=60 op stop timeout=60   #定義本地掛載資源 
crm(live)configure# primitive mfsip ocf:heartbeat:IPaddr params ip="192.168.1.40" op monitor interval=20 timeout=20 on-fail=restart   #定義vip 
crm(live)configure# primitive mfsserver lsb:mfsmaster   #定義mfs服務 

   定義colocation約束(資源運行在同一個節點上的偏好)

crm(live)configure# colocation mfsstore_with_ms_mfs_drbd_master inf: mfsstore ms_mfs_drbd:Master   #掛載資源追隨drbd主資源在一塊兒 
crm(live)configure# colocation mfsserver_with_mfsstore inf: mfsserver mfsstore   #mfs服務追隨掛載資源 
crm(live)configure# colocation mfsip_with_mfsserver inf: mfsip mfsserver   #vip追隨mfs服務 

 定義資源組(若是定義了資源組就沒有必要定義colocation約束了)

crm(live)configure# group ha_mfsservice mfsstore mfsserver mfsip   #本文沒有這樣作,但特此說明這樣作也是能夠的 

   定義order約束(資源啓動和關閉的次序)  

crm(live)configure# order ms_mfs_drbd_before_mfsstore mandatory: ms_mfs_drbd:promote mfsstore:start   #節點上存在drbdMaster才能啓動mystore服務 
crm(live)configure# order mfsstore_before_mfsserver mandatory: mfsstore:start mfsserver:start   #mystore服務啓動才能啓動mfs服務 
crm(live)configure# order mfsip_before_mfsserver mandatory: mfsip mfsserver   #vip啓動才能啓動mfs服務    

 定義location約束(資源對節點的傾向性)

location mfsservice_prefer_one ha_mfsservice 500: one.soulboy.com   #主節點從故障中回覆是否能夠將資源搶奪回來,本文沒有這樣作,特此說明這樣作是能夠完成資源搶佔的。 

   檢查語法並保存

crm(live)configure# verify 
crm(live)configure# commit 

   查看集羣狀態(發現資源都運行在主節點上)

[root@one packages]# crm 
crm(live)# status 
Online: [ one.soulboy.com two.soulboy.com ] 
Master/Slave Set: ms_mfs_drbd [mfs_drbd] 
     Masters: [ one.soulboy.com ] 
     Slaves:  [ two.soulboy.com ] 
mfsstore   (ocf::heartbeat:Filesystem):    Started one.soulboy.com 
mfsserver  (lsb:mfsmaster):                Started one.soulboy.com 
mfsip      (ocf::heartbeat:IPaddr):        Started one.soulboy.com 

  查看驗證

[root@one ~]# drbd-overview               #drbd資源正常 
  1:mfs/0     Connected Primary/Secondary UpToDate/UpToDate C r----- /mfs    ext4 5.0G 142M 4.6G 3% 
[root@one ~]# service mfsmaster status       #mfs資源正常 
mfsmaster pid: 13966 
mfscgiserv pid:14158 
[root@one ~]# ip addr show  | grep 192.168.1.40  #vip資源正常 
    inet 192.168.1.40/24 brd 192.168.1.255 scope global secondary eth0 
[root@one ~]# ls /mfs               #掛載資源正常 
etc  lost+found  sbin  share  var 

故障模擬測試

   安裝ChunkServer

useradd mfs -s /sbin/nologin 
tar xf mfs-1.6.26.tar.gz 
cd mfs-1.6.26 
./configure --prefix=/usr/local/mfs --with-default-user=mfs --with-default-group=mfs 
make && make install 
cp /usr/local/mfs/etc/mfschunkserver.cfg.dist /usr/local/mfs/etc/mfschunkserver.cfg 
cp /usr/local/mfs/etc/mfshdd.cfg.dist /usr/local/mfs/etc/mfshdd.cfg 

   主配置文件

vim /usr/local/mfs/etc/mfschunkserver.cfg 
# WORKING_USER = mfs 
# WORKING_GROUP = mfs 
# SYSLOG_IDENT = mfschunkserver 
# LOCK_MEMORY = 0 
# NICE_LEVEL = -19 
# DATA_PATH = /usr/local/mfs/var/mfs 
# MASTER_RECONNECTION_DELAY = 5 
# BIND_HOST = * 
MASTER_HOST = 192.168.1.40         #元數據服務器的地址 
MASTER_PORT = 9420                 #元數據服務器監聽端口 
# MASTER_TIMEOUT = 60 
# CSSERV_LISTEN_HOST = * 
# CSSERV_LISTEN_PORT = 9422       #此端口用戶和其餘ChunkServer間複製數據 
# HDD_CONF_FILENAME = /usr/local/mfs/etc/mfshdd.cfg   #分配給MFS磁盤使用空間配置文件路徑 
# HDD_TEST_FREQ = 10 
# LOCK_FILE = /var/run/mfs/mfschunkserver.lock 
# BACK_LOGS = 50 
# CSSERV_TIMEOUT = 5 

   磁盤空間配置文件

vim /usr/local/mfs/etc/mfshdd.cfg 
/data      #/data是一個MFS的分區,實例化爲本機一個獨立的磁盤掛載分區。 

   修改權限並啓動服務

chown -R mfs:mfs /data 
mfschunkserver start 

   Client編譯安裝

   MFS客戶端依賴於fuse

tar xf fuse-2.9.2.tar.gz 
cd fuse-2.9.2 
./configure 
make && make install 
vim /etc/profile     #在最後添加 
export PKG_CONFIG_PATH=/usr/local/lib/pkgconfig:$PKG_CONFIG_PATH 
source /etc/profile   #即時生效 
export PKG_CONFIG_PATH=/usr/local/lib/pkgconfig:$PKG_CONFIG_PATH 

   安裝MFS客戶端

useradd mfs -s /sbin/nologin 
tar xf mfs-1.6.26.tar.gz 
cd mfs-1.6.26 
./configure --prefix=/usr/local/mfs --with-default-user=mfs --with-default-group=mfs --enable-mfsmount 
make && make install 
modprobe fuse    #加載fuse到內核 

   掛載MFS文件系統

mkdir /webdata       #建立本地目錄做爲掛載點 
/usr/local/mfs/bin/mfsmount /webdata -H 192.168.1.40   #掛載MFS到本地/webdata目錄 

   掛載MFSMeta文件系統

mkdir /webdatameta   #建立本地MFSMeta目錄 
/usr/local/mfs/bin/mfsmount -m /webdatameta -H 192.168.1.40   #掛載MFSMeta文件系統 

   client建立文件並查看信息(正常)

[root@five /]# echo "123" > /webdata/one   #建立文件 
[root@five /]# mfsfileinfo  /webdata/one  #查看副本和存儲節點 
/webdata/one: 
    chunk 0: 0000000000000006_00000001 / (id:6 ver:1) 
        copy 1: 192.168.1.50:9422 
        copy 2: 192.168.1.64:9422 

   登陸web管理控制檯(正常)

   模擬主節點故障

crm(live)node# standby    #離線,等待幾秒鐘 
crm(live)node# online     #上線 
crm(live)node# cd         #回退 
crm(live)# status         #查看集羣資源狀態 
Online: [ one.soulboy.com two.soulboy.com ] 
Master/Slave Set: ms_mfs_drbd [mfs_drbd] 
     Masters: [ two.soulboy.com ] 
     Slaves: [ one.soulboy.com ] 
mfsstore   (ocf::heartbeat:Filesystem):    Started two.soulboy.com 
mfsserver  (lsb:mfsmaster):                Started two.soulboy.com 
mfsip      (ocf::heartbeat:IPaddr):        Started two.soulboy.com 

   client再次建立文件並查看副本數(正常)

[root@five /]# echo "123" > /webdata/two 
[root@five /]# mfsfileinfo  /webdata/two 
/webdata/two: 
    chunk 0: 0000000000000007_00000001 / (id:7 ver:1) 
        copy 1: 192.168.1.50:9422 
        copy 2: 192.168.1.64:9422 

   再次登陸web管理控制檯(正常)

 

補充和總結

   解決MFS單點故障的主要思路是將MasterServer安裝在drbd設備目錄中,經過corosync+pacemaker將drbd、vip、mount、mfsmaster資源粘合在一塊兒,並經過colocation和order的約束保證了資源間依賴關係和啓動次序,此外mfsmaster的啓動在pacemaker中定義爲lsb風格RA,也就是形如/etc/init.d/目錄下的sysv風格的腳本。值得一提的是pacemaker的管理接口,本文中使用的是crmsh,而pcs接口有着比crmsh更強大的功能,能夠實現管理集羣整個生命週期,支持節點的添加、移除、啓動、關閉等操做。

   實現mysql的高可用也能夠經過本文這種思路實現,具體步驟可參考本文,這裏補充下pcs接口的用法,方便讀者作對比。

pcs resource create myvip ocf:heartbeat:IPaddr params ip=192.168.1.70 op monitor interval=20 timeout=20 on-fail=restart   #定義vip 
pcs resource create mystore ocf:heartbeat:Filesystem params device="192.168.1.50:/mysqldata" directory="/mydata" fstype="nfs" op monitor interval=40 timeout=40 on-fail=restart op start timeout=60 op stop timeout=60   #定義nfs 
pcs resource create mysqlserver lsb:mysqld op monitor interval=20 timeout=20 on-fail=restart   #定義httpd 
pcs resource group add mysqlservice myvip mystore mysqlserver   #定義webservice資源組 
pcs constraint location mysqlservice prefers two.soulboy.com=500   #定義資源傾向性,資源組webservice對節點二的傾向性爲500 
pcs constraint order start myvip then start mystore   #定義資源的order執行次序,這個貌似不能一會兒定義三個資源月約束 
pcs constraint order start mystore then start mysqlserver   #定義資源的order執行次序 
pcs constraint colocation add myvip mystore   #定義colocation,若是有資源組能夠省略。這個貌似不能一次定義三個資源月約束 
pcs constraint colocation add mystore mysqlserver   #定義colocation 

   實現mfs的高可用也能夠經過heartbeat+drbd來實現,思路和本文相似,已經大牛撰寫,文章內容優質,請參考:  qzhijun的BLOG

 

 

海量小文件存儲利器Mogilefs

#######################################################################

  • 數據存儲的趨勢和大數據帶來的挑戰

  • 分佈式存儲與CAP定理

  • 分佈式存儲文件系統

  • Mogilefs基本原理

  • Mogilefs實現

  • Nginx反向代理Tracker節點

#######################################################################

 

數據存儲的趨勢和大數據帶來的挑戰

       當下咱們處在一個互聯網飛速發展的信息社會,在海量併發鏈接的驅動下天天所產生的數據量必然以幾何方式增加,隨着信息鏈接方式日益多樣化,數據存儲的結構也隨着發生了變化。在這樣的壓力下使得人們不得不從新審視大量數據的存儲所帶來的挑戰,例如:數據採集、數據存儲、數據搜索、數據共享、數據傳輸、數據分析、數據可視化等一系列問題。

傳統存儲在面對海量數據存儲表現出的力不從心已是不爭的事實,例如:縱向擴展受陣列空間限制、橫向擴展受交換設備限制、節點受文件系統限制。

       然而分佈式存儲的出如今必定程度上有效的緩解了這一問題,之因此稱之爲緩解是由於分佈式存儲在面對海量數據存儲時也並不是十全十美毫無壓力,依然存在的難點與挑戰例如:節點間通訊、數據存儲、數據空間平衡、容錯、文件系統支持等一系列問題仍處在不斷摸索和完善中。

 

分佈式存儲與CAP定理

       首先要說明的是一個完美分佈式系統有三個最重要的元素,他們分別是:

       一致性(Consistency):任何一個讀操做老是能讀取以前完成的寫操做。

       可用性(Availability):每次操做老是可以在預約時間返回。

       分區容錯性(Partition Tolerance):在出現網絡分區(分佈式)的狀況下,仍然可以知足一致性和可用性。

       2007年,正當全部科學家都在致力於CAP三元素並存的時候,Eric.Brewer教授站了出來並指出CAP永遠沒法兼顧,只能根據具體應用來權衡和取捨,而且至多兩個元素能夠共存,後來由兩位麻省理工學院的科學家證實此觀點是具備前瞻性的,由此造成Brewer的CAP定理。

       正所謂魚和熊掌不可兼得,關注一致性就須要處理因系統不可用而帶來寫操做失敗的狀況,反之關注可用性就沒法保證每次都能讀取到最新的寫入操做。傳統關係型數據庫側重於CA,而非關係型鍵值數據庫則側重於AP

       對於大型站點,可用性(Availability)分區容錯性(Partition Tolerance)的優先級會高於一致性(Consistency),這裏並非指徹底捨棄一致性,而是經過其餘手段實現數據的弱一致性,例如:用戶微博的瀏覽數和評論能夠容忍相對長時間的不一致,幾乎不會影響用戶體驗,而股票價格的數據則異常敏感,即使是10秒鐘的數據不一致也沒法容忍,爲了能更形象的瞭解所謂「各類一致性」須要進行一下內容的回顧。

       強一致性(ACID)在單機環境中,強一致性能夠由數據庫的事務來保證;在分佈式環境中,強一致性很難作到,即使是作到也會由於分佈式事物所帶來的性能低下,不適合在互聯網的環境中應用。

       弱一致性(包括最終一致性)系統不能保證後續訪問返回最新的值,在訪問到最新值以前這段時間稱之爲不一致窗口

       最終一致性:是弱一致性的一種特例,存儲系統保證若是對象有屢次更新,在渡過不一致窗口以後必將放回最後更新的值。

       服務器的一致性N表明節點的個數;W表明更新的時候須要確認已經被更新的節點個數;R表明讀取數據須要的節點數量。

               W + R > N  ---->  強一致性(一般N=3,W=R=2)

               W=N,R=1   ---->  最佳讀

               W=1,R=N   ---->  最佳寫

               W + R <= N ---->  弱一致性

 

分佈式存儲文件系統



Mogilefs基本原理

       MogileFS是一個開源的分佈式文件系統,用於組建分佈式文件集羣,由LiveJournal旗下DangaInteractive公司開發,Danga團隊開發了包括 Memcached、MogileFS、Perlbal等不錯的開源項目:(注:Perlbal是一個強大的Perl寫的反向代理服務器)。MogileFS是一個開源的分佈式文件系統。主要特性包括:應用層的組件、無單點故障、自動文件複製、具備比RAID更好的可靠性、無需RAID支持等……核心角色以下:

       tracker節點:藉助數據庫保存各節點文件的元數據信息保存每一個域中全部鍵的存儲位置分佈,方便檢索定位數據位置的同時監控各節點,告訴客戶端存儲區位置並指揮storage節點複製數據副本,進程名爲mogilefsd(7001)。

       database節點爲tracker節點提供數據存取服務。

       storage節點:將指定域中的鍵轉換爲其特有的文件名存儲在指定的設備文件中,轉換後的文件名爲值,storage節點自動維護鍵值的對應關係,storage節點因爲使用http進行數據傳輸,所以依賴於perlbal,storage節點前端可使用nginx進行反向代理,但須要安裝nginx-mogilefs-module-master模塊進行名稱轉換,進程名mogstored(7501),perbal(7500)。

       Domain一個域中的鍵值是唯一的,一個MogileFS能夠有多個域,域能夠用來存儲不一樣應用類型的數據的容器。

       Host每個存儲節點稱爲一個主機,一個主機上能夠有多個存儲設備(單獨的硬盤),每一個設備都有ID號,Domain+Fid用來定位文件。

       Class:複製最小單位,文件屬性管理,定義文件存儲在不一樣設備上份數。

       流程圖以下:

       一、應用層發起GET請求到Nginx。

       二、Nginx根據負載均衡機制隨機代理到後臺Node one。

       三、Node one向從服務器發起查詢請求。

       四、從服務器返回查詢結果。

       五、Node one將查詢結果返回給Nginx。

       六、Nginx將查詢結果根據模塊轉換爲合理的url方位Node three。

       七、Node Three將文件內容經過http協議返回給Nginx。

       八、Nginx將結果返回給應用層的請求。

 

Mogilefs實現

      因爲各角色和服務之間都是基於套接字通訊,就服務自己來講沒有耦合性,因此可使用少許機器運行多種服務角色,功能圖以下:

       一、經過Nginx+Keepalived實現高可用的負載均衡,經過upstream模塊能夠有選擇性的轉發應用層的請求至後端tracker節點。

       二、DRBD+Corosync+Pacemaker的機制保證了Mysql的高可用,詳細配置請參閱博文:DAS之mysql高可用解決方案

       三、爲了進一步提高Mysql的性能引入從節點爲其分攤讀操做,從節點的數據能夠根據具體業務規模來設定,若是使用數據庫代理進行讀寫分離,代理會成爲單點故障,則須要爲代理作高可用,另外Tracker節點支持手動爲其指定從節點,所以能夠根據本身的喜愛,Mysql代理和複製相關實現請參閱博文:Mysql複製及代理

##### Database節點 
安裝mariadb 
受權 
GRANT ALL ON *.* TO 'root'@'%' IDENTIFIED BY 'mypass'; 
CREATE DATABASE mogilefs; 
GRANT ALL ON mogilefs.* TO 'moguser'@'%' IDENTIFIED BY 'mogpass'; 
FLUSH PRIVILEGES; 
##### Tracker節點(能夠是全部節點) 
安裝 mogilefs 
修改配置文件以下 
vim /etc/mogilefs/mogilefsd.conf         
daemonize = 1 
pidfile = /var/run/mogilefsd/mogilefsd.pid 
db_dsn = DBI:mysql:mogilefs:host=192.168.1.241 
db_user = moguser 
db_pass = mogpass 
listen = 0.0.0.0:7001 
conf_port = 7001 
query_jobs = 100 
delete_jobs = 1 
replicate_jobs = 5 
reaper_jobs = 1 
service mogilefsd start     #啓動服務 
ss -tanlp (LISTEN      0      128       192.168.1.241:7001  ) 
##### storage節點(能夠是全部節點) 
安裝 mogilefs 
mkdir /mogdata/dev1 -pv     #建立設備目錄 
chown -R mogilefs.mogilefs /mogdata/dev2/   #權限 
vim /etc/mogilefs/mogstored.conf 
maxconns = 10000 
httplisten = 0.0.0.0:7500 
mgmtlisten = 0.0.0.0:7501 
docroot = /mogdata          #目錄級別 
service mogstored start 
ss -tanlp (*:7500) 
##### tracker節點添加storage節點和經常使用命令 
mogadm check        #檢測節點 
mogadm host list    #每一個存儲節點稱爲一個host 
mogadm host add 192.168.1.213 --ip=192.168.1.213 --ip=192.168.1.213 --status=alive      #添加第一個存儲節點 
mogadm host add 192.168.1.242 --ip=192.168.1.242 --ip=192.168.1.242 --status=alive       #添加第一個存儲節點 
mogadm host add 192.168.1.241 --ip=192.168.1.241 --ip=192.168.1.241 --status=alive      #添加第一個存儲節點 
mogadm device add 192.168.1.213 1    #添加第一個設備,設備號惟一不能重名 
mogadm device add 192.168.1.242 2   #添加第二個設備 
mogadm device add 192.168.1.241 3   #添加第三個設備 
mogadm check    #能夠查看狀態 
mogadm domain add files     #建立文件存儲域 
mogadm domain add images    #建立圖片存儲域 
mogadm domain list  #查看全部域 
mogupload --trackers=192.168.1.241 --domain=files --key='/fstab' --file='/etc/fstab'     #上傳fstab文件,key爲'/fstab' 
mogfileinfo --trackers=192.168.1.241 --domain=files --key='/fstab'    #根據key查看文件存放信息 

註釋:mogupload工具是爲了測試,實際環境中上傳是由程序員在代碼中使用mogilefs的API進行交互。

 

Nginx反向代理Tracker節點

##### 配置Nginx 
安裝tng 
yum install pcre-devel -y 
yum groupinstall "Development Tools" "Server Platform Development" 
yum install libxslt-devel gd-devel lua-devel geoip-devel 
tengine-1.5.1.tar.gz 
nginx-mogilefs-module-master.zip    #mogilefs模塊須要打補丁 
mkdir -pv /var/tmp/nginx/client     #模塊須要 
unzip nginx-mogilefs-module-master.zip 
useradd -r nginx 
./configure \ 
  --prefix=/usr/local/nginx \ 
  --sbin-path=/usr/local/nginx/sbin/nginx \ 
  --conf-path=/etc/nginx/nginx.conf \ 
  --error-log-path=/var/log/nginx/error.log \ 
  --http-log-path=/var/log/nginx/access.log \ 
  --pid-path=/var/run/nginx/nginx.pid  \ 
  --lock-path=/var/lock/nginx.lock \ 
  --user=nginx \ 
  --group=nginx \ 
  --enable-mods-shared=all \ 
  --add-module=/nginx-mogilefs-module-master 
make && make install 
vim /etc/profile.d/nginx.sh 
export PATH=/usr/local/nginx/sbin:$PATH 
. !$ 
提供腳本..... 
配置nginx 
vim /etc/nginx/nginx.cfg 
upstream trackers { 
        server 192.168.1.242:7001 weight=1; 
        server 192.168.1.213:7001 weight=1; 
        server 192.168.1.241:7001 backup; 
        check interval=3000 rise=2 fall=5 timeout=1000; 
        check_http_send "GET / HTTP/1.0\r\n\r\n"; 
        check_http_expect_alive http_2xx http_3xx; 
   } 
location /jpg/ { 
        mogilefs_tracker trackers; 
        mogilefs_domain images; 
        mogilefs_methods GET; 
        mogilefs_pass { 
            proxy_pass $mogilefs_path; 
            proxy_hide_header Content-Type; 
            proxy_buffering off; 
                } 
       } 
##### 配置keepalived 
安裝keepalived 
vim /etc/keepalived/keepalived.conf  # backup  priority 99 
global_defs { 
   notification_email { 
     root@localhost 
   } 
   notification_email_from admin@localhost 
   smtp_server 127.0.0.1 
   smtp_connect_timeout 30 
   router_id LTT 

vrrp_script chk_nginx { 
   script "killall -0 nginx" 
   interval 1 
   weight -2 
   fall 2 
   rise 1 

vrrp_instance IN_1 { 
    state MASTER 
    interface eth0 
    virtual_router_id 22 
    priority 100 
    advert_int 1 
    authentication { 
        auth_type PASS 
        auth_pass aaaa 
    } 
    virtual_ipaddress { 
        192.168.1.222 
    } 
   track_script { 
    chk_nginx 


 

查看負載節點:

 

模擬GET方法測試Nginx_mogilefs模塊:

 

 

SAN之可擴展的集羣共享存儲

###############################

SCSI

SAN

ISCSI

SAN和NAS的對比

ISCSI+gfs2+cLVM的實現

###############################

 

SCSI

計算機體系結構

  • CPU:核心組件,負責從memory中讀取數據並進行處理。

  • Memory:核心組件,經過北橋與外圍存儲設備進行交換,做爲易失性存儲有極高的存儲效率,但斷電後數據會丟失。

  • IDE:有限的接口上,可以鏈接的設備有限,IDE的控制器在數據傳輸過程當中的協議封裝能力不好,整個傳輸過程須要大量CPU時鐘週期的參與,這就意味着CPU要花費大量的時候完成數據的讀入和寫出,在業務處理比較繁忙和CPU資源極尤其重要的場合下是沒法忍受的。

  • SCSI:是一種I/O技術,SCSI規範了一種並行的I/O總線和相關的協議,除了硬盤轉速上的提高外,總線的適配器HBA(HostBusAdapter)卡中內置了控制芯片,此控制芯片能夠完成協議的封裝,能夠大量下降CPU的參與,此外因爲SCSI的數據傳輸是以塊的方式進行的,所以它具備如下特色設備無關性、多設備並行、高帶寬、低系統開銷

SCSI使用體系結構

  • 窄SCSI總線:最多容許8個SCSI設備和它進行鏈接。

  • 寬SCSI總線:最多容許16個不一樣的SCSI設備和它進行鏈接

  • SCSI ID:一個獨立的SCSI總線按照規格不一樣能夠支持8或16個SCSI設備,設備的編號須要經過SCSI ID(Target)來進行控制,系統中每一個SCSI設備都必須有本身惟一的SCSI ID,SCSI ID實際上就是這些設備的地址。

SCSI的侷限性

  • 傳輸距離:因爲SCSI線纜的長度有限,限制了SCSI的延展性。

  • 服務主機:Target數量限制了可服務的主機數。

 

 

SAN

  • 可以經過非SCSI線纜傳輸SCSI協議報文,而且能將其路由至目標存儲設備的網絡成爲Storage Area Network(區域存儲網絡)。

 

SCSI協議報文

  • Physical Interconnects and Transport Protocols:定義物理傳輸介質和傳輸報文格式,經過光信道傳輸就成爲FCSAN,經過IP網絡傳輸就成爲IPSAN

  • Shared Command Set:SCSI共享(公共)命令集,定義存儲或讀取等相關命令。

  • SCSI Device-Type Specific Command Sets:不一樣SCSI設備類型特有的命令。

  • Common Access Method:公共訪問方法。

 

ISCSI

IPSAN和FCSAN的對比

  • FCSAN:須要FC的HBA,存儲端互相也須要FC的交換機或者SCSI線纜,應用程序存儲數據由Adapter Driver向存儲網絡發起請求並完成數據存取。

  • IPSAN:應用程序的請求先交由SCSI驅動封裝(協議報文各類指令),再由ISCSI驅動封裝(用於聯繫ISCSI服務器端),藉助於TCP/IP網絡發送至ISCSI服務器端。

IPSAN的傳輸過程

  • ISCSI服務端:經過安裝一款成熟的存儲管理軟件ISCSI Target,也稱爲Target。

  • ISCSI客戶端:能夠是硬件,也能夠是安裝iscsi客戶端軟,稱爲Initiator。客戶端的鏈接方式有如下三種:

  • 以太網卡+initiator軟件:成本低,但須要佔用客戶端主機部分資源用於ISCSI和TCP/IP協議之間的解析, 適用於低I/O帶寬的環境下。

  • 硬件TOE網卡+initiator:TOE(TCP Offload Engine)功能的智能以太網卡能夠完成ISCSI的封裝,但SCSI封裝仍以軟件方式運做,使得客戶端主機能夠從繁忙的協議中解脫出來,大幅度提升數據傳輸速率,下降了客戶端主機資源消耗。但TOE功能的網卡,成本較高。

  • ISCSI HBA卡鏈接:不須要安裝客戶端軟件,所有靠硬件,數據傳輸性能最好,但成本很高,客戶端數量和性價比成反比。

 

SAN和NAS的對比

註釋:因爲SAN是在DAS的基礎之上增長了延展性,所以下圖以DAS做比較:

結論:從圖中能夠看出NAS的文件系統在服務器端,而SAN的文件系統在客戶端,由於SAN的客戶端能夠實現對分區的建立格式化等操做,而NAS不能夠。所以SAN常常配合集羣文件系統(gfs二、ocfs)一塊兒使用,爲的就是避免多個Initiator對Target的同一資源在同一時刻進行徵用帶來的腦裂。

 

ISCSI+gfs2+cLVM的實現

架構圖以下:

部署Target端

安裝軟件包

yum install scsi-target-utils 

查看當前磁盤情況(將/dev/sdb2發佈出去3GB)

[root@localhost yum.repos.d]# fdisk -l 
Disk /dev/sdb: 21.4 GB, 21474836480 bytes 
255 heads, 63 sectors/track, 2610 cylinders 
Units = cylinders of 16065 * 512 = 8225280 bytes 
   Device Boot      Start         End      Blocks   Id  System 
/dev/sdb1               1        1217     9775521   83  Linux 
/dev/sdb2            1218        1583     2939895   83  Linux 

經常使用配置 

/etc/tgt/targets.conf   配置文件的方式來管理target 
/etc/sbin/tgt-admin     經過配置文件定義 
/usr/sbin/tgtadm        經過命令行的方式管來target 
service tgtd start      啓動服務 

編輯配置文件vim /etc/tgt/targets.conf

<target iqn.2013-08.com.soulboy:sdb1> 
        backing-store /dev/sdb2 
        initator-address 192.168.1.0/24 
</target> 

啓動服務

service tgtd start 

命令行方式配置

tgtadm --lld iscsi --mode logicalunit --op new --tid 2 --lun 1 --backing-store /dev/sdb2 
    tgtadm --lld iscsi --mode target --op bind --tid 2 --initiator-address 192.168.1.0/24 

部署各節點

安裝軟件包

yum install -y cman rgmanager gfs2-utils vm2-cluster 

確保個節點hosts文件和hostname爲以下

[root@node3 ~]# cat /etc/hosts 
192.168.1.21    node1.soulboy.com node1 
192.168.1.22    node2.soulboy.com node2 
192.168.1.23    node3.soulboy.com node3 

各節點時間同步

ntpdate 192.168.1.101 

集羣邏輯卷 cLVM共享存儲作成LVM,借用HA的機制,讓多個節點能夠同時對一個捲髮起管理操做。

vim /etc/lvm/lvm.conf 
locking_type = 3 

定義集羣名稱

ccs_tool create tcluster 

添加fence設備

ccs_tool addfence meatware fence_manual 

添加集羣成員

ccs_tool addnode -v 1 -n 1 -f meatware node1.soulboy.com 
ccs_tool addnode -v 1 -n 2 -f meatware node2.soulboy.com 
ccs_tool addnode -v 1 -n 3 -f meatware node3.soulboy.com 

在各節點依次啓動服務

service  cman  start                 
service  rgmanager start 

查看各節點信息

[root@node3 ~]#  ccs_tool lsnode 
Cluster name: tcluster, config_version: 7 
Nodename                        Votes Nodeid Fencetype 
node1.soulboy.com                  1    1 
node2.soulboy.com                  1    2 
node3.soulboy.com 

各節點安裝initator配置並啓動服務

yum --nogpgcheck localinstall iscsi-initiator-utils-6.2.0.872-16.el5.i386.rpm
service iscsi start 啓動服務 

各節點客戶端執行發現和登錄操做

[root@localhost mydata]#  iscsiadm -m discovery -t sendtargets -p 192.168.1.50 
192.168.1.50:3260,1 iqn.2013-08.com.soulboy:sdb1 
192.168.1.50:3260,1 iqn.2013-08.com.soulboy:sdb2 
[root@localhost mydata]#  iscsiadm -m node -T iqn.2013-08.com.soulboy:sdb2 -p 192.168.1.50 -l 

在任意initator上對共享設備建立分區(各節點在本地識別成sdc)

fdisk /dev/sdc 

在其餘節點上執行

partprobe /dev/sdb 

在節點三建立物理卷

[root@node3 ~]# pvcreate /dev/sdc 

在節點二使用pvs命令查看

[root@node2 ~]# pvs 
PV         VG         Fmt  Attr PSize  PFree 
/dev/sda2  VolGroup00 lvm2 a--  19.88G    0 
/dev/sdc              lvm2 a--   2.80G 2.80G 

在節點三建立建立卷組

[root@node3 ~]# vgcreate clustervg /dev/sdc 

在節點二使用vgs命令查看

[root@node2]# vgs 
  VG         #PV #LV #SN Attr   VSize  VFree 
  VolGroup00   1   2   0 wz--n- 19.88G      0 
  clustervg    1   1   0 wz--nc  2.80G  2.80G 

在節點二建立邏輯卷

[root@node2]# lvcreate -L 1G -n clusterlv clustervg 

在節點三使用lvs命令查看

[root@node3 ~]# lvs 
LV        VG         Attr   LSize  Origin Snap%  Move Log Copy%  Convert 
LogVol00  VolGroup00 -wi-ao 17.88G                               
LogVol01  VolGroup00 -wi-ao  2.00G                               
clusterlv clustervg  -wi-a-  1.00G 

在集羣邏輯上使用集羣文件系統(暫時先建立2個日誌區域,加入兩個節點)

mkfs.gfs2 -j 2 -p lock_dlm -t tcluster:lktb1 /dev/clustervg/clusterlv 

各節點建立/mydata目錄

mkdir /mydata 

各節點掛載邏輯卷clustervg至本地/mydata目錄中

mount -t gfs2 /dev/clustervg/clusterlv /mydata 

查看信息

[root@node3 ~]# gfs2_tool df /mydata 
/mydata: 
  SB lock proto = "lock_dlm" 
  SB lock table = "tcluster:lktb1" 
  SB ondisk format = 1801 
  SB multihost format = 1900 
  Block size = 4096 
  Journals = 2 
  Resource Groups = 8 
  Mounted lock proto = "lock_dlm" 
  Mounted lock table = "tcluster:lktb1" 
  Mounted host data = "jid=1:id=196610:first=0" 
  Journal number = 1 
  Lock module flags = 0 
  Local flocks = FALSE 
  Local caching = FALSE 
  Type           Total Blocks   Used Blocks    Free Blocks    use%    
  ------------------------------------------------------------------------ 
  data           524196         66195          458001         13% 
  inodes         458018         17             458001         0% 

補充

#####馬上同步到磁盤 
gfs2_tool settune /mydata new_files_directio 1 
#####默認是60秒,日誌刷新次數 
log_flush_secs = 60                    
#####擴展邏輯卷物理邊界至2GB(能夠指定選項,不指默認就是擴展所有) 
lvextend -L 2G /dev/clustervg/clusterlv 
mount -t gfs2 /dev/clustervg/clusterlv /mnt 
#####擴展邏輯卷邏輯編輯至2GB 
gfs2_grow /dev/clustervg/clusterlv 
#####磁盤檢測命令 
fsck.gfs2 
#####凍結gfs文件系統(只能讀,不能寫) 
gfs2_tool freeze /mydata 
#####解凍,備份數據的時候能夠用到。 
gfs2_tool unfreeze /mydata 
註釋:擴展卷組須要iSCSI添加新的設備,和使用LVM同樣建立PV,添加入卷組便可不在演示過程。 

測試

節點二

[root@node2 mydata]# pwd 
/mydata 
[root@node2 mydata]# ls 
[root@node2 mydata]# touch node2 
[root@node2 mydata]# ls 
node2 

節點三

[root@node3 mydata]# pwd 
/mydata 
[root@node3 mydata]# ls 
node2 
[root@node3 mydata]# rm -rf node2 

節點二

[root@node2 mydata]# pwd 
/mydata 
[root@node2 mydata]# ls

 

 

NAS之mysql高可用解決方案

###############################################

NAS

高可用集羣

hearbeat v二、crm、NFS實現MySQL高可用集羣

NFS做爲共享存儲所存在的問題

###############################################

 

NAS

  • (NetworkAttachedStorage):網絡附屬存儲是一種將分佈、獨立的數據整合爲大型、集中化管理的數據中心,以便於對不一樣主機和應用服務器進行訪問的技術。它經過網絡交換機鏈接存儲系統和服務器,創建專門用於數據存儲的私有網絡,用戶經過TCP/IP協議訪問數據,採用業界標準的文件共享協議如:NFS、HTTP、CIFS來實現基於文件級的數據共享,NAS存儲使文件共享訪問變的快捷方便,而且易增長存儲空間。但NAS自己也有必定的侷限性,它會受到網絡帶寬和網絡擁堵的影響,在必定程度上限制了NAS的網絡傳輸能力。

  • NAS的優勢:NAS具有文件操做和管理系統,kernel的存在有效解決多個進程在同一時間對同一資源徵用帶來的數據崩潰(腦裂split-brain);NAS是共享與獨享兼顧的數據存儲池而且簡單靈活建立成本不高。

  • NAS的缺點:NAS自己將會受到網絡帶寬和網絡擁堵的影響;文件級別的數據共享在必定程度上會影響效率。

 

高可用集羣

  • 高可用集羣,英文原文爲High Availability Cluster,簡稱HA Cluster,簡單的說,集羣(cluster)就是一組計算機,它們做爲一個總體向用戶提供一組網絡資源。這些單個的計算機系統 就是集羣的節點(node)。只有兩個節點的高可用集羣又稱爲雙機熱備,即便用兩臺服務器互相備份。當一臺服務器出現故障時,可由另外一臺服務器承擔服務任務,從而在不須要人工干預的 狀況下,自動保證系統能持續對外提供服務。雙機熱備只是高可用集羣的一種,高可用集羣系統更能夠支持兩個以上的節點,提供比雙機熱備更多、更高級的功能, 更能知足用戶不斷出現的需求變化,邏輯結構圖以下:

  • ccm(Cluster Consensus Menbership Service):監聽節點間心跳信息並計算整個集羣的票數和收斂狀態信息。

  • crmd(Cluster Resource Manager):集羣資源管理器實現了資源的分配,資源分配的每一個動做都要經過crm來實現,是核心組建,每一個節點上的crm都維護一個cib用來定義資源特定的屬性,哪些資源定義在同一個節點上。

  • cib(Cluster Infonation Base):集羣信息基庫是XML格式的配置文件,在內存中的一個XML格式的集羣資源的配置文件。

  • lrmd(Local Resource Manager):本地資源管理器用來獲取本地某個資源的狀態,而且實現本地資源的管理。

  • pengine:PE、TE

  • PE(Policy Engine):策略引擎負責計算集羣資源的粘性

  • TE(Transition Engine):事務引擎根據PE計算結果指揮節點進行資源轉移

  • stonithd(Shoot The Other Node in the Head):切斷故障節點電源。

Messagin Layer軟件

  • heartbeat

  • corosync

  • cman

  • keepalived

  • ultramokey

Cluster Resource Manager Layer軟件

  • crm

  • pacemaker

  • rgmanager

HA經常使用組合

  • heartbeat v2+crm

  • heartbeat v3+pacemaker

  • corosync+pacemaker

  • cman + rgmanager

  • keepalived+lvs

 

 

hearbeat v二、crm、NFS實現MySQL高可用集羣

  • 網絡結構圖以下:

註釋:節點1和節點2上運行着HA軟件和mysql服務,數據目錄在NFS服務器端/mydata目錄下,經過HA軟件的實時監控能夠完成節點故障時資源的自動轉移,對於客戶端來講VIP表徵着mysql服務,並持久可用。

必備條件

  • 節點名稱必須跟uname -n命令的執行結果一致

  • 節點名稱和IP對應關係保存在/etc/hosts文件,不依賴於DNS

  • 各節點ssh互信通訊

  • 集羣各節點時間須要同步

######修改各節點主機名 
hostname node1.soulboy.com 
vim /etc/sysconfig/network 
HOSTNAME=node1.soulboy.com 
######修改hosts文件 
vim /etc/hosts 
192.168.1.131   node1.soulboy.com       node1 
192.168.1.132   node2.soulboy.com       node2 
######各節點ssh互信,節點二再也不演示 
ssh-keygen -t rsa -f ~/.ssh/id_rsa -P '' 
ssh-copy-id -i .ssh/id_rsa.pub root@192.168.1.132 
######各節點時間同步,須要時間服務器配合crontab 
* */5 * * *  ntpdate 192.168.1.100 

部署HA軟件

######各節點安裝軟件包 
yum --nogpgcheck localinstall heartbeat-2.1.4-9.el5.i386.rpm heartbeat-gui-2.1.4-9.el5.i386.rpm heartbeat-pils-2.1.4-10.el5.i386.rpm heartbeat-stonith-2.1.4-10.el5.i386.rpm libnet-1.1.4-3.el5.i386.rpm perl-MailTools-1.77-1.el5.noarch.rpm 
######各節點提供配置文件 
cp /usr/share/doc/heartbeat-2.1.4/{authkeys,ha.cf,haresources} /etc/ha.d/ 
chmod 600 /etc/ha.d/authkeys 
######修改密鑰文件authkeys 
dd if=/dev/random count=1 bs=512 | md5sum   生成隨機數 
vim /etc/ha.d/authkeys 
auth 1 
1 md5 b20f227f85d8f51f76f9feec992061ed 
######各節點修改核心配置文件 
vim /etc/ha.d/ha.cf 
mcast eth0 225.0.100.20 694 1 0   組播 
node    node1.soulboy.com 
node    node2.soulboy.com 
crm     respawn                 crm今後代替haresources,並實現CRM功能 
######複製node1祕鑰文件到node2 
scp /etc/ha.d/authkeys node2:/etc/ha.d/ -P  複製到node2 
######各節點啓動服務 
service hearbeat start 

部署NFS服務器

partprobe /dev/sdb 
pvcreate /dev/sdb1 
vgcreate myvg /dev/sdb1 
lvcreate -L 6G -n mydata myvg 
mke2fs -j /dev/myvg/mydata 
groupadd -g 3306 mysql     添加mysql用戶組 
useradd -u 3306 -g mysql -s /sbin/nologin -M mysql 
mkdir /mydata              建立共享目錄 
vim /etc/fstab             開機自動掛載 
/dev/myvg/mydata    /mydata    ext3    defaults    0  0 
mount -a                   掛載 
mkdir /mydata/data         建立數據目錄 
chown -R mysql.mysql /mydata/data/     修改目錄爲mysql用戶 
vim /etc/exports 
/mydata         192.168.1.0/24(no_root_squash,rw)   修改共享權限 
exportfs -arv 

部署mysql服務

######各節點中止heartbeat服務 
service heartbeat stop 
######建立mysql用戶和組 
groupadd -g 3306 mysql 
useradd -g 3306 -u 3306 -s /sbin/nologin -M mysql 
mkdir /mydata 
mount 192.168.1.230:/mydata /mydata    掛載目錄 
usermod -s /bin/bash mysql             測試是否可寫 
su - mysql 
touch /mydata/data/a 
rm /mydata/data/a 
logout 
usermod -s /sbin/nologin mysql 
umount /mydata                         測試正常 
#####在節點一上安裝mysql 
tar xf mysql-5.5.28-linux2.6-i686.tar.gz -C /usr/local/ 
ln -sv /usr/local/mysql-5.5.28-linux2.6-i686 /usr/local/mysql 
chown -R root:mysql /usr/local/mysql/* 
mount 192.168.1.230:/mydata /mydata     掛載NFS共享目錄到本地mydata目錄 
#####初始化mysql 
/usr/local/mysql                        切換目錄 
scripts/mysql_install_db --user=mysql --datadir=/mydata/data/  初始化 
#####修改相關配置文件 
cp /usr/local/mysql/support-files/my-large.cnf  /etc/my.cnf 
vim /etc/my.cnf 
datadir = /mydata/data 
innodb_file_per_table = 1               表空間獨立 
cp /usr/local/mysql/support-files/mysql.server  /etc/init.d/mysqld 
chkconfig --add mysqld 
chkconfig mysqld off                    禁止開機自啓動 
service mysqld start                    啓動服務 
/usr/local/mysql/bin/mysql              客戶端工具 
######爲Mysql受權遠程用戶 
/usr/local/mysql/bin/mysql 
mysql> GRANT ALL ON *.* to 'root'@'%' IDENTIFIED BY 'redhat'; 
mysql> FLUSH PRIVILEGES; 
mysql> create database testdb; 
mysql> use testdb 
mysql> create table student (id int unsigned not null auto_increment primary key, name char(20)); 
######中止服務卸載目錄 
service mysqld stop                     關閉mysql服務 
umount /mydata                          卸載mydata目錄 
######同步配置文件和啓動腳本到node2 
cp /etc/my.cnf  node2:/etc/   
scp /etc/init.d/mysqld  node2:/etc/init.d/ 
######爲node2建立/mydata目錄 
mkdir /mydata 

使用crm定義資源

######配置GUI登錄帳戶密碼 
passwd hacluster 
######打開GUI登錄窗口(請確保鏈接DC) 
hb_gui & 

一、登錄crm

二、定義資源組

三、定義VIP

四、定義NFS存儲

五、定義mysql服務

六、啓動資源組

七、查看資源已運行在node2上

八、使用客戶端登錄測試

模擬故障測試HA功能是否生效

一、資源組此時運行在node2節點,node1並沒有任何資源,此時讓node2變爲standy。

二、crm顯示全部資源已成功轉移至node1

三、切換至node1端驗證真實性

四、mysql客戶端第二次查詢

crm的補充(關於資源約束)

 

location: 資源對節點的傾向程度,同一節點全部資源(進程)之和。

caloation:資源間互斥性,兩個資源傾向於在一塊兒仍是分開。

order: 資源採起動做的次序。

 

NFS做爲共享存儲所存在的問題

  • 單點故障的問題顯而易見

 

 

Network File System

#####################################

Local Procedure Call爲開發帶來的不便

Remote Procedure Call的引入

Network File System

NFS在LAMP架構下的應用

#####################################

Local Procedure Call爲開發帶來的不便

 本地兩個進程或進程和內核之間調用函數完成某種功能的過程叫作本地過程調用。

Remote Procedure Call的引入

 遠程過程調用,不一樣主機上的兩個進程直接依賴於二進制協議通訊,它是編程技術及協議,簡化分佈式應用程序的開發,它一種開發框架,在這種框架下,程序員開發程序無需再考慮網絡報文的封裝,有RPC底層機制負責完成,RPC自己只是一種協議,它的實現是Portmap。

Network File System

1、NFS簡介

 和ext三、ext2等同樣,也位於內核空間做爲內核模塊工做的,它基於RPC基礎實現,不一樣主機上的兩個進程直接依賴於二進制協議通訊,它可讓遠程文件系統掛載到本地一個目錄。nfs-utils是NFS的安裝包,包含了三個主進程:

nfsd   (文件傳輸主進程)      固定端口爲TCP/UDP 2049端口

mountd  (接收客戶端掛載請求)    動態向portmap註冊端口

quotad  (磁盤配額進程)       動態向portmap註冊端口

 /etc/exports  主配置文件

注意:因爲nfs是基於RCP協議實現,因此請確保portmap服務開啓

2、NFS工做機制

3、NFS使用方法

文件系統導出屬性

ro                 只讀 
rw                 讀寫 
sync               同步 
async              異步 
root_squach        將root用戶映射爲來賓帳號 
no_root_squach     很是不安全,客戶端管理員此時等於服務器端管理員權限。 
all_squash         把用戶所有映射爲來賓用戶,最安全 
anonuid,anongid    指定映射的來賓帳號UID和GID 

 簡單的經過映射用戶ID來標識文件屬主和屬組,客戶端只要有用戶ID號跟服務器端同樣,就能夠具備相應權限,至關不安全,所以一般能夠把一個目錄或文件鎖定爲一個服務器端能控制的用戶,而全部用戶的權限等於此用戶的權限,例如:

NFS服務端 
useradd-u 510 nfstest 
touch/shared/nfstest 
chownnfstest.nfstest /shared/nfstest 
vim /etc/exports                          修改主配置文件 
/shared192.168.1.0/24(rw,all_squash,anonuid=510,anongid=510) 
exportfs -ra 

客戶端從新掛載並看結果

showmount命令

mount-t nfs 192.168.1.30:/shared/tmp/nfs    掛載遠程NFS共享目錄至本地 
showmount -a 192.168.1.30    顯示NFS服務器全部文件系統掛載狀況 
showmount -e 192.168.1.30    顯示NFS服務器已被掛在的文件系統和客戶端列表 
showmount -d 192.168.1.30    顯示NFS服務器已被掛在的文件系統列表 

exportfs命令(無需重啓服務讓配置文件生效)

-a 
-r    從新導出 
-u    取消導出 
-v    顯示過程 
-arv  從新導出配置文件內容 
-auv  (取消全部導出文件系統) 

開機自動掛載

vim /etc/fstab 
192.168.1.30:/shared    /tmp/nfs    nfs    defaults,_rnetdev    0    0 

讓mountd和quotad等進程監聽在固定端口

vim   /etc/sysconfig/nfs 
MOUNTD_PORT=892 
RQUOTAD_PORT=875 
LOCKD_TCPPORT=32803 
LOCKD_UDPPORT=32769 

NFS在LAMP架構下的應用

1、NFS服務器端

部署LAMP平臺

##########################安裝LAMP########################## 
yum installhttpd httpd-develhttpd                安裝httpd 
yum installmysql mysql-server mysql-devel mysql  安裝mysql 
yum installphp53 php53-mbstring php53-mysqlphp   安裝php 
##########################httpd############################# 
#AddDefaultCharset UTF-8                          修改字符集 
unzip Discuz_X2.5_SC_GBK.zip                      加壓論壇 
mvupload/* /var/www/html/                        發佈論壇 
service httpd start                               啓動服務 
##########################mysql############################# 
mysqladmin -uroot -p password 'redhat'            爲數據庫添加密碼 
grant all privileges on *.* to root@'%'identified by 'redhat'; 
                                                  遠程受權root 
service mysqld start                               啓動服務 
##########################修改權限安裝論壇################## 
cd/var/www/html 
chmod777 config/ data/ data/cache/data/avatar/data/plugindata/data/download/data/addonmd5/data/template/data/threadcache/data/attachment/data/attachment/album/data/attachment/forum/data/attachment/group/data/log/uc_client/data/cache/uc_server/data/uc_server/data/cache/uc_server/data/avatar/uc_server/data/backup/uc_server/data/logs/uc_server/data/tmp/uc_server/data/view/ 

啓動NFS服務

service portmap status                            檢測portmap服務 
vim /etc/exports                                  修改主配置文件 
/var/www/html   192.168.1.240(rw,no_root_squash) 
exportfs –ra                                      從新導出目 
service nfs start                                 啓動nfs服務 

2、NFS客戶端

###########################安裝LAP平臺########################## 
yum install httpd httpd-devel                            安裝httpd 
yum install php53 php53-mbstring php53-mysql             安裝php 
service httpd start                                      啓動服務 
##########################NFS客戶端############################# 
mount -t nfs 192.168.1.230:/var/www/html /var/www/html   掛載目錄 
#AddDefaultCharset UTF-8                                 修改字符集 
service httpd start                                      啓動服務 

3、測試

客戶端使用瀏覽器訪問192.168.1.240(NFS客戶端)

客戶端使用瀏覽器訪問192.168.1.230(NFS服務端)

 

 

File Transfer Protocol

#####################################

FTP簡介

vsftpd基本使用

明文傳輸帶來的安全隱患

安全通訊方式

vsftpd + PAM + mysql實現虛擬用戶

#####################################

FTP簡介

   文件傳輸服務位於應用層,監聽21/tcp端口,數據傳輸模式爲自適應,沒有交叉編碼能力Mine,遵循原文件自己格式,基於TCP協議實現,它有兩個鏈接,命令鏈接和數據鏈接,它的工做模式有兩種,主動模式和被動模式。

主動模式

被動模式

 

vsftpd基本使用

特性

   文件服務權限等於文件系統權限和文件共享權限的交集

   支持虛擬用戶

       家目錄在/var/ftp目錄下,/目錄被鎖定爲其家目錄

   支持匿名用戶

   支持系統用戶

       家目錄目錄在/home/username目錄下,/目錄沒有鎖定,能夠切換 lcd

   支持基於PAM實現用戶認證

安裝

yum install vsftpd 
service vsftpd start 
chkconfig vsftpd on 
/etc/vsftpd                        配置文件 
/etc/init.d/vsftpd                 服務腳本 
/usr/sbin/vsftpd                   守護進程 
/etc/pam.d/*                       配置文件 
/lib/security                      認證模塊 
/var/ftp                           文件目錄,不容許除root用戶以外的其餘用戶具備寫權限 

經常使用選項

anonymous_enable=YES            啓用匿名用戶anonymous 
local_enable=YES                啓用系統用戶 
write_enable=YES                開啓寫入 
anon_upload_enable=YES          開啓上傳 
anon_mkdir_write_enable=YES     開啓目錄建立 
anon_other_write_enable=YES     開啓其餘寫權限,例如delete等…… 
dirmessage_enable=YES           開啓目錄進入歡迎提示 
    vim /var/ftp/upload/.message      當用戶切換到此目錄時候會顯示 
xferlog_enable=YES             開啓傳輸日誌 
xferlog_file=/var/log/vsftpd.log      定義傳輸日誌存儲位置和名稱 
#chown_uploads=YES              是否開啓修改用戶上傳以後修改用戶屬主 
#chown_username=whoever         修改成誰? 
#idle_session_timeout=600       命令鏈接超時時間 
#data_connection_timeout=120    數據鏈接超時時間 
#ascii_upload_enable=YES        文本模式上傳 
#ascii_download_enable=YES      文本模式下載 
chroot_list_enable=YES          禁錮用戶至本身家目錄 
chroot_list_file=/etc/vsftpd/chroot_list經過用戶列表禁錮那些用戶 
#chroot_local_user=YES          禁錮全部用戶至本身家目錄,須要註釋上面兩項 
listen=YES                      vsftpd是否工做爲一個獨立守護進程類型; 
        獨立守護進程適合於 (訪問量大,在線時間長的服務) 
        瞬時守護進程 (訪問量比較小,在線時間不長的服務) 
pam_service_name=vsftpd         基於pam的認證 
  /etc/vsftpd/ftpusers (文件中用戶不能登陸,清空/etc/vsftpd/user_list後才真正由此文件控制) 
userlist_enable=YES            文件的用戶不容許登陸(/etc/vsftpd/user_list) 
userlist_deny=NO               僅容許文件中的用戶能夠登陸(/etc/vsftpd/user_list) 
tcp_wrappers=YES 
max_clients                    最多容許幾個IP訪問 
max_per_ip                     一個IP最多幾個請求 

舉例:讓匿名用戶能夠上傳文件

anon_upload_enable=YES    開啓 
mkdir /var/ftp/upload 
setfacl -m u:ftp:rwx /var/ftp/upload/ 
getfacl /var/ftp/upload/ 

 

明文傳輸帶來的安全隱患

使用客戶端鏈接FTP服務器

在服務器端使用tcpdum命令抓包

tcpdump -i eth0 -nn -X -vv tcp port 21 and ip host 192.168.1.30

 

安全通訊方式

ftps:ftp+ssl/tls

sftp:OpenSSH,SubSystem,sftp(SSH)

建立私有CA

cd /etc/pki/CA 
mkdir certs newcerts crl 
echo 01 > serial 
(umask 077;openssl genrsa -out private/cakey.pem 2048)建立私鑰 
openssl req -new -x509 -key private/cakey.pem -out cacert.pem -days 3650生成自簽證書 

生成證書頒發請求並簽署

mkdir  /etc/vsftpd/ssl 
cd /etc/vsftpd/ssl 
(umask 077; openssl genrsa -out vsftpd.key 2048;)  生成私鑰 
openssl req -new -key vsftpd.key -out vsftpd.csr   生成證書頒發請求 
openssl ca -in vsftpd.csr -out vsftpd.crt          簽署證書 

修改配置文件etc/vsftpd/vsftpd.conf支持ssl、tsl功能

# ssl or tls 
ssl_enable=YES 
ssl_sslv3=YES 
ssl_tlsv1=YES 
allow_anon_ssl=NO 
force_local_data_ssl=YES 
force_local_logins_ssl=YES 
rsa_cert_file=/etc/vsftpd/ssl/vsftpd.crt 
rsa_private_key_file=/etc/vsftpd/ssl/vsftpd.key 

客戶端軟件登錄

本文中使用FlashFXP做爲FTP客戶端

點擊鏈接

成功鏈接

在服務器端抓包發現是明文

tcpdump -i eth0 -nn -X -vv tcp port 21 and ip host 192.168.1.30

 

vsftpd + PAM + mysql實現虛擬用戶

1、安裝所須要程序

事先安裝好開發環境和mysql數據庫;

yum -y install mysql-server mysql-devel 
yum -y groupinstall "Development Tools" "Development Libraries" 

安裝pam_mysql-0.7RC1

tar zxvf  pam_mysql-0.7RC1.tar.gz 
cd  pam_mysql-0.7RC1 
./configure --with-mysql=/usr --with-opensslrpm包的mysql 
make 
make install 

安裝vsftpd

yum -y install vsftpd 

2、建立虛擬用戶帳號

準備數據庫及相關表,首先請確保mysql服務已經正常啓動。然後,按須要創建存儲虛擬用戶的數據庫便可,這裏將其建立爲vsftpd數據庫。

mysql> create database vsftpd; 
mysql> grant select on vsftpd.* to vsftpd@localhost identified by 'vsftpd'; 
mysql> grant select on vsftpd.* to vsftpd@127.0.0.1 identified by 'vsftpd'; 
mysql> flush privileges; 
mysql> use vsftpd; 
mysql> create table users ( 
    -> id int AUTO_INCREMENT NOT NULL, 
    -> name char(20) binary NOT NULL, 
    -> password char(48) binary NOT NULL, 
    -> primary key(id) 
    -> ); 

添加測試的虛擬,用戶pam_mysql的password()函數與MySQL的password()函數可能會有所不一樣。

insert into users (name,password) value ('bob','123'),('tom','321'),('lucy','333'); 

3、配置vsftpd

創建pam認證所需文件vi /etc/pam.d/vsftpd.mysql

auth required /usr/lib/security/pam_mysql.so user=vsftpd passwd=vsftpd host=localhost db=vsftpd table=users usercolumn=name passwdcolumn=password crypt=0 
account required /usr/lib/security/pam_mysql.so user=vsftpd passwd=vsftpd host=localhost db=vsftpd table=users usercolumn=name passwdcolumn=password crypt=0 

修改vsftpd的配置文件,使其適應mysql認證,創建虛擬用戶映射的系統用戶及對應的目錄

useradd -s /sbin/nologin -d /var/ftproot vuser 
chmod go+rx /var/ftproot 

請確保/etc/vsftpd.conf中已經啓用瞭如下選項

anonymous_enable=YES 
local_enable=YES 
write_enable=YES 
anon_upload_enable=YES 
anon_mkdir_write_enable=NO 
chroot_local_user=YES 

修改成NO,驗證不經過SSL

force_local_data_ssl=NO 
force_local_logins_ssl=NO 

然後添加如下選項

guest_enable=YES        啓用來賓用戶 
guest_username=vuser    來賓用戶爲 

並確保pam_service_name選項的值以下所示

pam_service_name=vsftpd.mysql 

4、啓動vsftpd服務並測試

啓動服務

service vsftpd start 
chkconfig vsftpd on            自動啓動 

查看端口開啓狀況

netstat -tnlp |grep :21 

查看數據庫

FTP客戶端工具登陸驗證pam是否生效

5、配置虛擬用戶具備不一樣的訪問權限

爲虛擬用戶使用配置文件目錄

vim /etc/vsftpd/vsftpd.conf 
user_config_dir=/etc/vsftpd/vusers_dir 

建立所須要目錄,併爲虛擬用戶提供配置文件

mkdir /etc/vsftpd/vusers_dir/ 
touch /etc/vsftpd/vusers_dir/bob /etc/vsftpd/vusers_dir/tom 

配置虛擬用戶的訪問權限;全部虛擬用戶的家目錄爲/var/ftproot;全部的虛擬用戶映射到vuser中,而vuser屬於匿名用戶,所以虛擬用戶的訪問權限是經過匿名用戶指令生效的。

bob能夠上傳、建立、刪除

vim /etc/vsftpd/vusers_dir/bob 
anon_upload_enable=YES      (配置文件中已經開啓,這裏不寫也能夠) 
anon_mkdir_write_enable=YES 
anon_other_write_enable=YES 

tom不能夠上傳

vim /etc/vsftpd/vusers_dir/tom 
anon_upload_enable=NO 

lucy能夠上傳

主配置文件中匿名上傳已啓用anon_upload_enable=YES,因此不須要作任何修改 

bob測試

tom測試

lucy測試

 

rsync+inotify搭建實時同步系統

rsync簡介

   rsync是Linux和UNIX系統下的文件同步和數據傳輸工具,它採用了「rsync」算法使一個客戶機和遠程文件服務器之間的文件同步,它不一樣於cp和wget命令完整複製的侷限性,它支持增量備份,所以文件傳輸效率高,於是同步時間很短,具體特性以下:

   一、能夠鏡像保存整個目錄樹和文件系統

   二、能夠增量同步數據。文件傳輸效率高。

   三、能夠保持原有文件的權限、時間等屬性。

   四、加密傳輸數據,保證數據的安全性。

   五、可使用rcp、ssh等方式來傳輸文件。

 

搭建遠程容災備份系統

   Web服務器爲了保證數據安全,天天凌晨2點將數據備份到遠程容災服務器上,因爲數據量比較大,每一年只能進行增量備份,僅備份當天新增數據,系統環境以下:

Web端配置

主配置文件/etc/rsyncd.conf

密碼文件chmod 600 /etc/server.pass 

啓動rsync守護進程

遠程容災端配置

密碼文件chmod 600 /etc/server.pass

添加計劃任務crontab -e

分析不足

此時一個遠程容災系統已經搭建完成,但這並不是是一個完整意義上的容災方案,因爲rsync須要經過觸發才能將服務器端數據同步,所以兩次觸發同步的時間間隔內,服務器和客戶端的數據可能不一致,若是在這個時間間隔內,網站系統出現問題,數據必然丟失,Linux 2.6.13之後的內核提供了inotify文件系統監控機制,用過rsync與inotify的組合,徹底能夠實現rsync服務器端和客戶端的實時數據同步。

 

rsync+inotify實現數據的實時備份

   inotify是一種強大的、細粒度的、異步的文件系統時間監控機制,Linux內核從2.6.13版本起,加入了對inotify的支持。經過inotify能夠監控文件系統中添加、刪除、修改、移動等各類細微事件,利用這個內核接口,第三方軟件能夠監控文件系統下文件的各類變化狀況,inotify-tools軟件正是基於這種需求實現的一個第三方軟件。

   內容分發服務器實時同步數據對2個Web服務器上,inotify是用來監控文件系統變化的工具,所以必須安裝在內容發佈節點上,內容發佈節點(Server)充當了rsync客戶端的角色,2個Web節點充當了rsync服務器端的角色,整個數據同步過程就是一個從客戶端向服務器端發送數據的過程,與前面案例中的邏輯結構恰好相反,系統環境以下:

Web1端配置

主配置文件/etc/rsyncd.conf

密碼文件chmod 600 /etc/server.pass

啓動rsync守護進程並添加開機自動啓動

Web2端配置

主配置文件/etc/rsyncd.conf

密碼文件chmod 600 /etc/server.pass

啓動rsync守護進程並添加開機自動啓動

Server端配置

安裝inotify-tools

密碼文件chmod 600 /etc/server.pass

監控目錄變化並同步Web節點腳本

指定權限並放入後臺運行

爲此腳本添加開機自動啓動

測試結果

Server端(rsync客戶端)建立測試文件,如圖:

Web1端查看,如圖:

Web2端查看,如圖:

 

 

HTML5本地存儲之Database Storage篇

在上一篇《HTML5本地存儲之Web Storage篇》中, 簡單介紹瞭如何利用localStorage實現本地存儲;實際上,除了sessionStorage和localStorage外,HTML5還支持通 過本地數據庫進行本地數據存儲,HTML5採用的是"SQLite"這種文件型數據庫,該數據庫多集中在嵌入式設備上,熟悉IOS/Android開發的 同窗,應該對SQLite數據庫比較熟悉。

HTML5中的數據庫操做比較簡單,主要有以下兩個函數:

一、經過openDatabase方法建立一個訪問數據庫的對象

[javascript] view plaincopy

  1. var db = openDatabase(databasename,version,description,size)  
該方法有四個參數,做用分別爲:
  • databasename:數據庫名;
  • version:數據庫版本號,可不填;
  • description:數據庫描述;
  • size:給數據庫分配的空間大小;

二、使用第一步建立的數據庫訪問對象(如db)執行transaction方法,用來執行事務處理;

[javascript] view plaincopy

  1. db.transaction(function(tx)){  
  2.     //執行訪問數據庫的語句  
  3. });  
transaction方法使用一個回調函數做爲參數,在這個函數中,執行訪問數據庫的具體操做;

三、經過executeSql方法執行查詢

[javascript] view plaincopy

  1. tx.executeSql(sqlQuery,[value1,value2..],dataHandler,errorHandler)  
executeSql方法有四個參數,做用分別以下:
  • sqlQuery:須要具體執行的sql語句,能夠是create、select、update、delete;
  • [value1,value2..]:sql語句中全部使用到的參數的數組,在executeSql方法中,將sql語句中所要使用的參數先用「?」代替,而後依次將這些參數組成數組放在第二個參數中;
  • dataHandler:執行成功是調用的回調函數,經過該函數能夠得到查詢結果集;
  • errorHandler:執行失敗時調用的回調函數;

本文經過HTML5的數據庫支持,從新實現一遍上篇文章中的通信錄管理,待實現功能以下:

  • 可建立聯繫人並保存到數據庫中,聯繫人字段包括:姓名、手機號碼、公司、建立時間;
  • 列出當前已保存的全部聯繫人信息;
  • 可刪除特定聯繫人信息;

一樣,先準備一個HTML頁面,以下:

[html] view plaincopy

  1. <!DOCTYPE HTML>  
  2. <html>  
  3. <head>  
  4.     <meta charset="utf-8"/>  
  5.     <title>HTML5本地存儲之本地數據庫篇</title>  
  6.     <style>  
  7.         .addDiv{  
  8.             border: 2px dashed #ccc;  
  9.             width:400px;  
  10.             text-align:center;  
  11.         }  
  12.     </style>  
  13. </head>  
  14. <body onload="loadAll()">  
  15.     <div class="addDiv">     
  16.         <label for="user_name">姓名:</label>  
  17.         <input type="text" id="user_name" name="user_name" class="text"/>  
  18.         <br/>  
  19.         <label for="mobilephone">手機:</label>  
  20.         <input type="text" id="mobilephone" name="mobilephone"/>  
  21.         <br/>  
  22.         <label for="mobilephone">公司:</label>  
  23.         <input type="text" id="company" name="company"/>  
  24.         <br/>  
  25.         <input type="button" onclick="save()" value="新增記錄"/>  
  26.     </div>  
  27.     <br/>  
  28.     <div id="list">  
  29.     </div>  
  30. </body>  
  31. </html>  

界面展示以下:

 
要實現建立新聯繫人並存入數據庫功能,須要以下簡單的JS代碼:

[javascript] view plaincopy

  1. //打開數據庫  
  2. var db = openDatabase('contactdb','','local database demo',204800);  
  3.   
  4. //保存數據  
  5. function save(){  
  6.     var user_name = document.getElementById("user_name").value;  
  7.     var mobilephone = document.getElementById("mobilephone").value;  
  8.     var company = document.getElementById("company").value;  
  9.     //建立時間  
  10.     var time = new Date().getTime();  
  11.     db.transaction(function(tx){  
  12.         tx.executeSql('insert into contact values(?,?,?,?)',[user_name,mobilephone,company,time],onSuccess,onError);  
  13.     });  
  14. }  
  15.  //sql語句執行成功後執行的回調函數  
  16. function onSuccess(tx,rs){  
  17.     alert("操做成功");  
  18.     loadAll();  
  19. }  
  20. //sql語句執行失敗後執行的回調函數  
  21. function onError(tx,error){  
  22.     alert("操做失敗,失敗信息:"+ error.message);  
  23. }  
要展示當前全部已保存的聯繫人列表,可經過以下JS代碼實現:

[javascript] view plaincopy

  1. //將全部存儲在sqlLite數據庫中的聯繫人所有取出來  
  2. function loadAll(){  
  3.     var list = document.getElementById("list");  
  4.     db.transaction(function(tx){  
  5.         //若是數據表不存在,則建立數據表  
  6.         tx.executeSql('create table if not exists contact(name text,phone text,company text,createtime INTEGER)',[]);  
  7.         //查詢全部聯繫人記錄  
  8.         tx.executeSql('select * from contact',[],function(tx,rs){  
  9.            if(rs.rows.length>0){  
  10.                 var result = "<table>";  
  11.                 result += "<tr><th> 序號</th><th>姓名</th><th>手機</th><th>公 司</th><th>添加時間</th><th>操做</th></tr>";  
  12.                 for(var i=0;i<rs.rows.length;i++){  
  13.                     var row = rs.rows.item(i);  
  14.                     //轉換時間,並格式化輸出  
  15.                     var time = new Date();  
  16.                     time.setTime(row.createtime);  
  17.                     var timeStr = time.format("yyyy-MM-dd hh:mm:ss");  
  18.                     //拼裝一個表格的行節點  
  19.                     result += "<tr><td>"+(i+1)+"</td><td>"+row.name+"</td><td>"+row.phone+"</td><td>"+row.company+"</td><td>"+timeStr+"</td><td><input type='button' value='刪除' onclick='del("+row.phone+")'/></td></tr>";  
  20.                 }  
  21.                 list.innerHTML = result;  
  22.            }else{  
  23.                 list.innerHTML = "目前數據爲空,趕忙開始加入聯繫人吧";  
  24.            }   
  25.         });  
  26.     });  
  27. }  
其中,涉及到格式化時間的format函數,可參考以下JS實現:

[javascript] view plaincopy

  1. Date.prototype.format = function(format)  
  2. {  
  3.     var o = {  
  4.     "M+" : this.getMonth()+1, //month  
  5.     "d+" : this.getDate(),    //day  
  6.     "h+" : this.getHours(),   //hour  
  7.     "m+" : this.getMinutes(), //minute  
  8.     "s+" : this.getSeconds(), //second  
  9.     "q+" : Math.floor((this.getMonth()+3)/3),  //quarter  
  10.     "S" : this.getMilliseconds() //millisecond  
  11.     }  
  12.     if(/(y+)/.test(format)) format=format.replace(RegExp.$1,  
  13.     (this.getFullYear()+"").substr(4 - RegExp.$1.length));  
  14.     for(var k in o)if(new RegExp("("+ k +")").test(format))  
  15.     format = format.replace(RegExp.$1,  
  16.     RegExp.$1.length==1 ? o[k] :  
  17.     ("00"+ o[k]).substr((""+ o[k]).length));  
  18.     return format;  
  19. }  
最後,界面實現效果以下:


要實現具體某個聯繫人,需執行以下JS代碼:

[javascript] view plaincopy

  1. //刪除聯繫人信息  
  2. function del(phone){  
  3.      db.transaction(function(tx){  
  4.         //注意這裏須要顯示的將傳入的參數phone轉變爲字符串類型  
  5.         tx.executeSql('delete from contact where phone=?',[String(phone)],onSuccess,onError);  
  6.     });  
  7. }  

 

如上截圖中的表格樣式,可參考以下CSS代碼:

[css] view plaincopy

  1. th {  
  2.     font: bold 11px "Trebuchet MS", Verdana, Arial, Helvetica, sans-serif;  
  3.     color: #4f6b72;  
  4.     border-right: 1px solid #C1DAD7;  
  5.     border-bottom: 1px solid #C1DAD7;  
  6.     border-top: 1px solid #C1DAD7;  
  7.     letter-spacing: 2px;  
  8.     text-transform: uppercase;  
  9.     text-align: left;  
  10.     padding: 6px 6px 6px 12px;  
  11. }  
  12. td {  
  13.     border-right: 1px solid #C9DAD7;  
  14.     border-bottom: 1px solid #C9DAD7;  
  15.     background: #fff;  
  16.     padding: 6px 6px 6px 12px;  
  17.     color: #4f6b72;  
  18. }  
 
 
 
 
Anna

How to import merries diapers from Japan to China?

How to import merries diapers from Japan to China?

Seahog logistics firm can help you!

Chinese tax

Customs clearance

Customs declaration

Seahog Logistics is an international integrated logistics specialist business offering worldwide air freight and sea freight services to clients throughout the world. The company, which is located in Shanghai, was set-up in 1997 and has many years experience in the trade, with a global network of contacts and appointed agents.

 

Agent: Anna Leung   

Mobile: +86 15218771070

Tel: +86 769-89830090

Email: anna@seahog.cn 

anna0109@qq.com  

QQ:1975088296

Skype: AnnaLeung89

Company: Shanghai Seahog International Logistics Company

Address: Rm 404A, Building B, #1518 Minsheng Rd, Pudong New District,Shanghai City, China

Website: http://www.seahog-ay.com/  

 

 
 
 
 
磁選機安裝

第八屆中國西南國際煤礦及採礦技術裝備展覽會

第八屆中國西南國際煤礦及採礦技術裝備展覽會_展會信息_財富雲南_新浪七彩雲南_新浪網 $(function () { $("#txtKeyword").focus(function () { if ($(this).val() == "輸入你要搜索的關鍵字...") { $(this).val(""); } }); $("#txtKeyword").blur(function () { if ($(this).val() == "") { $(this).val("輸入你要搜索的關鍵...
 
 
 
 
wyw5257

Set模型,集裝箱改變世界

集裝箱改變世界,集裝箱改變了航運的經濟規律.並所以改變了全球的貿易流。若是沒有集裝箱.就不會有全球化,集裝箱成爲經濟全球化的幕後推手,主要有如下三個特性:

一、標準化,減小貨物中轉及理貨時間,提升貨物運輸效率,下降運輸成本,海上集裝箱船裝卸、中轉。(貨櫃車\火車\輪船)
二、規模化,按集裝箱規格來進行業務週轉,規模化做業運轉,下降運做成本,提升效率。( 30噸、20噸、10噸)
三、模塊化,外形方正,尺寸標準化,堆放、裝卸、運輸方便,功能單一化,無需再包裝,節約成本。

平常會有不少場景應用集裝箱模式來解決不少問題,能夠先看看咱們常遇到的問題:

一、業務很是多,每一個業務的服務器數量都很大,...

 
 
 
 
zjwsk

Hadoop分佈式文件系統和OpenStack對象存儲有何不一樣

引用:http://blog.csdn.net/starean/article/details/11158979

 

「HDFS (Hadoop分佈式文件系統)和OpenStack對象存儲(OpenStack Object Storage)彷佛都有着類似的目的:實現冗餘、快速、聯網的存儲。什麼樣的技術特性讓這兩種系統於是不同?這兩種存儲系統最終趨於融合是否大有意義?」

問題提出以後,很快有OpenStack的開發者進行了回覆。本文在此摘抄了前兩名回覆進行翻譯,以供各位參考。


排名第一的答案來自RackSpace的OpenStack Swift開發者Chuck Their:

雖然HDFS與Openstack對象存儲(Swift)之間有着一些類似之處,可是這兩種系統的整體設計卻大不同。

1. HDFS使用了中央系統來維護文件元數據(Namenode,名稱節點),而在Swift中,元數據呈分佈式,跨集羣複製。使用一種中央元數據系統對HDFS來講無異於單一故障點,於是擴展到規模很是大的環境顯得更困難。
2. Swift在設計時考慮到了多租戶架構,而HDFS沒有多租戶架構這個概念。
3. HDFS針對更龐大的文件做了優化(這是處理數據時一般會出現的狀況),Swift被設計成了能夠存儲任何大小的文件。
4. 在HDFS中,文件寫入一次,並且每次只能有一個文件寫入;而在Swift中,文件能夠寫入屢次;在併發操做環境下,以最近一次操做爲準。
5. HDFS用Java來編寫,而Swift用Python來編寫。

 

另外,HDFS被設計成了能夠存儲數量中等的大文件,以支持數據處理,而Swift被設計成了一種比較通用的存儲解決方案,可以可靠地存儲數量很是多的大小不一的文件。

排名第二的答案來自Joshua McKenty,他是美國宇航局Nebula雲計算項目的首席架構師,是OpenStack Nova軟件的早期開發者之一,目前是OpenStack項目監管委員會的成員,仍是Piston.cc這家基於OpenStack的公司的創始人。

Chuck剛纔詳細介紹了二者的技術差別,可是沒有討論二者可想而知的融合,OpenStack設計峯會上拋出了融合這個話題。簡而言之,HDFS被設計 成可使用Hadoop,跨存儲環境裏面的對象實現MapReduce處理。對於許多OpenStack公司(包括我本身的公司)來講,支持Swift裏 面的處理是路線圖上面的一個目標,不過不是每一個人都認爲MapReduce是解決之道。

咱們已討論過爲HDFS編寫包裝器,這將支持OpenStack內部存儲應用編程接口(API),而且讓用戶能夠針對該數據來執行Hadoop查詢。還有一個辦法就是在Swift裏面使用HDFS。可是這些方法彷佛沒有一個是理想的。

OpenStack社區方面也在開展研究開發方面的一些工做,認真研究其餘替代性的MapReduce框架(Riak和CouchDB等)。

最後,如今有別的一些存儲項目,目前「隸屬於」OpenStack社區(SheepDog和HC2)。充分利用數據局部性,而且讓對象存儲變得「更智能」,這是預計會取得進步的一個領域。

相關文章
相關標籤/搜索