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 注释掉也行 //默认ip为127.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: 最近一次发送ping的unix毫秒时间戳,0代表没有发送过。
6. pong-recv: 最近一次收到pong的unix毫秒时间戳。
7. config-epoch: 该节点或其master节点的epoch值。每次故障转移都会生成一个新的,唯一的,递增的epoch值。若多个节点竞争相同的slot,epoch值大的获胜。
8. link-state: 节点和集群总线间的连接状态,可以是connected或disconnected。
9. slot: 该节点负责的slot。
存在master机器上
Kill掉一个redis后
一个salve变为master
把原来的salve也kill掉后集群失效
节点挂掉后的重新启动
注:在不同的目录下启动redis生成的node id是不同的,所以原来挂掉的redis在哪里启动的,就需要在哪里重新启动,这样才能保证重新启动的redis节点能重新加入到集群。
重新加入后原来挂掉的master节点会变为slave节点。这样会导致的问题就是,挂掉之前写入master的数据,如果还没有同步到slave,原master节点启动后会去同步新master节点的数据,导致未同步的数据丢失。
启动后,当前目录下aof和rdb文件不要删除,该文件用来存储redis中的数据,节点重新启动后优先从aof文件中获取数据,再是rdb中的数据。
部署流程,假设有三台主机(192.168.0.220,192.168.0.254,192.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.254:8085 加入到原来的集群
把其他两个从节点也加入
新加入的节点也是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.conf、appenonly.aof、dumb.rdb
启动
3.重新启动节点后,没有自动加入到集群里
检查重新启动后,节点的node id 是否和原先的一致,如果不一致,kill掉后,在之前启动的目录下重新启动(在原路径启动后node id才会一致)