《Redis内存数据库》Redis集群

前言

随着业务并发量的不断扩张,redis内存数据库也会有处理不过来的情况,故redis也考虑集群来缓解并发的压力。

原理

Redis 集群原理图

《Redis内存数据库》Redis集群

1. Redis集群中总共了16384个Slot 用于存放redis的键值对。这个Slot会平均分配给每一组集群(图中3组就分配成5461,5461,5462)。

2. 键值对的键值 经过crc16哈希处理后再除以16384 取余数,然后放入对应编号的Slot中。

3. 应用程序连接任何一个主节点都能获取到键值对信息,并且如果写入操作,会自动告知应用你重连对应的节点去写入信息。

搭建

1. 环境准备linux, 安装ruby。

yum install ruby rubygems -y

设置:ali镜像

gem sources -a http://mirrors.aliyun.com/rubygems/    -- 加入ali源
gem sources --remove https://rubygems.org/ -- 删除国外源

《Redis内存数据库》Redis集群

查看源为ali源。

gem install redis -v 3.3.3    -- 安装ruby驱动

创建redis实例的目录

mkdir -p /home/redis/master-replica/700{0..5}/data
mkdir -p /home/redis/master-replica/700{0..5}/log

设置6个实例的配置文件

cat > /home/redis/master-replica/7000/redis.conf <<EOF
protected-mode no
port 7000
daemonize yes
pidfile /var/run/redis_7000.pid
loglevel notice
logfile "/home/redis/master-replica/7000/log/redis.log"
databases 16
dbfilename dump.rdb
dir /home/redis/master-replica/7000/data
cluster-enabled yes          -- 开启集群
cluster-config-file nodes.conf
cluster-node-timeout 5000
appendonly yes    
EOF

cat > /home/redis/master-replica/7001/redis.conf <<EOF
protected-mode no
port 7001
daemonize yes
pidfile /var/run/redis_7001.pid
loglevel notice
logfile "/home/redis/master-replica/7001/log/redis.log"
databases 16
dbfilename dump.rdb
dir /home/redis/master-replica/7001/data
cluster-enabled yes
cluster-config-file nodes.conf
cluster-node-timeout 5000
appendonly yes
EOF

cat > /home/redis/master-replica/7002/redis.conf <<EOF
protected-mode no
port 7002
daemonize yes
pidfile /var/run/redis_7002.pid
loglevel notice
logfile "/home/redis/master-replica/7002/log/redis.log"
databases 16
dbfilename dump.rdb
dir /home/redis/master-replica/7002/data
cluster-enabled yes
cluster-config-file nodes.conf
cluster-node-timeout 5000
appendonly yes
EOF

cat > /home/redis/master-replica/7003/redis.conf <<EOF
protected-mode no
port 7003
daemonize yes
pidfile /var/run/redis_7003.pid
loglevel notice
logfile "/home/redis/master-replica/7003/log/redis.log"
databases 16
dbfilename dump.rdb
dir /home/redis/master-replica/7003/data
cluster-enabled yes
cluster-config-file nodes.conf
cluster-node-timeout 5000
appendonly yes
EOF

cat > /home/redis/master-replica/7004/redis.conf <<EOF
protected-mode no
port 7004
daemonize yes
pidfile /var/run/redis_7004.pid
loglevel notice
logfile "/home/redis/master-replica/7004/log/redis.log"
databases 16
dbfilename dump.rdb
dir /home/redis/master-replica/7004/data
cluster-enabled yes
cluster-config-file nodes.conf
cluster-node-timeout 5000
appendonly yes
EOF

cat > /home/redis/master-replica/7005/redis.conf <<EOF
protected-mode no
port 7005
daemonize yes
pidfile /var/run/redis_7005.pid
loglevel notice
logfile "/home/redis/master-replica/7005/log/redis.log"
databases 16
dbfilename dump.rdb
dir /home/redis/master-replica/7005/data
cluster-enabled yes
cluster-config-file nodes.conf
cluster-node-timeout 5000
appendonly yes
EOF

启动六个实例

redis-server /home/redis/master-replica/7000/redis.conf
redis-server /home/redis/master-replica/7001/redis.conf
redis-server /home/redis/master-replica/7002/redis.conf
redis-server /home/redis/master-replica/7003/redis.conf
redis-server /home/redis/master-replica/7004/redis.conf
redis-server /home/redis/master-replica/7005/redis.conf

查看六个实例是否启动

ps -ef | grep 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

-- replicas 1 表示几个从库。 第一个节点会自动成为管理节点

查看集群情况

redis-cli -p 7000 cluster nodes | grep master    -- 查看主节点
redis-cli -p 7000 cluster nodes | grep slave       -- 查看从节点

《Redis内存数据库》Redis集群

《Redis内存数据库》Redis集群

管理

增加集群节点

新增两个实例(看上面实例新建方式),并且启动。

redis-trib.rb add-node 127.0.0.1:7006 127.0.0.1:7000    -- 添加7006节点到7000集群中。

重新分配Slot

redis-trib.rb reshard 127.0.0.1:7000

《Redis内存数据库》Redis集群

重新查询Slot分配情况:

《Redis内存数据库》Redis集群

重节点加入集群 

redis-trib.rb add-node --slave --master-id bcf4285a50d51929c21340bc25a05b9e77db4f74 127.0.0.1:7007 127.0.0.1:7000

bcf4285a50d51929c21340bc25a05b9e77db4f74   是该从节点对应的主节点node_id。 查看从节点情况:

《Redis内存数据库》Redis集群

删除集群节点

第一步重新分配Slot节点(平均分配给剩余节点)

redis-trib.rb reshard 127.0.0.1:7000

按照平均分成3份分配回去

《Redis内存数据库》Redis集群

done 表结束。 重复三次以上操作。

删除集群节点

redis-trib.rb del-node 127.0.0.1:7006 bcf4285a50d51929c21340bc25a05b9e77db4f74
redis-trib.rb del-node 127.0.0.1:7007 19b771f682865b62c25818092fe82b4488dc26c5

ok 删除集群节点完成。  被删除的节点不能直接再加回去。

特别注意点:redis集群如果(redis.conf)设置上密码:

requirepass 123456
masterauth 123456

则需要修改如下配置才能构建集群:

vi /usr/local/share/gems/gems/redis-3.3.3/lib/redis/client.rb

《Redis内存数据库》Redis集群

总结

Redis 集群操作简单,可靠,故障恢复也是非常智能,推荐。

《Redis内存数据库》Redis集群

上一篇:《Redis内存数据库》Redis主复制集(主从复制)


下一篇:win10 docker 安装redis activemq,mysql等。