corosync+pacemaker+pcs 使用ansible配置高可用LAMP構架

前言: 這篇博客的實驗主要是配置兩個節點基于corosync + pacemaker的高考用lamp, 是我搞得最痛苦的一次,并且結果還不穩定。主要問題是corosync 1.x + pacemaker 時,如果把pacemaker當成插件使用,嘗試很多次都不成功,后來把pacemaker當成半獨立的服務進行配置。 但是如此一來crm就沒辦法進行資源配置,只能使用pcs配置,但是由于沒有pcsd,所以pcs只能配置不能獲取狀態信息。如此一來各種蛋疼。最后結果是兩個節點,一個節點總是不穩定,我也不知道為什么。 

ha_lamp.png

一、 使用ansible做準備工作

    1.配置主機名: 一共四臺主機,主機名如下

    192.168.98.128node1.playground.com    
    192.168.98.129  node2.playground.com 
    192.168.98.130node3.playground.com 
    192.168.98.131node4.playground.com
    要永久生效,需寫在/etc/sysconfig/network中

    2. 在node1.playground.com上面安裝ansible

    http://docs.ansible.com/ansible/intro_installation.html
    # getting-ansible    
    # mkdir /etc/ansible
    # cp -r ./ansible/examples/* /etc/ansible
    # vim /etc/ansible/hosts 
    [all_nodes]
    192.168.253.134
    192.168.253.135
    192.168.253.136
    [AMP]
    192.168.253.134
    192.168.253.135
    [nfs]
    192.168.253.136

    3. 把node1的秘鑰復制到各節點上

    # ssh-keygen -t rsa     
    # ssh-copy-id /root/.ssh/id_rsa.pub root@node2.playground.com
    # ssh-copy-id /root/.ssh/id_rsa.pub root@node3.playground.com
    # ssh-copy-id /root/.ssh/id_rsa.pub root@node4.playground.com

    4. 關閉防火墻

    # ansible all_nodes -m service -a  "name=iptables state=stopped enabled=no"    
    # ansible all_nodes -m copy -a "src=/etc/selinux/config dest=/etc/selinux/config"

    5. 同步時間

    # ansible all_nodes -m yum -a "name=ntp state=present"    
    # ansible all_nodes -m service -a  "name=ntpd state=started "
    # ansible all_nodes -a "date"
    node3.playground.com | success | rc=0 >>    
        Fri Jan 22 13:22:12 SGT 2016
    node2.playground.com | success | rc=0 >>
        Fri Jan 22 13:22:12 SGT 2016
    node4.playground.com | success | rc=0 >>
        Fri Jan 22 13:22:12 SGT 2016

    6. 同步hosts文件

    # ansible all_nodes -m copy -a "src=/etc/hosts dest=/etc/hosts"

    7. 使用yum源安裝httpd 

    # ansible AMP -m yum -a "name=httpd state=present"

    8. 使用yum源安裝php,php-mysql模塊,推送php.ini配置文件

    # ansible AMP -m yum -a "name=php state=present"    
    # ansible AMP  -a "ls /usr/lib64/httpd/modules/libphp5.so"
    node2.playground.com | success | rc=0 >>
        /usr/lib64/httpd/modules/libphp5.so
    node3.playground.com | success | rc=0 >>
        /usr/lib64/httpd/modules/libphp5.so
    # ansible AMP -m yum -a "name=php-mysql state=present"
    默認php.ini中要加一下面兩行    
    extension = /usr/lib64/php/modules/mysql.so
    extension = /usr/lib64/php/modules/mysqli.so
    并推送到兩個節點上。

    9. 使用yum安裝php-xcache

    # ansible AMP -m yum -a "name=php-xcache state=present"

    10. 提供一個php測試頁,啟動服務并測試,可以使用物理機瀏覽器進行測試

    # vim hello.php 
    <html>
         <head>
              <title>PHP Test</title>
         </head>
         <body>
             <?php echo '<p>Hello World</p>'; ?> 
         </body>
    </html
    # ansible AMP -m copy -a "src=./hello.php dest=/var/www/html/"
    # ansible AMP -m service -a  "name=httpd enabled=yes state=started "

    11. 部署nfs服務器,并導出mysql共享目錄和httpd的共享目錄

    # vim exports 
        /mysqldata      192.168.253.134(rw,no_root_squash)      192.168.253.135(rw,no_root_squash)
        /httpddata      192.168.253.134(rw)     192.168.253.135(rw) 
    # ansible nfs -m copy -a  "src=./exports dest=/etc/exports"
    # ansible nfs -a 'groupadd -g 133 mysql'
    # ansible nfs -a 'useradd -u 133 -g 133 mysql'
    # ansible nfs  -m service -a "name=nfs state=started enabled=yes"
    # ansible nfs  -a "exportfs -v"
        node4.playground.com | success | rc=0 >>
        /mysqldata    192.168.98.129(rw,wdelay,no_root_squash,no_subtree_check)
        /mysqldata    192.168.98.130(rw,wdelay,root_squash,no_subtree_check)
        /httpddata    192.168.98.129(rw,wdelay,root_squash,no_subtree_check)
        /httpddata    192.168.98.130(rw,wdelay,root_squash,no_subtree_check)
    # ansible all_nodes  -m group -a "gid=48 name=apache state=present"
    # ansible all_nodes  -m user -a "uid=48 name=apache state=present"
    # ansible nfs -m acl -a "entity=apache etype=user  name=/httpddata permissions=rwx state=present"

    12. 使用二進制文件在node2,node3上面部署mysql(mariadb)服務

    部署服務    
    # ansible AMP -m copy -a "src=./mariadb-10.0.23-linux-x86_64.tar.gz  dest=/root/"
    # ansible AMP -a "tar -xf /root/mariadb-10.0.23-linux-x86_64.tar.gz -C /usr/local/"
    # ansible AMP -a "ln -s /usr/local/mariadb-10.0.23-linux-x86_64 /usr/local/mysql"
    創建mysql用戶
    # ansible all_nodes -m group -a "gid=133 name=mysql state=present"
    # ansible all_nodes -m user -a "uid=133 name=mysql state=present"
    # ansible AMP -a "chown -R mysql.mysql /usr/local/mariadb-10.0.23-linux-x86_64 "
    給nfs導出文件夾mysql的讀寫權限
    # ansible nfs -m acl -a "entity=mysql etype=user  name=/mysqldata permissions=rw state=present"
    推送配置文件,配置文件如下
    [mysqld]
    datadir=/data/mysqldata
    socket=/tmp/mysql.sock
    user=mysql
    log-bin=/data/mysqldata/mysql_bin
    # Disabling symbolic-links is recommended to prevent assorted security risks
    symbolic-links=0
    [mysqld_safe]
    log-error=/var/log/mysqld.log
    pid-file=/var/run/mysqld/mysqld.pid
    把配置文件加上datadir=/data/mysqldata后推送到各節點
    # ansible AMP -m copy -a "src=./my.cnf dest=/etc/my.cnf"
    推送服務腳本
    # ansible AMP -m copy -a "src=mysqld dest=/etc/rc.d/init.d/mysqld mode=755"
    把服務腳本加到服務列表
    # ansible AMP -m service -a "name=mysqld enabled=yes state=stopped"
    備注: 這里記得做一件事情就是,把/usr/local/mysql/bin 目錄導出來成為PATH, 否則后面pacemaker啟動mysql會失敗。

    13. 創建共享數據文件夾

    # ansible AMP -a "mkdir -pv /data/mysqldata"

    14. 鏈接一個AMP主機初始化數據庫,node2為例,刪除匿名用戶等等

    # mount -t nfs node4.playground.com:/mysqldata /data/mysqldata     
    # ./scripts/mysql_install_db 
    不需要加選項,會自動讀取配置文件中的選項。 
    在node3上面也嘗試掛載一下,連入mysql服務器,測試正常,說明兩個mysql庫可以共享后端nfs了
    
    MariaDB [(none)]> CREATE DATABASE discuzData
    MariaDB [(none)]> GRANT ALL ON discuzData.* TO 'discuzUser'@'192.168.253.%' IDENTIFIED BY 'discuz';
    MariaDB [(none)]> flush privilesges

