专注人工智能在金融领域的应用

Redis3.0 集群搭建

上一篇介绍了《Redis3.0 集群设计要点》,本文将介绍如何搭建 Redis 集群。
 
安装redis-cluster依赖:redis-cluster的依赖库在使用时有兼容问题,在reshard时会遇到各种错误,请按指定版本安装。

  (1) 确保系统安装zlib,否则gem install会报(no such file to load — zlib)

  1. #download:zlib-1.2.6.tar
  2. ./configure
  3. make
  4. make install

(2) 安装ruby:version(1.9.2)

  1. # ruby1.9.2
  2. cd /path/ruby
  3. ./configure -prefix=/usr/local/ruby
  4. make
  5. make install
  6. sudo cp ruby /usr/local/bin

(3) 安装rubygem:version(1.8.16)

  1. # rubygems-1.8.16.tgz
  2. cd /path/gem
  3. sudo ruby setup.rb
  4. sudo cp bin/gem /usr/local/bin

(4) 安装gem-redis:version(3.0.0) ./redis-trib.rb是ruby程序,需要到rubygem去安装redis的包

  1. gem install redis –version 3.0.0
  2. #由于源的原因,可能下载失败,就手动下载下来安装
  3. #download地址:http://rubygems.org/gems/redis/versions/3.0.0
  4. #备用下载地址:http://pan.baidu.com/s/1eQFcbg2
  5. gem install -l /data/soft/redis-3.0.0.gem
要让集群正常工作至少需要3个主节点,在这里我们要创建6个redis节点,其中三个为主节点,三个为从节点,对应的redis节点的ip和端口对应关系如下
127.0.0.1:7000
127.0.0.1:7001
127.0.0.1:7002
127.0.0.1:7003
127.0.0.1:7004
127.0.0.1:7005
1:下载redis。
官网下载3.0.0版本,之前2.几的版本不支持集群模式
下载地址:http://download.redis.io/releases/redis-3.0.2.tar.gz
备用下载地址:http://pan.baidu.com/s/1qW26sDA
2:上传服务器,解压,编译
tar -zxvf redis-3.0.2.tar.gz.tar.gz
mv redis-3.0.2.tar.gz.tar.gz redis3.0
cd /usr/local/redis3.0
make
make install
3:创建集群需要的目录
mkdir -p /usr/local/cluster
cd /usr/local/cluster
mkdir 7000
mkdir 7001
mkdir 7002
mkdir 7003
mkdir 7004
mkdir 7005
4:修改配置文件redis.conf

cp /usr/local/redis3.0/redis.conf  /usr.local/cluster
vi redis.conf

##修改配置文件中的下面选项

port 7000
daemonize yes
cluster-enabled yes
cluster-config-file nodes.conf
cluster-node-timeout 5000
appendonly yes

##修改完redis.conf配置文件中的这些配置项之后把这个配置文件分别拷贝到7000/7001/7002/7003/7004/7005目录下面

cp /usr/local/cluster/redis.conf /usr/local/cluster/7000
cp /usr/local/cluster/redis.conf /usr/local/cluster/7001
cp /usr/local/cluster/redis.conf /usr/local/cluster/7002
cp /usr/local/cluster/redis.conf /usr/local/cluster/7003
cp /usr/local/cluster/redis.conf /usr/local/cluster/7004
cp /usr/local/cluster/redis.conf /usr/local/cluster/7005

##注意:拷贝完成之后要修改7001/7002/7003/7004/7005目录下面redis.conf文件中的port参数,分别改为对应的文件夹的名称

5:分别启动这6个redis实例

cd /usr/local/cluster/7000
redis-server redis.conf

cd /usr/local/cluster/7001
redis-server redis.conf

cd /usr/local/cluster/7002
redis-server redis.conf

cd /usr/local/cluster/7003
redis-server redis.conf

cd /usr/local/cluster/7004
redis-server redis.conf

cd /usr/local/cluster/7005
redis-server redis.conf

##启动之后使用命令查看redis的启动情况ps -ef|grep redis

如下显示则说明启动成功

# ps -ef|grep redis

root     13703     1  0 10:03 ?        00:00:00 redis-server *:7000 [cluster]
root     14323     1  0 10:04 ?        00:00:00 redis-server *:7001 [cluster]
root     14015     1  0 10:04 ?        00:00:00 redis-server *:7002 [cluster]
root     14133     1  0 10:04 ?        00:00:00 redis-server *:7003 [cluster]
root     14172     1  0 10:04 ?        00:00:00 redis-server *:7004 [cluster]
root     14187     1  0 10:04 ?        00:00:00 redis-server *:7005 [cluster]

6:执行redis的创建集群命令创建集群

#redis-trib.rb的create子命令构建
#–replicas 则指定了为Redis Cluster中的每个Master节点配备几个Slave节点
#节点角色由顺序决定,先master之后是slave

创建方式:

