?{ nfs共享mysql數據;nfs共享web資源 }
MySQL基于NFS共享數據
要求如下:
(1) 創建一個共享mydata,路徑為/mysql/data,客戶端1掛載至/mydata;而后客戶端1主機安裝mysql或mariadb,將數據目錄設定為/mydata,要確保mysql服務能正常 運行,但數據目錄位于samba server上;
(2) 客戶端2主機使用類似客戶端1主機的方式掛載mydata共享至本地的/mydata目錄,而后,直接安裝mysql或mariadb server,設定其數據目錄為/mydata;
測試:
(a) 客戶端1 mysql服務運行時,客戶端2的mysql服務能否啟動?
(b) 客戶端1 mysql服務停止時,客戶端2的mysql服務能否啟動?
測試環境
node1為nfs服務器,系統為CentOS 7.2
node2為mysql服務器1,系統為CentOS 6.8
node3為mysql服務器2,系統為CentOS 6.8
node1安裝nfs服務
yum -y install nfs-utils
配置共享目錄,設定用戶權限
node1創建一個uid=27,gid=27的系統用戶nfs_mysql,并賦予共享目錄 /mydata/data 的訪問控制權限??紤]到mysql的元數據生成和啟動mysqld服務時通常以root用戶執行,因此,nfs共享目錄可開啟no_root_squash
,讓root用戶和mysql用戶都有讀寫共享目錄的權限。如果共享目錄只給予mysql用戶有讀寫權限,則在客戶端啟動mysqld服務時必須以mysql用戶啟動mysqld服務,即su - mysql -c 'service mysqld start'
才能正常啟動服務。
mkdir -p /mydata/data
useradd -o -r -u 27 -g 27 -s /sbin/nologin nfs_mysql
setfacl -m u:nfs_mysql:rwx /mydata/data
vi /etc/exports
/mydata/data 10.1.253.69(rw,no_root_squash) 10.1.253.65(rw,no_root_squash)
開啟nfs服務,添加iptables規則
iptables應配置nfs的tcp/2049端口。由于nfs采用rpc機制建立連接,導致iptables很難進行規則匹配,因此我的做法是:客戶端先掛載nfs共享,建立連接之后在添加iptables規則。
systemctl start nfs.service
iptables -I INPUT -d 10.1.253.29 -m state --state NEW,ESTABLISHED -j ACCEPT
iptables -A INPUT -p tcp -d 10.1.253.29 --dport 2049 -m state --state NEW,ESTABLISHED -j ACCEPT
iptables -A INPUT -d 10.1.253.29 -j DROP
iptables -P INPUT ACCEPT
iptables -I OUTPUT -s 10.1.253.29 -m state --state ESTABLISHED -j ACCEPT
iptables -A OUTPUT -s 10.1.253.29 -j DROP
iptables -P OUTPUT ACCEPT
node2安裝mysql-server(yum 安裝)
mysql服務使用yum安裝與使用二進制通用包在修改默認數據路徑datadir時稍有不同。
yum -y install mysql-server mysql
node2掛載nfs共享至/mydata目錄,拷貝mysql數據
由于nfs開啟了不壓縮root權限,因此root用戶對/mydata目錄有讀寫權限。mysql的元數據可使用mysql_install_db
命令生成,也可拷貝yum安裝時生成的元數據到/mydata目錄下。
showmount -e 10.1.253.29
mount -t nfs 10.1.253.29:/mydata/data /mydata
cp -a /var/lib/mysql/* /mydata
修改mysql-server數據目錄
mysql客戶端連接mysqld服務時依賴于mysql.sock
文件,如果文件不存在或不對應會造成無法連接。默認的mysql.sock文件存放在 /tmp/mysql.sock
,因此一并修改為/mydata/mysql.sock
。
在CentOS 6中,mysqld啟動腳本默認指定datadir為/var/lib/mysql
,因此也需要對其進行修改,否則無法啟動mysqld服務。
vi /etc/my.cnf
[mysql]
port = 3306
socket = /mydata/mysql.sock
[mysqld]
datadir = /mydata
socket = /mydata/mysql.sock
vi /etc/rc.d/init.d/mysqld
get_mysql_option mysqld datadir "/mydata"
node2啟動mysqld服務
此處需要注意,root用戶對/mydata目錄有讀寫權限才能以root用戶啟動mysqld服務,否則只能以mysql用戶啟動mysqld服務,即su - mysql -c 'service mysqld start'
另外一點需要注意的是SELinux服務是否為Permissive
狀態
service mysqld start
mysql #正常連接mysqld服務
node3安裝mariadb-server(二進制通用程序)
二進制通用包安裝mysql與yum安裝mysql在修改默認數據目錄datadir時稍有不同。
創建mysql用戶
客戶端創建uid=27
的mysql用戶,目的是為了與nfs共享目錄的授權用戶做映射
useradd -r -u 27 -g 27 mysql
套路法安裝mariadb
tar xf mariadb-5.5.43-linux-x86_64.gz -C /usr/local/
cd /usr/local
chown -R root:mysql mariadb-5.5.43-linux-x86_64/
ln -s mariadb-5.5.43-linux-x86_64/ mysql
cp mysql/support-files/my-large.cnf /etc/my.cnf
cp mysql/support-files/mysql.server /etc/rc.d/init.d/mysqld
chmod +x /etc/rc.d/init.d/mysqld
chkconfig --add mysqld
echo 'export PATH=/usr/local/mysql/bin:$PATH'> /etc/profile.d/mysqld.sh
source /etc/profile.d/mysqld.sh
vi /etc/man.conf
MANPATH /usr/local/mysql/man
cd /usr/include/
ln -s ../mysql/include mysql
echo '/usr/local/mysql/lib' > /etc/ld.so.conf.d/mysql.conf
ldconfig
node3掛載nfs共享至/mydata目錄
由于node2中已經拷貝mysql元數據到/mydata目錄下,因此無需再做此操作。如果node2沒有拷貝數據到/mydata,此處需用mysql_install_db --user=mysql --datadir=/mydata
showmount -e 10.1.253.29
mount -t nfs 10.1.253.29:/mydata/data /mydata
修改mysql-server數據目錄
mysql客戶端連接mysqld服務時依賴于mysql.sock
文件,如果文件不存在或不對應會造成無法連接。默認的mysql.sock文件存放在 /tmp/mysql.sock
,因此一并修改為/mydata/mysql.sock
。
在CentOS 6中,mysqld啟動腳本默認指定datadir為/var/lib/mysql
,因此也需要對其進行修改,否則無法啟動mysqld服務。
vi /etc/my.cnf
[client]
port = 3306
socket = /mydata/mysql.sock
[mysqld]
port = 3306
datadir = /mydata
socket = /mydata/mysql.sock
vi /etc/rc.d/init.d/mysqld
datadir=/mydata
node3啟動mysqld服務
應關閉node2的mysqld服務,否則無法啟動。
service mysqld start
mysql
測試結果
-
客戶端1 mysql服務運行時,客戶端2的mysql服務能否啟動?
測試結果:不能同時啟動兩個mysql 服務,日志顯示為
161022 0:26:28 InnoDB: Completed initialization of buffer pool
InnoDB: Unable to lock ./ibdata1, error: 11
InnoDB: Check that you do not already have another mysqld process
InnoDB: using the same InnoDB data or log files.
-
客戶端1 mysql服務停止時,客戶端2的mysql服務能否啟動?
測試結果:關閉客戶端1 mysql 服務,客戶端2的 mysql 服務立即啟動
錯誤匯總
-
系統安全因素導致無法啟動mysqld服務
[Warning] Can't create test file /mydata/cent6.lower-test
[ERROR] Can't open the mysql.plugin table. Please run mysql_upgrade to create it.
解決:檢查/mydata/mysql目錄下的文件屬主屬組是否為mysql;檢查SELinux是否為Permissive或Disabled狀態
-
能夠啟動mysqld服務,但是mysql客戶端無法連接mysqld服務
ERROR 2002 (HY000): Can't connect to local MySQL server through socket '/mydata/mysql/mysql.sock' (111)
解決:原mysqld啟動服務時會創建 /tmp/mysql.sock 文件,導致mysql啟動時無法使用 /mydata/mysql.sock 文件,因此,刪除 /tmp/mysal.sock 文件即可。
依然報錯顯示無法連接'/var/lib/mysql/mysql.sock'
ERROR 2002 (HY000): Can't connect to local MySQL server through socket '/var/lib/mysql/mysql.sock' (2)
解決:ln -s /mydata/mysql.sock /var/lib/mysql/mysql.sock
總結
mysql服務通過nfs服務存儲數據的方式使得多臺mysql服務器之間得以共享數據,適用于生產環境中分布式數據共享的情況。本文特意適用兩種不同的mysql安裝方式,node2使用rpm包安裝,node3使用通用二進制程序包安裝,目的在于融合不同情況下的解決辦法。本次實驗的mysql數據文件僅是安裝時生成的,如果數據文件較多且非常重要,通常建議先備份數據庫,以免造成損失。
HTTPD基于NFS共享數據
要求:
-
nfs共享/data/application/web,在目錄中提供wordpress;
-
部署兩臺amp服務器,均掛載此共享作為某主機的文檔映射路徑;
-
驗正兩臺主機上的wordpress是否可被同時訪問;
(a) 發布一篇文章,驗正圖片上傳等功能;
(b) 在任一客戶端上訪問此應用,多次刷新,確認下所有資源訪問是否正常
測試環境
node1為nfs服務器,系統為CentOS 7.2
node2為web服務器1,系統為CentOS 6.8
node3為web服務器2,系統為CentOS 6.8
node4為DNS服務器,系統為CentOS 7.2
node1安裝nfs服務
yum -y install nfs-utils
配置共享目錄,設定用戶權限
node1創建一個uid=48,gid=48的系統用戶apache,并賦予共享目錄 /mydata/wordpress 的訪問控制權限??紤]到啟動httpd服務時通常以root用戶執行,因此,nfs共享目錄可開啟no_root_squash
,讓root用戶和apache用戶都有讀寫共享目錄的權限。如果共享目錄只給予apache用戶有讀寫權限,則在客戶端啟動httpd服務時必須以apache用戶啟動httpd服務,即su - apache -c 'service httpd start'
才能正常啟動服務。
mkdir -p /mydata/wordpress
useradd -o -r -u 48 -g 48 -s /sbin/nologin apache
setfacl -m u:apache:rwx /mydata/wordpress
vi /etc/exports
/mydata/wordpress 10.1.253.69(rw,no_root_squash) 10.1.253.65(rw,no_root_squash)
開啟nfs服務,添加iptables規則
iptables應配置兩個端口的出入規則,tcp/2049端口為nfs服務,tcp/3306端口為mysqld服務。由于nfs采用rpc機制建立連接,導致iptables很難進行規則匹配,因此我的做法是:客戶端先掛載nfs共享,建立連接之后再添加iptables規則。
systemctl start nfs.service
iptables -I INPUT -d 10.1.253.29 -m state --state NEW,ESTABLISHED -j ACCEPT
iptables -A INPUT -p tcp -d 10.1.253.29 -m multiport --dports 2049,3306 -m state --state NEW,ESTABLISHED -j ACCEPT
iptables -A INPUT -d 10.1.253.29 -j DROP
iptables -P INPUT ACCEPT
iptables -I OUTPUT -s 10.1.253.29 -m state --state ESTABLISHED -j ACCEPT
iptables -A OUTPUT -s 10.1.253.29 -j DROP
iptables -P OUTPUT ACCEPT
node1安裝mysql服務
在node1上安裝mysql服務器,wordpress程序把數據保存在node1的mysql數據庫中,wordpress站點文檔通過nfs共享給node2和node3,以提高web服務的可用性。
yum install mariadb mariadb-server
systemctl start mariadb
mysql_secure_installation
創建wordpress數據庫
mysql數據庫在node1,如果遠程web服務器可以訪問數據庫,應授權給遠程主機的ip地址或者網絡地址10.1.253.%
,授權完成后建議先測試能否正常訪問
mysql -p -e 'CREATE DATABASE wordpress;GRANT ALL ON wordpress.* TO "wp"@"10.1.253.%" IDENTIFIED BY "admin"'
mysql -p -e 'GRANT ALL ON wordpress.* TO "wp"@"localhost" IDENTIFIED BY "admin"'
#驗證能否登錄
mysql -uwp -p
node2、node3安裝httpd、php服務
yum install httpd php php-mysql php-xcache nfs-utils
配置虛擬主機
node2與node3都是web服務器,配置完全相同,可把wordpress配置成物理主機或虛擬主機。httpd-2.2配置虛擬主機應把物理主機注釋掉。
#注釋物理主機
vi /etc/httpd/conf/httpd.conf
#DocumentRoot "/var/www/html"
#配置虛擬主機
vi /etc/httpd/conf.d/vh_wordpress.conf
<Virtualhost *:80>
Servername www.jasonmc.com
DocumentRoot /data/wordpress
<Directory />
Options FollowSymLinks
AllowOverride None
</Directory>
</VirtualHost>
啟動httpd服務
httpd -t
service httpd start
node4安裝DNS服務
dns服務器解析jasonmc.com這個域,兩條A記錄分別指向node2和node3,如果想通過dns輪詢兩臺web服務器,可設置較短的TTL值,以刷新dns緩存。
yum install bind
修改主配置文件
vi /etc/named.conf
#listen-on port 53 { 127.0.0.1; };
#listen-on-v6 port 53 { ::1; };
#allow-query { localhost; };
添加域
vi /etc/named.rfc1912.zones
zone "jasonmc.com" IN {
type master;
file "jasonmc.com.zone";
};
zone "253.1.10.in-addr.arpa" IN {
type master;
file "10.1.253.zone";
};
添加域配置文件
vi /var/named/jasonmc.com.zone
$TTL 86400
@ IN SOA ns1. admin. ( 16101601 1800 600 1W 300 )
IN NS ns1
ns1 IN A 10.1.253.72
websrv IN A 10.1.253.65
websrv IN A 10.1.253.69
www IN CNAME websrv
* IN CNAME websrv
@ IN A 10.1.253.65
vi /var/named/10.1.253.zone
$TTL 86400
@ IN SOA ns1.jasonmc.com admin.jasonmc.com ( 16101601 1800 600 1W 300 )
IN NS ns1.
72 IN PTR ns1.jasonmc.com.
65 IN PTR www.jasonmc.com.
69 IN PTR www.jssonmc.com.
簡單測試
修改測試機的dns地址為node4,如圖,能夠解析jasonmc.com域
測試結果
初始化wordpress
由于mysql服務器在node1,因此,在安裝wordpress時應指明mysql服務器的地址。此外,wordpress這個database已授權給wp
用戶和10.1.253.%
網段,才能按圖完成配置。初始化時訪問web1或web2皆可,配置完成后在站點文檔目錄下生成wp-config.php
文件,如想重新配置可修改或刪除此文件。
發布一篇圖文博客
驗證圖片上傳功能,發布后在web1和web2都可以看到這篇文章
同時訪問node2和node3
為了測試xcache對php資源的加速效果,特意在node2中安裝了xcache拓展模塊。關閉瀏覽器緩存后經反復測試,可看出加速效果明顯。
DNS輪詢
由于dns緩存的原因,此處不修改dns服務器的區域文件,僅把其中一臺web服務器的ip地址添加到另一臺中,以模擬web服務冗余功能。
-
node2單點故障,node3接管其ip,刷新網頁可正常訪問
[node2]service network stop
[node3]ip addr add 10.1.253.69/16 dev eth0 -
-
node3單點故障,node2接管其ip,刷新網頁可正常訪問
[node3]service network stop
[node2]ip addr add 10.1.253.65/16 dev eth0 -
總結
經填坑之后,實現了兩臺web服務器共享mysql和站點文檔的網絡環境,這種模型在實際環境中也很常見,無非就是有更多的節點,以實現web服務的高可用性和高性能。
由于wordpress中文版引用了fonts.googleapis.com提供的字體,或者說wordpress引用了互聯網上的字體,導致web資源加載非常慢,解決辦法有很多種,比如安裝wordpress插件disable-google-fonts可加速訪問。
原創文章,作者:helloc,如若轉載,請注明出處:http://www.www58058.com/56263