實驗環境:三臺CentOS6.5虛擬機,功能:
nfs:172.16.103.3 該主機共享的目錄用於存儲數據庫中的數據,而且node1和node2都要能掛載,使用的是同一個數據庫目錄。
node1:172.16.103.1
node2:172.16.103.2
時間服務器:172.16.0.1
高可用服務中用到的資源有:IP:172.16.103.10,httpd,nfs,mysql。
拓撲圖:
配置過程:
一、nfs服務器的配置:
nfs服務器上不需要mysql安裝數據庫,但需要創建mysql用戶和mysql組,而且要手動指定該用戶和組的uid以及gid,將共享目錄的屬主屬組都改爲mysql,目的是在共享目錄時,其他的節點的相同uid的用戶可以對這個目錄有寫權限。nfs共享的目錄最好是掛載到LVM格式的邏輯捲上,方便日後擴展空間,創建LVM邏輯卷的過程未給出。
# mkdir -pv /nfs/shared #共享用的目錄 # groupadd -g 3306 mysql # useradd -u 3306 -g mysql -s /sbin/nologin -M mysql # chown -R mysql.mysql /nfs/shared # vim /etc/exports #添加如下內容,共享/nfs/shared目錄 /nfs/shared 172.16.0.0/16(no_root_squash,rw,async) # service nfs start 選項中no_root_squash可以允許管理員root用戶登錄進共享目錄並創建文件,這個選項需要用到,因爲後續在高可用服務的節點上會用管理員的身份初始化數據庫,rw選項的作用是允許普通用戶對數據庫目錄進行讀寫操作,async是爲了提高性能而設置的。
二、配置node1和node2節點同步時間,基於host文件實現主機名和ssh公鑰方式實現通信:
同步時間,指向同一個時間服務器,設置週期性任務計劃,自動同步時間。
node1:
# ntpdate 172.16.0.1 # crontab -e */5 * * * * /usr/sbin/ntpdate 172.16.0.1 &> /dev/null # vim /etc/sysconfig/network HOSTNAME=node1.cluster.com # vim /etc/hosts 172.16.103.1 node1.cluster.com node1 172.16.103.2 node2.cluster.com node2 # ssh-keygen -t rsa -P '' # ssh-copy-id -i .ssh/id_rsa.pub node2
node2:
# ntpdate 172.16.0.1 # crontab -e */5 * * * * /usr/sbin/ntpdate 172.16.0.1 &> /dev/null # vim /etc/sysconfig/network HOSTNAME=node2.cluster.com # vim /etc/hosts 172.16.103.1 node1.cluster.com node1 172.16.103.2 node2.cluster.com node2 # ssh-keygen -t rsa -P '' # ssh-copy-id -i .ssh/id_rsa.pub node1
這些基本設置完畢之後再進一步的配置node1和node2。
三、配置node1:
安裝httpd:
# yum install -y httpd # cd /var/www/html # vim index.html #編輯默認首頁面,爲測試使用,內容如下: <h1>node1</h1>
在其他主機端測試一下http服務,然後再將服務停掉。
[root@node1 ~]# service httpd start Starting httpd: [ OK ] [root@node2 ~]# curl http://172.16.103.1 <h1>node1</h1> [root@node1 ~]# service httpd stop Stopping httpd: [ OK ]
安裝mysql,這裏使用的是通用二進制格式,使用源碼編輯的方式也可以。
# groupadd -g 3306 mysql # useradd -u 3306 -g mysql -s /sbin/nologin -M mysql [root@node1 ~]# id mysql uid=3306(mysql) gid=3306(mysql) groups=3306(mysql) # mkdir -pv /mydata/data # chown -R mysql.mysql /mydata/data
開始初始化數據庫,由於真正要使用的數據庫磁盤空間在nfs服務器上,所以要先將nfs服務器的共享目錄掛載到/mydata/data下,而且要注意啓動數據庫之前要先掛載該目錄,否則會報錯,卸載該目錄之前要先停止數據庫服務,這些很簡單的順序操作,很可能會實際使用過程中順序上出問題,提醒朋友們注意。
# mount -t nfs 172.16.103.3:/nfs/shared /mydata/data # tar xf mariadb-5.5.39-linux-x86_64.tar.gz -C /usr/local/ # cd /usr/local # ln -sv mariadb-5.5.39-linux-x86_64.tar.gz mysql # cd mysql # chown -R mysql.mysql ./ # scripts/mysql_install_db --user=mysql --datadir=/mydata/data # cp support-files/my-large.cnf /etc/my.cnf # vim /etc/my.cnf #添加數據庫的數據目錄,修改其中的thread_concurrency=8將其默認值設定爲合理的數值,不調整也沒有問題。另外,實驗過程中如果遠程連接數據庫速度很慢,添加進去skip-name-resolve選項,這樣可以避免名稱解析,造成很大的延時,這些添加的內容要在mysqld段添加。 skip-name-resolve datadir = /mydata/data thread_concurrency=2 # cp support-files/mysql.server /etc/rc.d/init.d/mysqld
mysql的初始化工作完成了,可以嘗試啓動mysql,然後注意最好先將掛載目錄卸載掉。
# service mysqld start 連入數據庫測試是否能正常讀寫: [root@node1 ~]# /usr/local/mysql/bin/mysql Welcome to the MariaDB monitor. Commands end with ; or \g. Your MariaDB connection id is 3 Server version: 5.5.39-MariaDB-log MariaDB Server Copyright (c) 2000, 2014, Oracle, Monty Program Ab and others. Type 'help;' or '\h' for help. Type '\c' to clear the current input statement. MariaDB [(none)]> SHOW DATABASES; +--------------------+ | Database | +--------------------+ | information_schema | | mysql | | performance_schema | | test | +--------------------+ 4 rows in set (0.01 sec) MariaDB [(none)]> CREATE DATABASE tdb; Query OK, 1 row affected (0.01 sec) [root@node1 ~]# service mysqld stop Shutting down MySQL. [ OK ] # umount /mydata/data
爲了便於mysql的使用,進一步做的配置如下:
# vim /etc/profile.d/mysql.sh #添加PATH環境變量的路徑 export PATH=/usr/local/mysql/bin:$PATH # source /etc/profile.d/mysql.sh # vim /etc/man.config MANPATH /usr/local/mysql/man # ln -sv /usr/local/mysql/include /usr/include/mysql # echo '/usr/local/mysql/lib' > /etc/ld.so.conf.d/mysql.conf # ldconfig
將配置好的數據庫配置文件和腳本文件複製到另外一個節點:
# scp -p /etc/rc.d/init.d/mysqld node2:/etc/rc.d/init.d # scp -p /etc/my.cnf node2:/etc
在node1節點安裝heartbeat:
解決依賴關係:
# yum install perl-TimeDate net-snmp-libs libnet PyXML # rpm -ivh heartbeat-2.1.4-12.el6.x86_64.rpm heartbeat-pils-2.1.4-12.el6.x86_64.rpm heartbeat-stonith-2.1.4-12.el6.x86_64.rpm 注意:這幾個rpm包版本比較老,在CentOS6.5系統上不能使用yum方式安裝。
爲heartbeat提供資源文件,節點間通信的祕鑰文件以及配置文件:
# cd /usr/share/doc/heartbeat-2.1.4/ # cp -p ha.cf haresources authkeys /etc/ha.d/
修改祕鑰文件的屬性,原文件go屬性中有r屬性,不符合要求,要修改爲600.
# cd /etc/ha.d # chmod 600 authkeys
修改配置文件的幾個參數,示例:
# vim ha.cf logfile /var/log/ha-log #啓用日誌文件 mcast eth0 225.103.0.1 694 1 0 #設定組播地址 node node1.cluster.com #高可用服務的兩個節點,這兩行是需要添加上的 node node2.cluster.com ping 172.16.0.1 # 啓用Ping設備,在集羣節點數爲偶數時使用。
配置兩個高可用節點之間通信的祕鑰:
# openssl rand -hex 8 6f3173070ea11875 # vim authkeys auth 2 2 sha1 6f3173070ea11875
配置資源:
# vim haresources node1.cluster.com 172.16.103.10/16/eth0/172.16.103.255 Filesystem::172.16.103.3:/nfs/shared::/mydata/data::nfs mysqld httpd
注意資源文件中各個資源的定義順序,nfs資源要定義在mysqld之前,mysqld和httpd倒不一定有前後,不過從服務可用的角度來講,先啓動mysql後啓動httpd比較合理。用於高可用集羣的3個文件配置完成後,等node2節點上的heartbeat安裝完成後,將這3個文件複製到node2節點上。
至此,node1節點的數據庫和httpd,heartbeat配置完成。
四、配置node2:
node2上的數據庫不需要掛載nfs上的共享目錄進行再一次的初始化,不過所需要的二進制安裝文件以及配置文件和服務腳本文件都還是需要的,配置文件和腳本文件通過node1節點已經複製過來了,需要做的是二進制安裝文件的解壓工作。
# mkdir -pv /mydata/data # groupadd -g 3306 mysql # useradd -u 3306 -g mysql -s /sbin/nologin -M mysql # chown -R mysql.mysql /mydata/data # tar xf mariadb-5.5.39-linux-x86_64.tar.gz -C /usr/local/ # cd /usr/local # ln -sv mariadb-5.5.39-linux-x86_64.tar.gz mysql # cd mysql # chown -R root.mysql ./
node2的數據庫配置工作完成了,可以嘗試掛載nfs共享目錄,然後啓動數據庫:
# mount -t nfs 172.16.103.3:/nfs/shared /mydata/data # service mysqld start
連入數據庫測試能否正常讀寫,一定要注意這時的操作順序,先掛載目錄再啓動,要卸載目錄就要先停用mysql。
[root@node2 ~]# service mysqld start Starting MySQL... [ OK ] [root@node2 ~]# mysql Welcome to the MariaDB monitor. Commands end with ; or \g. Your MariaDB connection id is 2 Server version: 5.5.39-MariaDB-log MariaDB Server Copyright (c) 2000, 2014, Oracle, Monty Program Ab and others. Type 'help;' or '\h' for help. Type '\c' to clear the current input statement. MariaDB [(none)]> SHOW DATABASES; +--------------------+ | Database | +--------------------+ | information_schema | | mysql | | performance_schema | | tdb | | test | +--------------------+ 5 rows in set (0.03 sec) MariaDB [(none)]> use tdb Database changed MariaDB [tdb]> CREATE TABLE tb1 (ID INT); Query OK, 0 rows affected (0.02 sec)
node2上安裝httpd服務,並在其他主機測試是否可以正常訪問
# yum install -y httpd # cd /var/www/html # vim index.html <h1>node2</h1> [root@node1 ~]# curl http://172.16.103.2 <h1>node2</h1>
node2上安裝heartbeat:
# yum install perl-TimeDate net-snmp-libs libnet PyXML # rpm -ivh heartbeat-2.1.4-12.el6.x86_64.rpm heartbeat-pils-2.1.4-12.el6.x86_64.rpm heartbeat-stonith-2.1.4-12.el6.x86_64.rpm 在node1上覆制之前配置的heartbeat的配置文件,祕鑰文件以及資源文件至該節點: [root@node1 ha.d]# scp -p haresources ha.cf authkeys node2:/etc/ha.d
五、在兩個節點上啓動heartbeat服務並查看啓動的效果:
[root@node1 ~]# service heartbeat start Starting High-Availability services: 2014/09/08_19:27:47 INFO: Resource is stopped Done. [root@node2 ~]# service heartbeat start Starting High-Availability services: 2014/09/08_19:28:06 INFO: Resource is stopped Done.
在node1的日誌文件中查看服務啓動的結果:
[root@node1 ~]# tail /var/log/ha-log ResourceManager[12455]:2014/09/08_19:28:19 info: Running /etc/ha.d/resource.d/IPaddr 172.16.103.10/16/eth0/172.16.103.255 start IPaddr[12578]:2014/09/08_19:28:19 INFO: Using calculated netmask for 172.16.103.10: 255.255.0.0 IPaddr[12578]:2014/09/08_19:28:19 INFO: eval ifconfig eth0:0 172.16.103.10 netmask 255.255.0.0 broadcast 172.16.103.255 IPaddr[12549]:2014/09/08_19:28:19 INFO: Success Filesystem[12677]:2014/09/08_19:28:19 INFO: Resource is stopped ResourceManager[12455]:2014/09/08_19:28:19 info: Running /etc/ha.d/resource.d/Filesystem 172.16.103.3:/nfs/shared /mydata/data nfs start Filesystem[12755]:2014/09/08_19:28:19 INFO: Running start for 172.16.103.3:/nfs/shared on /mydata/data Filesystem[12744]:2014/09/08_19:28:19 INFO: Success ResourceManager[12455]:2014/09/08_19:28:19 info: Running /etc/init.d/mysqld start ResourceManager[12455]:2014/09/08_19:28:22 info: Running /etc/init.d/httpd start
查看資源啓動的情況:
[root@node1 ~]# ifconfig eth0 Link encap:Ethernet HWaddr 00:0C:29:0E:2D:35 inet addr:172.16.103.1 Bcast:172.16.255.255 Mask:255.255.0.0 inet6 addr: fe80::20c:29ff:fe0e:2d35/64 Scope:Link UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1 RX packets:243547 errors:0 dropped:0 overruns:0 frame:0 TX packets:93261 errors:0 dropped:0 overruns:0 carrier:0 collisions:0 txqueuelen:1000 RX bytes:292639466 (279.0 MiB) TX bytes:50676467 (48.3 MiB) eth0:0 Link encap:Ethernet HWaddr 00:0C:29:0E:2D:35 inet addr:172.16.103.10 Bcast:172.16.103.255 Mask:255.255.0.0 UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1 lo Link encap:Local Loopback inet addr:127.0.0.1 Mask:255.0.0.0 inet6 addr: ::1/128 Scope:Host UP LOOPBACK RUNNING MTU:16436 Metric:1 RX packets:0 errors:0 dropped:0 overruns:0 frame:0 TX packets:0 errors:0 dropped:0 overruns:0 carrier:0 collisions:0 txqueuelen:0 RX bytes:0 (0.0 b) TX bytes:0 (0.0 b)
[root@node1 ~]# service mysqld status MySQL running (13172) [ OK ] [root@node1 ~]# service httpd status httpd (pid 13239) is running...
如果停用node1上的服務,資源會自動切換到node2上:
[root@node1 ~]# service heartbeat stop Stopping High-Availability services: Done.
在node2上查看資源配置的情況:
[root@node2 ~]# ifconfig eth0 Link encap:Ethernet HWaddr 00:0C:29:E1:37:51 inet addr:172.16.103.2 Bcast:172.16.255.255 Mask:255.255.0.0 inet6 addr: fe80::20c:29ff:fee1:3751/64 Scope:Link UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1 RX packets:243742 errors:0 dropped:0 overruns:0 frame:0 TX packets:65339 errors:0 dropped:0 overruns:0 carrier:0 collisions:0 txqueuelen:1000 RX bytes:300473835 (286.5 MiB) TX bytes:9136036 (8.7 MiB) eth0:0 Link encap:Ethernet HWaddr 00:0C:29:E1:37:51 inet addr:172.16.103.10 Bcast:172.16.103.255 Mask:255.255.0.0 UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1 lo Link encap:Local Loopback inet addr:127.0.0.1 Mask:255.0.0.0 inet6 addr: ::1/128 Scope:Host UP LOOPBACK RUNNING MTU:16436 Metric:1 RX packets:0 errors:0 dropped:0 overruns:0 frame:0 TX packets:0 errors:0 dropped:0 overruns:0 carrier:0 collisions:0 txqueuelen:0 RX bytes:0 (0.0 b) TX bytes:0 (0.0 b)
[root@node2 ~]# service httpd status httpd (pid 8829) is running... [root@node2 ~]# service mysqld status MySQL running (8763) [ OK ]
至此,基於Heartbeat v1 配置httpd+mysql+nfs模擬實現。