技术分析
LNMP
LNMP代表的就是:Linux系统下Nginx+MySQL+PHP这种网站服务器架构。
Linux是一类Unix计算机操作系统的统称,是目前最流行的免费操作系统。
Nginx是一个高性能的HTTP和反向代理服务器,也是一个IMAP/POP3/SMTP代理服务器。
Mysql是一个小型关系型数据库管理系统。
PHP是一种在服务器端执行的嵌入HTML文档的脚本语言。
这四种软件均为免费开源软件,组合到一起,成为一个免费、高效、扩展性强的网站服务系统。
CDN(智能DNS)
-
CDN简介
CDN是内容分发网络,目的是让用户更快速的得到请求的数据,直白的讲,CDN就是加速数据的访问,将用户的请求分发到就近的服务器获得数据,从而减少了因为地理位置远近造成的消耗。DNS是域名解析服务,目的是方便我们从繁多网络站点中找到特定的站点。当我们在浏览器中输入一个域名时,首先需要将域名转换为ip地址,再将ip地址转换为mac地址,这样才能在网络上找到该服务器。通过dns服务我们可以很快的定位到用户的位置,然后给用户分配最佳cdn节点,这就是智能DNS。
-
智能DNS原理
DNS策略解析最基本的功能是可以智能的判断访问您网站的用户,然后根据不同的访问者把您的域名分别解析成不同的IP地址。如访问者是网通用户,DNS策略解析服务器会把你的域名对应的网通IP地址解析给这个访问者。如访问者是电信用户,DNS策略解析服务器会把您域名对应的电信IP地址解析给这个访问者。
MySQL 主主同步
-
Mysql主主同步简介
所谓双主备份,其实也就是互做主从复制,每台master既是master,又是另一台服务器的slave。这样,任何一方所做的变更,都会通过复制应用到另外一方的数据库中。即使一台master服务器宕机,仍然可对备份数据库进行读写数据操作。
MFS和DFS文件系统
-
MFS文件系统
MFS(MooseFS)分布式文件系统,MFS正式推出是2008年5月,是一个具有容错功能,高可用、可扩展的海量级分布式文件系统。MFS把数据分散在多台服务器上,但用户看到的只有一个源。MFS也像其他类UNIX文件系统一样,包含了层级结构、文件属性,可以创建特殊的文件(块设备、字符设备、管道、套接字)、符号链接和硬链接。
-
DFS文件系统
分布式文件系统(Distributed File
System)是指文件系统管理的物理存储资源不一定直接连接在本地节点上,而是通过计算机网络与节点相连。简单来说就是把一些分散的(分布在局域网内各个计算机上)共享文件夹,集合到一个文件内(虚拟共享文件夹)。对于用户来说,要访问这些共享文件夹,用户感觉不到这些共享文件是分散于各个计算机上的。分布式文件系统的好处是集中访问、简化操作、数据容灾、提高文件存取性能。 -
MFS文件系统的组成
元数据服务器(Master):在整个体系中负责管理文件系统,维护元数据,目前只支持单个Master服务器
元数据日志服务器(MetaLogger):备份Master服务器的变化日志文件
数据存储服务器(Chunk Server):真正存储数据的服务器
客户端(Client):可以像挂载NFS一样挂载MFS文件系统
MFS是一个具有容错性的网络分布式文件系统,它把数据分散存放在多个物理服务器上,而呈现给用户的则是一个统一的资源。
Keepalived + LVS架构
-
Keepalived + LVS简介
在 lvs+keepalived 环境里面,lvs 主要的工作是提供调度算法,把客户端请求按照需求调度在 real
服务器,keepalived 主要的工作是提供 lvs 控制器的一个冗余,并且对 real 服务器做健康检查,发现不健康的 real
服务器,就把它从 lvs 集群中剔除,real 服务器只负责提供服务。LVS 是一个开源的软件,可以实现 LINUX平台下的简单负载均衡。 -
Keeplived双机热备简介
用高可用(HA)技术提供持续的、不间断的计算机系统或网络服务。
使用Keepalived实现双机热备,包括针对IP地址的故障切换,以及在LVS高可用群集中的热备应用。 keepalived的热备方式
VRRP(Virtual Router Redundancy Protocol,虚拟路由冗余协议)
一主 + 多备,共用同一个IP地址,但优先级不同
-
keepalived +LVS替代nginx做反向代理
为了实现冗余,使用nginx进行LNMP站点代理,需要两台nginx,这就需要使用两个不同的IP地址,不便于DNS进行智能调度,如果使用keepalived+LVS框架代替nginx进行反向代理,可以两台master主机使用同一个虚拟IP地址,DNS进行智能调度时候就相比两台nginx做反向代理更加简单。
HAproxy+keepalived架构
采用HAproxy+keepalived架构对主主同步数据库实现代理服务,实现了数据库的负载均衡,增强整个网站运行环境的稳健性。在haproxy基础上搭建keepalived,解决了因haproxy出现单点故障而导致整个网站崩溃的问题。
-
HAproxy+keepalived架构简介
HAProxy是一个使用C语言编写的自由及开放源代码软件[1],其提供高可用性、负载均衡,以及基于TCP和HTTP的应用程序代理。
HAProxy特别适用于那些负载特大的web站点,这些站点通常又需要会话保持或七层处理。HAProxy运行在当前的硬件上,完全可以支持数以万计的并发连接。并且它的运行模式使得它可以很简单安全的整合进您当前的架构中,
同时可以保护你的web服务器不被暴露到网络上。HAProxy实现了一种事件驱动, 单一进程模型,此模型支持非常大的并发连接数。多进程或多线程模型受内存限制
、系统调度器限制以及无处不在的锁限制,很少能处理数千并发连接。事件驱动模型因为在有更好的资源和时间管理的用户空间(User-Space)
实现所有这些任务,所以没有这些问题。此模型的弊端是,在多核系统上,这些程序通常扩展性较差。这就是为什么他们必须进行优化以
使每个CPU时间片(Cycle)做更多的工作。包括 GitHub、Bitbucket、Stack Overflow、Reddit、Tumblr、Twitter和
Tuenti在内的知名网站,及亚马逊网络服务系统都使用了HAProxy。 -
HAProxy+keepalived实现MySQL主主复制
MySQL的主主复制是在主从数据库的基础上进行进一步的配置,使得两台数据库互为主从,在原来从数据库不可写的基础上给与一定的权限和优先级,使得两台数据库都可读可写,并且互为主从,实现数据库的主主复制,两台数据库既作冗余,也作负载均衡。
系统物理架构
系统运行的硬件环境
安装Centos6.5操作系统的虚拟机12台
系统运行的软件环境
个别软件安装的过程,需要提前安装相关依赖软件。
网络环境
服务器和客户端使用网段:
192.168.15.1~192.168.15.254
网关:192.168.15.1
系统框架
项目环境搭建
智能DNS搭建
-
挂载光盘(/dev/cdrom)
-
安装
#rpm -ivh bind-9.8.2-0.17.rc1.el6_4.6.x86_64.rpm rpm -ivh #bind-chroot-9.8.2-0.17.rc1.el6_4.6.x86_64.rpm rpm -ivh #bind-libs-9.8.2-0.17.rc1.el6_4.6.x86_64.rpm rpm -ivh #bind-utils-9.8.2-0.17.rc1.el6_4.6.x86_64.rpm
-
配置DNS(vim /var/named/chroot/etc/named.conf)
acl cd { 192.168.15.10; //ip为192.168.15.10的用户访问cd }; acl gz { 192.168.15.17; //ip为192.168.15.17的用户访问gz }; options { directory "/var/named"; forwarders { 114.114.114.114; }; //解析未能匹配的ip }; view cd { match-clients {cd;}; //客户端匹配 zone "baidu.com" IN { type master; file "baidu.com.zone.cd"; //调用文件 }; }; view gz { match-clients {gz;}; zone "baidu.com" IN { type master; file "baidu.com.zone.gy";
MFS文件系统搭建
-
chunk server搭建
#yum -y install zlib-devel //安装依赖 #useradd mfs -s /sbin/nologin //创建用户 #tar xf mfs-1.6.27-5.tar.gz #cd mfs-1.6.27 #./configure --prefix=/usr/local/mfs --with-default-user=mfs --with-default-group=mfs --disable-mfsmaster -disable-mfsmount #make #make install #cd /usr/local/mfs/etc/mfs/ #cp mfschunkserver.cfg.dist mfschunkserver.cfg #cp mfshdd.cfg.dist mfshdd.cfg #vim mfschunkserver.cfg MASTER_HOST = 192.168.15.201 //mfs主服务器IP #vim mfshdd.cfg /data //添加mfs文件系统的共享目录 #mkdir /data #chown -R mfs:mfs /data //赋予权限 #./mfschunkserver start (/usr/local/mfs/sbin)
-
master server 搭建
安装mfs文件系统;
开启:./mfsmaster start(/usr/local/mfs/sbin/)
关闭:./mfsmaster stop(/usr/local/mfs/sbin/)#vim mfsexports.cfg
该文件每一个条目分为三部分:
第一部分:客户端的ip 地址
第二部分:被挂接的目录
第三部分:客户端拥有的权限权限部分:
ro 只读模式共享
rw 读写的方式共享
alldirs 许挂载任何指定的子目录
maproot 映射为root,还是指定的用户
password 指定客户端密码 -
搭建MetaLogger Server
开启:./mfsmetalogger start(/usr/local/mfs/sbin/)
关闭:./mfsmetalogger stop(/usr/local/mfs/sbin/) -
在LNMP上搭载mfs客户端
安装mfs文件系统,并且安装fuse
#vim /etc/profile //配置环境变量 export PKG_CONFIG_PATH=/usr/local/lib/pkgconfig:$PKG_CONFIG_PATH #mkdir /mnt/mfs #modprobe fuse (调用fuse模块) #/usr/local/mfs/bin/mfsmount /usr/local/nginx/html -H 192.168.15.201(运用挂载命令/usr/local/mfs/bin/mfsmount 挂载在/mnt/mfs文件下(客户端) 挂载的主机是mfs架构的主服务器)
安装keepalived
- 先安装依赖
yum -y install kernel-devel openssl-devel popt-devel ipvsadm
- 传入压缩包
keepalived-1.2.13.tar.gz
- 解压
#tar zxf keepalived-1.2.13.tar.gz
- 查看内核版本
cd /usr/src/kernels/(uname -a) 内核路径显示为(本机):/usr/src/kernels/2.6.32-754.25.1.el6.x86_64
- 安装配置
#cd /keepalived-1.2.13 #./configure --prefix=/ --with-kernel-dir=/usr/src/kernels/2.6.32-431.el6.x86_64/(该路径) #make #make install 使用Keepalived服务(添加为系统服务) # cd /etc/init.d/keepalived(查看是否有Keepalived) # chkconfig --add keepalived #cd /etc/keepalived/ # vim keepalived.conf global_defs { router_id HAPROXY1 } vrrp_instance VI_1 { state MASTER interface eth0 virtual_router_id 51 priority 100 //修改优先级 advert_int 1 authentication { auth_type PASS //设置认证方式为密码认证 auth_pass 123456 } virtual_ipaddress { 192.168.15.8 } } # service keepalived restart # service network restart # ip addr show dev eth0(查看两个Keepalived)
Haproxy搭建配置
这里两台服务器192.168.15.3和192.168.233配置一样,配置步骤如下:
- 安装
yum -y install pcre-devel bzip2-devel
- 安装HA
- 配置文件
global log 127.0.0.1 local0 log 127.0.0.1 local1 notice #log loghost local0 info maxconn 4096 #chroot /usr/share/haproxy uid 99 gid 99 #daemon debug #quiet defaults log global mode http option httplog option dontlognull retries 3 #redispatch maxconn 2000 contimeout 5000 clitimeout 50000 srvtimeout 50000 listen mysql bind 0.0.0.0:7306 mode tcp balance roundrobin server mysql1 192.168.15.231:3306 check inter 2000 fall 3 server mysql2 192.168.15.230:3306 check inter 2000 fall 3 listen stats bind 0.0.0.0:1080 mode http option httplog maxconn 10 stats refresh 30s stats uri /stats stats realm XingCloud\ Haproxy stats auth admin:admin #用这个账号登录,可以自己设置 stats auth Frank:Frank stats hide-version stats admin if TRUE
- 软连接直接启动
#ln -s /usr/local/sbin/haproxy /usr/sbin/haproxy #chmod +x /etc/init.d/haproxy
Mysql主主复制
在主主同步配置时,需要将两台服务器的:
auto_increment_increment 增长量都配置为2
auto_increment_offset 分别配置为1和2。这是序号,第一台从1开始,第二台就是2,以此类推…
这样才可以避免两台服务器同时做更新时自增长字段的值之间发生冲突。(针对的是有自增长属性的字段)
通俗的理解:主主同步事实上就是在主从的基础上,将原先的从机当主机,主机当从机再配置一遍主从同步。
实现过程如下:
在192.168.15.230服务器的my.cnf的mysql节点添加如下配置:
port=3306 //将mysql启动端口设置成3306
server-id=1 //在保证两台mysql主机不重复的条件下可以任意设置
log-bin=mysql-bin //启动mysql二进制日志,如果没有配置这个将无法远程连接
auto_increment_increment=2 //步进值auto_imcrement。一般是有n台主mysql就填n
auto_increment_offset=1 //设定数据库中自动增长的起点,两台mysql的起点必须不同,这样才能避免两台服务器同步时出现主键冲突
binlog-ignore=mysql //指定不同步的数据库,如果有多个数据库不需要同步可以多个分别声明
binlog-ignore=information_schema//…
binlog-ignore=performance_schema//…
character_set_server=utf8//指定utf8为默认字符集
log-bin-trust-function-creators=1//默认情况下mysql会阻止主从同步的数据库function的创建,这会导致我们在导入sql文件时如果有创建function或者使用function的语句将会报错。
在192.168.15.231服务器的my.cnf的mysql节点添加如下配置:
port=3306
server-id=2
log-bin=mysql-bin
auto_increment_increment=2
auto_increment_offset=2
binlog-ignore=mysql
binlog-ignore=information_schema
binlog-ignore=performance_schema
character_set_server=utf8
log-bin-trust-function-creators=1
重启mysql:
service mysqld restart
进入mysql:
mysql -uroot -p
相互授权:
192.168.15.230数据库1:
grant replication slave, replication client on *.* to 'root'@'192.168.15.231' identified by '123456'
flush privileges; //刷新MySQL的系统权限相关表,否则会无法用账号链接
192.168.15.231数据库2:
grant replication slave, replication client on *.* to 'root'@'192.168.15.230' identified by '123456';
flush privileges; //刷新MySQL的系统权限相关表,否则会无法用账号链接
相互设置同步日志节点:
192.168.15.230
mysql> change master to
>master_host=`192.168.15.231`,
>master_port=3306,
>master_user=`root`,
>master_password=`123456`,
>master_log_file=`mysql_bin.000001`,
>master_log_pos=107;
192.168.15.230
mysql> change master to
>master_host=`192.168.15.230`,
>master_port=3306,
>master_user=`root`,
>master_password=`123456`,
>master_log_file=`mysql_bin.000001`,
>master_log_pos=107;
在两台主机上启动slave服务:
start slave;
查看数据库状态:
show slave status\G
表示成功;
keepalived+LVS搭建
-
keepalived安装如上(主机192.168.15.201、192.168.15.25)
-
修改主副服务器的配置文件
1)编辑主服务器配置文件
cd /etc/keepalived/ vim keepalived.conf 修改配置文件里内容为: global_defs { router_id HA_TEST_R1 } vrrp_instance VI_1 { state MASTER interface eth0 virtual_router_id 51 priority 100 advert_int 1 authentication { auth_type PASS auth_pass 123456 } virtual_ipaddress { 192.168.15.126 } virtual_server 192.168.15.126 80 { delay_loop 6 lb_algo rr lb_kind DR nat_mask 255.255.255.0 protocol TCP real_server 192.168.15.9 80 { weight 1 TCP_CHECK { connect_port 8080 connect_timeout 3 nb_get_retry 3 delay_before_retry 4 } } real_server 192.168.15.18 80 { weight 1 TCP_CHECK { connect_port 8080 connect_timeout 3 nb_get_retry 3 delay_before_retry 4 } } }
2)编辑副服务器配置文件
cd /etc/keepalived/ vim keepalived.conf 修改配置文件里内容为: global_defs { router_id HA_TEST_R2 } vrrp_instance VI_1 { state BACK interface eth0 virtual_router_id 51 priority 99 advert_int 1 authentication { auth_type PASS auth_pass 123456 } virtual_ipaddress { 192.168.15.126 } virtual_server 192.168.15.126 80 { delay_loop 6 lb_algo rr lb_kind DR nat_mask 255.255.255.0 protocol TCP real_server 192.168.15.9 80 { weight 1 TCP_CHECK { connect_port 8080 connect_timeout 3 nb_get_retry 3 delay_before_retry 4 } } real_server 192.168.15.18 80 { weight 1 TCP_CHECK { connect_port 8080 connect_timeout 3 nb_get_retry 3 delay_before_retry 4 } } }
(3)修改真正服务器
vim /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 保存并退出 输入:sysctl -p 输入:ifconfig lo:0 192.168.15.126/32 route add -host 192.168.15.126 dev lo:0(添加一条指向路由)
更多内容可关注博主 奔跑的小猫
LNMP高可用网站视频教程以及文档教程可关注博主公众号 布丁分享园 进行下载