设为首页 收藏本站
查看: 1390|回复: 0

[经验分享] redis cluster官方集群的搭建笔记

[复制链接]

尚未签到

发表于 2018-11-4 12:49:36 | 显示全部楼层 |阅读模式
  参考文档:
  https://www.zybuluo.com/phper/note/195558
  http://www.cnblogs.com/shihaiming/p/5949772.html
  http://redis.io/topics/cluster-tutorial
  http://xiaorui.cc
  系统环境:
  CentOS6.7 X86_64
  双机6节点:
  node1: 192.168.2.11
  node2: 192.168.2.12
  node3:192.168.2.13
  redis cluster必须用3.X版本的才能支持。我们实验中使用的是3.0.1版本的redis。
安装redis
  安装redis的过程略过。
安装ruby及相关redis依赖组件
  #!/bin/bash
  # 安装Ruby2.3.0,安装到/usr/local/ruby目录下
  # 安装rubygems、安装redis-rb组件
  # 先安装相关的devel包
  yum install zlib zlib-developenssl openssl-devel -y
  wait
  # 编译安装 ruby2.3.0
  tar xf src/ruby-2.3.0.tar.gz -Csrc/
  cd src/ruby-2.3.0
  ./configure --enable-shared--enable-pthread --prefix=/usr/local/ruby
  make && make install
  wait
  echo 'exportPATH=/usr/local/ruby/bin:$PATH' > /etc/profile.d/ruby.sh
  source /etc/profile.d/ruby.sh
  # 安装 rubygems
  /usr/local/ruby/bin/gem installrubygems-update
  update_rubygems
  wait
  # 安装redis-rb
  /usr/local/ruby/bin/gem installredis
  wait
  # 一些补充说明:
  # client.rb的存放路径:
  #/usr/local/ruby/lib/ruby/gems/2.3.0/gems/redis-3.3.1/lib/redis/client.rb
  # redis 3.X cluster 如果添加密码认证的话,需要修改client.rb里面的password
配置redis cluster的基本操作
  node1、node2上都运行3个节点
  node1上如下操作:
  cd /usr/local/
  mkdir redis_cluster
  cd redis_cluster
  mkdir 7000 7001 7002
  cp /usr/local/redis/etc/redis.conf7000/
  vim 7000/redis.conf 修改的地方如下:
  pidfile /var/run/redis7000.pid
  port 7000
  logfile "./redis.log"
  dir /usr/local/redis_cluster/7000/
  appendonly yes
  cluster-enabled yes      # 注意一定要开启这个集群功能
  同样的操作,将redis.conf 复制到7001 7002文件夹下,并修改下各自的配置文件
  sed -i 's#7000#7001#'/usr/local/redis_cluster/7001/redis.conf
  sed -i 's#7000#7002#' /usr/local/redis_cluster/7002/redis.conf
  配置文件都修改好后,启动3个redis实例。
  redis-server/usr/local/redis_cluster/7000/redis.conf
  redis-server/usr/local/redis_cluster/7001/redis.conf
  redis-server/usr/local/redis_cluster/7002/redis.conf
  ss -lnt
  可以看到redis不仅监听在7000~7002端口上,还开启了700X+10000的端口号。
  700X是用于客户端访问的
  1700X是用于集群内部节点之间访问的
  node2上如下操作:
  cd /usr/local/
  mkdir redis_cluster
  cd redis_cluster
  mkdir 7003 7004 7005
  vim 7003/redis.conf 修改的地方如下:
  pidfile /var/run/redis7003.pid
  port 7003
  logfile "./redis.log"
  dir /usr/local/redis_cluster/7003/
  appendonly yes
  cluster-enabled yes      # 注意一定要开启这个集群功能
  同样的操作,将redis.conf 复制到7004 7005文件夹下,并修改下各自的配置文件
  redis-server/usr/local/redis_cluster/7003/redis.conf
  redis-server/usr/local/redis_cluster/7004/redis.conf
  redis-server /usr/local/redis_cluster/7005/redis.conf
  ss -lnt|grep 700
  node1和node2都启动好了之后,我们可以执行下面的操作:
  说明:
  我编译安装的redis,不知为何在/usr/local/redis/下所有文件夹里都没有redis-trib.rb 这个文件。因此我是从原始的安装包把src/redis-trib.rb拷贝到/usr/local/redis/bin里面的。
  cp /root/redis-3.0.1/src/redis-trib.rb  /usr/local/redis/bin
  然后在node1上执行:
  redis-trib.rb create --replicas 1192.168.2.11:7000 192.168.2.11:7001 192.168.2.11:7002 192.168.2.12:7003192.168.2.12:7004 192.168.2.12:7005
  上面的命令含义:replicas 是给master分配slave个数的参数,我们给的参数是1 ,那每个master就有一个从节点
DSC0000.png

DSC0001.png

  运行后,还可以运行redis-trib.rb check192.168.2.11:7000 检查下集群的状态,如下图:
