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

相关推荐

  • Linux Shell(脚本)编程入门

    为什么要进行shell编程 在Linux系统中,虽然有各种各样的图形化接口工具,但是sell仍然是一个非常灵活的工具。Shell不仅仅是命令的收集,而且是一门非常棒的编程语言。您可以通过使用shell使大量的任务自动化,shell特别擅长系统管理任务,尤其适合那些易用性、可维护性和便携性比效率更重要的任务。 下面,让我们一起来看看shell是如何工作的: 建…

    Linux干货 2017-08-05
  • N25-第三周作业

    N25第三周作业 博客作业 1、列出当前系统上所有已经登录的用户的用户名,注意:同一个用户登录多次,则只显示一次即可。 [root@ip-172-31-25-9 ~]# who|awk '{print $1}'|sort -u ec2-user [root@ip-172-31-25-9&n…

    Linux干货 2017-02-06
  • 自建回收站

    linux 自添加回收站 (1)建立一个回收站目录 mkdir /tmp/trash_tmp (2) 编辑一个文件 vi /bin/trash mv $@ /tmp/trash_tmp :wq 保存退出 (3)添加别名 alias rm=/bin/trash (4)编辑/etc/bashrc 在最后一行添加alias rm=/bin/trash (5)给予目…

    Linux干货 2017-09-04
  • shell脚本编程2

    shell脚本编程2   今天继续学习了shell脚本编程,续之前写的脚本编程1。上次主要学了编程的基础,脚本格式,变量类型及变量的使用,条件测试,数字运算并且进行了部分练习,因为这部分逻辑思维能力要求不是很高,因此记忆起来难度不是特别大。   从今天开始便进入了流程控制以及函数、数组、高级字符串操作、高级变量等内容的学习,总体来说难度和…

    Linux干货 2016-08-16
  • sed和awk和数组实践-week15

    1、总结sed和awk的详细用法; (1) sedsed:Stream EDitor,流编辑器,行编辑器 基本原理:一次从文本中读取一行,放到sed自己的工作车间加工, 该工作车间叫做模式空间(pattern space)判断该行是否符合过滤模式, 如果符合过滤模式: 送往标准输出(终端) 执行编辑操作, 从模式空间中处理以后,处理过后送到标准输出(不一定有…

    Linux干货 2017-05-06
  • http和apache服务器

    超文本传输协议(HTTP,HyperText Transfer Protocol)是互联网上应用最为广泛的一种网络协议。所有的WWW文件都必须遵守这个标准。设计HTTP最初的目的是为了提供一种发布和接收HTML页面的方法。 http/1.1 :1997年1月 引入了持久连接(persistent connection) , tcp连接默认不关闭,可以被多个请…

    2017-12-05