服务热线
135-6963-3175
redis cluster集群搭建
准备机器列表用于安装redis主从节点及代理集群
ip | 角色 |
192.168.1.101 | master |
192.168.1.102 | slave |
192.168.1.103 | master |
192.168.1.104 | slave |
192.168.1.105 | redis-proxy |
192.168.1.106 | redis-proxy |
下载redis-4.0.6.tar.gz安装包并解压到/app下
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")