首页 存档 技术 查看内容

双机高可用、负载均衡、MySQL (读写分离、主从自动切换)架构设计

2018-3-30 13:00 |来自: 互联网 814 0

摘要: 来源:朱茂海 链接:www.centos.bz/2014/12/ha-load-balance-mysql-master-slave-architecture/ 架构简介 前几天网友来信说帮忙实现这样一个架构:只有两台机器,需要实现其中一台死机之后另一台能接管这台机器 ...


来源:朱茂海

链接:www.centos.bz/2014/12/ha-load-balance-mysql-master-slave-architecture/


架构简介


前几天网友来信说帮忙实现这样一个架构:只有两台机器,需要实现其中一台死机之后另一台能接管这台机器的服务,并且在两台机器正常服务时,两台机器都能用上。于是设计了如下的架构。



此架构主要是由keepalived实现双机高可用,维护了一个外网VIP,一个内网VIP。正常情况时,外网VIP和内网VIP都绑定在server1服务器,web请求发送到server1的nginx,nginx对于静态资源请求就直接在本机检索并返回,对于php的动态请求,则负载均衡到server1和server2。对于SQL请求,会将此类请求发送到Atlas MySQL中间件,Atlas接收到请求之后,把涉及写操作的请求发送到内网VIP,读请求操作发送到mysql从,这样就实现了读写分离。


当主服务器server1宕机时,keepalived检测到后,立即把外网VIP和内网VIP绑定到server2,并把server2的mysql切换成主库。此时由于外网VIP已经转移到了server2,web请求将发送给server2的nginx。nginx检测到server1宕机,不再把请求转发到server1的php-fpm。之后的sql请求照常发送给本地的atlas,atlas把写操作发送给内网VIP,读操作发送给mysql从,由于内网VIP已经绑定到server2了,server2的mysql同时接受写操作和读操作。


当主服务器server1恢复后,server1的mysql自动设置为从,与server2的mysql主同步。keepalived不抢占server2的VIP,继续正常服务。


架构要求

要实现此架构,需要三个条件:


  • 1、服务器可以设置内网IP,并且设置的内网IP互通;


  • 2、服务器可以随意绑定IDC分配给我们使用的外网IP,即外网IP没有绑定MAC地址;


  • 3、MySQL服务器支持GTID,即MySQL-5.6.5以上版本。


环境说明


server1


  • eth0: 10.96.153.110(对外IP)


  • eth1: 192.168.1.100(对内IP)


server2


  • eth0: 10.96.153.114(对外IP)


  • eth1: 192.168.1.101(对内IP)


系统都是CentOS-6。


对外VIP:10.96.153.239
对内VIP:192.168.1.150


hosts设置


/etc/hosts:
192.168.1.100 server1
192.168.1.101 server2


Nginx PHP MySQL Memcached安装


这几个软件的安装推荐使用EZHTTP来完成。


解决session共享问题


php默认的session存储是在/tmp目录下,现在我们是用两台服务器作php请求的负载,这样会造成session分布在两台服务器的/tmp目录下,导致依赖于session的功能不正常。我们可以使用memcached来解决此问题。


上一步我们已经安装好了memcached,现在只需要配置php.ini来使用memcached,配置如下,打开php.ini配置文件,修改为如下两行的值:


session.save_handler = memcache

session.save_path = "tcp://192.168.1.100:11211,tcp://192.168.1.101:11211"


之后重启php-fpm生效。


Nginx配置


Server1配置


http {

[...]

upstream php-server {

server 192.168.1.101:9000;

server 127.0.0.1:9000;

keepalive 100;

}

[...]

server {

[...]

location ~ \.php$ {

fastcgi_pass php-server;

fastcgi_indexindex.php;

fastcgi_paramSCRIPT_FILENAME$document_root$fastcgi_script_name;

includefastcgi_params;

}

[...]

}

[...]

}


Server2配置


http {

[...]

upstream php-server {

server 192.168.1.100:9000;

server 127.0.0.1:9000;

keepalive 100;

}

[...]

server {

[...]

location ~ \.php$ {

fastcgi_pass php- 声明:文章版权归原作者所有 部分文章转自互联网 如有侵权请联系 [邮箱地址] 删除


路过

雷人

握手

鲜花

鸡蛋

相关分类

返回顶部