MENU

Redis集群

• 2020 年 10 月 27 日 • 默认分类,Linux,Redis

Redis集群:非关系型数据库,以键值对的形式来存储数据,数据存储在内存中,支持数据的持久化,通过持久化文件RDB,AOF,也可以用作缓存服务器,从redis3版本开始支持cluster(集群)功能

Redis集群的特点

1)redis集群是去掉中心化,群集中每一个节点都可以接收客户端的连接请求,节点之间通过总线端口互相通信,总线端口与redis对客户端提供服务的端口之间有固定的偏移量10000,
例:redis监听的端口为7000,则总线端口为17000

2)redis集群中的节点通过哈希槽的槽点来分配要读取和写入的数据,槽点数量为16384个取值范围为0-16383,集群中的主节点平均分配着些槽点,当数据要写入或者读取时,会对数据的键进行CRC16算法的计算得到的值在对16384范围内进行提取数据,对最终结果进行和槽点的匹配,来判断该数据应该写入到哪个节点或者从哪个节点读取

3)Redis支持主从复制,每隔主节点可以有一个到多个从节点,主节点对外提供服务,从节点只是备份数据,当主节点故障时会从它的从节点中随机选一台作为新的主节点提供服务

4)Redis集群中节点直接可以互相投票,当超过半数以上的主机认为某个节点不可用,则该主节点不可用,如果主节点没有从节点,则整个集群不可用,redsi集群中主节点的个数为奇数个

安装依赖工具(节点A)

CODE
yum -y install ruby rubygems
gem install  redis-3.3.0.gem

解压软件包(三台)

CODE
tar zxf redis-4.0.6.tar.gz
mv redis-4.0.6 /usr/local/redis
cd /usr/local/redis/
make && make install

节点A创建群集目录

CODE
mkdir -p /cluster/7000 /cluster/7001

节点B创建群集目录

CODE
mkdir -p /cluster/7002 /cluster/7003

节点C创建群集目录

CODE
mkdir -p /cluster/7004 /cluster/7005

节点A操作

CODE
#拷贝redis目录下的redis.conf配置文件到/cluster/7000和7001
cp /usr/local/redis/redis.conf /cluster/7000

#修改主从节点7000配置文件
vim /cluster/7000/redis.conf
port 7000            //监听端口
bind 0.0.0.0            //监听IP
daemonize yes                //允许后台运行
cluster-enabled yes                //开启主从节点
cluster-config-file nodes-7000.conf    //从节点配置文件
cluster-node-timeout 5000        //从节点通信的超时时间,单位毫秒(5000毫秒=5s)

#将7000端口的配置文件拷贝到7001目录下,并修改7001的配置文件
cp /cluster/7000/redis.conf /cluster/7001
sed -i 's/7000/7001/g' /cluster/7001/redis.conf

#启动7000和7001端口的配置文件
redis-server /cluster/7000/redis.conf
redis-server /cluster/7001/redis.conf

#放行防火墙
systemctl stop firewalld
setenforce 0

#将7000端口的配置文件分别远程拷贝到BC两台redis服务节点的02.03.04.05中
cd /cluster/7000/
scp redis.conf root@172.16.1.13:/cluster/7002/
scp redis.conf root@172.16.1.13:/cluster/7003/
scp redis.conf root@172.16.1.14:/cluster/7004/
scp redis.conf root@172.16.1.14:/cluster/7005/

节点B操作

CODE
sed -i 's/7000/7002/g' /cluster/7002/redis.conf
sed -i 's/7000/7003/g' /cluster/7003/redis.conf

#启动7000和7001端口的配置文件
redis-server /cluster/7002/redis.conf
redis-server /cluster/7003/redis.conf

#放行防火墙
systemctl stop firewalld
setenforce 0

节点C操作

CODE
sed -i 's/7000/7004/g' /cluster/7004/redis.conf
sed -i 's/7000/7005/g' /cluster/7005/redis.conf

#启动7000和7001端口的配置文件
redis-server /cluster/7004/redis.conf
redis-server /cluster/7005/redis.conf

#放行防火墙
systemctl stop firewalld
setenforce 0

创建群集

CODE
cd /usr/local/redis/src
./redis-trib.rb create --replicas 1 172.16.1.12:7000 172.16.1.12:7001 172.16.1.13:7002 172.16.1.13:7003 172.16.1.14:7004 172.16.1.14:7005

create:创建集群 –replicas给主节点指定从节点个数
reshard 槽点重新分配
info 集群信息
add-node:添加节点,默认为主节点
add-node –slave 添加从节点
–master-id:指定主节点
del-node:删除节点,如果是主节点,这里的槽点需要提前转移,然后删除
./redis-trib.rb check 172.16.1.12:7000

添加从节点

需要带着选项–slave

CODE
# 准备从节点配置文件目录
[root@localhost ~]# mkdir /usr/local/cluster/7006
[root@localhost ~]# cp /usr/local/cluster/7000/redis.conf /usr/local/cluster/7006/
[root@localhost ~]# sed -i "s/7000/7006/g" /usr/local/cluster/7006/redis.conf 
# 启动从节点
[root@localhost ~]# redis-server /usr/local/cluster/7006/redis.conf 
[root@localhost ~]# /usr/local/redis/src/redis-trib.rb check 172.16.1.12:7000
# 粘贴任意一个主的uuid
2172d6d3bfcc487241903193d437ff9dc9a60995
redis-trib.rb add-node --slave {新节点IP+端口} {172.16.1.12:7000}

给指定的主节点添加从节点

需要指明主节点的节点ID

CODE
redis-trib.rb add-node --slave --master-id 470d23e9cfeaf224c1227ca3773c1cb910931f81 {新节点IP+端口} {172.16.1.12:7000}

添加主节点

CODE
# 准备主节点配置文件目录
[root@localhost ~]# mkdir /usr/local/cluster/7007
[root@localhost ~]# cp /usr/local/cluster/7000/redis.conf /usr/local/cluster/7007/
[root@localhost ~]# sed -i "s/7000/7007/g" /usr/local/cluster/7007/redis.conf
# 启动服务
[root@localhost ~]# redis-server /usr/local/cluster/7007/redis.conf
创建主节点
/usr/local/redis/src/redis-trib.rb add-node {新节点IP+端口} {172.16.1.12:7000}

[root@localhost ~]# /usr/local/redis/src/redis-trib.rb check 172.16.1.12:7000
# 因为没有槽点。复制刚添加的端口号的uuid,要进行重新分配槽点
90e63fe3e6c50fe596e761c2b652f5e10d65ff84
[root@localhost ~]# /usr/local/redis/src/redis-trib.rb reshard 172.16.1.12:7000
填写移动槽点  因为四台16384/4=4096
然后,填写uuid,输入all,yes就好了
[root@localhost ~]# /usr/local/redis/src/redis-trib.rb check 172.16.1.12:7000
# 再次查看7007有了槽点

槽点重分配指令

CODE
redis-trib.rb reshard 172.16.1.12:7000  //对172.16.1.12:7000这个节点所在的集群进行槽点重分配

节点删除指令

CODE
redis-trib.sh del-node 172.16.1.12:7000 node-id  //要删除192.168.10.100:7000这个节点所在的集群中node-id所表示的这个节点

集群修复指令

CODE
redis-trib.rb fix {要修复集群中的IP与端口}

查看集群节点信息

CODE
redis-trib.rb info 172.16.1.12:7000