生產環境下ftp的遷移並構建corosync+pacemaker的高可用

       說明:這是1個小項目就兩臺DELL的服務器,和一臺IP SAN存儲(DELL MD3200i)。原來是4臺小服務器,而且服務器太老了,經常有問題,這回相當於一次ftp的遷移,以前用的是proftp,這次換成了vsftp。數據量有2.5T。
拓撲很簡單:

wKioL1Ng4iaDS1xrAACJJEo5i_w225.jpg

系統:CENTOS 6.4(64bit)
高可用軟件:corosync+pacemaker
host:ftp1 192.168.1.190
          ftp2  192.168.1.191
stonith(ipmi):ftp1 192.168.1.180 

                               ftp2 192.168.1.181

       MD3200i這個存儲,配置很簡單和FC SAN的存儲配置沒啥太大的區別,實在不行就打金牌服務,DELL的售後會給發相關的文檔。我做了1個group,裏面有2個主機,共享2個lun。這2個lun可以同時被2臺服務器認到的,也就是說1臺服務器掛載一個LUN,如果其中一臺服務器壞了,另外一臺可以掛載2個LUN,當然這個過程是靠雙機軟件來實現的。以前做很多項目都用的是RHCS,這次選擇corosync+pacemaker

 

1.使用UDEV綁定iscsi  initiator

 

MD3200i,其實就是iscsi的target端,服務器就是iscsi的initiator,有人也許不用udev來綁定target提供的LUN。開始我也沒用,但做的過程時,確實還是出現了怪問題,所以後來果斷使用UDEV綁定別名。

[root@ftp1  ~]# iscsiadm -m discovery -t st -p 192.168.130.101:3260
[root@ftp1  ~]# iscsiadm -m node  -T iqn..... -p 192.168.130.101:3260 -l #iqn.....根據實際情況寫, 192.168.130.101 是存儲的控制卡ip。
[root@ftp1  ~]# scsi_id --whitelisted --replace-whitespace /dev/sdb
36f01faf000ec79db000004993e46b6a0
[root@ftp1  ~]# scsi_id --whitelisted --replace-whitespace /dev/sdc
36f01faf000ec77c2000003f95356cbab
[root@ftp1  ~]# vim /etc/udev/rules.d/99-ftp.rules     #這個文件是自己創建的
KERNEL=="sd*",SUBSYSTEM=="block",PROGRAM="/sbin/scsi_id --whitelisted --replace-whitespace /dev/$name",RESULT=="36f01faf000ec79db000004993e46b6a0",NAME="mydisk1"
KERNEL=="sd*",SUBSYSTEM=="block",PROGRAM="/sbin/scsi_id --whitelisted --replace-whitespace /dev/$name",RESULT=="36f01faf000ec77c2000003f95356cbab",NAME="mydisk2"
[root@ftp1  ~]#start_udev
這個還得配置多路徑的,但是服務器的網卡 不夠用了,就只配了一條,服務器和存儲是直連的沒有走交換機。
然後就去 /dev/下面驗證是否有mydisk1,mydisk2,有則說明成功。
ftp2也進行上面相關的操作。
然後進行集羣配置前的相關準備工作(最好裝完系統就進行的):
1).進行時間同步
2).確認主機名是否解析正確,/etc/hosts 以及uname -n
3).確認NetworkManager是否關閉,這個東西必須關閉。(很雞肋的東西)
 

2.安裝,配置corosync

 