cd /usr/local/redis3.0/src
./redis-trib.rb    create  –replicas  1  127.0.0.1:7000  127.0.0.1:7001  127.0.0.1:7002 127.0.0.1:7003 127.0.0.1:7004 127.0.0.1:7005
#这里的–replicas 1 表示每个主节点下有一个从节点
输入yes,显示如下,配置完成。
《Redis3.0 集群搭建》
注意观察 主从的配置:
默认是前三个节点 7000  7001  7002 是主,后3个节点 7003  7004   7005 是从。
如果是部署在不同的服务器,请根据主从分部规则,分开在不同的服务器。
至此redis集群即搭建成功!
Redis集群测试
# redis-cli -c -p 7000
127.0.0.1:7000> set weburl wangbaocai.cn
-> Redirected to slot [13061] located at 127.0.0.1:7002
OK
127.0.0.1:7002> get weburl
“wangbaocai.cn”
在node7000中插入一条数据,redis根据key计算该条数据应存放在node7002上,因此自动切换到了node7002上。
下面连接node7006,来查询上面插入的这条数据,可以看到redis切换到了node7002上,查询到该数据。
# redis-cli -c -p 7006
127.0.0.1:7006> get weburl
-> Redirected to slot [13061] located at 127.0.0.1:7002
“wangbaocai.cn”
127.0.0.1:7002>
下面还是连接node7006,查询所有的key,可以查询到存在node7002上面的数据,因为7006是7002的slave,所以会同步7002的数据。
# redis-cli -c -p 7006
127.0.0.1:7006> keys *
1) “weburl”
127.0.0.1:7006>
下面连接node7000,来测试看看是否能查询到存在node7002中的所有key呢?
# redis-cli -c -p 7000
127.0.0.1:7000> keys *
(empty list or set)
127.0.0.1:7000>
通过测试,发现在node7000想查询集群中的所有key是不可能的,也就是我上一篇文章《Redis3.0 集群设计要点》中提到的 redis cluster  不支持多key操作。
Redis集群的管理
#通过check cluster的一个节点,就知道整个集群的状况,可以看出来谁是主,谁是从
./redis-trib.rb check 127.0.0.1:7000
#查看集群节点的相关信息
redis-cli -p 7000 -h 127.0.0.1 cluster nodes
 
#添加节点,add-node  将一个节点添加到集群里面, 第一个是新节点ip:port, 第二个是任意一个已存在节点ip:port
./redis-trib.rb add-node 127.0.0.1:7006 127.0.0.1:7000
#node:新节点没有包含任何数据, 因为它没有包含任何slot。新加入的加点是一个主节点, 当集群需要将某个从节点升级为新的主节点时, 这个新节点不会被选中

# 为新节点分配slot

  1. redis-trib.rb reshard 10.10.34.14:6386
  2. #根据提示选择要迁移的slot数量(ps:这里选择500)
  3. How many slots do you want to move (from 1 to 16384)? 500
  4. #选择要接受这些slot的node-id
  5. What is the receiving node ID? f51e26b5d5ff74f85341f06f28f125b7254e61bf
  6. #选择slot来源:
  7. #all表示从所有的master重新分配,
  8. #或者数据要提取slot的master节点id,最后用done结束
  9. Please enter all the source node IDs.
  10.   Type ’all’ to use all the nodes as source nodes for the hash slots.
  11.   Type ’done’ once you entered all the source nodes IDs.
  12. Source node #1:all
  13. #打印被移动的slot后,输入yes开始移动slot以及对应的数据.
  14. #Do you want to proceed with the proposed reshard plan (yes/no)? yes
  15. #结束
#添加节点的测试,需求:把7006这个节点作为slave添加到7000这个master节点上
#命令如下:
./redis-trib.rb add-node --slave 127.0.0.1:7006 127.0.0.1:7000
#note:在线添加slave 时,需要dump整个master进程,并传递到slave,再由 slave加载rdb文件到内存,rdb传输过程中Master可能无法提供服务,整个过程消耗大量io,小心操作.
 
#如果需要改变主从关系,比如将7006这个服务节点从master(7000)转变成master(7001),那么如下
redis-cli -p 7006 -h 127.0.0.1
127.0.0.1:7006> cluster replicate 5dfa7d9f2dbb4ab64b71f2713538125354c88462
#5dfa7d9f2dbb4ab64b71f2713538125354c88462是master(7001)的NodeID
#删除一个slave节点
#redis-trib del-node ip:port ‘<node-id>’
./redis-trib.rb del-node 10.10.34.14:7386 ‘c7ee2fca17cb79fe3c9822ced1d4f6c5e169e378′
 
#删除一个master节点
#删除master节点之前首先要使用reshard移除master的全部slot,然后再删除当前节点(目前只能把被删除master的slot迁移到一个节点上)
  1. #把10.10.34.14:6386当前master迁移到10.10.34.14:6380上
  2. redis-trib.rb reshard 10.10.34.14:6380
  3. #根据提示选择要迁移的slot数量(ps:这里选择500)
  4. How many slots do you want to move (from 1 to 16384)? 500(被删除master的所有slot数量)
  5. #选择要接受这些slot的node-id(10.10.34.14:6380)
  6. What is the receiving node ID? c4a31c852f81686f6ed8bcd6d1b13accdc947fd2 (ps:10.10.34.14:6380的node-id)
  7. Please enter all the source node IDs.
  8.   Type ’all’ to use all the nodes as source nodes for the hash slots.
  9.   Type ’done’ once you entered all the source nodes IDs.
  10. Source node #1:f51e26b5d5ff74f85341f06f28f125b7254e61bf(被删除master的node-id)
  11. Source node #2:done
  12. #打印被移动的slot后,输入yes开始移动slot以及对应的数据.
  13. #Do you want to proceed with the proposed reshard plan (yes/no)? yes
 
#删除空master节点
./redis-trib.rb del-node 10.10.34.14:6386 ’f51e26b5d5ff74f85341f06f28f125b7254e61bf’
 
点赞

发表评论

电子邮件地址不会被公开。 必填项已用*标注

您可以使用这些HTML标签和属性: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>