技术交流28群

服务热线

135-6963-3175

微信服务号

redis-trib方式集群搭建 更新时间 2020-5-14 浏览1978次

redis cluster集群搭建


准备机器列表用于安装redis主从节点及代理集群

ip角色
192.168.1.101master
192.168.1.102slave
192.168.1.103master
192.168.1.104slave
192.168.1.105
redis-proxy
192.168.1.106redis-proxy
  1. 下载redis-4.0.6.tar.gz安装包并解压到/app下

  2. cd redis-4.0.6 
    make
    make PREFIX=/app/redis-cluster install #PREFIX必须为大写

    将redis-cluster目录分发到以上机器列表中

3.配置redis.conf

daemonize yes #后台启动
port 7001
cluster-enabled yes #开启cluster,去掉注释
# 数据保存位置
dir /app/redis-cluster/redis-data
# 集群配置文件,不需要我们维护,首次启动的时候会自动生成
cluster-config-file nodes.conf
cluster-node-timeout 15000
appendonly yes

4.安装reids-trib所需的ruby脚本

 复制脚本到redis-cluster目录下

 cp /app/redis-4.0.6/src/redis-trib.rb /app/redis-cluster
 yum install ruby
 yum install rubygems

5. 在所有节点启动redis,并开启相关端口

./redis-server redis.conf


6.使用redis-trib.rb创建集群

主从自己指定方式

./redis-trib.rb create 192.168.1.101:7001 192.168.1.103:7001

该命令101和103都为主节点

然后为主节点添加子节点

三种方式:

方式1:

./redis-trib.rb add-node --slave 192.168.1.102:7001 192.168.1.101:7001
./redis-trib.rb add-node --slave 192.168.1.104:7001 192.168.1.103:7001

方式2:

./redis-trib.rb add-node --slave --master-id xxxxxxx 192.168.1.102:7001 192.168.1.101:7001
./redis-trib.rb add-node --slave --master-id xxxxxxx 192.168.1.104:7001 192.168.1.103:7001

master-id通过

redis-trib.rb check 192.168.1.101:7001命令查看

如果没有给定那个主节点--master-id的话,redis-trib将会将新增的从节点随机到从节点较少的主节点上。

方式3:

redis-trib.rb replicate --master-addr ip:port --salve-addr ip2:port2

随机主从方式创建:

redis-trib.rb create  --replicas 1 ip1:port1 ip2:port2 ip3:port3 ip4:port4

--replicas 1表示为每一个主节点创建一个从节点

备注:其实也不建议使用-replicas 1来自动创建主从关系,因为这种创建方法没办法指定哪个从节点对应哪个主节点,无法控制交叉主从。可以先创建好主节点,然后再通过创建从节点指定主节点。


附相关操作命令:

增加主节点,通过命令

方式1:
./redis-trib.rb add-node ip:port(被增加节点)  ip2:port2(集群已存在的节点)
方式2:
redis-trib.py add_node --existing-addr   (已存在的)ip:port  --new-addr(待添加的)
#将一个节点添加到群集,但既不设置为从节点,也不向其迁移插槽

若要移除节点

(1).移除主节点

redis-trib del-node ip:port ${node-id}

node-id为要删除的主节点,和添加节点不同,移除节点node-id是必需的。

若有数据是不能被删除的,需要将数据先迁移出去。

注意: 删除主节点之前需要先将主节点上的所有slot移动到别的主节点,并且保证没有从节点,否则需要先将从节点移走或者删除.

删除节点和增加节点语法节点的循序正好相反

(2).移除从节点

./redis-trib del-node ip:port(被删除节点的主节点) ${node-id}

node-id为被删除节点的id

迁移插槽

redis-trib.py migrate $slots --src-addr $masterNode --dst-addr detHost:PORT 

redis-trib.py migrate --src-addr SRC_HOST:PORT --dst-addr DST_HOST:PORT SLOT SLOT_BEGIN-SLOT_END

迁移插槽(需要包含所有迁移插槽的源节点,并且两个节点在同一集群中)

修复插槽(迁移)

