那啥
分类: 系统运维
2014-07-14 17:23:57
系统环境:centos 6.5
运行环境lnmp1.1
A IP:192.168.152.133
B IP:192.168.152.134
C IP:192.168.152.135
实验域名a.com
由测试电脑指定HOST
192.168.152.133 a.com
由A 做负载均衡将请求均分给B,C 也可A,B,C
建立虚拟机 安装centos系统
Vi /etc/sysconfig/network-scripts/ifcfg-eth0 #修改IP
DEVICE=eth0
HWADDR=00:0C:29:39:4D:42
TYPE=Ethernet
UUID=78c4ea9c-0b46-4922-8536-5529688191d1
ONBOOT=yes #默认no 改为 yes (自启动)
NM_CONTROLLED=yes #默认yes (实时生效更改设置无需重启)
BOOTPROTO=static #默认dhcp 可改为static(静态)
IPADDR=192.168.152.133
NETMASK=255.255.255.0
GATEWAY=192.168.152.1
DNS1=192.168.152.1’’ #此为测试环境 请按实际需要填写
:wq #保存
关闭防火墙
service iptables stop
禁止防火器开机自启
chkconfig iptables off
另两个依次设置为134 135
用sftp 工具 将lnmp1.1 文件传入虚拟机中
解压
tar xzvf lnmp.tar.gz ./
我的放在/home 文件下
cd /home
解压后文件夹为lnmp1.1-full
cd lnmp1.1-full
运行centos的安装脚本
./centos.sh
第一个提示 输入mysql 的 root账户的密码
接下来有几个提示 输入y 确认
自动安装等安装完成会提示 nginx mysql
都已经运行了
用主机访问192.168.152.133
看到lnmp的界面安装成功。
域名解析
由于不是真实环境,域名就随便使用一个a.com用作测试,所以a.com的解析只能在hosts文件设置。
打开:C:Window\System32\driver\etc\hosts
在末尾添加
192.168.152.133 a.com
保存退出,然后启动命令模式ping下看看是否已设置成功
A服务器.conf设置
打开nginx.conf,文件位置在nginx安装目录的conf目录下。
在http段加入以下代码
utream a.com
{
server 192.168.152.134:80;
server 192.168.152.135:80;
}
server{
listen 80;
server_name
a.com;
location / {
proxy_pass
proxy_set_header
Host
$host;
proxy_set_header
X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
}
}
保存重启nginx
B、C服务器nginx.conf设置
打开nginx.confi,在http段加入以下代码
server{
listen 80;
server_name a.com;
index
index.html;
home/wwwroot/defaut/;
}
保存重启nginx
负载测试
当访问a.com的时候,为了区分是转向哪台服务器处理我分别在B、C服务器下写一个不同内容的index.html文件,以作区分。
打开浏览器访问a.com结果,刷新会发现所有的请求均分别被主服务器(192.168.152.133)分配到B服务器(192.168.152.134)与C服务器(192.168.152.135)上,实现了负载均衡效果。
假如其中一台服务器宕机会怎样?
当某台服务器宕机了,是否会影响访问呢?
我们先来看看实例,根据以上例子,假设C服务器192.168.152.135这台机子宕机了(由于无法模拟宕机,所以我就把C服务器关机)然后再来访问看看。
访问结果:
我们发现,虽然C服务器(192.168.152.135)宕机了,但不影响网站访问。这样,就不会担心在负载均衡模式下因为某台机子宕机而拖累整个站点了。
主服务器不能提供服务吗?
以上例子中,我们都是应用到了主服务器负载均衡到其它服务器上,那么主服务器本身能不能也加在服务器列表中,这样就不会白白浪费拿一台服务器纯当做转发功能,而是也参与到提供服务中来。
如以上案例三台服务器:
A服务器IP :192.168.152.133 (主)
B服务器IP :192.168.152.134
C服务器IP :192.168.152.135
我们把域名解析到A服务器,然后由A服务器转发到B服务器与C服务器,那么A服务器只做一个转发功能,现在我们让A服务器也提供站点服务。
我们先来分析一下,如果添加主服务器到upstream中,那么可能会有以下两种情况发生:
1、主服务器转发到了其它IP上,其它IP服务器正常处理;
2、主服务器转发到了自己IP上,然后又进到主服务器分配IP那里,假如一直分配到本机,则会造成一个死循环。
怎么解决这个问题呢?因为80端口已经用来监听负载均衡的处理,那么本服务器上就不能再使用80端口来处理a.com的访问请求,得用一个新的。于是我们把主服务器的nginx.conf加入以下一段代码:
server{
listen 8080;
server_name a.com;
index index.html;
home/wwwroot/defaut;;
}
重启nginx,在浏览器输入a.com:8080试试看能不能访问。结果可以正常访问
既然能正常访问,那么我们就可以把主服务器添加到upstream中,但是端口要改一下,如下代码:
upstream
a.com {
server 192.168.152.134:80
server 192.168.152.135:80;
server 127.0.0.1:8080;
}
由于这里可以添加主服务器IP192.168.152.133或者127.0.0.1均可以,都表示访问自己。
重启Nginx,然后再来访问a.com看看会不会分配到主服务器上。
主服务器也能正常加入服务了。
最后
一、负载均衡不是nginx独有,也有,但性能可能不如nginx。
二、多台服务器提供服务,但域名只解析到主服务器,而真正的服务器IP不会被ping下即可获得,增加一定安全性。
三、upstream里的IP不一定是内网,外网IP也可以。不过经典的案例是,局域网中某台IP暴露在外网下,域名直接解析到此IP。然后又这台主服务器转发到内网服务器IP中。
四、某台服务器宕机、不会影响网站正常运行,Nginx不会把请求转发到已宕机的IP上
服务器A 192.168.152.134
服务器B 192.168.152.135
Mysql版本:lnmp 集成mysql
System OS:CentOS 6.5
服务器A:
grant replication slave,file on *.* to 'ceshi'@'192.168.152.135' identified by '123456';
flush privileges;
服务器B:
grant replication slave,file on *.* to 'ceshi'@'192.168.152.134' identified by '123456';
flush privileges;
A:
log-bin=mysql-bin
server-id = 1
binlog-do-db=ceshi # 要备份的数据库
binlog-ignore-db=mysql # 不备份的数据库
replicate-do-db=ceshi
replicate-ignore-db=mysql
log-slave-updates
sync_binlog=1
auto_increment_increment=2
auto_increment_offset=1
B:
log-bin=mysql-bin
server-id = 2
binlog-do-db=ceshi
binlog-ignore-db=mysql
replicate-do-db=ceshi
replicate-ignore-db=mysql
log-slave-updates
sync_binlog=1
auto_increment_increment=2
auto_increment_offset=2
参数选项说明:
log-slave-updates 将执行的复制sql记录到二进制日志
sync_binlog 当有二进制日志写入binlog文件的时候,mysql服务器将它同步到磁盘上
auto_increment_increment,auto_increment_offset 主要用于主主复制中,用来控制AUTO_INCREMENT列的操作
A:
mysql> flush tables with read lock;
mysql> show master status\G
*************************** 1. row ***************************
File: mysql-bin.000028
Position: 866
Binlog_Do_DB: test
Binlog_Ignore_DB: mysql
1 row in set (0.00 sec)
mysql> unlock tables;
mysql> stop slave;
mysql> change master to master_host='192.168.152.135',master_user='ceshi',master_password='123456',master_log_file='mysql-bin.000041', master_log_pos=107;
mysql> start slave;
B:
mysql> flush tables with read lock;
mysql> show master status\G
*************************** 1. row ***************************
File: mysql-bin.000014
Position: 704
Binlog_Do_DB: test
Binlog_Ignore_DB: mysql
1 row in set (0.00 sec)
mysql> unlock tables;
mysql> stop slave;
mysql> change master to master_host='192.168.152.134',master_user='ceshi',master_password='123456',master_log_file='mysql-bin.000028', master_log_pos=107;
mysql> start slave;
mysql> show slave status\G;
出现:Slave_IO_Running: Yes
Slave_SQL_Running: Yes
则状态正常,直接测试数据能否同步就OK了!
编辑新的文本文件改名为index.php
$a=mysql_connect('192.168.152.135','qqqq','34415268');
if($a){
echo '192.168.152.135';
}else{
$b=mysql_connect('192.168.152.134','qqqq','34415268');
if($b){
echo '192.168.152.134';
}else{
echo 2;
}
}
echo '192.168.152.133'; # 三个虚拟机各自填写本机IP
?>