作者彙整: johnpupu

Setting up a redundant MySQL with HAST and CARP

Common Address Redundancy Protocol ( CARP )

  1. 角色說明
    主要會有兩種角色, 一種是Host(  Primary ), 一種是Provider ( Secondary )
    Host 主要就是我們提供服務的機器
    Provider 就是當Host 掛掉後, 接手服務的機器
  2. 參數說明 ( 這部份看原文吧, 這是我看OpenBSD上找來的, FreeBSD上敘述的比較少, 請大家搭配著一起服用 )
    vhid
    The Virtual Host ID. This is a unique number that is used to identify the redundancy group to other nodes on the network. Acceptable values are from 1 to 255.
    password
    The authentication password to use when talking to other CARP-enabled hosts in this redundancy group. This must be the same on all members of the group.
    carpdev
    This optional parameter specifies the physical network interface that belongs to this redundancy group. By default, CARP will try to determine which interface to use by looking for a physical interface that is in the same subnet as the ipaddress and mask combination given to the carp(4) interface.
    advbase
    This optional parameter specifies how often, in seconds, to advertise that we’re a member of the redundancy group. The default is 1 second. Acceptable values are from 1 to 255.
    advskew
    This optional parameter specifies how much to skew the advbase when sending CARP advertisements. By manipulating advskew, the master CARP host can be chosen. The higher the number, the less preferred the host will be when choosing a master. The default is 0. Acceptable values are from 0 to 254.
    state
    Force a carp(4) interface into a certain state. Valid states are init, backup, and master.
    group, -group
    Add or remove a carp(4) interface to a certain interface group. By default all carp(4) interfaces are added to the carp group. Each group has a carpdemote counter affecting all carp(4) interfaces belonging to that group. As described below, it can be useful to group certain interfaces together for failover purposes.
    ipaddress
    This is the shared IP address assigned to the redundancy group. This address does not have to be in the same subnet as the IP address on the physical interface (if present). This address needs to be the same on all hosts in the group, however.
    mask
    The subnet mask of the shared IP.
  3. 實作
    要用CARP的功能有兩個方法
    一個是 rebuild kernel

    device carp

    另一個是load Kernel Module, 在/boot/loader.conf加入下面這行

    if_carp_load="YES"

    我個人是傾向用Kernel Module, 這以用freebsd-update 昇級時比較方便.

    接下來先在hasta ( Host ) 這台機器中, 編輯/etc/rc.conf 加入下面的設定

    hostname="hasta.example.org"
    ifconfig_fxp0="inet 192.168.1.51 netmask 255.255.255.0"
    cloned_interfaces="carp0"
    ifconfig_carp0="vhid 1 pass testpass 192.168.1.50/24"

    再編輯 hastb ( Provider ) 的 /etc/rc.conf

    hostname="hastb.example.org"
    ifconfig_fxp0="inet 192.168.1.52 netmask 255.255.255.0"
    cloned_interfaces="carp0"
    ifconfig_carp0="vhid 1 advskew 100 pass testpass 192.168.1.50/24"

    然後Host重開機, 等個幾秒再重開 Provider, 不重開機的話, 也可以試試

    # kldload if_carp.ko
    # ifconfig carp0 create
    # ifconfig carp0 down && ifcofig carp0 up ( 兩台都要, 先Host, 再Provider )

    這樣Host 應該就會拿到192.168.1.50的IP了, 從同網段的機器ping 一下, 看是不是有成功

  4. failback
    在 Host 那台執行

    # sysctl net.inet.carp.preempt=1

    就可以了, 若搭配了HAST, 會滿不建議這樣處理的, 最好還是人工去看狀況怎麼樣, 再做調整及切換

Highly Available Storage  ( HAST )

  1. 角色說明
    primary ( carp 中的 Host ) => 會把資料傳給slave 叫他乖乖的寫進去
    secondary ( carp 中的 provider ) => 乖乖的收 master 的資料來同步
  2. 實作
    編輯兩台機器上的/etc/hast.conf, 加入以下資料

    resource test {
        on hasta {
            local /dev/ad6 ( 看你那顆HD要來做同步 )
            remote 192.168.1.52
        }
        on hastb {
            local /dev/ad6
            remote 192.168.1.51
        }
    }

    及執行下列指令

    # hastctl create test
    # /etc/rc.d/hastd onestart

    在 “primay” 機器上

    hastctl role primary test

    在 “secondary” 機器上

    # hastctl role secondary test

    接下來在 primary 就newfs, mount

    # newfs -U /dev/hast/test
    # mkdir -p /hast/test
    # mount /dev/hast/test /hast/test

    最後在編輯兩台機器/etc/rc.conf

    # hastd_enable="YES"

    這樣系統Boot後HAST就會自已啟動了…

  3. Failover
    在之前的Wiki上是要搭配ifstated一起服用
    新的文件上則是透過devd來做
    作法如下
    編輯兩台機器的 /etc/devd.conf

    notify 30 {
        match "system" "IFNET";
        match "subsystem" "carp0";
        match "type" "LINK_UP";
        action "/usr/local/sbin/carp-hast-switch master";
    };
    
    notify 30 {
        match "system" "IFNET";
        match "subsystem" "carp0";
        match "type" "LINK_DOWN";
        action "/usr/local/sbin/carp-hast-switch slave";
    };

    詳細的意思可以man devd.conf
    接著重啟devd

    # /etc/rc.d/devd restart

    再來就是編輯/usr/local/sbin/carp-hast-switch 了( 兩台都要有 )

    #!/bin/sh
    
    # Original script by Freddie Cash <fjwcash@gmail.com>
    # Modified by Michael W. Lucas <mwlucas@BlackHelicopters.org>
    # and Viktor Petersson <vpetersson@wireload.net>
    
    # The names of the HAST resources, as listed in /etc/hast.conf
    resources="test"
    
    # delay in mounting HAST resource after becoming master
    # make your best guess
    delay=3
    
    # logging
    log="local0.debug"
    name="carp-hast"
    
    # wait_count
    wait_count=7
    
    # end of user configurable stuff
    
    case "$1" in
        master)
            logger -p $log -t $name "Switching to primary provider for ${resources}."
            sleep ${delay}
    
            # Wait for any "hastd secondary" processes to stop
            for disk in ${resources}; do
                while $( pgrep -lf "hastd: ${disk} (secondary)" > /dev/null 2>&1 && [ $wait_count -gt 0 ] ); do
    								logger -p $log -t $name "countdown => ${wait_count}."
    								wait_count=`expr $wait_count - 1`
                    sleep 1
                done
    						wait_count=7
    
                # Switch role for each disk
                hastctl role primary ${disk}
                if [ $? -ne 0 ]; then
                    logger -p $log -t $name "Unable to change role to primary for resource ${disk}."
                    exit 1
                fi
            done
    
            # Wait for the /dev/hast/* devices to appear
            for disk in ${resources}; do
                for I in $( jot 60 ); do
                    [ -c "/dev/hast/${disk}" ] && break
                    sleep 0.5
                done
    
                if [ ! -c "/dev/hast/${disk}" ]; then
                    logger -p $log -t $name "GEOM provider /dev/hast/${disk} did not appear."
                    exit 1
                fi
            done
    
            logger -p $log -t $name "Role for HAST resources ${resources} switched to primary."
    
            logger -p $log -t $name "Mounting disks."
            for disk in ${resources}; do
                mkdir -p /hast/${disk}
                fsck -p -y -t ufs /dev/hast/${disk}
                mount /dev/hast/${disk} /hast/${disk}
    	    ## start mysql server
    	    logger -p $log -t $name "start mysql"
    	    /bin/sh /usr/local/etc/rc.d/mysql-server start
            done
    
        ;;
    
        slave)
            logger -p $log -t $name "Switching to secondary provider for ${resources}."
    
            # Switch roles for the HAST resources
            for disk in ${resources}; do
                if ! mount | grep -q "^/dev/hast/${disk} on "
                then
                else
    	        ## stop mysql server
                    logger -p $log -t $name "stop mysql"
    	        /bin/sh /usr/local/etc/rc.d/mysql-server stop
    	        sleep 0.5
    	        ## umount
                    logger -p $log -t $name "umount ${disk}."
                    umount -f /hast/${disk}
                fi
                sleep $delay
                hastctl role secondary ${disk} 2>&1
                if [ $? -ne 0 ]; then
                    logger -p $log -t $name "Unable to switch role to secondary for resource ${disk}."
                    exit 1
                fi
                logger -p $log -t $name "Role switched to secondary for resource ${disk}."
            done
        ;;
    esac

    這個script我有改了一小部份, 加入了mysql 的啟動, 和最大等待次數

  4. 測試方法
    # ifconfig carp0 down && ifconfig carp0 up

    然後用 hastctl status test 觀看吧

  5. 錯誤回復
    確定那一台的資料比較新, 在舊的那台執行

    # hastctl role init <resource>
    # hastctl create <resource>
    # hastctl role secondary <resource>

    然後觀看 primary 的 HAST status 應該會發現 dirty: 的部份會重跑

