?{ nfs共享mysql數據;nfs共享web資源 }

?{ 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 

01.jpg

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 服務立即啟動

錯誤匯總

  1. 系統安全因素導致無法啟動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狀態
  1. 能夠啟動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共享數據

要求:

  1. nfs共享/data/application/web,在目錄中提供wordpress;

  2. 部署兩臺amp服務器,均掛載此共享作為某主機的文檔映射路徑;

  3. 驗正兩臺主機上的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 

02.jpg

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程序把數據保存在node1mysql數據庫中,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域 

03.jpg

測試結果

初始化wordpress

由于mysql服務器在node1,因此,在安裝wordpress時應指明mysql服務器的地址。此外,wordpress這個database已授權給wp用戶和10.1.253.%網段,才能按圖完成配置。初始化時訪問web1或web2皆可,配置完成后在站點文檔目錄下生成wp-config.php文件,如想重新配置可修改或刪除此文件。 

04.jpg

發布一篇圖文博客

驗證圖片上傳功能,發布后在web1和web2都可以看到這篇文章 

05.jpg

同時訪問node2和node3

為了測試xcache對php資源的加速效果,特意在node2中安裝了xcache拓展模塊。關閉瀏覽器緩存后經反復測試,可看出加速效果明顯。 

06.jpg

DNS輪詢

由于dns緩存的原因,此處不修改dns服務器的區域文件,僅把其中一臺web服務器的ip地址添加到另一臺中,以模擬web服務冗余功能。

  • node2單點故障,node3接管其ip,刷新網頁可正常訪問 
    [node2]service network stop 
    [node3]ip addr add 10.1.253.69/16 dev eth0 

  • 07.jpg

  • node3單點故障,node2接管其ip,刷新網頁可正常訪問 
    [node3]service network stop 
    [node2]ip addr add 10.1.253.65/16 dev eth0 

  • 08.jpg

總結

經填坑之后,實現了兩臺web服務器共享mysql和站點文檔的網絡環境,這種模型在實際環境中也很常見,無非就是有更多的節點,以實現web服務的高可用性和高性能。

由于wordpress中文版引用了fonts.googleapis.com提供的字體,或者說wordpress引用了互聯網上的字體,導致web資源加載非常慢,解決辦法有很多種,比如安裝wordpress插件disable-google-fonts可加速訪問。

原創文章,作者:helloc,如若轉載,請注明出處:http://www.www58058.com/56263

(0)
hellochelloc
上一篇 2016-10-20 20:35
下一篇 2016-10-20 21:00

相關推薦

  • 探索這個“男人”

    一、前言 正所謂了解一個命令就得了解他的用法,正好是要了解一個人就得了解他的興趣愛好,處事態度以及為人是怎么樣的。 二、man是什么 man – an interface to the on-line reference manuals Man是manual(手冊)的縮寫,使用權限是所有用戶,man命令提供為linux系統在線提供了很好的幫助手冊…

    Linux干貨 2016-05-03
  • Linux運維學習歷程-第八天-Linux文本工具sed與Vim(vi)

    概述:    本篇我們主要學習兩個功能非常強大的文本編輯器,了解這兩種文本編輯器的各自的特點 一、sed命令:  1、sed簡介:     sed(Stream EDitor)是一種流編輯器、行編輯器。逐行處理文本內容,即一次處理一行內容,處理時,當前處理的行存儲在“模式空間”(pattern sp…

    Linux干貨 2016-08-15
  • 創建LVM分區實例

                         內容概述   LVM邏輯卷的定義                       &nbsp…

    2017-06-25
  • MBR分區結構

    MBR分區結構 一、硬盤主引導記錄MBR由4個部分組成: 1、主引導程序(偏移地址0000H–0088H),它負責從活動分區中裝載,并運行系統引導程序。 2、出錯信息數據區,偏移地址0089H–00E1H為出錯信息,00E2H–01BDH全為0字節。 3、分區表(DPT,Disk Partition Table):含4個分…

    2017-08-20
  • LB Cluster 負載均衡集群 —-lvs 配置詳解

    lvs : ipvs scheduler: 根據其調度時是否考慮各RS當前的負載狀態,可分為靜態方法和動態方法兩種: 1、靜態方法:僅根據算法本身進行調度; RR:roundrobin,輪詢; WRR:Weighted RR,加權輪詢; SH:Source Hashing,實現session sticy,源IP地址hash;將來自于同一個IP地址的請求始終發…

    Linux干貨 2016-10-30
  • linux基礎知識

    馮*諾依曼體系 摩爾定律

    2018-03-26
欧美性久久久久