从上个星期到现在弄了一套模仿淘宝2010的双11架构图,为了对自己这一年多学习linux和网站架构有个交代。据说这个高可用架构可以用好几年,不知道现在淘宝有没有变化了。
记得一年前在linux连iP都不会配,vi查找命令都不会用,现在想起都觉得十分尴尬。就算在这个架构我也出了很多错,网上翻阅很多资料,甚至最离谱的是自己粗心所犯下的错耗费了很多时间。不过计划决心在做这个项目之前的兴奋和现在见到可以完工的心悦,还是觉得之前的辛苦和耗时是值得的。不多废话解释下这里面的软件吧。
lvs:国人在国际It界拿得出手见人的开源产品,主要是做4层调度分发
keepalived:主要做监测功能,如果其中一台lvs挂掉,马上启用另外一台。保持集群的高可用
nginx:在这里主要是做反向代理,7层分发功效。为什么不按照淘宝用haproxy?因为自己还没学到,后期继续把他都学了。
lnmp:不解释了。
memcache:在这里是为了session共享。将用户登录后的session保存在memcache,一来保证一致性,二来比文件保存速度快很多。缺点,如果机器死了,所有信息没了。
这是淘宝2010的双11的拓补图:
这是我自己根据这图修改下变成的拓补图(因为考虑到本身机器硬件问题,所以改成这样了):
先看下lvs+ keepalive(后备机我就不粘贴了,只是改下router_id,state而已,其他一样的)
global_defs {
notification_email {
gzcxl123@163.com
}
notification_email_from gzcxl123@163.com
smtp_server 127.0.0.1
smtp_connect_timeout 30
router_id LVS1
}
vrrp_sync_group test {
group {
loadbalance
}
}
vrrp_instance loadbalance {
state MASTER
interface eth0
lvs_sync_daemon_inteface eth0
virtual_router_id 51
priority 180
advert_int 5
authentication {
auth_type PASS
auth_pass 1111
}
virtual_ipaddress {
192.168.1.254
}
}
virtual_server 192.168.1.254 80 {
delay_loop 6
lb_algo rr
lb_kind DR
protocol TCP
#persistence_timeout 20
real_server 192.168.1.13 80 {
weight 3
TCP_CHECK {
connect_timeout 3
nb_get_retry 3
delay_before_retry 3
connect_port 80
}
}
real_server 192.168.1.14 80 {
weight 3
TCP_CHECK {
connect_timeout 3
nb_get_retry 3
delay_before_retry 3
connect_port 80
}
}
}
再看下nginx反向代理(只粘贴一台,用了lvs的rr模式会自动轮询)
upstream bulutua {
server 192.168.1.11;
server 192.168.1.12;
}
server {
listen 80;
server_name bulutu.a.com;
location / {
proxy_pass http://bulutua;
proxy_set_header Host $host;
proxy_set_header X-Forward-For $remote_addr;
}
access_log /home/wwwlogs/bulutu.a.com.log;
}
upstream bulutub {
server 192.168.1.11;
server 192.168.1.12;
}
server{
listen 80;
server_name bulutu.b.com;
location / {
proxy_pass http://bulutub;
proxy_set_header Host $host;
proxy_set_header X-Forward-For $remote_addr;
}
}
最后看下memcache配置
session.save_handler = memcache
session.save_path = "tcp://192.168.1.17:11211"
配置了这个之后程序代码按照最普通的session_start();这样写就可以了。的确方便了程序员很多功夫。
这个架构图还有一些不完善的地方,例如memache可以做出分布式,用hash来读取,mysql的一主多从,从库机做lvs等等。因为实在不能再安装系统了,太卡了,所以先做得到这样了,求共勉。
最后附上实验网站: