大量业务快速读取需要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

"???????????"

添加删除节点等等,仅仅是测试机,随便玩,线上业务会很多配置测试……