redis cluster的实现。

redis cluster基本介绍

1、首先在搭建集群时,会为每一个分片的主节点,对应一个从节点,实现slaveof的功能,同时当主节点down,实现类似于sentinel的自动failover的功能。

2、在redis cluster在多分片节点中,将16384个槽位,均匀分布到多个分片节点中,存数据时,redis根据每个key进行一个crc16哈希运算,得出一个数字,和16384取模,得出的结果0到16383。

3、根据计算得出的槽位值,找到相对应的分片节点的主节点,存储到相应槽位上

4、如果客户端当时连接的节点不是要存储的分片节点,分片集群会将连接切换至存储节点进行数据存储

部署

集群插件安装

# 安装epel 
# 安装依赖
yum install ruby rubygems -y
cd /opt/software/
wget https://cache.ruby-lang.org/pub/ruby/2.5/ruby-2.5.1.tar.gz
tar zxf ruby-2.5.1.tar.gz
cd ruby-2.5.1
./configure --prefix=/opt/modules/ruby
make install

# 设置软连接
ln -s /opt/modules/ruby/bin/ruby /usr/bin/ruby
ln -s /opt/modules/ruby/bin/gem /usr/bin/gem
ln -s /opt/modules/ruby/bin/erb /usr/bin/erb

# 配置国内源
gem sources -a http://mirrors.aliyun.com/rubygems/ 
gem sources --remove https://rubygems.org/
gem sources -l
gem install redis

节点配置

shell脚本批量创建节点 create_rediscluster.sh

#!/bin/bash
mkdir /opt/modules/redis/conf/700{0..5}
for ((i=7000;i<=7005;i++));
do
cat >> /opt/modules/redis/conf/$i/redis.conf <<EOF
port $i
daemonize yes
pidfile /opt/modules/redis/conf/$i/redis.pid
loglevel notice
logfile "/opt/modules/redis/conf/$i/redis.log"
dbfilename dump.rdb
dir /opt/modules/redis/conf/$i
protected-mode no
cluster-enabled yes
cluster-config-file nodes.conf
cluster-node-timeout 5000
appendonly yes
EOF

启动节点

[root@node1 redis]# for ((i=7000;i<=7005;i++));do redis-server /opt/modules/redis/conf/$i/redis.conf;done;
[root@node1 redis]# ps -ef|grep redis
root      94801      1  3 00:30 ?        00:00:00 redis-server *:7000 [cluster]
root      94803      1  0 00:30 ?        00:00:00 redis-server *:7001 [cluster]
root      94808      1  0 00:30 ?        00:00:00 redis-server *:7002 [cluster]
root      94813      1  0 00:30 ?        00:00:00 redis-server *:7003 [cluster]
root      94822      1  0 00:30 ?        00:00:00 redis-server *:7004 [cluster]
root      94824      1  0 00:30 ?        00:00:00 redis-server *:7005 [cluster]

节点加入集群管理

redis-cluster分片是1主1从的结构,下面命令需要注意的是会把前三个几点 7000,70001,7002 作为主,同时7000也是后续管理连接到7000这个节点,后面的作为从。7000对应的从为7003,以此类推。另外生产主从节点,7000和7003是不能放在同一台硬件上,防止物理节点坏了,两个主从节点的数据就都丢失了。

[root@node1 redis]# redis-trib.rb create --replicas 1 127.0.0.1:7000 127.0.0.1:7001 127.0.0.1:7002 127.0.0.1:7003 127.0.0.1:7004 127.0.0.1:7005
出现交互后输入yes集群就搭建完成

查看状态

# 集群主节点状态
redis-cli -p 7000 cluster nodes | grep master
# 集群从节点状态
redis-cli -p 7000 cluster nodes | grep slave

cluster新增节点

配置 生产上新增节点也要3主3从

# 创建节点目录
mkdir /opt/modules/redis/conf/7006 (主)
mkdir /opt/modules/redis/conf/7007 (从)

# 创建配置文件
cat >> /opt/modules/redis/conf/7006/redis.conf <<EOF
port 7006
daemonize yes
pidfile /opt/modules/redis/conf/7006/redis.pid
loglevel notice
logfile "/opt/modules/redis/conf/7006/redis.log"
dbfilename dump.rdb
dir /opt/modules/redis/conf/7006
protected-mode no
cluster-enabled yes
cluster-config-file nodes.conf
cluster-node-timeout 5000
appendonly yes
EOF