二、 安裝discuz論壇站點。并配置,需要在node4(nfs)節點上進行

    1. 下載部署discuz論壇

    # wget http://download.comsenz.com/DiscuzX/3.2/Discuz_X3.2_SC_UTF8.zip    
    # unzip Discuz_X3.2_SC_UTF8.zip
    # cp upload/* -r /httpddata/
    # chown -R apache.apache httpddata
    
    這里要確認一下,apache用戶的用戶ID和組ID,要確保和httpd節點一致 
    # ansible all_nodes -a "id apache "
        192.168.253.136 | success | rc=0 >>
        uid=48(apache) gid=48(apache) groups=48(apache)
        192.168.253.134 | success | rc=0 >>
        uid=48(apache) gid=48(apache) groups=48(apache)
        192.168.253.135 | success | rc=0 >>
        uid=48(apache) gid=48(apache) groups=48(apache)

    2. 在MySQL上面創建discuzData庫,并授權用戶

    MariaDB [(none)]> CREATE DATABASE discuzData    
    MariaDB [(none)]> GRANT ALL on discuzData.* TO "discuzUser"@'192.168.98.%' IDENTIFIED BY 'discuzpass'; 
    MariaDB [(none)]> FLUSH PRIVILEGES

     2. 安裝discuz論壇。 

         1) 這里默認mysql服務不一定和httpd在一起,所以給mysql一個單獨vip 192.168.98.111。安裝時使用這個vip安discuz. 

         2) 安裝時,把任意一個AMP節點掛載nfs即可,mysqld和httpd(php)不一定在同一節點

         3) 后面配置高可用時候,也需要配置兩個vip資源,一個給mysql一個給httpd

         具體安裝,這里就不詳述了

