redis-集群搭建
Time : 20181019,通过这篇文章掌握 centos7 下redis的集群搭建
通过一台服务器进行Redis集群搭建,方式是通过不同的TCP端口启动实例,组成集群
环境
1. redis-3.2.8
2. CentOS7
3. redis3 以上版本才支持集群搭建,需要使用Rube
Redis 安装
1. 将 redis 上传到服务器的目录
cd /home/softwares/redis
tar -zxvf redis-3.2.8 : 解压到当前目录
执行 make;make install
2. 创建 redis-cluster,并将 redis安装目录下的redis.conf 复制到 redis-cluster下
3. 创建 redis-7000.conf...redis-7006.conf
4. 修改redis-xxx.conf
# 配置端口 7001-7006
port 7006
# ip 默认为127.0.0.1,需要改为其他机器可以访问的节点ip,否则创建的时候无法访问对应的端口,导致创建集群失败
bind 172.16.1.131
# redis 后台运行
daemonize yes
# 开启集群
cluster-enabled yes
# pidfile pid对应 7001-7006
pidfile ./redis-7006.pid
# 集群的配置,首次启动会创建
cluster-config-file nodes_7006.conf
# 集群失效时间默认为15S可自行配置
cluster-node-timeout 15000
# aof 日志,有需要就开启它会每次写操作会记录一条日志
appendonly yes
5. 启动
redis-server ../redis-cluster/redis-7001.conf
redis-server ../redis-cluster/redis-7002.conf
redis-server ../redis-cluster/redis-7003.conf
redis-server ../redis-cluster/redis-7004.conf
redis-server ../redis-cluster/redis-7005.conf
redis-server ../redis-cluster/redis-7006.conf
6. 检查
ps -ef|grep redis
此IP的六个redis启动成功;
redis集群-ruby
1. Redis3以上的集群是通过Redis安装目录下的bin/redis-trib.rb脚本搭建。
2. 这个脚本是ruby 写的,尝试运行 Ruby redis-trib.rb
3. 打印 Usage: redis-trib <command> <options> <arguments ...>
说明执行成功可以跳过 Ruby安装
Ruby安装
1. yum安装ruby和依赖的包。 yum -y install ruby ruby-devel rubygems rpm-build
2. 使用 gem 这个命令安装redis接口 : gem是Ruby的二进制工具包
gem install redis
3. ERROR error installing redis; 需要升级Ruby版本
4. 升级 Ruby
安装 rvm :# curl -L get.rvm.io | bash -s stable
若安装失败 提示 : gpg2 --recv-keys 409B6B1796C275462A1703113804BB82D39DC0E3
需要先运行 gpg2 --recv-keys 409B6B1796C275462A1703113804BB82D39DC0E3 再安装 rvm
5. source环境,让rvm可用。 source /usr/local/rvm/scripts/rvm
6. 查看 Ruby 版本
# rvm list known
# MRI Rubies
[ruby-]1.8.6[-p420]
[ruby-]1.8.7[-head] # security released on head
[ruby-]1.9.1[-p431]
[ruby-]1.9.2[-p330]
[ruby-]1.9.3[-p551]
[ruby-]2.0.0[-p648]
[ruby-]2.1[.10]
[ruby-]2.2[.7]
[ruby-]2.3[.4]
[ruby-]2.4[.1]
7. 升级Ruby
rvm install 最新版本(2.4.1)
8. 安装gem redis接口,成功! gem install redis
9. 安装rubygems,成功! yum install -y rubygems
Redis集群搭建
1. 有了Ruby执行环境,可以开始将之前的6个实例组建成集群了。
ruby ./redis-trib.rb create --replicas 1 172.16.1.131:7001 172.16.1.131:7002 172.16.1.131:7003 172.16.1.131:7004 172.16.1.131:7005 172.16.1.131:7006
--replicas 1表示为集群的master节点创建1个副本。那么6个实例里,有三个master,有三个是slave,后面跟上6个实例就好了,形式就是ip:port
2. 可以看到3个master和对应的replica已经建立起来
验证集群状态
1. 登录集群客户端,-c标识以集群方式登录 : ./bin/redis-cli -h 10.93.84.53 -p 7000 -c
2. 查看集群状态 : cluster info
原理和注意事项
redis cluster在设计的时候,就考虑到了去中心化,去中间件,也就是说,集群中的每个节点都是平等的关系,都是对等的,每个节点都保存各自的数据和整个集群的状态。每个节点都和其他所有节点连接,而且这些连接保持活跃,这样就保证了我们只需要连接集群中的任意一个节点,就可以获取到其他节点的数据。
Redis集群没有并使用传统的一致性哈希来分配数据,而是采用另外一种叫做哈希槽(hash slot)的方式来分配的,一致性哈希对向集群中新增和删除实例的支持很好,但是哈希槽对向集群新增实例或者删除实例的话,需要额外的操作,需要手动的将slot重新平均的分配到新集群的实例中。
redis cluster 默认分配了 16384 个slot,当我们set一个key时,会用CRC16算法来取模得到所属的slot,然后将这个key分到哈希槽区间的节点上,具体算法就是:CRC16(key)%16384。
Redis 集群会把数据存在一个master节点,然后在这个master和其对应的salve之间进行数据同步。当读取数据时,也根据一致性哈希算法到对应的master节点获取数据。只有当一个master 挂掉之后,才会启动一个对应的salve节点,充当master。
需要注意的是:必须要3个或以上的主节点,否则在创建集群时会失败,并且当存活的主节点数小于总节点数的一半时,整个集群就无法提供服务了。
编写shell脚本
前几次都是一个一个 redis 服务的启动 : 每次都是 redis-server ../redis-7001.conf ....
突然想到编写一个简单的 Shell 脚本 touch redis.sh
#! /bin/bash
# 启动 redis
./../redis-3.2.8/src/redis-server redis-7001.conf
./../redis-3.2.8/src/redis-server redis-7002.conf
./../redis-3.2.8/src/redis-server redis-7003.conf
./../redis-3.2.8/src/redis-server redis-7004.conf
./../redis-3.2.8/src/redis-server redis-7005.conf
./../redis-3.2.8/src/redis-server redis-7006.conf
# 启动 集群
ruby ./../redis-3.2.8/src/redis-trib.rb create --replicas 1 172.16.1.131:7001 172.16.1.131:7002 172.16.1.131:7003 172.16.1.131:7004 172.16.1.131:7005 172.16.1.131:7006
赋予执行权限 : chmod u+x redis.sh
进行执行 ./redis.sh 启动集群