[root@ftp1  ~]# yum install pacemaker corosync rpm-build -y
[root@ftp1  ~]#yum install python-lxml  cluster-glue-libs-devel pacemaker-libs-devel asciidoc  autoconf automake libtool redhat-rpm-config  -y
安裝crmsh,以前有編譯好的rpm包,所以可以使用
[root@ftp1  ~]#yum install --nogpgcheck localinstall crmsh-1.2.6-4.el6.x86_64.rpm
[root@ftp1  ~]# vim /etc/corosync/ corosync.conf
compatibility: whitetank
totem {
version: 2
secauth: on
threads: 0
interface {
ringnumber: 0
bindnetaddr: 192.168.1.0
mcastaddr: 226.94.1.1
mcastport: 5405
ttl: 1
}
}
logging {
fileline: off
to_stderr: no
to_logfile: yes
to_syslog: no
logfile: /var/log/cluster/corosync.log
debug: off
timestamp: on
logger_subsys {
subsys: AMF
debug: off
}
}
amf {
mode: disabled
}
service {
ver: 0
name: pacemaker
}
aisexec {
user: root
group: root
}
[root@ftp1 corosync]#corosync-keygen #生成key,使用/dev/random生成隨機數,這時可能需要敲擊鍵盤,安裝些包,卸載包來生成隨機數
[root@ftp1 corosync]# scp corosync.conf authkey ftp2:/etc/corosync/
[root@ftp1 ~]#/etc/init.d/corosync start
校驗是否正常工作:
查看corosync引擎是否正常啓動:
[root@ftp1 ~]# grep -e "Corosync Cluster Engine" -e "configuration file" /var/log/cluster/corosync.log
corosync [MAIN  ] Corosync Cluster Engine ('1.4.1'): started and ready to provide service.
corosync [MAIN  ] Successfully read main configuration file '/etc/corosync/corosync.conf'.
查看初始化成員節點通知是否正常發出:
[root@ftp1 ~]# grep  TOTEM  /var/log/cluster/corosync.log
corosync [TOTEM ] Initializing transport (UDP/IP Multicast).
corosync [TOTEM ] Initializing transmit/receive security: libtomcrypt SOBER128/SHA1HMAC (mode 0).
corosync [TOTEM ] The network interface [172.16.0.11] is now up.
corosync [TOTEM ] A processor joined or left the membership and a new membership was formed.
corosync [TOTEM ] A processor joined or left the membership and a new membership was formed.
檢查啓動過程中是否有錯誤產生。下面的錯誤信息表示packmaker不久之後將不再作爲corosync的插件運行,因此,建議使用cman作爲集羣基礎架構服務;此處可安全忽略。
[root@ftp1 ~]# grep ERROR: /var/log/cluster/corosync.log | grep -v unpack_resources
Apr 02 21:55:08 corosync [pcmk  ] ERROR: process_ais_conf: You have configured a cluster using the Pacemaker plugin for Corosync. The plugin is not supported in this environment and will be removed very soon.
Apr 02 21:55:08 corosync [pcmk  ] ERROR: process_ais_conf:  Please see Chapter 8 of 'Clusters from Scratch' (http://www.clusterlabs.org/doc) for details on using Pacemaker with CMAN
[root@ftp1 ~]# ps auxf
corosync
\_ /usr/libexec/pacemaker/cib    #集羣信息基庫
\_ /usr/libexec/pacemaker/stonithd  #stonish
\_ /usr/libexec/pacemaker/lrmd    #ra需要本地代理  本地資源管理器
\_ /usr/libexec/pacemaker/attrd   #管理集羣資源屬性
\_ /usr/libexec/pacemaker/pengine #策略引擎
\_ /usr/libexec/pacemaker/crmd  #資源管理

ftp2 做類似的操作,兩邊都OK了,就開始使用crmsh 來進行資源配置。

 

3.使用crm進行資源配置

 

[root@ftp1 corosync]# yum install ipmitool -y
[root@ftp1 corosync]# /etc/init.d/ipmi start
[root@ftp1 corosync]# chkconfig ipmi on
[root@ftp1 corosync]# ipmitool lan set 1 ipaddr 192.168.1.180
[root@ftp1 corosync]# ipmitool lan set 1 netmask 255.255.255.0
[root@ftp1 corosync]# ipmitool user list 1 # 顯示當前用戶列表
#[root@ftp1 corosync]#ipmitool lan set 1 password 123123 #這個我沒修改,使用的DELL的默認密碼 calvin
這個是ftp1做的設置,配置ftp2一樣換個ip,192.168.1.181
這個也可以在bios中設置ipmi的。
[root@ftp1 corosync]#yum install fence_agents #安裝fence agents,這裏面有我想要的fence_ipmilan,也就是stonith設備
[root@ftp1 corosync]# crm configure property  no-quorum-policy=ignore  #在雙節點集羣中,由於票數是偶數,當心跳出現問題(腦裂)時,兩個節點都將達不到法定票數,默認quorum策略會關閉集羣服務,爲了避免這種情況,配置quorum策略爲【ignore】。
[root@ftp1 corosync]# crm configure #配置stonith
crm(live)configure# primitive ipmi_1 stonith:fence_ipmilan params ipaddr=192.168.1.180 login=root passwd=calvin action=reboot pcmk_reboot_action=reboot pcmk_host_list="ftp1 ftp2" pcmk_monitor_action=status op monitor interval=30 timeout=60 op start timeout=120 op stop timeout=120
crm(live)configure# primitive ipmi_2 stonith:fence_ipmilan params ipaddr=192.168.1.181 login=root passwd=calvin action=reboot pcmk_reboot_action=reboot pcmk_host_list="ftp1 ftp2" pcmk_monitor_action=status op monitor interval=30 timeout=60 op start timeout=120 op stop timeout=120
crm(live)configure# location fence1 ipmi_1 100: ftp2
crm(live)configure# location fence2 ipmi_2 100: ftp1
crm(live)configure# location fence1_on_2 ipmi_1 -inf: ftp1
crm(live)configure# location fence2_on_1 ipmi_1 -inf: ftp2
crm(live)configure# verify
crm(live)configure# commit

配置2個LUN的lv

[root@ftp1 ~]# mkdir -pv /ftp/data1
[root@ftp1 ~]# mkdir -pv /ftp/data2 #ftp2 也創建
[root@ftp1 ~]# pvcreate /dev/mydisk1
[root@ftp1 ~]# pvcreate /dev/mydisk2
[root@ftp1 ~]# vgcreate vg_ftp1 /dev/mydisk1
[root@ftp1 ~]# vgcreate vg_ftp2 /dev/mydisk2
[root@ftp2 ~]# vgscan #在ftp2上檢查vg是否存在
[root@ftp1 ~]# lvcreate -L 1.7t -n lv_ftp1 vg_ftp1
[root@ftp1 ~]# lvcreate -L 1.7t -n lv_ftp2 vg_ftp2
[root@ftp1 ~]# mkfs.ext4 /dev/vg_ftp1/lv_ftp1
[root@ftp1 ~]# mkfs.ext4 /dev/vg_ftp2/lv_ftp2
[root@ftp2 ~]# lvscan #沒有的話就用lvchange -ay 來激活lv,然後掛載試試,來判斷是否操作成功。
#我沒對mydisk1進行分區操作,然後變成8e,再然後進行pvcreate,這是個規範的流程吧,我圖省事。

進行lv以及文件系統的資源操作:

[root@ftp1 ~]# crm configure
crm(live)configure# primitive ftp1_lvm ocf:heartbeat:LVM params volgrpname=vg_ftp1 op monitor interval=30 timeout=60 op start timeout=60 op stop timeout=60 on-fail=restart
crm(live)configure# primitive ftp2_lvm ocf:heartbeat:LVM params volgrpname=vg_ftp2 op monitor interval=30 timeout=60 op start timeout=60 op stop timeout=60 on-fail=restart
crm(live)configure# primitive ftp1_store ocf:heartbeat:Filesystem params device="/dev/vg_ftp1/lv_ftp1" directory=/ftp/data1 fstype=ext4 op monitor interval=30 timeout=60 op start timeout=60 op stop timeout=60 on-fail=restart
crm(live)configure# primitive ftp2_store ocf:heartbeat:Filesystem params device="/dev/vg_ftp2/lv_ftp2" directory=/ftp/data2 fstype=ext4 op monitor interval=30 timeout=60 op start timeout=60 op stop timeout=60 on-fail=restart
crm(live)configure# order lvm1_before_store inf: ftp1_lvm: start ftp1_store: start
crm(live)configure# order lvm2_before_store inf: ftp2_lvm: start ftp2_store: start

配置ip(這個ip 是公網IP),但是我就寫172.16網段來代替了。

crm(live)configure#  primitive ftp1_ip cof:heartbeat:IPaddr2 params ip=172.16.1.1 cidr_netmask=24 nic=em1 iflabel=1 op monitor interval=20 timeout=20 on-fail=restart
crm(live)configure#  primitive ftp2_ip cof:heartbeat:IPaddr2 params ip=172.16.1.2 cidr_netmask=24 nic=em1 iflabel=1 op monitor interval=20 timeout=20 on-fail=restart

配置group 把ip和lvm,文件系統綁到一個組裏

crm(live)configure# ftp1_server ftp1_lvm ftp1_store ftp1_ip
crm(live)configure# ftp2_server ftp2_lvm ftp2_store ftp2_ip
配置默認路由,由於使用的是vip,來提供服務,所以得需要配置vip相關的默認路由
crm(live)configure# primitive ftp_gw ocf:heartbeat:Route params destination=default gateway=172.16.1.254 op monitor interval=20 on-fail=restart
crm(live)configure# clone cl_ftp_gw ftp_gw meta clone-max=2 clone-node-max=1 notify=true

配置ip與路由的關係,ip要在路由之前啓動

crm(live)configure# order ip1_before_gw inf: ftp1_ip cl_ftp_gw
crm(live)configure# order ip2_before_gw inf: ftp2_ip cl_ftp_gw
#

配置ftp1_server 組在 ftp1 節點上,ftp2_server 在ftp2 節點上

crm(live)configure# location server1_on_ftp1 ftp1_server 200: ftp1
crm(live)configure# location server2_on_ftp2 ftp2_server 200: ftp2
crm(live)configure# verify
crm(live)configure# commit
最後commit,進行驗證:
crm status 來查看,正常的話會顯示ftp1_server 在ftp1 上 然後檢查ip,掛載點;同理檢查ftp2。
到這corosync+pacemaker的雙機配置完成,但是這只是做的ip+文件系統以及路由的雙機配置,而vsftpd沒有加入,因爲兩臺都啓動vsftpd服務,我在兩臺都分別啓動vsftpd,並做相關配置以及對vsftpd進行監控。我寫了個簡單的檢測vsftpd服務的腳本,如果發現vsftpd提供不了服務會進行自動重啓。

#!/bin/bash
LOG_FILE=/var/log/watch.log
vsftpd="/etc/init.d/vsftpd"
FTPPORTNUM=`netstat -lnt|grep 21 | grep -v grep|wc -l`
FTPPRONUM=`ps -ef | grep vsftpd | grep -v grep | wc -l`
[ ! -f $LOG_FILE ] && touch $LOG_FILE
if [[ "$FTPPORTNUM" < "1" || "$FTPPRONUM" < "1" ]];then
echo -e "vsftpd is not running\n" >> $LOG_FILE
echo "Preparing start vsftpd..." >> $LOG_FILE
sleep 1
while true
do
killall vsftpd > /dev/null 2>&1
[ $? -ne 0 ] &&  break;
sleep 1
done
$vsftpd restart > /dev/null 2>&1 &&  echo "vsftpd already restared" >> $LOG_FILE
fi

把腳本放到crontab中。

接着進行數據遷移,這個數據同步是個很糾結的過程,因爲線上的FTP還不能斷,所以是漫長的等待。我把corosync給關閉,vsftpd也關閉,只把lv進行掛載:

[root@ftp1 ~]# mount  /dev/vg_ftp1/lv_ftp1 /ftp/data1
[root@ftp2 ~]# mount /dev/vg_ftp2/lv_ftp2 /ftp/data2 #每臺機器掛一個LUN。

接着使用的rsync來同步,這個rsync 基本誰都會的,不是重點就略過了。

 

4.進行vsftd的配置

 

這個vsftp的配置,網上一搜一大把,我這個包含了虛擬用戶的配置

[root@ftp1 ~]# vim /etc/vsftpd/vsftpd.conf
anonymous_enable=YES
local_enable=YES
write_enable=YES
local_umask=022
ftp_username=ftp
anon_root=/ftp
anon_upload_enable=NO
anon_world_readable_only=NO
anon_mkdir_write_enable=NO
anon_other_write_enable=NO
max_per_ip=4
max_clients=2000
anon_max_rate=100000
guest_enable=YES
guest_username=user1
virtual_use_local_privs=YES
pam_service_name=vsftpd.vu
user_config_dir=/etc/vsftpd/vsftpd_user_conf
chroot_local_user=YES
chroot_list_enable=NO
pasv_enable=yes
cmds_denied=LIST
pasv_min_port=3000
pasv_max_port=3500
dirmessage_enable=YES
xferlog_enable=YES
xferlog_file=/var/log/vsftpd.log
xferlog_std_format=YES
listen=YES
userlist_enable=YES
tcp_wrappers=YES
#我們規定是不允許匿名用戶list的,也就是說只給用戶下載鏈接,不讓用戶隨便list下載的。

建立虛擬用戶:

[root@ftp1  ~]# vim /tmp/user.txt
ftp1
password1
ftp2
password2
[root@ftp1  ~]# db_load -T -t hash -f /tmp/user.txt /etc/vsftpd/vsftpd_login.db
配置pam文件
[root@ftp1  ~]# vim /etc/pam.d/vsftpd.vu
auth required /lib64/security/pam_userdb.so db=/etc/vsftpd/vsftpd_login
account required /lib64/security/pam_userdb.so db=/etc/vsftpd/vsftpd_login

建立虛擬用戶對應的真實用戶:

[root@ftp1 ~]# useradd user1 -s /sbin/nologin
[root@ftp1 ~]# chown -R user1 /ftp/data1
[root@ftp1 ~]# chown -R user1 /ftp/data2

配置虛擬用戶配置文件:

[root@ftp1 ~]# vim  /etc/vsftpd/vsftpd_user_conf/ftp1
write_enable=YES
anon_world_readable_only=YES
anon_upload_enable=YES
anon_mkdir_write_enable=YES
anon_other_write_enable=YES
local_umask=022
download_enable=YES
local_root=/ftp/data1
cmds_denied=none
[root@ftp1 ~]# vim  /etc/vsftpd/vsftpd_user_conf/ftp2
write_enable=YES
anon_world_readable_only=YES
anon_upload_enable=YES
anon_mkdir_write_enable=YES
anon_other_write_enable=YES
local_umask=022
download_enable=YES
local_root=/ftp/data1
cmds_denied=none
       ftp1和ftp2 用戶是作爲上傳文件使用的用戶,這個是有專門人來上傳資料,然後給會員提供下載(只給鏈接)。

        ftp2做同樣的操作,測試vsftpd服務,進行下載,上傳。沒有問題的話,啓動corosync,再做下測試,同時也可以做下拔網線,看另外一臺是否會被stonithd掉(重啓)。這樣兩臺ftp都同時使用,一臺有問題時,還可以進行切換,屬於雙活的狀態吧。實際中,我們的用戶和密碼不是這麼簡單的。

注意:selinux要關閉,以及iptables配置前要關閉,所有的服務都配置好了之後,關閉不用的服務,只留ssh與vsftpd以及corosync的相關服務,最後都測試正常了再寫iptables規則,vsftpd使用的是被動模式,這個配置防火牆時要注意了,要放行min_port和max_port,ssh也要修改端口,禁止root登錄,我使用的pubkey認證沒有使用密碼。(小項目,沒有使用跳轉機)



發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章