大量业务快速读取需要redis支持,单个redis太吃力,考虑redis集群,先做一个小小测试;
下载redis,centos系统redis2.8版本不支持集群,需要3.0以上支持,windows系统2.8版本可以做主从;
wget http://download.redis.io/releases/redis-3.0.3.tar.gz
tar -zxvf redis-3.0.3.tar.gz
cd redis-3.0.3
make && make install
redis安装完成。
在两台Server10.10.10.43/44上创建六个节点,每台3个,3主3从。
1)Server1-10.10.10.43
cd /data
mkdir cluster //创建集群目录
mkdir 7000 7001 7002 //分别代表三个节点 其对应端口7000 7001 7002
创建7000节点为例,
cd ./7000 把编译后的redis.conf ./ //拷贝到当前7000目录
vi redis.conf //编辑配置 主要修改一下几个参数
daemonize yes //redis后台运行
pidfile /var/run/redis_7000.pid //pidfile文件对应7000
port 7000 //端口7000
cluster-enabled yes //开启集群 把注释#去掉
cluster-config-file nodes.conf //集群的配置 配置文件首次启动自动生成
cluster-node-timeout 5000 //请求超时 设置5秒够了
appendonly yes //aof日志开启 有需要就开启,它会每次写操作都记录一条日志
配置好了,就相应地把这个修改后的配置文件拷贝到7001 7002目录,注意要修改监听端口port7001 7002.
接下来,启动服务,进入节点目录
依次执行 redis-server redis.conf
可以看到生成了appendonly.aof nodes.conf
ps -ef | grep redis 查看是否启动成功
[root@localhostsrc]# ps aux|grep redis
root 956 0.3 0.4 137444 9372 ? Ssl 05:38 0:04 redis-server *:7000 [cluster]
root 960 0.3 0.4 137444 9312 ? Ssl 05:39 0:04 redis-server *:7001 [cluster]
root 964 0.3 0.4 137444 9488 ? Ssl 05:39 0:04 redis-server *:7002 [cluster]
root 992 0.0 0.0 103252 820 pts/0 S+ 05:59 0:00 grep redis
[root@localhostsrc]# netstat -tnlp | grep redis
tcp 0 0 0.0.0.0:7000 0.0.0.0:* LISTEN 956/redis-server *
tcp 0 0 0.0.0.0:7001 0.0.0.0:* LISTEN 960/redis-server*
tcp 0 0 0.0.0.0:7002 0.0.0.0:* LISTEN 964/redis-server *
tcp 0 0 0.0.0.0:17000 0.0.0.0:* LISTEN 956/redis-server *
tcp 0 0 0.0.0.0:17001 0.0.0.0:* LISTEN 960/redis-server *
tcp 0 0 0.0.0.0:17002 0.0.0.0:* LISTEN 964/redis-server*
tcp 0 0 :::7000 :::* LISTEN 956/redis-server *
tcp 0 0 :::7001 :::* LISTEN 960/redis-server *
tcp 0 0 :::7002 :::* LISTEN 964/redis-server *
tcp 0 0 :::17000 :::* LISTEN 956/redis-server *
tcp 0 0 :::17001 :::* LISTEN 960/redis-server *
tcp 0 0 :::17002 :::* LISTEN 964/redis-server *
我们除了看到配置文件中设置的端口700* 还有700*+10000 (1700*), 前者是客户端访问的,后者是集群内部节点之间访问的.在多台Server间搭建集群,如果开了防火墙的,需要设置iptables开放上面所有端口.
同样server10.10.10.44上面也是设置7003,7004,7005的redis端口;
前面已经准备好了搭建集群的redis节点,接下来我们要把这些节点都串连起来搭建集群。官方提供了一个工具:redis-trib.rb (/usr/local/redis/src/redis-trib.rb)看后缀就知道这鸟东西不能直接执行,它是用ruby写的一个程序,所以我们还得安装ruby.
yum -y install ruby ruby-devel rubygems rpm-build //网上不明觉厉,网上都是这么安装的。
再用gem 这个命令来安装redis接口 gem貌似是ruby的一个工具包 反正没错就是了。
gem install redis //等一会儿就好了
当然,方便操作,两台Server都要安装。
上面的步骤完事了, 确认所有的节点都启动,接下来使用参数create创建 (在Server1中来创建)
./redis-trib.rbcreate --replicas 1 127.0.0.1:7000 127.0.0.1:7001 127.0.0.1:7002 10.10.10.44:700310.10.10.44:7004 10.10.10.44:7005
解释下,--replicas 1 表示自动为每一个master节点分配一个slave节点 上面有6个节点,程序会按照一定规则生成3个master(主)3个slave(从),好像是随机的生成主从,试了好多次,想43做主,44做从,没成功,可能没找到规律吧(:
前面已经提醒过的防火墙一定要开放监听的端口,否则会创建失败。
运行中,提示CanI set the above configuration? (type 'yes' to accept): yes //输入yes
接下来提示 Waiting for the cluster to join.......... 安装的时候在这里就一直等等等,没反应, 参照网上是说到各个节点中输入命令会快很多, 在Server2,redis-cli -c -p 700* 分别进入redis各节点的客户端命令窗口,依次输入cluster meet 10.10.10.43 7000……
为毛没感觉快,第一次搭建过程中机器重启了,悲剧的再重新来一次,不过出错了如下:
./redis-trib.rbcreate --replicas 1 127.0.0.1:7000 127.0.0.1:7001 127.0.0.1:7002 10.10.10.44:700310.10.10.44:7004 10.10.10.44:7005
>>>Creating cluster
Connecting to node127.0.0.1:7000: OK
[ERR] Node127.0.0.1:7000 is not empty. Either the node already knows other nodes (checkwith CLUSTER NODES) or contains some key in database 0.
Redis集群搭建上次没完成这次报错了,解决如下:
解决方法:
1)、将需要新增的节点下aof、rdb等本地备份文件删除;
2)、同时将新Node的集群配置文件删除,即:删除你redis.conf里面cluster-config-file所在的文件;
3)、再次添加新节点如果还是报错,则登录新Node,./redis-cli–h x –p对数据库进行清除:
172.168.63.201:7001> flushdb #清空当前数据库
重启下redis-server就可以了;
言归正传开始搭建:
./redis-trib.rb create--replicas 1 127.0.0.1:7000 127.0.0.1:7001 127.0.0.1:7002 10.10.10.44:7003 10.10.10.44:7004 10.10.10.44:7005
>>> Creatingcluster
Connecting to node127.0.0.1:7000: OK
Connecting to node127.0.0.1:7001: OK
Connecting to node 127.0.0.1:7002:OK
Connecting to node10.10.10.44:7003: OK
Connecting to node10.10.10.44:7004: OK
Connecting to node10.10.10.44:7005: OK
>>>Performing hash slots allocation on 6 nodes...
Using 3 masters:
127.0.0.1:7000
10.10.10.44:7003
127.0.0.1:7001
Adding replica10.10.10.44:7004 to 127.0.0.1:7000
Adding replica127.0.0.1:7002 to 10.10.10.44:7003
Adding replica10.10.10.44:7005 to 127.0.0.1:7001
M:4b205b34c399df5524f39fd277a41feb0a538cdf 127.0.0.1:7000
slots:0-5460 (5461 slots) master
M: 371839b536868a967beed332cd8fab06dbfdbf4e127.0.0.1:7001
slots:10923-16383 (5461 slots) master
S:d8fa3317aa1240969c7f5882315dc1e911eed8f8 127.0.0.1:7002
replicatesef59161100534ab467b780eeaf34fd89256fd238
M:ef59161100534ab467b780eeaf34fd89256fd238 10.10.10.44:7003
slots:5461-10922 (5462 slots) master
S:f7992d1df9da4b7428c10d0c19a8d1a37f8c701b 10.10.10.44:7004
replicates4b205b34c399df5524f39fd277a41feb0a538cdf
S:a3de835c2f9debc3ab6c53fb09b140e8f54287af 10.10.10.44:7005
replicates 371839b536868a967beed332cd8fab06dbfdbf4e
Can I set the aboveconfiguration? (type 'yes' to accept): yes
>>> Nodesconfiguration updated
>>> Assign adifferent config epoch to each node
>>> SendingCLUSTER MEET messages to join the cluster
Waiting for thecluster to join.........................................................................................................
>>>Performing Cluster Check (using node 127.0.0.1:7000)
M:4b205b34c399df5524f39fd277a41feb0a538cdf 127.0.0.1:7000
slots:0-5460 (5461 slots) master
M:371839b536868a967beed332cd8fab06dbfdbf4e 127.0.0.1:7001
slots:10923-16383 (5461 slots) master
M:d8fa3317aa1240969c7f5882315dc1e911eed8f8 127.0.0.1:7002
slots: (0 slots) master
replicates ef59161100534ab467b780eeaf34fd89256fd238
M:ef59161100534ab467b780eeaf34fd89256fd238 10.10.10.44:7003
slots:5461-10922 (5462 slots) master
M:f7992d1df9da4b7428c10d0c19a8d1a37f8c701b 10.10.10.44:7004
slots: (0 slots) master
replicates 4b205b34c399df5524f39fd277a41feb0a538cdf
M:a3de835c2f9debc3ab6c53fb09b140e8f54287af 10.10.10.44:7005
slots: (0 slots) master
replicates371839b536868a967beed332cd8fab06dbfdbf4e
[OK] All nodes agreeabout slots configuration.
>>> Check foropen slots...
>>> Check slotscoverage...
[OK] All16384 slots covered.
终于看到ok了,集群到此初步搭建好了;
下面进行测试:
查看节点状态:
[root@localhost7002]# redis-cli -c -p 7000 cluster nodes
f7992d1df9da4b7428c10d0c19a8d1a37f8c701b10.10.10.44:7004 slave 4b205b34c399df5524f39fd277a41feb0a538cdf 0 14763628189495 connected
4b205b34c399df5524f39fd277a41feb0a538cdf10.10.10.43:7000 myself,master - 0 0 1 connected 0-5460
371839b536868a967beed332cd8fab06dbfdbf4e127.0.0.1:7001 master - 0 1476362818445 2 connected 10923-16383
d8fa3317aa1240969c7f5882315dc1e911eed8f8127.0.0.1:7002 slave ef59161100534ab467b780eeaf34fd89256fd238 0 1476362818445 4connected
a3de835c2f9debc3ab6c53fb09b140e8f54287af10.10.10.44:7005 slave 371839b536868a967beed332cd8fab06dbfdbf4e 0 14763628204616 connected
ef59161100534ab467b780eeaf34fd89256fd23810.10.10.44:7003 master - 0 1476362819454 4 connected 5461-10922
模拟一个master宕了以后,对应slave接管,变为master,可以实现;
测试数据:
[root@localhost7005]# redis-cli -c -p 7005
127.0.0.1:7005>set testa ???????????
-> Redirected toslot [2133] located at 10.10.10.43:7000
OK
10.10.10.43:7000>get testa
"???????????"
10.10.10.43:7000>
root@localhostsrc]# redis-cli -c -p 7000
127.0.0.1:7000>get testa
"???????????"
添加删除节点等等,仅仅是测试机,随便玩,线上业务会很多配置测试……