☞{ 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)
上一篇 2016-10-20 20:35
下一篇 2016-10-20 21:00

相关推荐

  • Linux 磁盘、文件系统管理

    Linux 磁盘、文件系统管理                                               &nb…

    Linux干货 2016-09-01
  • 当Web访问性能出现问题,如何深探?

    对运维或开发工程师来说,遇到访问性能问题时,最先需要定位的是问题出现在哪个环节,是网络的问题,服务端的问题,还是客户端的问题? 往往技术人员喜欢把精力放在保障后端服务的可用性方面,而对前端界面是否能正常装载,是否能完整渲染不是太关心。但从业务的角度来说,界面承载的才是最终的业务,业务是通过人机交互来实现的。 日常我们遇到哪些场景需要定位访问性能瓶颈? ·不同…

    系统运维 2017-01-09
  • 文本处理三剑客之Sed(行编辑器)

    sed(流编辑器,行编辑器)     是一种流编辑器,一次处理一行内容,处理时把当前处理的行存储在临时缓存中,成为“模式空间”,接着用sed命令处理缓冲区的内容,处理完毕后吧缓冲区内容输出到屏幕接着处理下一行。这样不断重复到末尾。文件内容并没有改变。除非使用重定向输出才会改变内容。 sed:行编辑器(全屏编辑器:vi)   &n…

    Linux干货 2016-08-15
  • Elasticsearch 5.0 集群

    IT运维 www.chinasa.net 下载地址:https://www.elastic.co/downloads/elasticsearch 1、JDK 安装略过 node1 部署 2、Elasticsearch安装 #tar zxvf elasticsearch-5.0.0.tar.gz -C /opt/ #cd /opt #mv elast…

    系统运维 2016-12-27
  • linux 哲学思想

    一切皆文件:普通文件,目录、字符设备、块设备、套接字在linux中都是以文件被对待;虽然类型不通,但是对其提供得却都是统一套操作界面。 由众多的单一程序,一个程序只实现一个功能,多个程序组合完成负责任务。单一的程序可以保持高效的执行效率,对于复杂的功能linux通过许多简单程序组合等方式实现,在保证简单程序的高效性同时,复杂的程序也必然是高效性的。 文本文件…

    Linux干货 2017-08-19
  • iptables实验2

    IPTABLES   实验2       实验大体结构图       相关概念及公式 源地址转换:    SNAT   POSTROUTING 目标地址转换:DNAT  PREROUTING   每次重启网络后…

    Linux干货 2016-10-24