mysql主从复制 lvs+ keepalived

2019独角兽企业重金招聘Python工程师标准>>> hot3.png


一、环境
Master(主机A):192.168.1.1
Slave(主机B) :192.168.1.2  
W-VIP(写入)  :192.168.1.3 
R-VIP(读取)  :192.168.1.4 
Client(测试) :192.168.1.100

操作系统版本:CentOS release 6.5
MySQL数据库版本:5.5.13
keepalived版本:1.2.7
LVS版本:1.26

所有环境均为虚拟机
 

二、设计思路

1. 服务器A和B,通过mysql的slave进程同步数据。
2. 通过keepalived启用两个虚IP:W-VIP/R-VIP,一个负责写入,一个负责读取,实现读写分离。
3. A和B都存在时,W-VIP下将请求转发至主机A,R-VIP将请求转发给A和B,实现负载均衡。
4. 当主机A异常时,B接管服务,W-VIP/R-VIP此时漂到了主机B上,此时这两个虚IP下都是主机B,实现高可用
5. 当主机B异常时,R-VIP会将B踢出,其他不变
 

三、架构图

 

四、软件安装
主从两个主机都要装以下软件:
1. MySQL的安装(略)
2. keepalived安装
yum install keepalived
2. LVS安装
yum install ipvsadm

 

