redis是一个非常强大的nosql服务,不仅能替代memcache这样的key/value服务,也具有强大的队列功能,在普通应用上可以替代activemq/rabbitmq一类队列服务
但是目前为止,redis都没有实现真正有效的集群功能,redis的作者承诺会在redis 3.0的时候将名为“redis-cluster”的集群功能加入redis,但是截至目前,redis还是2.8版本
redis本身不具有集群,不代表我们不能实现redis集群,通过思考,我选择使用流行的负载均衡器+redis的组合来实现
在负载均衡器的选择上,我选择haproxy。目前圈内流行的负载均衡器有lvs、nginx、haproxy,lvs的资料相对较少,nginx只支持http和email的负载均衡,相较之下,只有haproxy比较适合我们的应用场景。
多的不说了,我们马上开始
实验过程全部在一台服务器上进行:
192.168.1.168
在这台服务器上只装了一个redis
/usr/local/redis
但是通过使用不同的配置文件(实际只是copy了同一份配置文件,改一下监听端口),开启了两个redis监听实例,就等于两个redis了
192.168.1.168:6379
192.168.1.168:6378
我们的haproxy装在
/usr/local/haproxy
安装过程很简单
到http://download.chinaunix.net/download/0013000/12508.shtml下载haproxy的最新版本,我选择下载http://down1.chinaunix.net/distfiles/haproxy-1.4.21.tar.gz这个
tar zxvf haproxy-1.4.21.tar.gz
mv haproxy-1.4.21 /usr/local/haproxy
cd /usr/local/haproxy
make install
这样就装好了,简单不
接下来要写配置文件
cd /usr/local/haproxy
mkdir conf log
cd conf
vim haproxy.cfg
配置内容如下:
global
log 127.0.0.1 local0 #日志输出配置,所有日志都记录在本机,通过local0输出
maxconn 4096 #最大连接数
chroot /usr/local/haproxy #改变当前工作目录
user haproxy #所属运行的用户
group haproxy #所属运行的用户组
daemon #以后台形式运行ha-proxy
nbproc 4 #启动4个ha-proxy实例
pidfile /usr/local/haproxy/log/haproxy.pid #pid文件位置
defaults
log 127.0.0.1 local3 #日志文件的输出定向
mode tcp #{ tcp|http|health } 设定启动的实例的协议类型,此处要选择tcp,因为redis是基于tcp协议运行的
option dontlognull #保证HAProxy不记录上级负载均衡发送过来的用于检测状态没有数据的心跳包
option redispatch #当serverId对应的服务器挂掉后,强制定向到其他健康的服务器
retries 2 #重试2次连接失败就认为服务器不可用,主要通过后面的check检查
maxconn 2000 #最大连接数
balance roundrobin #负载均衡算法,roundrobin表示轮询,source表示按照IP
contimeout 5000 #连接超时时间
clitimeout 50000 #客户端连接超时时间
srvtimeout 50000 #服务器端连接超时时间
listen proxy 192.168.1.168:6300
server redis_192.168.1.168_6378 192.168.1.168:6378 check inter 2000 rise 2 fall 5 #你的均衡节点
server redis_192.168.1.168_6379 192.168.1.168:6379 check inter 2000 rise 2 fall 5
配置文件保存,然后来启动haproxy
/usr/local/haproxy/haproxy -f /usr/local/haproxy/conf/haproxy.cfg
如果修改了配置文件要重新运行,先要结束haproxy的所有进程
killall haproxy
然后再重新执行启动haproxy的命令
这样redis的集群就搭好了!
现在来试验一下,php代码:
$redis = new Redis();
$redis->connect('192.168.1.168',6300);
$r = $redis->info();
print_r($r);
打印出来的状态数组,能看得出来是不同的实例,process_id是不同的进程id
以上是为实现redis集群目的进行的haproxy配置,haproxy是一款非常强大的负载均衡器,功能不止于此
更多的haproxy配置方法请参考:
http://blog.zhanxb.com/post/476
更详细的haproxy配置参数解释请参考:
http://www.cnblogs.com/dkblog/archive/2012/03/13/2393321.html