☞{ 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.178linux.com/56263

(0)
hellochelloc
上一篇 2016-10-20
下一篇 2016-10-20

相关推荐

  • rsync+inotify实现实时同步案例

    随着应用系统规模的不断扩大,对数据的安全性和可靠性也提出的更好的要求,rsync在高端业务系统中也逐渐暴露出了很多不足,首先,rsync同步数据时,需要扫描所有文件后进行比对,进行差量传输。如果文件数量达到了百万甚至千万量级,扫描所有文件将是非常耗时的。而且正在发生变化的往往是其中很少的一部分,这是非常低效的方式。其次,rsync不能实时的去监测、同步数据,…

    Linux干货 2016-10-30
  • Linux系统启动过程中grub故障与修复(一)

    GRUB 是引导装入器 — 它负责装入内核并引导 Linux 系统。GRUB 可以引导多种操作系统,如Linux、 DOS、 Windows 。 GRUB共分为三个阶段:stage1主要负责BIOS和GRUB之间的交接,载入存放于各个分区中的开机文件;stage1.5是连接stage1和stage2之间的通道,起着过渡的作用,负责识别stage2所在/bo…

    2017-09-03
  • Hadoop简介

    我们之前已经解释过了分布式存储,分布式存储有很多的解决方案,其中有个开源程序叫做HDFS,HDFS+MAPREDUCE=hadoop。 hadoop不算是单存的分布式存储,我们之前提到的Mogilefs和Fastdfs都是分布式存储。hadoop属于分布式计算,MAPREDUCE是一个编程的框架,使得程序可以并行计算。 HDFS适用于存储单个大文件,在存储中…

    2017-03-13
  • linux基础学习之SElinux

    1、SElinux简介 SELinux: Secure Enhanced Linux,是美国国家安全局「NSA=The National Security Agency」和SCC(Secure Computing Corporation)开发的Linux的一个强制访问控制的安全模块。2000年以GNU GPL发布,Linux内核2.6版本后集成在内核中 2、…

    Linux干货 2016-09-15
  • VimTutor(上)

    柚子翻译,如有理解错误或翻译错误,请指正! VimTutor Vim是一款强大的文本编辑器,拥有多命令的特性,tutor解释了其中大多数命令。 tutor是为了描述足够多的Vim命令帮助你轻松使用Vim而被制作的,使Vim能成为一个可完成你所有工作意图的编辑器。 完成tutor的内容大概需要25-30分钟,所完成时间取决于你通过时间积累的经验。 注意: 1.…

    Linux干货 2015-10-18
  • 我与Linux的第一次亲密接触

        作为一个新手,经过一周的学习,我对Linux目前有了些许的了解,从Linux的发展史中,开源共享精神深深的感染了我,也使得我对Linux的兴趣更加浓厚。对于一个一直翘计算机课的我来说,入门和基础是一项非常艰巨的任务,初期为了搭建学习的环境,也是费了不小的功夫,相信许多萌也对此有很大的感触,在这里,我来和大家分享一下如何去构建环境。…

    Linux干货 2017-03-26