五、配置
1. 配置MySQL的主从复制(略)
2. 配置keepalived
Master上的配置
vi /etc/keepalived/keepalived.conf

 

  1. ! Configuration File for keepalived 
  2.  
  3. global_defs { 
  4.      router_id MySQL-ha 
  5.  
  6. vrrp_instance VI_1 { 
  7.      state BACKUP 
  8.      interface eth1 
  9.      virtual_router_id 90 
  10.      priority 100 
  11.      advert_int 1 
  12. notify_master "/usr/local/mysql/bin/remove_slave.sh"
  13.      nopreempt 
  14.      authentication { 
  15.      auth_type PASS 
  16.      auth_pass 1111 
  17.      } 
  18.      virtual_ipaddress { 
  19.      192.168.1.3 label eth1:1 
  20.      192.168.1.4 label eth1:2 
  21.      } 
  22.  
  23. virtual_server 192.168.1.3 6603 {   
  24.      delay_loop 2 
  25.      lb_algo wrr 
  26.      lb_kind DR 
  27.      persistence_timeout 60 
  28.      protocol TCP 
  29.      real_server 192.168.1.1 6603 { 
  30.      weight 3 
  31.      notify_down /usr/local/mysql/bin/mysql.sh 
  32.      TCP_CHECK { 
  33.      connect_timeout 10 
  34.      nb_get_retry 3 
  35.      delay_before_retry 3 
  36.      connect_port 6603 
  37.      } 
  38.      } 
  39.  
  40. virtual_server 192.168.1.4 6603 { 
  41.      delay_loop 2 
  42.      lb_algo wrr 
  43.      lb_kind DR 
  44.      persistence_timeout 60 
  45.      protocol TCP 
  46.      real_server 192.168.1.1 6603 { 
  47.      weight 1 
  48.      notify_down /usr/local/mysql/bin/mysql.sh 
  49.      TCP_CHECK { 
  50.      connect_timeout 10 
  51.      nb_get_retry 3 
  52.      delay_before_retry 3 
  53.      connect_port 6603 
  54.      } 
  55.      } 
  56.      real_server 192.168.1.2 6603 { 
  57.      weight 3 
  58.      TCP_CHECK { 
  59.      connect_timeout 10 
  60.      nb_get_retry 3 
  61.      delay_before_retry 3 
  62.      connect_port 6603 
  63.      } 
  64.      } 


! Configuration File for keepalived global_defs { router_id MySQL-ha } vrrp_instance VI_1 { state BACKUP interface eth1 virtual_router_id 90 priority 100 advert_int 1 notify_master "/usr/local/mysql/bin/remove_slave.sh" nopreempt authentication { auth_type PASS auth_pass 1111 } virtual_ipaddress { 192.168.1.3 label eth1:1 192.168.1.4 label eth1:2 } } virtual_server 192.168.1.3 6603 { delay_loop 2 lb_algo wrr lb_kind DR persistence_timeout 60 protocol TCP real_server 192.168.1.1 6603 { weight 3 notify_down /usr/local/mysql/bin/mysql.sh TCP_CHECK { connect_timeout 10 nb_get_retry 3 delay_before_retry 3 connect_port 6603 } } } virtual_server 192.168.1.4 6603 { delay_loop 2 lb_algo wrr lb_kind DR persistence_timeout 60 protocol TCP real_server 192.168.1.1 6603 { weight 1 notify_down /usr/local/mysql/bin/mysql.sh TCP_CHECK { connect_timeout 10 nb_get_retry 3 delay_before_retry 3 connect_port 6603 } } real_server 192.168.1.2 6603 { weight 3 TCP_CHECK { connect_timeout 10 nb_get_retry 3 delay_before_retry 3 connect_port 6603 } } }

keepalived配置成服务并开机启动

  1. cp /usr/local/keepalived/etc/rc.d/init.d/keepalived /etc/rc.d/init.d/ 
  2. cp /usr/local/keepalived/etc/sysconfig/keepalived /etc/sysconfig/ 
  3. cp /usr/local/keepalived/sbin/keepalived /usr/sbin/ 
  4. chkconfig --add keepalived  
  5. chkconfig --level 345 keepalived on 


cp /usr/local/keepalived/etc/rc.d/init.d/keepalived /etc/rc.d/init.d/ cp /usr/local/keepalived/etc/sysconfig/keepalived /etc/sysconfig/ cp /usr/local/keepalived/sbin/keepalived /usr/sbin/ chkconfig --add keepalived chkconfig --level 345 keepalived on

vi /usr/local/mysql/bin/remove_slave.sh

  1. #!/bin/bash 
  2. user=u1 
  3. password=12345 
  4. log=/usr/local/mysql/log/remove_slave.log 
  5. echo "`date`" >> $log 
  6. /usr/local/mysql/bin/mysql -u$user -p$password -e "set global read_only=OFF;reset master;stop slave;change master to master_host='localhost';" >> $log 
  7. /bin/sed -i 's#read-only#\#read-only#' /etc/my.cnf 


#!/bin/bash user=u1 password=12345 log=/usr/local/mysql/log/remove_slave.log echo "`date`" >> $log /usr/local/mysql/bin/mysql -u$user -p$password -e "set global read_only=OFF;reset master;stop slave;change master to master_host='localhost';" >> $log /bin/sed -i 's#read-only#\#read-only#' /etc/my.cnf

 

vi /usr/local/mysql/bin/mysql.sh

 

  1. #!/bin/bash 
  2. /etc/init.d/keepalived stop 


#!/bin/bash /etc/init.d/keepalived stop

Slave上的配置
vi /etc/keepalived/keepalived.conf

 

 

[plain]view plaincopyprint?

  1. ! Configuration File for keepalived 
  2.  
  3. global_defs { 
  4.      router_id MySQL-ha 
  5.  
  6. vrrp_instance VI_1 { 
  7.      state BACKUP 
  8.      interface eth1 
  9.      virtual_router_id 90 
  10.      priority 99 
  11.      advert_int 1 
  12.      notify_master "/usr/local/mysql/bin/remove_slave.sh" 
  13.      authentication { 
  14.      auth_type PASS 
  15.      auth_pass 1111 
  16.      } 
  17.      virtual_ipaddress { 
  18.      192.168.1.3 label eth1:1 
  19.      192.168.1.4 label eth1:2 
  20.      } 
  21.  
  22. virtual_server 192.168.1.3 6603 { 
  23.      delay_loop 2 
  24.      lb_algo wrr 
  25.      lb_kind DR 
  26.      persistence_timeout 60 
  27.      protocol TCP 
  28.      real_server 192.168.1.2 6603 { 
  29.      weight 3 
  30.      notify_down /usr/local/mysql/bin/mysql.sh 
  31.      TCP_CHECK { 
  32.      connect_timeout 10 
  33.      nb_get_retry 3 
  34.      delay_before_retry 3 
  35.      connect_port 6603 
  36.      } 
  37.      } 
  38.  
  39. virtual_server 192.168.1.4 6603 { 
  40.      delay_loop 2 
  41.      lb_algo wrr 
  42.      lb_kind DR 
  43.      persistence_timeout 60 
  44.      protocol TCP 
  45.      real_server 192.168.1.2 6603 { 
  46.      weight 3 
  47.      notify_down /usr/local/mysql/bin/mysql.sh 
  48.      TCP_CHECK { 
  49.      connect_timeout 10 
  50.      nb_get_retry 3 
  51.      delay_before_retry 3 
  52.      connect_port 6603 
  53.      } 
  54.      } 


! Configuration File for keepalived global_defs { router_id MySQL-ha } vrrp_instance VI_1 { state BACKUP interface eth1 virtual_router_id 90 priority 99 advert_int 1 notify_master "/usr/local/mysql/bin/remove_slave.sh" authentication { auth_type PASS auth_pass 1111 } virtual_ipaddress { 192.168.1.3 label eth1:1 192.168.1.4 label eth1:2 } } virtual_server 192.168.1.3 6603 { delay_loop 2 lb_algo wrr lb_kind DR persistence_timeout 60 protocol TCP real_server 192.168.1.2 6603 { weight 3 notify_down /usr/local/mysql/bin/mysql.sh TCP_CHECK { connect_timeout 10 nb_get_retry 3 delay_before_retry 3 connect_port 6603 } } } virtual_server 192.168.1.4 6603 { delay_loop 2 lb_algo wrr lb_kind DR persistence_timeout 60 protocol TCP real_server 192.168.1.2 6603 { weight 3 notify_down /usr/local/mysql/bin/mysql.sh TCP_CHECK { connect_timeout 10 nb_get_retry 3 delay_before_retry 3 connect_port 6603 } } }
keepalived配置成服务并开机启动

 

 

[plain]view plaincopyprint?

  1. cp /usr/local/keepalived/etc/rc.d/init.d/keepalived /etc/rc.d/init.d/ 
  2. cp /usr/local/keepalived/etc/sysconfig/keepalived /etc/sysconfig/ 
  3. cp /usr/local/keepalived/sbin/keepalived /usr/sbin/ 
  4. chkconfig --add keepalived  
  5. chkconfig --level 345 keepalived on 


cp /usr/local/keepalived/etc/rc.d/init.d/keepalived /etc/rc.d/init.d/ cp /usr/local/keepalived/etc/sysconfig/keepalived /etc/sysconfig/ cp /usr/local/keepalived/sbin/keepalived /usr/sbin/ chkconfig --add keepalived chkconfig --level 345 keepalived on
vi /usr/local/mysql/bin/remove_slave.sh

 

 

[plain]view plaincopyprint?

  1. #!/bin/bash 
  2. user=u1 
  3. password=12345 
  4. log=/usr/local/mysql/log/remove_slave.log 
  5. echo "`date`" >> $log 
  6. /usr/local/mysql/bin/mysql -u$user -p$password -e "set global read_only=OFF;reset master;stop slave;change master to master_host='localhost';" >> $log 
  7. /bin/sed -i 's#read-only#\#read-only#' /etc/my.cnf 


#!/bin/bash user=u1 password=12345 log=/usr/local/mysql/log/remove_slave.log echo "`date`" >> $log /usr/local/mysql/bin/mysql -u$user -p$password -e "set global read_only=OFF;reset master;stop slave;change master to master_host='localhost';" >> $log /bin/sed -i 's#read-only#\#read-only#' /etc/my.cnf

vi /usr/local/mysql/bin/mysql.sh

 

 

[plain]view plaincopyprint?

  1. #!/bin/bash 
  2. /etc/init.d/keepalived stop 


#!/bin/bash /etc/init.d/keepalived stop

3. 配置LVS
Master与Slave上的配置相同:
vi /usr/local/bin/lvs_real.sh

 

 

[plain]view plaincopyprint?

  1. #!/bin/bash 
  2. # description: Config realserver lo and apply noarp 
  3.   
  4. SNS_VIP=192.168.1.3 
  5. SNS_VIP2=192.168.1.4 
  6. source /etc/rc.d/init.d/functions 
  7. case "$1" in 
  8.   
  9. start) 
  10.        ifconfig lo:0 $SNS_VIP netmask 255.255.255.255 broadcast $SNS_VIP 
  11.        ifconfig lo:1 $SNS_VIP2 netmask 255.255.255.255 broadcast $SNS_VIP2 
  12.        /sbin/route add -host $SNS_VIP dev lo:0 
  13.        /sbin/route add -host $SNS_VIP2 dev lo:1 
  14.        echo "1" >/proc/sys/net/ipv4/conf/lo/arp_ignore 
  15.        echo "2" >/proc/sys/net/ipv4/conf/lo/arp_announce 
  16.        echo "1" >/proc/sys/net/ipv4/conf/all/arp_ignore 
  17.        echo "2" >/proc/sys/net/ipv4/conf/all/arp_announce 
  18.        sysctl -p >/dev/null 2>&1 
  19.        echo "RealServer Start OK" 
  20.        ;; 
  21.   
  22. stop) 
  23.        ifconfig lo:0 down 
  24.        ifconfig lo:1 down 
  25.        route del $SNS_VIP >/dev/null 2>&1 
  26.        route del $SNS_VIP2 >/dev/null 2>&1 
  27.        echo "0" >/proc/sys/net/ipv4/conf/lo/arp_ignore 
  28.        echo "0" >/proc/sys/net/ipv4/conf/lo/arp_announce 
  29.        echo "0" >/proc/sys/net/ipv4/conf/all/arp_ignore 
  30.        echo "0" >/proc/sys/net/ipv4/conf/all/arp_announce 
  31.        echo "RealServer Stoped" 
  32.        ;; 
  33.   
  34. *) 
  35.   
  36.        echo "Usage: $0 {start|stop}" 
  37.        exit 1 
  38. esac 
  39. exit 0 


#!/bin/bash # description: Config realserver lo and apply noarp SNS_VIP=192.168.1.3 SNS_VIP2=192.168.1.4 source /etc/rc.d/init.d/functions case "$1" in start) ifconfig lo:0 $SNS_VIP netmask 255.255.255.255 broadcast $SNS_VIP ifconfig lo:1 $SNS_VIP2 netmask 255.255.255.255 broadcast $SNS_VIP2 /sbin/route add -host $SNS_VIP dev lo:0 /sbin/route add -host $SNS_VIP2 dev lo:1 echo "1" >/proc/sys/net/ipv4/conf/lo/arp_ignore echo "2" >/proc/sys/net/ipv4/conf/lo/arp_announce echo "1" >/proc/sys/net/ipv4/conf/all/arp_ignore echo "2" >/proc/sys/net/ipv4/conf/all/arp_announce sysctl -p >/dev/null 2>&1 echo "RealServer Start OK" ;; stop) ifconfig lo:0 down ifconfig lo:1 down route del $SNS_VIP >/dev/null 2>&1 route del $SNS_VIP2 >/dev/null 2>&1 echo "0" >/proc/sys/net/ipv4/conf/lo/arp_ignore echo "0" >/proc/sys/net/ipv4/conf/lo/arp_announce echo "0" >/proc/sys/net/ipv4/conf/all/arp_ignore echo "0" >/proc/sys/net/ipv4/conf/all/arp_announce echo "RealServer Stoped" ;; *) echo "Usage: $0 {start|stop}" exit 1 esac exit 0

[plain]view plaincopyprint?

  1. chmod 755 /usr/local/bin/lvs_real.sh 
  2. echo "/usr/local/bin/lvs_real.sh start" >> /etc/rc.local 


chmod 755 /usr/local/bin/lvs_real.sh echo "/usr/local/bin/lvs_real.sh start" >> /etc/rc.local

五、Master和Slave的启动
1. 启动Master上的MySQL
service mysql start
2. 启动Slave上的MySQL
service mysql start
3. 启动Master上的realserver脚本
/usr/local/bin/lvs_real.sh start
4. 启动Slave上的realserver脚本
/usr/local/bin/lvs_real.sh start
5. 启动Master上的keepalived
service keepalived start
6. 启动Slave上的keepalived
service keepalived start


六、测试
1. 查看lvs能否进行负载均衡转发
在Master和Slave上分别执行:
ipvsadm -ln

2. 在Client上验证连通性:
ping 192.168.1.3
ping 192.168.1.4
mysql -u u1 -p12345 -P 6603 -h 192.168.1.3 -e "show variables like 'server_id'"
mysql -u u1 -p12345 -P 6603 -h 192.168.1.4 -e "show variables like 'server_id'"

3. 停掉Master上的MySQL,看写IP否自动切换到Slave,看读IP是否去掉了Master的MySQL
在Master和Slave上分别执行:
ipvsadm -ln
在Client上执行:
mysql -u u1 -p12345 -P 6603 -h 192.168.1.3 -e "show variables like 'server_id'"
mysql -u u1 -p12345 -P 6603 -h 192.168.1.4 -e "show variables like 'server_id'"

4. 停掉Master上的keepalived,看读写VIP是否会迁移到Slave上。
在Master和Slave上分别执行:
ipvsadm -ln
在Client上执行:
mysql -u u1 -p12345 -P 6603 -h 192.168.1.3 -e "show variables like 'server_id'"



在Master和Slave上分别执行:
ipvsadm -ln
在Client上执行:
mysql -u u1 -p12345 -P 6603 -h 192.168.1.3 -e "show variables like 'server_id'"
mysql -u u1 -p12345 -P 6603 -h 192.168.1.4 -e "show variables like 'server_id'"

6. 重启Master的系统,看看切换过程是否正常



七、参考
http://wenku.baidu.com/link?url=17K0UDApzfK18A8F5Of9wl0lmGx6AD_0PQ8GyVqmCsBMSz16xjt2JI88lPAeID2qECs7piUxkzQLyatTtDuEJxwZEy6joIBfBmT3vgTfdUS
http://blog.chinaunix.net/uid-23500957-id-3781918.html
http://blog.chinaunix.net/uid-23500957-id-3781919.html
http://blog.chinaunix.net/uid-20639775-id-3337471.html

转载于:https://my.oschina.net/u/2350399/blog/715737

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/398039.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

php 逗号编码,php有几种编码

当前 mbstring 模块支持以下的字符编码。这些字符编码中的任意一个都能指定到 mbstring 函数中的 encoding 参数。该 PHP 扩展支持的字符编码有以下几种:UCS-4*UCS-4BE (推荐学习:PHP视频教程)UCS-4LE*UCS-2UCS-2BEUCS-2LEUTF-32*UTF-32BE*UTF-32LE*UTF-…

jmeter命令行运行-分布式测试

秒秒开心jmeter命令行运行-分布式测试 上一篇文章我们说到了jmeter命令行运行但是是单节点下的, jmeter底层用java开发,耗内存、cpu,如果项目要求大并发去压测服务端的话,jmeter单节点难以完成大并发的请求,这时就需要…

ambari 自定义组件安装

借鉴:http://www.ibm.com/developerworks/cn/opensource/os-cn-bigdata-ambari3/index.htmlAmbari 在启动的时候,会扫描 resource 目录下 Stack 下面的 service 配置。也就是每个 Service 的 metainfo.xml,同时会将这些配置信息放在自己的数据…

android 双向滑动 seekbar

实现原理:1、自定义View,在onDraw(Canvas canvas)中,画出2个Drawable滑动块,2个Drawable滑动条,2个Paint(text)2、监听onTouchEvent()事件,修改滑块和滑动条的坐标,调用i…

java开发区块链只需150行代码

本文目的是通过java实战开发教程理解区块链是什么。将通过实战入门学习,用Java自学开发一个很基本的区块链,并在此基础上能扩展如web框架应用等。这个基本的java区块链也实现简单的工作量证明系统。本文用一个java例子,演示了开发一个区块链应用的过程,涉…

按钮长按

2019独角兽企业重金招聘Python工程师标准>>> 用update来实现定时 //长按处理update: function (delta) {cc.log("update "delta);this.totalTimedelta;if(this.totalTime>TOUCH_LONG_TIMER_INVOKE){this.stopTimer();this.invokeTouchLong();}},stop…

Git-如何将已存在的项目提交到git

1.首先在码云或者github上创建一个不带README.md的项目,然后复制远程库的地址(下面以码云为例):   2.进入本地已存在的项目目录:house    touch README.md //新建说明文件 git init //在当前项目目录中生成本地git…

ggplot2 theme相关设置—文本调整

在geom设置和scale设置之后,要想把图画的漂亮,theme设置是比不可少的 在theme 设置中element_text()是一项很重要的内容 element_text(family NULL, face NULL, colour NULL, size NULL, hjust NULL, vjust NULL, angle NULL, lineheight NULL) …

window10 mysql5.7 解压版 安装

1. 解压mysql-5.7.11-winx64.zip 到某文件夹, 如C:\DevelopCommon\mysql-5.7.11-winx64。 2. 配置环境变量 变量名 : MYSQL_HOME 变量值 : C:\DevelopCommon\mysql-5.7.11-winx64 -------------- 变量名 : Path 变量值 &#xff…

java zero copy 实现,关于Zero Copy

概述很多web应用都会有大量的静态文件。我们通常是从硬盘读取这些静态文件,并将完全相同的文件数据写到response socket。这样的操作需要较少的CPU,但是效率有些低,它需要经过如下的过程:kernel从硬盘读取数据,越过ker…

Java量与变量的区别

2019独角兽企业重金招聘Python工程师标准>>> 常量:其值不变即为常量。 语法: 数据类型 常量名 值; double PI 3.14;    备注: 一般默认常量名大写。 变量与常量之间关系(量间关系) 先来一个简单的实例,好了解 Java…

团队作业6

Alpha版本展示 一、 刘阳航|201521123026(组长) 博客地址:http://www.cnblogs.com/lyhooo/ 负责图形的创建和移动部分, 游戏区操作的实现,部分算法的编写 陈文俊|201521123047 博客地址:http://www.cnblogs…

java 新浪短网址生成器,新浪短链接接口被限制?最新新浪短网址api接口

背景新浪短网址api是sina平台官对外公开的短网址生成接口,可以将长链接通过接口生成t.cn样式的短链接,可以说是非常好用的。但近期新浪官方开始对已经公布的接口做出了多重限制,很多之前能用的功能现在都频频被限制,甚至有的时候接…

Sql Server 部署SSIS包完成远程数据传输

本篇介绍如何使用SSIS和作业完成自动更新目标数据任务。 ** 温馨提示:如需转载本文,请注明内容出处。** 本文链接:https://www.cnblogs.com/grom/p/9018978.html 笔者需要定期从服务器更新N家客户的远程服务器数据,上一篇的存储过程是其中一…

java值类型和引用类型 == 比较,Java中值类型和引用类型的比较与问题解决

一、问题描述前几天因为一个需求出现了Bug。说高级点也挺高级,说白点也很简单。其实也就是一个很简单的Java基础入门时候的值类型和引用类型的区别。只是开发的时候由于自己的问题,导致小问题的出现。还好突然想起来以前看过一篇对于该问题讲解的博客&am…

用最简单的例子说明设计模式(三)之责任链、建造者、适配器、代理模式、享元模式...

责任链模式一个请求有多个对象来处理,这些对象是一条链,但具体由哪个对象来处理,根据条件判断来确定,如果不能处理会传递给该链中的下一个对象,直到有对象处理它为止使用场景1)有多个对象可以处理同一个请求&#xff0…

利用Java针对MySql封装的jdbc框架类 JdbcUtils 完整实现(包含增删改查、JavaBean反射原理,附源码)...

最近看老罗的视频,跟着完成了利用Java操作MySQL数据库的一个框架类JdbcUtils.java,完成对数据库的增删改查。其中查询这块,包括普通的查询和利用反射完成的查询,主要包括以下几个函数接口: 1、public Connection getConnection() 获得数据库…

Linux启动提示Kernel panic - not syncing: Attempted to kill init解决办法

系统类型:CentOS 6.5(x64) 启动提示:Kernel panic - not syncing: Attempted to kill init 解决办法: 系统启动的时候,按下‘e’键进入grub编辑界面,编辑grub菜单,选择“kernel /vmlinuz-XXXXro root/dev/v…

vuex和vuejs

前言:在最近学习 Vue.js 的时候,看到国外一篇讲述了如何使用 Vue.js 和 Vuex 来构建一个简单笔记的单页应用的文章。感觉收获挺多,自己在它的例子的基础上进行了一些优化和自定义功能,在这里和大家分享下学习心得。 在这篇教程中我…

laravel mysql 配置,laravel5数据库配置及其注意事项

今天分享一个Laravel5数据库配置上的坑。Laravel5作为一套简洁、优雅的PHP Web开发框架(笑),唯一不足的一点就是中文手册或者说是资料比较少,虽然现在很多大神也开始普及这些东西,但是大神一遍也会忽略一下小坑。今天配置了一下数据库&#x…