三、 配置corosync + pacemacker + crmsh 高可用組件

    1. 安裝并配置corosync信息傳輸層

        1) 使用yum源安裝corosync和pacemaker

        # ansible AMP -m yum -a  "name=corosync state=present"        
        # ansible AMP -m yum -a "name=pacemaker state=present"

         2) AMP組的兩個節點相互交換秘鑰

    node2上    
    # ssh-keygen -t rsa
    # ssh-copy-id -i ~/.ssh/id_rsa.pub root@192.168.253.135
    
    node3
    # ssh-keygen -t rsa
    # ssh-copy-id -i ~/.ssh/id_rsa.pub root@192.168.253.134

        3) 在node2上準備配置文件,并且同步到node3上面 

    # cp /etc/corosync/corosync.conf.example /etc/corosync/corosync.conf
    # vim /etc/corosync/corosync.conf 修改一下幾項 
        bindnetaddr: 192.168.253.0  # 由于AMP所在是192.168.253.0網段
        mcastaddr: 239.255.12.1# 選擇一個獨立多播地址段
        logfile: /var/log/corosync.log# 設置一個存在的路徑,存放日志 
    # 添加一下內容
        service {
        ver:  1
        name: pacemaker
        # use_mgmtd: yes
        }
          
        aisexec {
        user: root
        group:  root
        }
    解釋一下ver這個指令
    0: pacemaker 作為corosync的插件使用
    1: pacemaker 自己作為獨立的服務,但是接受corosync作為插件調度。 
    先啟動corosync 然后啟動pacemaker 
    我在配置的時候,先使用0, 后來發現總是出問題,cib進程總是不正常。 后來選擇讓他們獨立工作,故障排除了。 
    # scp /etc/corosync/corosync.conf root@node3.playground.com:/etc/corosync/corosync.conf

         4) 生成節點間通信使用的秘鑰文件(node2)

    # scp /etc/corosync/authkey    
    # scp /etc/corosync/authkey node3.playground.com:/etc/corosync/authkey

         5) 在控制節點 node1使用ansible為AMP組節點,安裝crmsh,pssh

    # ansible AMP -m copy -a 'src=./crmsh-1.2.6-4.el6.x86_64.rpm dest=/tmp/crmsh-1.2.6-4.el6.x86_64.rpm'    
    # ansible AMP -m copy -a 'src=./pssh-2.3.1-2.el6.x86_64.rpm dest=/tmp/pssh-2.3.1-2.el6.x86_64.rpm'
    # ansible AMP -m yum -a 'name=/tmp/crmsh-1.2.6-4.el6.x86_64.rpm state=present'
    # ansible AMP -m yum -a 'name=/tmp/pssh-2.3.1-2.el6.x86_64.rpm state=present'

     6) 用控制節點node1啟動AMP組上的corosync服務

    # ansible AMP -m service -a  "name=corosync state=started "    
    # ansible AMP -m service -a  "name=pacemaker state=started "
    
    查看corosync引擎是否正常啟動:
    # grep -e "Corosync Cluster Engine" -e "configuration file" /var/log/cluster/corosync.log
    Jan 20 18:18:28 corosync [MAIN  ] Corosync Cluster Engine ('1.4.7'): started and ready to provide service.
    Jan 20 18:18:28 corosync [MAIN  ] Successfully read main configuration file '/etc/corosync/corosync.conf'.
    
    查看初始化成員節點通知是否正常發出:
    # grep  TOTEM  /var/log/cluster/corosync.log
        Jan 20 18:18:28 corosync [TOTEM ] Initializing transport (UDP/IP Multicast).
        Jan 20 18:18:28 corosync [TOTEM ] Initializing transmit/receive security: libtomcrypt SOBER128/SHA1HMAC (mode 0).
        Jan 20 18:18:29 corosync [TOTEM ] The network interface [192.168.253.134] is now up.
        Jan 20 18:18:29 corosync [TOTEM ] Process pause detected for 627 ms, flushing membership messages.
        Jan 20 18:18:29 corosync [TOTEM ] A processor joined or left the membership and a new membership was formed.
        Jan 20 18:18:30 corosync [TOTEM ] A processor joined or left the membership and a new membership was formed.
    
    檢查啟動過程中是否有錯誤產生。下面的錯誤信息表示packmaker不久之后將不再作為corosync的插件運行,因此,建議使用cman作為集群基礎架構服務;此處可安全忽略。
    # grep ERROR: /var/log/cluster/corosync.log | grep -v unpack_resources
        Jan 20 18:18:29 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.
        Jan 20 18:18:29 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
        
    查看pacemaker是否正常啟動:
    # grep pcmk_startup /var/log/cluster/corosync.log 
        Jan 22 10:23:29 corosync [pcmk  ] info: pcmk_startup: CRM: Initialized
        Jan 22 10:23:29 corosync [pcmk  ] Logging: Initialized pcmk_startup
        Jan 22 10:23:29 corosync [pcmk  ] info: pcmk_startup: Maximum core file size is: 18446744073709551615
        Jan 22 10:23:29 corosync [pcmk  ] info: pcmk_startup: Service: 9
        Jan 22 10:23:29 corosync [pcmk  ] info: pcmk_startup: Local hostname: node2.playground.com
        
    使用crmsh查看一下集群狀態
    # crm status 
        Last updated: Fri Jan 22 10:40:29 2016
        Last change: Fri Jan 22 10:15:51 2016
        Stack: classic openais (with plugin)
        Current DC: node2.playground.com - partition with quorum
        Version: 1.1.11-97629de
        2 Nodes configured, 2 expected votes
        0 Resources configured
        Online: [ node2.playground.com node3.playground.com ]

    2. 使用pcs配置資源。 主要是crm在pacemaker 單獨工作的時候,沒法兼容

        1) 由于是兩個節點所以關閉stonith

    # pcs property set stonith-enabled=false

         2) 創建web服務相關的資源

    # pcs resource create webip ocf:heartbeat:IPaddr2 ip=192.168.98.133 cidr_netmask=24 nic=eth0 op monitor interval=60s
    # pcs resource create webData ocf:heartbeat:Filesystem device=192.168.98.131:/httpddata directory=/var/www/html fstype=nfs
    # pcs resource create webservice lsb:heartbeat:httpd

         3) 創建web服務組 

    # resource group add webserviceGroup webip webData webservice
    # pcs resource group add webserviceGroup  webservice  --after webData
    # pcs resource group add webserviceGroup webData  --after webip

        4) 創建mysql服務相關資源 

    # pcs resource create mysqlip ocf:heartbeat:IPaddr2 ip=192.168.98.111 cidr_netmask=24 nic=eth0 op monitor interval=60s    
    # pcs resource create mysqlData ocf:heartbeat:Filesystem device=192.168.98.131:/mysqldata directory=/data/mysqldata fstype=nfs 
    # pcs resource create mysqlservice lsb:mysqld

        5) 創建mysql服務組 

    # pcs resource group add mysqlserviceGroup mysqlip mysqlData mysqlservice     
    # pcs resource group add mysqlserviceGroup mysqlservice --after mysqlData 
    # pcs resource group add mysqlserviceGroup mysqlData --after mysqlservice 
    # pcs resource cleanup 
    # pcs resource 
        Resource Group: mysqlserviceGroup
         mysqlip(ocf::heartbeat:IPaddr2):Started node.playground.com 
         mysqlData(ocf::heartbeat:Filesystem):Started node2.playground.com 
         mysqlservice(lsb:mysqld):Started node2.playground.com 
        Resource Group: webserviceGroup
         webip(ocf::heartbeat:IPaddr2):Started node2.playground.com 
         webData(ocf::heartbeat:Filesystem):Started node2.playground.com 
         webservice(lsb:httpd):Started node2.playground.com 
    可以看到所有資源在node2節點上面,運行了

        6) 切換節點,這里使用crmsh工具, 因為在pcsd沒啟動的情況下,總是很蛋疼

    crm(live)node# standby node2.playground.com     
    crm(live)node# standby node3.playground.com 
    crm(live)node# online node2.playground.com
    # pcs resource 
         Resource Group: mysqlserviceGroup
         mysqlip(ocf::heartbeat:IPaddr2):Started node2.playground.com 
         mysqlData(ocf::heartbeat:Filesystem):Started node2.playground.com 
         mysqlservice(lsb:mysqld):Started node2.playground.com 
         Resource Group: webserviceGroup
         webip(ocf::heartbeat:IPaddr2):Started node2.playground.com 
         webData(ocf::heartbeat:Filesystem):Started node2.playground.com 
         webservice(lsb:httpd):Started node2.playground.com

