web集群综合项目
实验描述:
在此项目中,为了使公司内部的web站点提供更稳定的服务,搭建负载均衡群集以及故障转移群集,具体拓扑环境如下;
实验环境:
主机
Ip地址
软件
主调度器
192.168.100.150
kernel-devel openssl-devel popt-devel ipvsadm keepalived-1.2.13.tar.gz
从调度器
192.168.100.151
kernel-devel openssl-devel popt-devel ipvsadm keepalived-1.2.13.tar.gz
Web站点1
192.168.100.152
Lamp平台
Web站点2
192.168.100.153
Lamp平台
Web站点3
192.168.100.154
Lamp平台
Nfs服务器1
192.168.100.155
nfs-utils rpcbind kernel-devel openssl-devel popt-devel ipvsadm keepalived-1.2.13.tar.gz
Nfs服务器2
192.168.100.156
nfs-utils rpcbind kernel-devel openssl-devel popt-devel ipvsadm keepalived-1.2.13.tar.gz
amoeba代理服务器
192.168.100.157
amoeba-mysql-binary-2.2.0.tar.gz jdk-6u14-linux-x64.bin
数据库master节点
192.168.100.158
Lamp平台
数据库slave1节点
192.168.100.159
Lamp平台
数据库slave2节点
192.168.100.160
Lamp平台
实验思路:
此项目中,前端搭建了lvs网站负载群集,通过lvs来完成网站的节点健康检查和负载,为了保证lvs调度器的稳定,搭建keepalived完成调度器的双机热备,web站点的存储连接着后端的nfs服务器,使用aotufs网络挂载的方式,在nfs共享存储服务器中同样也搭建了keepalived双机热备,同时也保证了nfs存储的稳定,另一端是web站点连接的mysql数据库,数据库采用主从复制、读写分离的方案,另外通过代理服务器amoeba提供到web站点进行服务,这里的web服务器部署了lamp平台,动静页面及于一身的server;
实验步骤:
部署后端数据库
搭建时间服务器:
主节点上安装ntp时间服务:192.168.100.158
yum -y install ntp
sed -i ‘/^server/s/^/#/g‘ /etc/ntp.conf
cat <>/etc/ntp.conf
server 127.127.1.0
fudge 127.127.1.0 stratum 8
END
/etc/init.d/ntpd restart
chkconfig ntpd on
netstat -utpln |grep ntp
从节点同步时间:192.168.100.159-160
yum -y install ntpdate
/usr/sbin/ntpdate 192.168.100.158
安装mysql:192.168.100.158-160
wget ftp://ftp.linuxfan.cn/tools/lamp_install_publis-app-2015-07-16.tar.xz
tar Jxvflamp_install_publis-app-2015-07-16.tar.xz
cd bin/
./ mysql_install.sh
./mysql_config.sh
配置MySQL主从复制:
1)主服务器配置:192.168.100.158
sed -i‘s/^log-bin=.*/log-bin=master-bin\nlog-slave-updates=ture/g‘ /etc/my.cnf ##更改配置文件中的某个部分
sed -i ‘/^server-id/s/1/11/g‘/etc/my.cnf ##更改server id 为11 ,此为服务器的id号,在数据库中是唯一的。
/etc/init.d/mysqld restart ##重新启动mysql服务
yum -y install mysql
mysql -uroot -p123123 ##进入数据库
mysql> grant replication slave on *.* to‘myslave‘@‘192.168.100.%‘ identified by ‘123123‘; ##进入数据库后进行授权访问
mysql> flush privileges; ##刷新授权的权限
mysql> show master status; ##记住File的及Position的值,此处为master-bin.000001和337 ,需要在从服务器上用到
mysql> create database db_test; ##创建文件测试数据库
mysql> quit
配置从服务器1:192.168.100.159
sed -i ‘/^server-id/s/1/22/g‘/etc/my.cnf ##更改server id为22
sed -i‘/^server-id/arelay-log=relay-log-bin\nrelay-log-index=slave-relay-bin.index‘/etc/my.cnf ##替换mysql配置文件,
/etc/init.d/mysqld restart ##重启mysql服务
yum -y install mysql
mysql -uroot -p123123 ##登陆数据库
mysql> change master tomaster_host=‘192.168.100.158‘,master_user=‘myslave‘,master_password=‘123123‘,master_log_file=‘master-bin.000001‘,master_log_pos=339; ##进行指定mysql的服务器的master-bin,注意在指定master的时候是stop slave的状态下,不能再开启的状态下指定。
mysql> start slave; ##启动slave
mysql> show slave status\G; ##查看无error即可,并且两个running为yes
mysql> show databases; ##验证数据库是否同步,验证在主服务器上登陆数据库创建的文件是否同步
mysql> quit ##退出mysql数据库
配置从服务器2:192.168.100.160
sed -i ‘/^server-id/s/1/33/g‘ /etc/my.cnf
sed -i‘/^server-id/arelay-log=relay-log-bin\nrelay-log-index=slave-relay-bin.index‘/etc/my.cnf
/etc/init.d/mysqld restart
yum -y install mysql
mysql -uroot -p123123
mysql> change master to master_host=‘192.168.100.158‘,master_user=‘myslave‘,master_password=‘123123‘,master_log_file=‘master-bin.000001‘,master_log_pos=339;
mysql> start slave;
mysql> show slave status\G; ##查看error=0即可
mysql> show databases; ##验证数据库是否同步
mysql> quit
注:两个从服务器的配置基本相同,指定的server id 不能相同。
搭建MySQL读写分离:
1)安装软件:192.168.100.157
lftp ftp.linuxfan.cn
>cd tools/
> get amoeba-mysql-binary-2.2.0.tar.gz jdk-6u14-linux-x64.bin
>bye
yum -y remove java
chmod +x jdk-6u14-linux-x64.bin
./jdk-6u14-linux-x64.bin
mv jdk1.6.0_14/ /usr/local/jdk1.6
vi/etc/profile
export JAVA_HOME=/usr/local/jdk1.6
exportCLASSPATH=$CLASSPATH:$JAVA_HOME/lib:$JAVA_HOME/jre/lib
exportPATH=$JAVA_HOME/lib:$JAVA_HOME/jre/bin/:$PATH:$HOME/bin
export AMOEBA_HOME=/usr/local/amoeba
export PATH=$PATH:$AMOEBA_HOME
:wq
source /etc/profile
java -version
mkdir /usr/local/amoeba
tar zxvf amoeba-mysql-binary-2.2.0.tar.gz-C /usr/local/amoeba/
chmod -R 755 /usr/local/amoeba/
/usr/local/amoeba/bin/amoeba ##验证
2)数据授权给amoeba读写权限:
mysql> grant all on *.* to linuxfan@‘192.168.100.%‘identified by ‘123123‘; ##在192.168.100.158完成
mysql> show grants forlinuxfan@‘192.168.100.%‘; ##在192.168.100.159-160同步了权限
3)代理服务器修改配置文件:192.168.100.157
vim /usr/local/amoeba/conf/amoeba.xml
30amoeba
31
32123456
115 master
116
117master ##注意删除的注释
118 slaves
:set nu##显示行号
:wq
vim /usr/local/amoeba/conf/dbServers.xml
25
26 linuxfan ##该用户必须是上一步授权的用户
27
28 ##修改
29 123123 ##删除下一行的“-->”
44##修改为master
45
46
47 192.168.100.158 ##指定正确的master的ip
51##修改为slave1
52
53
54 192.168.100.159 ##指定slave1的ip地址
55
56
57##添加如下6行,指定slave2的ip
58
59
60192.168.100.160
61
62
64 ##修改为slaves
70 slave1,slave2 ##修改集群的成员名称用逗号隔开
:wq
/usr/local/amoeba/bin/amoebastartdochkconfig $i on; done ##设置为开机启动
2.设置共享目录
[root@localhost ~]# mkdir /opt/wwwroot
[root@localhost ~]# chmod 755/opt/wwwroot ##设置权限
vi /etc/exports
/opt/wwwroot 192.168.100.0/24(rw,sync,no_root_squash)
3.启动nfs服务程序
[root@localhost ~]# /etc/init.d/rpcbindrestart
[root@localhost ~]# /etc/init.d/nfs restart
chkconfig rpcbind on
chkconfig nfs on
[root@localhost ~]# netstat -utpnl |greprpcbind
[root@localhost ~]# showmount -e ##查看本机共享的目录
搭建NFS服务器的keepalived双机热备;
1.安装keepalived(主从上都需要安装)192.168.100.155-156
yum -y install kernel-devel openssl-develpopt-devel ipvsadm
lftp ftp.linuxfan.cn
lftp ftp.linuxfan.cn:/tools> getkeepalived-1.2.13.tar.gz
tar -zxvf keepalived-1.2.13.tar.gz -C/usr/src/
cd /usr/src/keepalived-1.2.13/
./configure --prefix=/--with-kernel-dir=/usr/src/kernels/2.6.32-431.el6.x86_64/
make
主配置:(192.168.100.155上操作)
cd /etc/keepalived/
mv keepalived.conf keepalived.conf.bak
vi /etc/keepalived/keepalived.conf
global_defs {
router_id HA_TEST_R1 ##本服务器的名称,若环境中有多个 keepalived时,此名称不能一致
}
vrrp_instance VI_1 { ##定义VRRP热备实例,每一个keep组都不同
state MASTER ##MASTER表示主服务器
interface eth0 ##承载VIP地址的物理接口
virtual_router_id 1 ##虚拟路由器的ID号,每一个keep组都不同
priority 100 ##优先级,数值越大优先级越高
advert_int 1 ##通告间隔秒数(心跳频率)
authentication { ##认证信息
auth_type PASS ##认证类型
auth_pass 123456 ##密码字串
}
virtual_ipaddress {
192.168.100.95 ##指定漂移地址(VIP)
}
}
从配置:(192.168.100.156上操作)
cd /etc/keepalived/
mv keepalived.conf keepalived.conf.bak
vi /etc/keepalived/keepalived.conf
global_defs {
router_id HA_TEST_R2 ##本服务器的名称
}
vrrp_instance VI_1 {
state BACKUP ##SLAVE表示从服务器
interface eth0
virtual_router_id 1
priority 99 ##优先级,低于主服务器
advert_int 1
authentication {
auth_type PASS
auth_pass 123456
}
virtual_ipaddress {
192.168.100.95
}
}
3.启动服务及应用服务:192.168.100.155-156
1)启动keepalived:
/etc/init.d/keepalived start
ip addr show dev eth0 ##验证vip是否在主服务器上
4.配置rsync实现两台nfs服务器的目录实时同步;192.168.100.155-156
备份源:192.168.100.156
yum -y install rsync ##确认安装rsync软件
发起端:192.168.100.155
ssh-keygen-t rsa ##创建以密钥对加密的方式,远程时不用密码
ssh-copy-idroot@192.168.100.156 ##将公钥发送给备份源
sshroot@192.168.100.156 ##此时远程将不需要密码
lftp ftp.linuxfan.cn
cd /tools
get inotify-tools-3.14.tar.gz
tarzxvf inotify-tools-3.14.tar.gz -C/usr/src/ ##解压inotify
cd/usr/src/ inotify-tools-3.14/
./configurethen
/etc/init.d/network restart
ip addr show dev lo:0
fi
###############change kernel args##########
cat <> /etc/sysctl.conf
net.ipv4.conf.all.arp_ignore = 1
net.ipv4.conf.all.arp_announce = 2
net.ipv4.conf.default.arp_ignore = 1
net.ipv4.conf.default.arp_announce = 2
net.ipv4.conf.lo.arp_ignore = 1
net.ipv4.conf.lo.arp_announce = 2
END
grep arp /etc/sysctl.conf
if [ $? -eq 0 ];then
sysctl -p
fi
##################set route#############
echo "route add -host $VIP devlo:0" >>/etc/rc.local
source /etc/rc.local
route add -host $VIP dev lo:0
ip r |grep $VIP
#################check iptables
mysql> grant all on bbsdb.* to‘runbbs‘@‘localhost‘ identified by ‘123123‘;
mysql> flush privileges;
mysql> quit
2.下载discuz并发布:在NFS服务器中192.168.100.155上
lftp ftp.linuxfan.cn
cd /tools
get discuz_7.2_full_sc_utf8.zip
bye
mkdir /opt/wwwroot/bbs
unzip discuz_7.2_full_sc_utf8.zip -ddiscuz ##解压
cp -rf discuz/upload/* /opt/wwwroot/bbs
cd /opt/wwwroot/bbs/
chown daemon forumdata/ attachments/uc_client/data/cache/ templates/ config.inc.php -R
3.访问安装:
http://www.linuxfan.cn /bbs /install/
在mysql 数据库中可以看到该项目的写入记录;
4.安装完成后的处理:
mv install/ install.lock
chmod 600 install.lock/
二:发布wordpress博客系统:
1.配置数据库:
mysql> create database wpdb;
mysql> grant all on wpdb.* to‘wpadm‘@‘localhost‘ identified by ‘123123‘;
mysql> quit
2.下载wordpress,并发布:
wgethttps://cn.wordpress.org/wordpress-4.4.1-zh_CN.zip
unzip wordpress-4.4.1-zh_CN.zip
cp wordpress/usr/local/httpd/htdocs/linuxfan/ -rf
cd /usr/local/httpd/htdocs/linuxfan/wordpress/
cp wp-config-sample.php wp-config.php
##修改配置文件可以使用vimwp-config.php
sed -i ‘s/database_name_here/wpdb/g‘wp-config.php
sed -i ‘s/username_here/wpadm/g‘wp-config.php
sed -i ‘s/password_here/123123/g‘wp-config.php
3.访问:
http://www.linuxfan.cn/wordpress/
补充:
实验中所用到的脚本内容;
cat apache_install.sh
#!/bin/bash
#by linuxfan
rpm -e httpd httpd-manual --nodeps
ls /root/httpd*
if [ $? -eq 0 ];then
tar zxvf /root/httpd-2.2.17.tar.gz -C/usr/src/
cd /usr/src/httpd-2.2.17/
./configure --prefix=/usr/local/httpd--enable-rewrite --enable-so --disable-access 1>/dev/null
make then
echo "mysql installsuccessfully."
fi
cat php_install.sh
#!/bin/bash
##by linuxfan 20150611
#1.卸载已经安装rpm包
rpm -qa |grep php
if [ $? -eq 0 ];then
rpm -e php php-mysql --nodeps
fi
#2.安装mcrypt支持,安装的顺序必须libmcrypt-->mhash-->mcrypt,每安装都必须ln链接到系统库中,echo"/usr/local/lib/" >>/etc/ld.confthen
echo "PATH is set."
else
echo "export PATH=$PATH:/usr/local/mysql/bin" >>/etc/profile
source /etc/profile ##执行文件
fi
#4.初始化mysql,创建用户,赋权
useradd -M -s /sbin/nologin mysql
chown -R mysql:mysql /usr/local/mysql
/usr/local/mysql/scripts/mysql_install_db \
--basedir=/usr/local/mysql \
--datadir=/usr/local/mysql/data--user=mysql
#5.启动mysql,并设置为开机启动
if [ -e /tmp/mysql.sock ];then
/etc/init.d/mysqld restart
else
/etc/init.d/mysqld start
fi
chkconfig mysqld on
#6.修改密码,并提示密码
mysqladmin -u root password ‘123123‘ then
echo "mysql is running."
else
/etc/init.d/mysqld start
fi
实验难点:
1.在web站点挂载nfs的存储时,容易出现挂载目录全部删除的情况或者是挂载不上,此时停止autofs的服务,umount掉挂载点,检查autofs的配置文件,检查nfs服务器的共享目录,然后再启动autofs服务;
2.在此项目中,web站点将nfs服务器的共享目录挂载到了apache的安装目录下的htdocs网页存放目录中,可能出现的情况是autofs挂载成功,但是httpd/目录下的文件全部没有了,此时无法启动httpd/bin/apachectl服务,解决办法:先将autofs服务停止,umount掉挂载点,启动apache服务,检查80端口号,然后再将apache服务启动;
3.部署后端数据库时,配置数据库之后的初始化过程中,可能会初始化失败,或者是初始化成功改不了数据库的密码,此时,停止mysqld的服务,检查/tmp的权限是否为1777,检查/usr/local/mysqld/及以下目录属主属组全部为mysqld用户,删除/usr/local/mysqld/data/*下全部文件,并且重启主机,然后进行初始化mysql,启动mysqld,修改mysql的密码;
4.注意nfs服务器中的共享目录的权限,需要设置为755,目的是web站点不可以写入,只能读取,并且两台nfs服务器在做rsync的同时,需要指定-P选项保持文件的权限;
5.客户端在访问mysql数据库的原理:在数据库的读写分离中,客户端连接数据库使用的是代理服务器的amoeba用户,8066号端口,然后再通过代理服务器访问数据库,访问数据库时使用的是数据库中授权的用户linuxfan。(也可以在代理amoeba服务器的amoeba.xml配置文件中更改amoeba服务的端口号8066为3306,这样客户端就不用指定8066端口);
6.若nfs服务器中的网页项目有改变的话,web站点可能会出现无法读取挂载的问题,此时停止autofs的服务,umount掉挂载点,重新启动autofs服务;
7.注意前端调度器中配置的keepalived和后端nfs服务器所配置的keepalived,这两个keepalived的配置文件中的服务器名称,热备实例名称,路由器id不能相同;
拓展: