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