一、架构介绍
集群部署方式实现的主要思想:Nginx 和上联交换机间运行 OSPF 协议,上联交换机通过ECMP 等价路由,将数据流分发给 Nginx 集群,Nginx 集群再转发给缓存服务器。Nginx 和交换机间运行 OSPF 心跳,1 个 vip 配置在集群的所有 Nginx 上,当一台 Nginx 宕机,交换机会自动发现并将其从 ECMP 等价路由中剔除。Nginx 服务器通过 Url 一致性哈希的算法分配给指定 Cache服务器,避免多份缓存。基于七层的健康检查,加入和剔除后端不会影响其它服务器。Cache 服务器接收 Nginx 的请求,每台 Cache 服务器都有内存、SSD、普通硬盘缓存。
架构图:
整个架构被分为三层:
1.网络设备层
:三层交换机或其它网络设备,运行 OSPF 协议,宣告与其直连负载均衡设备的网段,提供多条到 VIP 等价路径的设备,主动发现路径,主动更新路由信息表,可支持大流量,必须为万兆网络设备。
2.代理转发层
:用 Nginx 七层代理替换了传统的四层代理,支持 Http 协议的转发,支持灵活的 ACL,网速限速,对访问 Url 进行一致性哈希,软件配置方便。与网络设备之间运行 OSPF 心跳来维护关系,多台服务器同时工作。
3.缓存层
:通过不同的介质临时或永久保存用户访问的内容,按对象访问热点进行数据迁移: 最热的放进 RAM,中等热度的放 SSD,轻热度的存普通 Disk。用户点播过程中,频繁被访问的视频会从硬盘缓存到内存,同时访问次数超过指定次数,内容再次从普通机械硬盘缓存到 SSD 中,这样就实现了冷热门内容的分层缓存。
1) 内存缓存层:快速的读写速率,适合存取频繁访问的数据。
2) SSD 缓存层:做为机械硬盘和内存之间的缓冲,保存次热门的数据,更好的衔接了内存与普通硬盘的读写速度。
3) 机械硬盘缓存层:读写速度最慢,可永久性保存冷门数据。
二、安装部署
1. 准备工作
在所有服务器上配置:
1) 关闭irqbalance
,iptables
,selinux
2) 更改内核参数,在/etc/sysctl.conf
添加
fs.nr_open = 2097152
fs.file-max = 2097152
net.ipv4.tcp_mem = 3097431 4129911 6194862
net.ipv4.tcp_rmem = 4096 87380 6291456
net.ipv4.tcp_wmem = 4096 65536 4194304
net.ipv4.tcp_max_tw_buckets = 26214400
net.ipv4.tcp_timestamps = 0
net.ipv4.tcp_tw_recycle = 0
net.ipv4.tcp_tw_reuse = 0
net.ipv4.tcp_syncookies = 0
net.ipv4.tcp_fin_timeout = 15
net.ipv4.ip_local_port_range = 1024 65535
net.ipv4.tcp_max_syn_backlog = 65535
net.core.somaxconn = 65535
net.core.netdev_max_backlog = 200000
vm.swappiness = 0
kernel.panic = 30
cat /etc/security/limits.conf
* soft nofile 2097152
* hard nofile 2097152
* soft nproc 65535
* hard nproc 65535
* soft memlock 1048576
* soft memlock 1048576
3) 网卡中断绑定,上传irq至/etc/init.d/
chmod +x /etc/init.d/irq
chkconfig irq on
service irq start
2. 安装ATS
在所有Cache Server上部署ATS
(1) 编译安装
yum install
pkgconfig libtool
gcc
gcc-c++
make
openssl-devel tcl-devel expat-devel pcre-devel libcap-devel flex-devel hwloc-devel lua-devel ncurses-devel
curl-devel boost-devel
tar xf trafficserver-4.2.3.tar.bz2
cd trafficserver-4.2.3
sed -i 's/ApacheTrafficServer/iTS/g' mgmt/RecordsConfig.cc
./configure --prefix=/usr/local/trafficserver \
--with-user=nobody \
--with-group=nobody \
--with-ncurses \
--enable-debug \
--enable-test-tools \
--enable-interim-cache \
--enable-experimental-plugins \
--enable-example-plugins \
--enable-hwloc
make && make install
ln -s /usr/local/trafficserver/bin/* /usr/local/bin/
mkdir /data/logs -p ; chown nobody:nobody /data/logs -R
chown nobody /usr/local/trafficserver/ -R
(2) 挂载裸设备
挂载除系统盘外,所用到的所有裸盘
cat /etc/udev/rules.d/51-cache-disk.rules
SUBSYSTEM=="block", KERNEL=="sd[a-q]", MODE=="660" OWNER:="nobody" GROUP:="nobody"
执行 udevadm trigger --subsystem-match=block 生效
查看ll /dev/sd*
(3) 健康检查
配置前端负载均衡器到ATS 7层健康检查,方便平滑踢出负载
在plugin.config
中添加
# healthchecks Plugin
/usr/local/trafficserver/libexec/trafficserver/healthchecks.so etc/trafficserver/healthchecks.config
在etc/trafficserver
下新建healthchecks.config
,添加以下内容(说明查看plugins/experimental/healthchecks/README)
/__hc /usr/local/trafficserver/hc/ping.html text/plain 200 404
新建ping.html
mkdir /usr/local/trafficserver/hc; echo OK
>
/usr/local/trafficserver/hc/ping.html
(4) tsar安装
tar 地址:https://github.com/alibaba/tsar
cd tsar
cd modules/
sed -i 's/mgmtapisocket/mgmtapi.socket/g' *.c
sed -i 's/eventapisocket/eventapi.socket/g' *.c
cd ..
make
make install
ln -s /usr/local/trafficserver/var/trafficserver/mgmtapi.sock /var/run/trafficserver/
ln -s /usr/local/trafficserver/var/trafficserver/eventapi.sock /var/run/trafficserver/
3. 配置代理
在所有前端代理上配置:
(1) 安装quagga
yum install
quagga
cat /etc/quagga/zebra.conf
hostname cnbzgpngx22cdnp01
password 123456.itv
enable password 123456.itv
cat /etc/quagga/ospfd.conf
! -*- ospf -*-
hostname cnbzgpngx22cdnp01
password 123456.itv
log stdout
interface bond0
ip ospf network broadcast
ip ospf hello-interval 1 # hello包时间
ip ospf dead-interval 4 # 死亡时间
ip ospf priority 0 # 优先级为0 DRother
interface bond00
interface lo
router ospf
ospf router-id 10.191.172.131
log-adjacency-changes
auto-cost reference-bandwidth 1000 #设置路径花费,每台相同
network 10.191.172.128/27 area 0.0.0.0 # 宣告nginx外网段和VIP
network 10.191.172.130/32 area 0.0.0.0
line vty
启动服务
/etc/init.d/zebra start ; /etc/init.d/ospfd start
在每台上绑定VIP
cat /etc/sysconfig/network-scripts/ifcfg-lo:0
DEVICE=lo:0
IPADDR=10.191.172.130
NETMASK=255.255.255.255
ifup
lo:
0
(2) 交换机配置OSPF
router id 1.1.1.1
#
ospf 1
maximum load-balancing 6
area 0.0.0.0
network 1.1.1.1 0.0.0.0
network 10.191.172.128 0.0.0.31
nterface Vlan-interface22
ip address 10.191.172.129 255.255.255.224
ospf timer hello 1 # hello包时间要一致
ospf timer dead 4 # 死亡时间要一致
ospf network-type broadcast
ospf dr-priority 100
配置完交换机后可以看到到VIP 有多条等价的路径
[CnXXXCdnHHXXXSw01]display ospf routing
OSPF Process 1 with Router ID 1.1.1.1
Routing Table
Routing for network
Destination Cost Type NextHop AdvRouter Area
10.191.172.128/27 1 Transit 0.0.0.0 1.1.1.1 0.0.0.0
10.191.172.130/32 101 Stub 10.191.172.131 10.191.172.131 0.0.0.0
10.191.172.130/32 101 Stub 10.191.172.132 10.191.172.132 0.0.0.0
10.191.172.130/32 101 Stub 10.191.172.133 10.191.172.133 0.0.0.0
1.1.1.1/32 0 Stub 0.0.0.0 1.1.1.1 0.0.0.0
Total nets: 5
Intra area: 5 Inter area: 0 ASE: 0 NSSA: 0
[CnXXXCdnHHXXXSw01]
(3) 安装tengine
yum install
tengine