redis集群搭建

Redis安装

cd /usr/local/

wget http://download.redis.io/releases/redis-3.2.1.tar.gz

tar -xvf /redis-3.2.1.tar.gz

make && make install

如果报错

/bin/sh: cc: command not found

执行

sudo yum -y install gcc gcc-c++ libstdc++-devel

make MALLOC=libc

cd src

make install

 

集群搭建(在两台虚拟机上启了6个redis端口)

/usr/local下新建redis-cluster目录

在该目录下新建对应端口的目录

在目录中放对应的配置文件

redis-3.2.1中拷贝redis.conf至新建的端口目录

修改对应的redis.conf

以下为需要修改的字段

port  7001                                        //端口7000,7002,7003        

bind 注释掉也行          //默认ip127.0.0.1 需要改为其他节点机器可访问的ip 否则创建集群时无法访问对应的端口,无法创建集群

daemonize    yes                               //redis后台运行

pidfile /var/run/redis_7001.pid          //pidfile文件对应7001,7002,7003

cluster-enabled  yes                           //开启集群  把注释#去掉

cluster-config-file  nodes_7001.conf   //集群的配置  配置文件首次启动自动生成 7001,7002,7003

cluster-node-timeout  15000                //请求超时  默认15秒,可自行设置

appendonly  yes                           //aof日志开启  有需要就开启,它会每次写操作都记录一条日志

logfile "/usr/local/redis-cluster/6380/reids.log"   //日志位置,如果不写会没有日志,log还是有必要

 

 

同样的在另一台虚拟机上执行以上操作

 

启动redis

查看启动状态

启动集群

搭建ruby环境

yum -y install ruby ruby-devel rubygems rpm-build

gem install redis

可能会报错,提示ruby版本号过低,如果有这个提示,先升级ruby

curl -L get.rvm.io | bash -s stable

source /etc/profile.d/rvm.sh(上一步完成后会有提示执行source

查看可安装的ruby版本

rvm list known

例如安装2.5.1则执行

rvm install 2.4.1

等待ruby安装完毕

 

gem install redis

yum install -y rubygems

 

组建集群

ruby ./redis-trib.rb create --replicas 1 192.168.3.11:7001 192.168.3.11:7002 192.168.3.11:7003 192.168.3.22:7001 192.168.3.22:7002 192.168.3.22:7003

--replicas 1 表示一个master一个slave  后面的排列没有什么标准,并不是MSMSMS也不是MMMSSS,好像是随机的

输入以上命令后能看到哪些端口是Master哪些是Slave

确认后输入yes

验证集群状态

redis-cli -h 192.168.0.254 -p 6379 -c

cluster nodes显示的每一行信息,由下面的字段组成。

<id> <ip:port> <flags> <master> <ping-sent> <pong-recv> <config-epoch> <link-state> <slot> <slot> ... <slot>

每个字段的含义如下:

1. id: 节点ID,一个40字节的随机字符串,节点创建时生成,且不会变化(除非使用CLUSTER RESET HARD命令)。

2. ip:port: 客户端访问的地址。

3. flags: 逗号分隔的标记位,可能值有:myself, master, slave, fail?, fail, handshake, noaddr, noflags

4. master: 若是已知master节点的slave,这里出现的是master的节点ID,否则是"-"

5. ping-sent: 最近一次发送pingunix毫秒时间戳,0代表没有发送过。

6. pong-recv: 最近一次收到pongunix毫秒时间戳。

7. config-epoch: 该节点或其master节点的epoch值。每次故障转移都会生成一个新的,唯一的,递增的epoch值。若多个节点竞争相同的slotepoch值大的获胜。

8. link-state: 节点和集群总线间的连接状态,可以是connecteddisconnected

9. slot: 该节点负责的slot

存在master机器上

Kill掉一个redis

一个salve变为master

把原来的salvekill掉后集群失效

节点挂掉后的重新启动

注:在不同的目录下启动redis生成的node id是不同的,所以原来挂掉的redis在哪里启动的,就需要在哪里重新启动,这样才能保证重新启动的redis节点能重新加入到集群。

重新加入后原来挂掉的master节点会变为slave节点。这样会导致的问题就是,挂掉之前写入master的数据,如果还没有同步到slave,原master节点启动后会去同步新master节点的数据,导致未同步的数据丢失。

启动后,当前目录下aofrdb文件不要删除,该文件用来存储redis中的数据,节点重新启动后优先从aof文件中获取数据,再是rdb中的数据。

部署流程,假设有三台主机(192.168.0.220192.168.0.254192.168.0.249),一台备机(192.168.0.221

现在三台主机中启动redis,然后创建集群

./redis-trib.rb create --replicas 0 192.168.0.220:6379 192.168.0.254:6379 192.168.0.249:6379

三个节点都加到集群,且都为主节点

为每个主节点增加从节点

我们在192.168.0.221中创建三个redis从节点

启动集群后添加节点

./redis-trib.rb add-node 192.168.0.221:6379 192.168.0.220:6379

192.168.0.2548085 加入到原来的集群

把其他两个从节点也加入

新加入的节点也是master,但是没有分配范围

将刚加入的节点改为主节点的从节点

redis-cli -c -p 6379 cluster replicate 50b95d5c04fe2d3af981d94e56247e4e9f0c5600

redis-cli -c -p 6380 cluster replicate ba35c9d06f590fa269408c82d730c89ef6ff157a

redis-cli -c -p 8085 cluster replicate d98916a65c533595ad4accc8bbaa4442e544a508

可以看到之前加入的从节点都变为了之前三台主机上的从节点

 

如果新加入的节点,就是需要作为主节点,则在该节点加入后,需要重新分配槽值

新启动一个8089节点,同上,将该节点加入到集群

./redis-trib.rb reshard 192.168.0.221:8089

选择分配给该新主节点多少槽值以及是从指定的主节点中分离部分给新的节点,还是从原有所有的节点中分离

249:6379中分离200个节点到新的节点

查询集群当前的状态可以看到现在分配的节点有哪些

 

删除从节点,可直接使用del-node进行

但是删除主节点时,需要将主节点原有的槽值节点移除,重新分配给别的主节点再进行删除

分配的流程同之前新加主节点的流程,使用reshard命令

 

将新主节点的所有槽值节点(200个)分配给之前的的节点

221:8089中原来的节点分配到了220:6379的节点上

现在可以删除原来的主节点了

./redis-trib.rb del-node 192.168.0.221:8089 2c057751a057c18071eef55a0ef9158583f5e66b

删除后会自动关闭节点

 

 

节点kill掉后会出现noaddr的状态

由于没有ip,无法通过del-node方法进行删除

需要用到cluster forget,这个只能禁用1分钟的心跳同步,所以需要在1分钟内在所有的节点上都执行这个操作

 

执行完毕后

原来的noaddr没有了

 

 

遇到问题:

1.curl -L get.rvm.io | bash -s stable时,报错“无法检查签名:没有公钥”

解决方案:

gpg --keyserver hkp://keys.gnupg.net --recv-keys 409B6B1796C275462A1703113804BB82D39DC0E3 7D2BAF1CF37B13E2069D6956105BD0E739499BDB

 

 

2.ruby ./redis-trib.rb create --replicas 1 192.168.0.254:6379 192.168.0.254:6380 192.168.0.220:6379 192.168.0.220:6380 192.168.0.249:6379 192.168.0.249:6380

1)报错不存在

解决方案:进入到redis-trib.rb的根目录下

查找:find / -name redis-trib.rb

得到:/usr/local/redis-3.2.1/src

启动:redis-server /usr/local/redis-cluster/6380/redis.conf

 

2)报错Node is empty

解决方案:

杀死redis服务

删除redis相关的nodes-xxxx.confappenonly.aofdumb.rdb

启动

 

3.重新启动节点后,没有自动加入到集群里

检查重新启动后,节点的node id 是否和原先的一致,如果不一致,kill掉后,在之前启动的目录下重新启动(在原路径启动后node id才会一致)

 

posted @ 2020-08-25 10:10  上枫  阅读(326)  评论(0编辑  收藏  举报