Nginx反向代理,负载均衡,redis session共享,keepalived高可用-搭建千万级系统架构
1、安装Nginx
安装机器IP地址为:
192.168.91.129 (主)
192.168.91.130(备)
192.168.91.199(虚拟IP)
1.1首先Nginx需要gcc,pcre,zlib,openssl 第三方库支持(主,备服务器都安装Nginx,Keepalived)
首先使用yum安装依赖的第三方库
yum install -y gcc
yum install -y pcre pcre-devel
yum install -y zlib zlib-devel
yum install -y openssl openssl-develplain
1.2 下载Nginix安装包(我这边下载的是nginx-1.8.1.tar.gz)
下载地址:http://nginx.org/en/download.html
1.3 编译安装Nginx
在根目录新建目录/soft ,并且在此目录下解压nginx-1.8.1.tar.gz
解压命令:
tar -zxvf nginx-1.8.1.tar.gz
编译安装Nginx:
cd /soft/nginx-1.8.1
./configure
make
make install
此时Nginx安装完毕,安装目录为/usr/local/nginx/
cd /usr/local/nginx/
启动Nginx服务
./sbin/nginx
关闭Nginx服务
./sbin/nginx -s stop
此时访问默认端口为80,http://192.168.91.129/
此时可以看到Nginx欢迎页面
有些童鞋可能访问不到,这时候你必须查看你的防火墙是否开启,开启你需要打开关闭防火墙,或者添加防火墙规则
第一种方案关闭防火墙(不建议):
查看防火墙状态
service iptables status
关闭防火墙
service iptables stop
第二种方案增加防火墙规则(建议):
这里的80是nginx默认端口
iptables -A INPUT -p tcp --dport 80 -j ACCEPT
service iptables save
service iptables restart
2、安装Keepalived
首先画一下流程图,帮助大家更好的理解Keepalived的作用。
2.1如图主机正常情况。
2.2如图主机宕机情况,备机接管服务。
·
正常情况下,主nginx作为反向代理服务器即可,假设nginx服务器挂了的话,能够立即切换到备份机上,保证用户可以访问,然后运维人员把主nginx服务器故障修好之后,又能够自动切换到主nginx提供服务。通过keepalived来监测两台服务器,正常情况时,将nginx主服务器ip(192.168.91.129)绑定到keepalived定义的一个虚拟ip(我设置为192.168.91.199)上,通过这个虚拟IP可以访问nginx,然后备机(192.168.91.130)啥事不干,就是每隔一小段时间(设置为1秒)keepalived会告诉备机,你不用管,我还活着呢,如果突然主机死了,那么就会超过一秒备机没有收到主机或者的消息,那么备机马上接管主机,keeplived将虚拟ip绑定到备机身上,网站继续提供服务。
突然主机又复活了(运维人员排除故障了),那么备机又将收到主机的活着的消息,于是将管理权交回给主机,虚拟ip又绑到主机上,大概就是这么个过程,个人理解。
首先在两台Nginx上安装Keepalived,我们这里选用rpm安装方式,当然你可以选择其他的安装方式。只要配置文件更改就可以了。
下载 keepalived-1.2.13-5.el6_6.x86_64.rpm
keepalived依赖openssl,上述我们已经使用yum安装完毕,如果上述未安装openssl请自行下载
keepalived-1.2.7-3.el6.x86_64.rpm
并且现行安装,命令如下:
rpm –Uvh --nodeps ./openssl-1.0.1e-30.el6_6.4.x86_64.rpm
接下来安装keepalived,命令如下:
rpm –Uvh --nodeps ./keepalived-1.2.13-5.el6_6.x86_64.rpm
安装完毕以后在/etc/keepalived/会出现keepalived.conf配置文件
更改其中两段配置,其他的不用管暂时用不到,192.168.91.129(主)的配置文件如下:
global_defs {
notification_email {
#这里指定,遇到故障发送邮件的
}
notification_email_from [email protected]
smtp_server 192.168.200.1
smtp_connect_timeout 30
router_id LVS_DEVEL
}
vrrp_instance VI_1 {
#主机是MASTER,备机是BACKUP
state MASTER
#这里绑定网卡一般为网卡0
interface eth0
#同一实例下,virtual_router_id必须相同
virtual_router_id 51
#这里表示权重,主机为100,备机最高为99
priority 100
#主备机相互检测的时间间隔,单位为秒,这里设置一秒钟
advert_int 1
#认证设置
authentication {
#主从服务器验证方式,这里PASS为明文
auth_type PASS
#密码
auth_pass 1111
}
virtual_ipaddress {
#这里为虚拟IP
192.168.91.199
}
}
更改其中两段配置,其他的不用管暂时用不到,192.168.91.130(备)的配置文件如下:
global_defs {
notification_email {
}
notification_email_from [email protected]
smtp_server 192.168.200.1
smtp_connect_timeout 30
router_id LVS_DEVEL
}
vrrp_instance VI_1 {
state BACKUP
interface eth0
virtual_router_id 51
priority 99
advert_int 1
authentication {
auth_type PASS
auth_pass 1111
}
virtual_ipaddress {
192.168.91.199
}
}
配置完Keepalived,这里启动Keepalived。
启动
service keepalived start
关闭
service keepalived stop
这里两台机器启动Keepalived
查看一下两台机器信息,主服务器如下:
[root@localhost keepalived]# ip addr
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN
link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
inet 127.0.0.1/8 scope host lo
inet6 ::1/128 scope host
valid_lft forever preferred_lft forever
2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP qlen 1000
link/ether 00:0c:29:20:29:a1 brd ff:ff:ff:ff:ff:ff
inet 192.168.91.129/24 brd 192.168.91.255 scope global eth0
inet 192.168.91.199/32 scope global eth0
inet6 fe80::20c:29ff:fe20:29a1/64 scope link
valid_lft forever preferred_lft forever
3: pan0: <BROADCAST,MULTICAST> mtu 1500 qdisc noop state DOWN
link/ether be:0d:e9:32:77:00 brd ff:ff:ff:ff:ff:ff
备用服务器
[root@localhost keepalived]# ip addr
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN
link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
inet 127.0.0.1/8 scope host lo
inet6 ::1/128 scope host
valid_lft forever preferred_lft forever
2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP qlen 1000
link/ether 00:0c:29:e8:b5:e2 brd ff:ff:ff:ff:ff:ff
inet 192.168.91.130/24 brd 192.168.91.255 scope global eth0
inet6 fe80::20c:29ff:fee8:b5e2/64 scope link
valid_lft forever preferred_lft forever
3: pan0: <BROADCAST,MULTICAST> mtu 1500 qdisc noop state DOWN
link/ether c2:ee:84:44:8d:48 brd ff:ff:ff:ff:ff:ff
这里我们可以看到,主服务器上面 inet 192.168.91.199/32 scope global eth0这里显示我们的虚拟ip绑定成功,而备用服务器没有绑定虚拟IP。我们通过访问虚拟IP访问我们后端的服务。
上面显示one,访问的是我们的主服务器192.168.91.129
我们这边测试Keepalived是否生效,我们关闭主服务器的Keepalived,或者关闭服务器。
这里瞬间跟改为two,访问的是我们备机。我们看看备机的网卡信息
[root@localhost keepalived]# ip addr
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN
link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
inet 127.0.0.1/8 scope host lo
inet6 ::1/128 scope host
valid_lft forever preferred_lft forever
2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP qlen 1000
link/ether 00:0c:29:e8:b5:e2 brd ff:ff:ff:ff:ff:ff
inet 192.168.91.130/24 brd 192.168.91.255 scope global eth0
inet 192.168.91.199/32 scope global eth0
inet6 fe80::20c:29ff:fee8:b5e2/64 scope link
valid_lft forever preferred_lft forever
3: pan0: <BROADCAST,MULTICAST> mtu 1500 qdisc noop state DOWN
link/ether c2:ee:84:44:8d:48 brd ff:ff:ff:ff:ff:ff
这里备机已经获取到虚拟IP地址
当然实践过程我们会遇到脑裂等问题,这些问题不在这节讨论范围内后续补充。
然后我们后续做的操作就是要保证Nginx与Keepalived要保持共存亡的,这些可以写shell脚本,相互扫描。
这里的tomcat安装,与通过nginx访问tomcat不叙述。
通过nginx访问多台tomcat会遇到session共享的问题,请参考
http://blog.csdn.net/u013381397/article/details/51565288这篇文章。
Redis集群Twemproxy请参考另外一篇文章 http://blog.csdn.net/u013381397/article/details/72472521