corosync_discuz.png

到這里為止,大體位置就配置完了,但是我的node3還經常出問題不怎么穩定,webservice服務總是啟動不起來,但是手工啟動運轉良好。不知道怎么搞。 

總的來說,這是我碰到的最困難的實驗之一。 各種配置跟視頻都不一樣。 痛苦死了。。??偹闩獋€半成品出來。就先這樣吧

原創文章,作者:以馬內利,如若轉載,請注明出處:http://www.www58058.com/11361

(0)
以馬內利以馬內利
上一篇 2016-01-21 14:03
下一篇 2016-02-09 17:43

相關推薦

  • 硬盤的讀寫原理

     硬盤的種類主要是SCSI 、IDE 、以及現在流行的SATA等;任何一種硬盤的生產都要一定的標準;隨著相應的標準的升級,硬盤生產技術也在升級;比如 SCSI標準已經經歷了SCSI-1 、SCSI-2、SCSI-3;其中目前咱們經常在服務器網站看到的 Ultral-160就是基于SCSI-3標準的;IDE 遵循的是ATA標準,而目前流行的SATA,…

    Linux干貨 2015-04-10
  • Linux中的shell腳本編程——基礎篇

    概述:       shell腳本在Linux系統管理員的運維工作中非常重要。shell腳本能夠幫助我們很方便的管理服務器,因為我們可以指定一個任務計劃,定時的去執行某一個腳本以滿足我們的需求。本篇將從編程基礎、腳本基本格式、變量、運算、條件測試這幾個方面詳細介紹shell腳本編程的基礎內容,也是我們必須要掌握熟練的內容。 一、…

    Linux干貨 2016-08-15
  • http請求過程

    1、瀏覽器根據訪問的域名找到其IP地址。DNS查找過程如下: 1.瀏覽器緩存:瀏覽器會緩存DNS記錄一段時間。 2.系統緩存:如果在瀏覽器緩存里沒有找到需要的域名,瀏覽器會查系統緩存中的記錄。 3.路由器緩存:如果系統緩存也沒找到需要的域名,則會向路由器發送查詢請求。 4.ISP DNS緩存:如果依然沒找到需要的域名,則最后要查的就是ISP緩存DNS的服務器…

    Linux干貨 2017-10-23
  • class17 網絡管理(二)

    IP 地址 它們可唯一標識IP網絡中的每臺設備 每臺主機(計算機、網絡設備、外圍設備)必須具有唯一的地址           IP 地址由兩部分組成:     ? 網絡ID:   …

    Linux干貨 2016-09-06
  • linux用戶,組及權限管理

      寫在前面: 本博客詳解命令如下: useradd, userdel,usermod, passwd,  chage, groupadd,  groupdel, groupmod, gpasswd ,newgrp, chsh, id, su,  chmod,  chowm,  chgrp, &nb…

    Linux干貨 2015-12-19
  • Vim 末行模式 & crontab & scripts 練習

    1、復制/etc/rc.d/rc.sysinit文件至/tmp目錄,將/tmp/rc.sysinit文件中的以至少一個空白字符開頭的行的行首加#;   ~]# cp /etc/rc.d/rc.sysinit /tmp     %s@^[[:space:]]\+\*@#&@g     (使用元字符 有幾…

    Linux干貨 2016-10-31
欧美性久久久久