眼看一个礼拜的期限就要到了,用户数与日俱增,这帮搞业务的真不是吹的,真给力,看来要架设多台机器了,可是这个需要的money啊,我就找到老板说:“老板,咱们的业务现在越做越大了,需要添加点机器啊”,老板严肃了起来,不耐烦的说:“要多少台啊”,我说:“得需要8台吧”,老板一听就火了:“8台,太多了,再说现在跑的不挺好吗,最多一共给你四台,想怎么撑住是你的问题了”,“我靠”,心里暗骂,“就喜欢你这样的老板,让我有更多的机会锻炼,谢谢老板,我退下了”,我非常严肃的对老板说,表现出了我不卑不亢的精神面貌。其实说实话四台是够用的,之所以要8台是为了做buffer,所以下面就开始了我的规划。

       首先设计的架构图如下:

172834652.jpg

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,

210616762.png

现在两台机器都启动了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;
#如果两台显示的都和下图的一样,说明就成功了

225512122.png

虽然还没进行优化,但是已经可以稳定运行了,而且应对未来大数据可以水平扩展,只需要加机器就行了,以后升级可以是如下图的方式


225338412.png


虽然已经完成了任务,但我没有向以前一样赶紧去找老大得瑟一番,而是想的如何做的更好点,让老大挑不出毛病。做技术的好像都有“洁癖”,总觉得优化的地方还有很多,要是不优化一下浑身难受,优化的道路是永无止境。欲知后事如何,请听下回分解……


ps:最近我们要在公司的庆功会上跳一段“爸爸咋了”,很惆怅啊!!大家可以点击看一下,要命了。

还有大家觉得我上面的架构图画的怎么样,我用的是一个在线的,叫做Gliffy,大家可以尝试用一下哦,我个人觉得很方便,基本上你要的功能都能实现了!