前言: 這篇博客的實驗主要是配置兩個節點基于corosync + pacemaker的高考用lamp, 是我搞得最痛苦的一次,并且結果還不穩定。主要問題是corosync 1.x + pacemaker 時,如果把pacemaker當成插件使用,嘗試很多次都不成功,后來把pacemaker當成半獨立的服務進行配置。 但是如此一來crm就沒辦法進行資源配置,只能使用pcs配置,但是由于沒有pcsd,所以pcs只能配置不能獲取狀態信息。如此一來各種蛋疼。最后結果是兩個節點,一個節點總是不穩定,我也不知道為什么。
一、 使用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
到這里為止,大體位置就配置完了,但是我的node3還經常出問題不怎么穩定,webservice服務總是啟動不起來,但是手工啟動運轉良好。不知道怎么搞。
總的來說,這是我碰到的最困難的實驗之一。 各種配置跟視頻都不一樣。 痛苦死了。。??偹闩獋€半成品出來。就先這樣吧
原創文章,作者:以馬內利,如若轉載,請注明出處:http://www.www58058.com/11361