DSC0002.png

  现在,我们加入一台主机node3,node3上跑了1个redis,端口是7006。redis.conf的配置文件和上面的基本相同。
  在node3上启动7006端口的redis:
  redis-server/usr/local/redis_cluster/7006/redis.conf
  然后,我们到node1上,添加一个节点node3的7006端口,在node1上操作如下:
  redis-trib.rb add-node 192.168.2.13:7006192.168.2.11:7000
  格式:redis-trib.rb add-node 你想要的增加的ip:port  现在已经存在的IP:port
  如果这一步添加失败了,原因可能如下:[摘录自xiaorui.cc]
  [ERR]Node xx.xx.xx.xx:7006 is not empty. Either the node already knows other nodes(check with CLUSTER NODES) or contains some key in database 0.
  上面的问题比较常见,尤其大家在测试的环境下,需要删除你redis.conf里面cluster-config-file 所在的文件。如果是你线上的环境一般很难遇到这样的问题,如果是小范围测试的时候,不注意把redis.conf都复制成一样,或者端口不一样,cluster的配置文件是一样所以redis启动不了,但势必会造成这个问题….    如果删除文件不好用,那么就直接redis-cli -p port进去,然后删掉所有的数据……   这两件事情都做OK了后,就可以正常启动了,不会提示你 not empty了。
  添加成功后,再检查下,如下图:
  redis-trib.rb check 192.168.2.11:7000
DSC0003.png

  上图中可以看出:master有4个,slave有3个。
  然后我们可以尝试使用redis-cli来连接redis实例。
  # redis-cli -p 7003 -h 192.168.2.12 -c
  # 注意这个-c参数,不加-c则客户端不自动切换。而加上-c如果set存数据发现不在本机上则会自动切换到7001客户端保存。
  然后可以随意set写入些内容,如下图。
DSC0004.png

  可以看到我们set 第一条数据的时候,直接给我们转到了192.168.2.12 7005端口的redis上去。
  然后再次set数据的时候,又跳到了192.168.2.12 7003端口的redis了。
  补充说明:这些key是经过CRC16('my_name')%16384计算后,自动分配存放到其他的master上了
集群中一个master宕机
  6台(3主3从)试验中,可以看到当某一个master宕机后,其对应的slave会自动提升为master提供服务,对集群不会造成影响。
  但是如果之后这个slave也挂了,则整个集群都会受到影响。
集群中再加入一个节点(分为主节点、从节点)
  当前环境3master、3slave
  如果我们在加入一台redis的话,默认是添加成为master节点的。
  > cluster nodes   可以看到集群中有哪些节点,下图可以看到新加入的节点还是myself状态。
DSC0005.png

  redis-trib.rb check 192.168.2.13:7006
DSC0006.png

  可以看到新加入的这个节点没有分配数据,因此我们需要迁移下数据。见下面的数据的reshard操作:
数据的reshard
  我们可以在线进行reshard,目的是让slot重新按照我们的规则分配,这样能一定程度。的解决数据分配不均匀的情况。如果你先增加了一个节点,也可以用reshard的方式让一定数目的slot迁移过去….   这样解决了新节点的slot分配….
  迁移的方法:redis-trib.rb reshard 192.168.2.12:7005
  说明:redis-trib.rb reshard 要迁移的集群中的任意节点IP:PORT
  输入上面的命令后,自动出现“How many slots do you want tomove (from 1 to 16384)”  这个是问我们要迁移多少个slot到7006这个新节点。
  可以算一下,16384/4=4096,也就是说,为了平衡分配起见,我们需要移动4096个槽点到7006上。

  输入4096后,系统自动提示我们输入要接收这些slot数据的主机的ID是多少?>  接着, redis-trib 会向你询问重新分片的源节点(source node),也即是,要从哪个节点中取出4096个哈希槽,并将这些槽移动到7006节点上面。
  如果我们不打算从特定的节点上取出指定数量的哈希槽,那么可以向redis-trib输入all,这样的话,集群中的所有主节点都会成为源节点,redis-trib将从各个源节点中各取出一部分哈希槽,凑够 4096个,然后移动到7006节点上:
  Source node #1:all
  接下来就开始迁移了,并且会询问你是否确认:
  输入 yes 并使用按下回车之后, redis-trib 就会正式开始执行重新分片操作,将指定的哈希槽从源节点一个个地移动到7006节点上面。
  迁移完成后,可以执行redis-trib.rb check192.168.2.12:7005 查看下7006的slot数量是多少。
从reids cluster中删除一个redis节点….
  root@ubuntu:~/redis-3.0.1/src#./redis-trib.rb del-node 127.0.0.1:7007
给指定的redis master节点添加从节点…
  默认add-node是添加主master节点…..
  ./redis-trib.rb add-node –slave–master-id ’ee05942ee38a56421a07eea01bc6072fe5e23bfd’ 127.0.0.1:7008  127.0.0.1:7000


运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-630674-1-1.html 上篇帖子: redis集群配置 下篇帖子: 给redis cluster集群加上认证功能
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表