redis-trib.py fix --addr $dst_addr

目前fix命令能修复两种异常, 1. 节点中存在处于迁移中(importing或migrating状态)的slot。 2. 节点中存在未分配的slot。

移动slot

redis-trib.rb reshard 192.168.191.11:7001
#ip和端口随便指定集群中的某一个,然后输入要移动的slot个数(可以按slot总数\master数量)和目标节点id,最后输入done即可。
用于add-node后节点上没slot,可以把其它集群上的slot移动一些过来


7.接下来创建predixy集群

predixy实现了redis cluster集群节点的代理(屏蔽),客户端不需要知道集群中的具体节点个数和主从身份,可以直接通过代理访问集群。

支持多密码配置(auth.conf)

下载地址:https://gitcode.net/mirrors/joyieldInc/predixy/-/archive/1.0.5/predixy-1.0.5.tar.gz

直接执行:

$ cd predixy-1.0.5
$ make

编译后会在src目录生成一个可执行文件predixy

主要配置文件

auth.conf(密码权限配置)

Authority {
    Auth {
         Mode write
    }
    Auth "#a complex password#" {
        Mode admin
    }
}

cluster.conf(集群模式代理配置)

ClusterServerPool {
    MasterReadPriority 60
    StaticSlaveReadPriority 50
    DynamicSlaveReadPriority 50
    RefreshInterval 1
    ServerTimeout 1
    ServerFailureLimit 10
    ServerRetryTimeout 1
    KeepAlive 120
    Servers {#Servers为redis集群中master节点地址集合
        + 192.168.1.101:7001
        + 192.168.1.103:7001
    }
}
附配置说明
Password: 指定连接redis实例默认的密码,不指定的情况下表示redis不需要密码
Databases: 指定redis db数量,不指定的情况下为1
Hash: 指定对key算哈希的方法,当前只支持atol和crc16
HashTag: 指定哈希标签,不指定的话为{}
Distribution: 指定分布key的方法,当前只支持modula和random
MasterReadPriority: 读写分离功能,从redis master节点执行读请求的优先级,为0则禁止读redis master,不指定的话为50
StaticSlaveReadPriority: 读写分离功能,从静态redis slave节点执行读请求的优先级,所谓静态节点,是指在本配置文件中显示列出的redis节点,不指定的话为0
DynamicSlaveReadPolicy: 功能见上,所谓动态节点是指在本配置文件中没有列出,但是通过redis sentinel动态发现的节点,不指定的话为0
RefreshInterval: predixy会周期性的请求redis sentinel以获取最新的集群信息,该参数以秒为单位指定刷新周期,不指定的话为1秒
ServerTimeout: 请求在predixy中最长的处理/等待时间,如果超过该时间redis还没有响应的话,那么predixy会关闭同redis的连接,并给客户端一个错误响应,对于blpop这种阻塞式命令,该选项不起作用,为0则禁止此功能,即如果redis不返回就一直等待,不指定的话为0
ServerFailureLimit: 一个redis实例出现多少次才错误以后将其标记为失效,不指定的话为10
ServerRetryTimeout: 一个redis实例失效后多久后去检查其是否恢复正常,不指定的话为1秒
KeepAlive: predixy与redis的连接tcp keepalive时间,为0则禁止此功能,不指定的话为0
Sentinels: 里面定义redis sentinel实例的地址
Group: 定义一个redis组,Group的名字应该和redis sentinel里面的名字一致,Group里可以显示列出redis的地址,列出的话就是上面提到的静态节点

代理启动方法

./predixy  ../conf/predixy.conf

predixy.conf会把其它配置文件Include进来

问题

若要操作带密码的集群,由于redis-trib.rb不支持使用密码的集群模式,故还需要修改redis-trib.rb脚本来使其支持带密码的集群部署,具体修改方法如下。

找到如下这一行:

vim /opt/redis/bin/redis-trib.rb
@r = Redis.new(:host => @info[:host], :port => @info[:port], :timeout => 60)

修改为:

@r = Redis.new(:host => @info[:host], :port => @info[:port], :timeout => 60, :password => "123456")