眼看一个礼拜的期限就要到了,用户数与日俱增,这帮搞业务的真不是吹的,真给力,看来要架设多台机器了,可是这个需要的money啊,我就找到老板说:“老板,咱们的业务现在越做越大了,需要添加点机器啊”,老板严肃了起来,不耐烦的说:“要多少台啊”,我说:“得需要8台吧”,老板一听就火了:“8台,太多了,再说现在跑的不挺好吗,最多一共给你四台,想怎么撑住是你的问题了”,“我靠”,心里暗骂,“就喜欢你这样的老板,让我有更多的机会锻炼,谢谢老板,我退下了”,我非常严肃的对老板说,表现出了我不卑不亢的精神面貌。其实说实话四台是够用的,之所以要8台是为了做buffer,所以下面就开始了我的规划。
首先设计的架构图如下:
1、安装keepalived install
tar zxvf keepalived-1.2.9.tar.gz cd keepalived-1.2.9/ ./configure --prefix=/data/soft/keepalived make && make install #需要修改一些东西变成系统服务 cp /data/soft/keepalived/sbin/keepalived /usr/sbin/ cp /data/soft/keepalived/etc/sysconfig/keepalived /etc/sysconfig/ cp /data/soft/keepalived/etc/rc.d/init.d/keepalived /etc/init.d/ mkdir /etc/keepalived cp /data/soft/keepalived/etc/keepalived/keepalived.conf /etc/keepalived/ #编辑主keepalived配置文件 vim /etc/keepalived/keepalived.conf ! Configuration File for keepalived global_defs { notification_email { wjw@qudapin.com } notification_email_from Alexandre.Cassen@firewall.loc smtp_server 127.0.0.1 smtp_connect_timeout 30 router_id LVS_DEVEL } vrrp_instance VI_1 { state MASTER interface eth0 virtual_router_id 51 priority 100 #只有这个地方不同 advert_int 1 authentication { auth_type PASS auth_pass 1111 } virtual_ipaddress { 192.168.1.123 } #编辑从keepalived配置文件 ! Configuration File for keepalived global_defs { notification_email { wjw@qudapin.com } notification_email_from Alexandre.Cassen@firewall.loc smtp_server 127.0.0.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.1.123 } #启动服务 service keepalived start
然后通过ip addr命令查看一下eth0,看是否绑定了两个ip,如下图,其中192.168.1.123就是虚拟出来的ip,我们叫它VIP,
现在两台机器都启动了keepalived,然后虚拟出来的ip都是192.168.1.123,然后启动Nginx和php-fpm,以前是直接通过机器的ip访问的,现在通过VIP访问试试,是不是一样的结果,然后关掉其中一台看看是否还是依然可以访问。
2、配置Nginx的负载均衡
#在nginx.conf文件的http下面添加(weight是权重,max_fails是最多失败次数,超过就换另一台机器,fail_timeout超时就换下一台) http{ upstream p2pwd { server 192.168.1.99 weight=1 max_fails=2 fail_timeout=30s; server 192.168.1.115 weight=1 max_fails=2 fail_timeout=30s; } server { listen 80; server_name localhost; root html; index index.html index.php; error_page 500 502 503 504 /50x.html; location = /50x.html { root html; } location / { proxy_next_upstream http_502 http_504 error timeout invalid_header; proxy_pass http://p2pwd; proxy_set_header X-Forward-For $remote_addr; } } } #其他一些配置可以参考项目成长记(二)中的配置,其他一些location就不需要了
3、MySQL主主结构
为什么要设计成主主结构呢,这是方便以后如果出现故障可以随时切换主从,MySQL在主主结构同时写入的时候会有一个bug(同时写入会混乱),所以采用读写分离的方式(具体实现是通过PHP程序实现的)
#在两台mysql的配置文件中分别加上一下字段 server_id 1 #两个数据库的数字不能一样 log-bin = binlog expire_logs_days = 14 max_binlog_size = 5G binlog_cache_size = 10M max_binlog_cache_size = 20M #然后重启,登录,在两台数据库分别执行 CREATE USER 'slave'@'%' IDENTIFIED BY '密码'; GRANT REPLICATION SLAVE , REPLICATION CLIENT ON * . * TO 'slave'@'%' IDENTIFIED BY '密码'; #分别查看每个数据库的master状态 show master status\G; #执行完上面的命令就会显示下面的信息,记住这两条 File: binlog.000001 Position: 211 #最后授权,在每台机器上执行下面的命令 change master to master_host='另一台机器的ip',master_user='slave',master_port=3306,master_password='密码',master_log_file='另一台机器的File值',master_log_pos=另一台机器的Position值; #启动从库 start slave; #查看是否启动从库 show slave status\G; #如果两台显示的都和下图的一样,说明就成功了
虽然还没进行优化,但是已经可以稳定运行了,而且应对未来大数据可以水平扩展,只需要加机器就行了,以后升级可以是如下图的方式
虽然已经完成了任务,但我没有向以前一样赶紧去找老大得瑟一番,而是想的如何做的更好点,让老大挑不出毛病。做技术的好像都有“洁癖”,总觉得优化的地方还有很多,要是不优化一下浑身难受,优化的道路是永无止境。欲知后事如何,请听下回分解……
ps:最近我们要在公司的庆功会上跳一段“爸爸咋了”,很惆怅啊!!大家可以点击看一下,要命了。
还有大家觉得我上面的架构图画的怎么样,我用的是一个在线的,叫做Gliffy,大家可以尝试用一下哦,我个人觉得很方便,基本上你要的功能都能实现了!