redis cluster架构
一个 Redis Cluster由多个 Redis 节点构成,不同节点组服务的数据没有交集,也就是每个一节点组对应数据 sharding 的一个分片.
节点组内部分为主备两类节点,对应 master 和 slave 节点.两者数据实时一致,通过异步化的主备复制机制来保证.
一个节点组有且只有一个 master 节点,同时可以有 0 到多个 slave 节点,在这个节点组中只有 master 节点对用户提供写服务,读服务可以由 master 或者 slave 提供.如下图,包含三个 master 节点以及三个 master 对应的 slave 节点,一般一组集群至少要 6 个节点才能保证完整的高可用.
其中三个 master 会分配不同的 slot(表示数据分片区间),当 master 出现故障时,slave 会自动选举成为 master 顶替主节点继续提供服务.
主机规划 192.168.80.236:6301 主 192.168.80.236:6302 从 192.168.80.86:6303 主 192.168.80.86:6304 从 192.168.80.7:6305 主 192.168.80.7:6306 从
各个节点安装
wget http://download.redis.io/releases/redis-5.0.5.tar.gz
解压
tar -zxvf redis-5.0.5.tar.gz
安装所需环境和工具并编译
yum -y install wget vim tcl gcc make
cd redis-5.0.5/
make install PREFIX=/home/redis-cluster/redis
分别创建6个节点的目录
mkdir -p /home/redis-cluster/630{1..6}/conf
mkdir -p /home/redis-cluster/630{1..6}/log
mkdir -p /home/redis-cluster/630{1..6}/run
mkdir -p /home/redis-cluster/630{1..6}/working
复制redis.conf 到/home/redis-cluster/6301/conf/redis-6301.conf
修改配置
vim redis-6301.conf
bind 0.0.0.0
protected-mode no
port 6301
daemonize yes
pidfile "/home/redis-cluster/6301/run/redis_6301.pid"
logfile "/home/redis-cluster/6301/log/redis_6301.log"
dir "/home/redis-cluster/6301/working" #数据存储目录,目录要提前创建好
masterauth 填写密码 #redis从去连接redis主使用的密码
requirepass 填写密码 #redis节点密码 建议都设置成一样的
appendonly yes
cluster-enabled yes #开启集群
cluster-config-file nodes-6301.conf #集群节点配置文件,这个文件是不能手动编辑的。确保每一个集群节点的配置文件不同
cluster-node-timeout 15000 #集群节点的超时时间,单位:ms,超时后集群会认为该节点失败
复制配置文件给其他五个, 修改文件名和对于端口号即可
sudo sed -i 's/6301/其他redis端口/g' redis-其他redis端口.conf
分别启动六个服务
/home/redis-cluster/redis/bin/redis-server /home/redis-cluster/630{1..6}/conf/redis-630{1..6}.conf
查看六个服务都启动完成之后,创建集群
./redis-cli --cluster create 192.168.80.236:6301 192.168.80.236:6302 192.168.80.86:6303 192.168.80.86:6304 192.168.80.7:6305 192.168.80.7:6306 -a 密码 --cluster-replicas
--cluster-replicas 1:表示采用最简单的方式配置集群,即每个master配1个slave,6个节点
就形成了3主3从
查看集群状态信息
cluster info
cluster nodes
集群操作
删除主节点 删除主节点稍微麻烦一点,因为主节点分配了 slots 槽,所以必须先把 slots 槽放到其他可用节点中去, 然后再进行移除节点操作才行,不然会出现数据丢失问题。
把数据移动到其它主节点中去,执行重新分片命令。
./redis-cli -a 密码 --cluster reshard 192.168.80.7:6305
192.168.80.7:6305 分配了 5461 个槽,这里输入 5461 即可。 回车以后,出现 what is the receiving node ID? 意思是你想移动到那个节点上。 我想移动到 6303 的节点上,那么此处输入 6303 节点的 ID。 回车以后,需要填写数据源节点 ID,就是 6305节点的 ID,因为我们要把 6305节点的数据移动到其他 节点去。 回车以后,还可以继续选择其他源节点,但是我这里只想把 6305 节点分到其它地方就行,此处输入 done 即可,否则输入其它节点的 ID,最后输入 done。
接下来,删除主节点, 从节点直接使用以下命令即可删除。
redis-cli --cluster del-node host:port node_id
--host:port:表示的是要删除的那个节点的 IP 和端口
--node_id:表示的是删除的那个节点的节点 ID
例子
./redis-cli -a 密码 --cluster del-node 192.168.80.7:6305 2c79f6d5a0dc4d9908a5a5f7525566fe73a7f145
添加主节点 首先准备一个新的节点,添加配置问件,启动新节点。 使用以下命令添加主节点
redis-cli --cluster add-node new_host:new_port existing_host:existing_port --cluster-master-id node_id
--new_host:new_port:为要新添加的主节点 IP 和端口
--existing_host:existing_port:表示的是环境中已存在的最后一个主节点的 IP 和端口,这个可以通过 查看节点信息得知
--–cluster-master-id:表示的是最后一个主节点的节点 ID,表示的是新添加的主节点要在这个节点 后面
例子
./redis-cli -a 密码 --cluster add-node 192.168.80.7:6305 192.168.80.86:6303 --cluster-master-id e7becd5419236a33dc1d413076cbc95d2a412b81
再次查看集群信息 会发现 6305 端口对应的节点已经加到集群中,是主节点,但是没有从节点,也没有分配槽数。
重新分片 添加完新节点后,需要对新添加的主节点进行 hash 槽重新分配,这样该主节点才能存储数据,Redis 共有16384个槽。
redis-cli --cluster reshard host:port --cluster-from node_id --cluster-to node_id --cluster-slots <args> --cluster-yes
--host:port:集群中随便一个节点的 IP : PORT 连接集群用的
--cluster-from node_id:表示的是从哪个节点取出槽,节点 ID
--cluster-to node_id:表示的是取出的槽添加给哪个节点,也就是新添加的那个主节点 ID
-–cluster-slots 5460:表示的是给新主节点分配多少,此处 5461表示是分配5461槽数,然后需要输入 yes 重新进行槽分配。
-–cluster-yes:不回显槽分配信息直接移动。
例子:
./redis-cli -a M密码 --cluster reshard 192.168.80.7:6305 --cluster-from e7becd5419236a33dc1d413076cbc95d2a412b81 --cluster-to 4d6c30be1acc7ffb9b3a9a9b99be4c1d7b69f38a --cluster-slots 5461
添加从节点
redis-cli --cluster add-node new_host:new_port existing_host:existing_port --cluster-slave --cluster-master-id node_id
--new_host:new_port:表示的是要添加的那个从节点的 IP 和端口
--existing_host:existing_port:表示的是要给哪个主节点添加从节点
-–cluster-slave:表示的是要添加从节点
-–cluster-master-id node_id:表示要给哪个主节点添加从节点,该主节点节点 ID
例子
./redis-cli -a 密码 --cluster add-node 192.168.80.12:6306 192.168.80.12:6305 --cluster-slave --cluster-master-id 2c79f6d5a0dc4d9908a5a5f7525566fe73a7f145
标签:node,cluster,--,Redis,redis,192.168,Cluster,集群,节点
From: https://blog.51cto.com/u_15204812/6437585