局域网内连接其他服务器上的mysql、redis数据库

在《如何应对服务器压力?服务器横向扩展(加机器)策略详谈》一文中,我提出了几套加机器的方案,其中加服务器的第一个方案就是将数据库和程序执行的服务器分开,一台服务器跑数据库,一台服务器跑程序代码。而现在,我就要实践这个操作。

首先,我们来分离网站程序和mysql数据库。

现在,另一台同网段(局域网内)的服务器已经买好了,mysql也在新的服务器上面安装好。接下来,我们需要做三个步骤:

  1. 允许从其他机器上面访问这个mysql
  2. 开放防火墙的端口
  3. 程序连接到新的mysql数据库

第一个步骤。我们要考虑到一个事实,即我们仅允许从原来的程序执行服务器访问新的mysql服务器,而且为了安全起见,我们最好新建一个mysql用户,这个用户不同于root,它只能进行增删改查的基本操作,而不能拥有管理权限,而且,这个用户只能从原来的服务器连接过来。我们假设程序端服务器IP为192.168.1.24(A),而新搭建的mysql服务器IP为192.168.24.111(B)。接下来我们要在B上进行操作。

创建这样的用户有两种方法,一种是通过phpmyadmin来操作,如果你使用过phpmyadmin,应该知道有一个新建用户的功能,在这个功能中新建一个用户,创建新的用户名密码等,授予合适的权限,其中关键的一点是,在该用户的域一栏中,要填写A服务器的IP地址,也就是192.168.1.24。然后点击创建。

但是如果B仅仅安装了mysql,而没有安装服务器环境和php,phpmyadmin是无法运行起来的,所以还有一种方法是通过mysql命令行来创建新用户:

GRANT  ALL PRIVILEGES ON *.* TO 'newusername'@'192.168.1.24' IDENTIFIED BY 'newuserpassword' WITH GRANT OPTION;

这样就创建了一个可以从192.168.1.24登陆B的新用户,A将通过这个用户与数据库连接。

第二个步骤。一般服务器都会通过防火墙来控制必要的一些访问,防止出现大规模的攻击。centos一般采用iptables防火墙,配置起来比较简单。为了简洁快速的打开端口,让A能够连接到B的mysql,我们执行下面的操作:

vi /etc/sysconfig/iptables

在规则列表中新增一行规则:

-A INPUT -s 192.168.1.24 -p tcp -m tcp --dport 3306 -j ACCEPT

添加上面这条规则之后,来自A服务器的访问如果请求3306端口,就会放行了。

第三个步骤。修改你的PHP程序,把数据库连接信息改为B服务器和刚才创建的用户信息。

至此,MySQL的分离工作已经完成了。

接下来,我们来分离Redis。

Redis的分离和mysql的分离有一样逻辑,也是修改B上面的Redis配置,打开防火墙端口,修改A上的连接程序。

第一个步骤。我们在B上面安装上了Redis,但我们需要修改Redis的配置文件。

vi /etc/redis.conf

找到bind 120.0.0.1,将这一行改为

bind 192.168.24.111

你可能已经注意到了,这个IP是B服务器的内网IP,这个和mysql那个新建用户的域不同,mysql要填写A服务器的IP,而Redis要绑定B服务器的IP。

如果在没有防火墙的情况下,经过这个修改,局域网内的所有服务器都可以连接到B,使用B的Redis(不过我们有防火墙)。为了避免这种情况,我们给redis增加密码,连接进行数据操作的时候,必须要进行密码验证,继续在配置文件中找到requirepass这一行,默认情况下,这一行是注释掉的,我们删除最前面的#,打开注释,并写入自己的新密码:

requirepass sfdf9sd8f09das87f89ds7af9

OK,完成redis的配置。但是mysql在新增用户后不用重启,redis更改配置后却需要重启服务器才能使配置生效。

service redis restart

第二个步骤。还记得上面是怎么打开mysql的防火墙端口的吗?我们用同样的方法,在iptables中增加:

-A INPUT -s 192.168.1.24 -p tcp -m tcp --dport 6379 -j ACCEPT

6379就是redis的默认端口,现在,在A服务器上面已经可以连接B上的redis了。

第三个步骤。在A上通过phpredis连接B上的redis,需要提供密码了。在进行所有数据交互前,执行如下连接操作:

$Redis = new Redis;
$Redis->connect('192.168.24.111',6379);
$Redis->auth('sfdf9sd8f09das87f89ds7af9');

这样,就完成了程序和Redis的分离。据说局域网内redis的吞吐能够达到150w条的数据量,赶紧体验一下网站的速度吧。

等一下,我们还可以做一些收尾工作,把B服务器上面的除了mysql和redis之外的其他服务停止,比如httpd、nginx之类的,把它们停到,这样B就成为纯粹提供数据服务的内部服务器了,再你需要进行调试,或特殊情况下,又可以打开httpd,用phpmyadmin来查看修改数据库。而在A服务器上,把之前使用的mysqld服务和redis服务停掉吧,虽然不会再有程序去连接它们,但是,它们一直再运行,也会消耗少量的资源。记得随时备份B上面的数据,最好做一个同步,将B上的数据同步到A上,如果哪一天B突然发生意外,可以临时开启A上的数据库服务,挽救一下,起码让网站的正常访问。

2015-11-29