MySQL

  1. 請把DB 的 dir 設到HAST 上面
    我的/etc/rc.conf 設定如下

    ## MYSQL
    mysql_enable="YES"
    mysql_dbdir="/hast/test/mysql"
    mysql_args="--bind-address=192.168.1.50 --skip-name-resolve"

    然後把/usr/local/etc/rc.d/mysql-server 的權限設成000
    怕mysql 在開機後自已啟了

注意事項

  1. 不要在 dirty: 還有值的情況下去切換 primary, secondary 會爆炸的
  2. 請打開 promiscuous model 不然完全ping不到vip
  3. 可以把 secondary 這台機器的開機加上delay, 以防整個機房跳電, primary, secondary 同時開機造成split-brain
    編輯/boot/loader.conf

    ## delay secondary boot
    autoboot_delay="240"

參考資料

  1. http://www.freebsd.org/doc/handbook/carp.html
  2. http://www.freebsd.org/doc/handbook/disks-hast.html
  3. http://www.openbsd.org/faq/pf/carp.html
  4. http://developer.51cto.com/art/200509/3863.htm
  5. man hast
  6. man hastctl
  7. man carp
  8. man devd.conf
  9. /usr/src/sys/netinet/ip_carp.c ( 因為我man carp 怎麼樣都沒看到他說 net.inet.carp.preempt 設成1 就會failback……, 所以就開這個來看, 裡面的 http://paste.plurk.com/show/394406/ 有寫到 )

debug

  1. /var/log/message
  2. /var/log/debug.log

截圖
pic

第七天

今天有相當多媽媽的朋友親戚們來看媽媽
有偉定叔叔、阿美阿姨、阿香阿姨、蕭富美阿姨、二姑、表姐(二姑)、小姑、小姑丈、大表哥(小姑丈)、小表哥(小姑丈)
俊豪堂哥、小舅、小舅媽、小表妹(小舅小女兒)、阿卿阿姨、邵小娥阿姨、陳麗華阿姨、外公、外婆、阿香(台語)、涂金生叔叔、克明、小阿姨全家

然後阿卿阿姨、邵小娥阿姨、陳麗華阿姨,他們在幫媽媽挑他的一些照片準備在追思會上用。
這樣弄一弄也下午一兩點了、
然後再挑照片掃描整理大約六點多時載”三姑姑”回家,順便拿星期二上班要穿的衣服
也和kiang見了面拿了書,kiang 真的很多禮,只能說kiang 人真的相當好,我會好好放在心上的
謝謝kiang ~

明天還要再和二姑姑去看一次塔位
這樣就差不多準備回去上班
等下星期一媽媽出殯後再記錄~

redmine使用google app 寄送 email 通知信

先安裝及設定
http://redmineblog.com/articles/setup-redmine-to-send-email-using-gmail/

照最下面去改smtp_tls.rb
http://www.redmine.org/boards/2/topics/4833

測試
1. Login as an administrator
2. Go to the Administration panel
3. Go into the Settings and select the “Email notifications” tab
4. In the bottom right, click the link to “Send a test email”

update: 2012/06/08

1. 修改 configuration.yml

production:
  email_delivery:
    delivery_method: :smtp
    smtp_settings:
      tls: true
      enable_starttls_auto: true
      address: "smtp.gmail.com"
      port: 587
      domain: "example.com.tw" # 'your.domain.com' for GoogleApps
      authentication: :plain
      user_name: "redmine@example.com.tw"
      password: "example"

2. 修改 environment.rb

config.action_mailer.perform_deliveries = true

3. 重啟 redmine

收工 *菸*

第六天

今天整天的計劃就是掃描媽媽的照片,準備做投影片,及將來媽媽的相簿網站用
邊掃邊看我媽年輕時的照片感覺”肉肉的”XD
稱不上正妹,不過就中規中矩的
當時的個性感覺個性應該相當活潑

也在整理照片的時後,感覺媽媽在整理東西處理事情的時後都很有條有序的
很多東西真的都整理的滿好的
在找的過程中也發現媽媽將我過往的獎狀、成績單都留著
還有找到氣喘的就醫記錄、免役證書、幼稚園的畢業紀念冊( 這個最扯, 竟然還留著 )
只能說好吧~媽~~做事這麼有條有序~~我學的還不夠好…可以說幾乎不像你XD

第五天

今天原本是計劃要跑國稅局, 及稅捐處一趟
不過後來因為緊急處理了一下某客戶的mail server 的問題
將spam filter 換成dspam
看一看時間也大約下午了
就準備媽媽頭七的事

約未晚上九點時,師父們也來頌經,整個過程含休息大約2個小時
不過~~我沒有感覺我媽媽有回來的fu…

第四天

約中午的時後去勞保局一趟
辦了勞保和國民年金的喪葬補助
然後跑了一趟基隆市政府的法律諮詢
去問了限定繼承及債權憑證的問題
因為還有時間及少了印鑑證明所以又跑了一趟戶政事務所申請
接著直接去基隆法院
因為家中找不到媽媽當初處理這部份債務的文件
所以去法院問了是否有相關的資料
查詢後確實有兩筆資料
一筆是”周旻志”, 一筆是”童志成”
其中周先生的部份已經確定有債權憑證可以處理
而童先生的部份因為對方始終不出面處理支付命令的事
所以法院沒有下一步動作, 而這部份我也申請閱巻
若是有相關的資料的話,而童先生還是不出面的話
我應該會直接申告。
接著又跑去買水果準備明天頭七要用的。

第三天

今天一早起來先去接”三姑姑”
然後去北海福座看塔位, 主要看了10樓, 12樓兩個
10樓的是坐北向南, 12樓則是坐東
然後10樓面對的是長的走道然後就是消防設備
原本比較喜歡10樓因為想說可以不用和”別人”相對向
且又是坐北向南, 我媽似乎比較適合做坐北這樣
然後下午殯葬業者來, 幫我問了一下10樓的部份是”樑下”
然後那個位子比較沒折扣, 然後又說那邊坐東還不錯, 因為後面有山可以靠
然後後來擲筊問媽媽, 媽媽一開始是說給我自已決定, 後來和媽媽說
10樓的問題後再擲筊問一次就選了12樓
然後下午開車回來後就和三姑姑找了一下之前媽媽被倒會然後告對方的文件
不過一直沒看到, 可能明天會先去問律師這部份的債權可以怎麼處理
晚上就和政彥、煌吃個飯, 回家後把LS的匯入程式修正了一下

第二天

一早起來先幫三阿姨上網預辦登機及劃位然後訂了espon v330 來掃描照片
然後處理了一下 育幼院的事情
接著就載三阿姨去機場, 然後去三重許先生那邊挑了骨灰罈
接著就去南榮公墓這邊登記出殯火化的時間( 2010/12/6 一 ), 12/4 號的時間滿爐了, 所以選了12/6號, 且7號的日子也行
所以要是6號處理的太晚來不及入塔的話, 還可以在七號的時後入塔, 時間算還滿充裕的, 而整個冰, 火化, 租廳的錢是10200( 火化的部份基隆市民不用錢 )
回家後沒多久epson v330 也送來了, Firch 也告訴我Ichi, LS 的進度, 及靖文在詢問出殯的時間, 看是否能過來
接著就試掃了幾張媽媽的照片及底片的, 效果還ok 速度也算快
再來又出去採買明天要煮給媽媽吃的東西, 期間也接到向叔叔的電話, 詢問媽媽是否有交待什麼事情要處理須不須要錢之類的
晚上也接到郁青關心的電話

第一天

今天早上和葬儀業者, 討論了一下媽媽後事大約的作法
及應該要注意的事項, 和可以申請的一些補助金

下午去辦了除戶, 及申請除戶謄本
在辦理之前因為媽媽的身份證, 健保卡會被收回去
所以特別拿去掃描起來, 可以留作記念
而爸爸的因為配偶欄的部份要移除, 所以把舊的拿去影印護貝留著.

又去問了遺產的部份, 明天要跑一趟基隆市政府,  有律師可以詢問
另外有人有欠媽媽錢( 倒會沒還 ), 讓媽媽當時很辛苦(身體可能就是這樣打壞掉的), 還退了勞保
我記得媽媽有去法院申告的樣子, 明天一併詢問律師
看債權的部份有沒有辦法繼承, 我要讓他永遠欠著我媽這條錢, 別想因為這樣就沒事.

## 這只是一篇單純的記事而已, 讓自已以後可以再回頭看看.

對了~~媽我很想你………