Redis分布式缓存集群环境搭建(手动搭建)

Redis集群简介
Redis Cluster 即 Redis 集群,是 Redis 官方在 3.0 版本推出的一套分布式存储方案。完全去中心化,由多个节点组成,所有节点彼此互联。Redis 客户端可以直接连接任何一节点获取集群中的键值对,不需要中间代理,如果该节点不存在用户所指定的键值,其内部会自动把客户端重定向到键值所在的节点。
Redis 集群是一个网状结构,每个节点都通过 TCP 连接跟其他每个节点连接。在一个有 N 个节点的集群中,每个节点都有 N-1 个流出的 TCP 连接,和 N-1 个流入的连接,这些 TCP 连接会永久保持。
Redis分布式缓存集群环境搭建(手动搭建)_第1张图片
Redis Cluster 同其他分布式存储系统一样,主要具备以下两个功能:

  • 数据分区
    Redis 集群会将用户数据分散保存至各个节点中,突破单机 Redis 内存最大存储容量。集群引入了 哈希槽slot的概念,其搭建完成后会生 16384个哈希槽slot,同时会根据节点的数量大致均等的将 16384 个哈希槽映射到不同的节点上。当用户存储key-value时,集群会先对key进行 CRC16 校验然后对 16384 取模来决定key-value放置哪个槽,从而实现自动分割数据到不同的节点上。
  • 数据冗余
    Redis 集群支持主从复制和故障恢复。集群使用了主从复制模型,每个主节点master应至少有一个从节点slave。假设某个主节点故障,其所有子节点会广播一个数据包给集群里的其他主节点来请求选票,一旦某个从节点收到了大多数主节点的回应,那么它就赢得了选举,被推选为主节点,负责处理之前旧的主节点负责的哈希槽。

了解的基本原理后,我们开始实战:
Redis集群搭建

本次环境有限,故在一台机器上模拟集群环境的实现
下载一个redis实例:redis-5.0.3.tar.gz
根据服务器环境下载,上面给出的是liunx下的文件
下载并解压:

cd /usr/local
wget http://download.redis.io/releases/redis-5.0.3.tar.gz
tar -zxvf redis-5.0.3.tar.gz

安装实例:(附带GCC,如已安装可去掉安装命令)

cd redis-5.0.3
yum -y install gcc
make distclean 
make && make install
###如果已安装GCC。可直接执行
cd redis-5.0.3
make && make install

make install命令会将程序安装至系统预设的可执行文件存放路径,一般是/usr/local/bin目录
执行命令查看可执行文件:

[root@localhost bin]# cd /usr/local/bin
[root@localhost bin]# ls -l
总用量 32672
-rwxr-xr-x. 1 root root 4367328 3月   6 06:11 redis-benchmark
-rwxr-xr-x. 1 root root 8092024 3月   6 06:11 redis-check-aof
-rwxr-xr-x. 1 root root 8092024 3月   6 06:11 redis-check-rdb
-rwxr-xr-x. 1 root root 4802696 3月   6 06:11 redis-cli
lrwxrwxrwx. 1 root root      12 3月   6 06:11 redis-sentinel -> redis-server
-rwxr-xr-x. 1 root root 8092024 3月   6 06:11 redis-server

单机Redis安装完成

重要工作开始
重要工作开始
重要工作开始
重要的事写三遍
依据 Redis Cluster 内部故障转移实现原理,Redis 集群至少需要 3 个主节点,而每个主节点至少有 1 从节点,因此搭建一个集群至少包含 6 个节点,三主三从,并且分别部署在不同机器上
第一步:规划节点,启动节点
节点规划;
Redis分布式缓存集群环境搭建(手动搭建)_第2张图片
创建各个节点启动配置文件的存放目录

#创建集群目录
mkdir /usr/local/redis-cluster
cd redis-cluster
#创建集群节点目录
mkdir -p 7001 7002 7003 8001 8002 8003

进入 Redis 源码包目录并将默认配置文件redis.conf分别复制到六个节点配置存放目录中,作为各自节点启动配置文件。

cd /usr/local/redis-5.0.3
cp redis.conf /usr/local/redis-cluster/7001 
cp redis.conf /usr/local/redis-cluster/7002
cp redis.conf /usr/local/redis-cluster/7003 
cp redis.conf /usr/local/redis-cluster/7004
cp redis.conf /usr/local/redis-cluster/7005
cp redis.conf /usr/local/redis-cluster/7006

分别修改每个节点的配置文件,以节点7001为例,其他以此修改

bind 192.168.83.128                    # 设置当前节点主机地址       
port 7001                              # 设置客户端连接监听端口     
pidfile /var/run/redis_7001.pid        # 设置 Redis 实例 pid 文件       
daemonize yes                          # 以守护进程运行 Redis 实例     
cluster-enabled yes                    # 启用集群模式
cluster-node-timeout 15000             # 设置当前节点连接超时毫秒数
cluster-config-file nodes-7001.conf    # 设置当前节点集群配置文件路径

至此,节点配置完毕,执行命令开启节点

/usr/local/bin/redis-server /usr/local/redis-cluster/7001/redis.conf
/usr/local/bin/redis-server /usr/local/redis-cluster/7002/redis.conf
/usr/local/bin/redis-server /usr/local/redis-cluster/7003/redis.conf
/usr/local/bin/redis-server /usr/local/redis-cluster/7004/redis.conf
/usr/local/bin/redis-server /usr/local/redis-cluster/7005/redis.conf
/usr/local/bin/redis-server /usr/local/redis-cluster/7006/redis.conf

通过ps -ef|grep redis命令确认各个节点服务是否已经正常运行

[root@localhost bin]# ps -ef|grep redis
root       5613      1  0 04:25 ?        00:00:00 /usr/local/bin/redis-server 127.0.0.1:7001 [cluster]
root       5650      1  0 04:26 ?        00:00:00 /usr/local/bin/redis-server 127.0.0.1:7002 [cluster]
root       5661      1  0 04:26 ?        00:00:00 /usr/local/bin/redis-server 127.0.0.1:7003 [cluster]
root       5672      1  0 04:27 ?        00:00:00 /usr/local/bin/redis-server 127.0.0.1:7004 [cluster]
root       5681      1  0 04:27 ?        00:00:00 /usr/local/bin/redis-server 127.0.0.1:7005 [cluster]
root       5690      1  0 04:27 ?        00:00:00 /usr/local/bin/redis-server 127.0.0.1:7006 [cluster]
root       5731   1311  0 04:28 pts/0    00:00:00 grep --color=auto redis

第二步:节点握手
节点握手就是在各个节点之间创建链接(每个节点与其他节点相连),形成一个完整的网格,即集群。
节点握手命令:cluster meet ip port
cluster meet会自动创建节点间缺失的连接,例如7001连接7002,7002连接7003,则cluster meet会自动创建7001与7003的连接,所以我们不需要全部建立
执行握手命令

[root@localhost bin]# /usr/local/bin/redis-cli -p 7001
127.0.0.1:7001> cluster meet 127.0.0.1 7002
OK
127.0.0.1:7001> cluster meet 127.0.0.1 7003
OK
127.0.0.1:7001> cluster meet 127.0.0.1 7004
OK
127.0.0.1:7001> cluster meet 127.0.0.1 7005
OK
127.0.0.1:7001> cluster meet 127.0.0.1 7006
OK

通过 cluster nodes 命令查看节点之间 的链接状态

[root@localhost /]# /usr/local/bin/redis-cli -p 7002 cluster nodes
61e8c4ed8d1ff2a765a4dd2c3d300d8121d26e12 127.0.0.1:7001@17001 master - 0 1552220691885 4 connected
a8a41694f22977fda78863bdfb3fc03dd1fab1bd 127.0.0.1:7005@17005 master - 0 1552220691000 5 connected
51987c4b5530c81f2845bb9d521daf6d3dce3659 127.0.0.1:7004@17004 master - 0 1552220690878 3 connected
1b4b3741945d7fed472a1324aaaa6acaa1843ccb 127.0.0.1:7002@17002 myself,master - 0 1552220690000 1 connected
19147f56e679767bcebb8653262ff7f56ca072a8 127.0.0.1:7003@17003 master - 0 1552220691000 2 connected
ed6fd72e61b747af3705b210c7164bc68739303e 127.0.0.1:7006@17006 master - 0 1552220690000 0 connected

第三步:分配槽位
此时 Redis 集群还并没有处于上线状态,通过命令 cluster info 命令来查看目前集群的运行状态

[root@localhost ~]# /usr/local/bin/redis-cli -p 7001 cluster info
cluster_state:fail  #表示当前集群处于下线状态
......

只有给集群中所有主节点分配好槽位(即哈希槽slot,本文第一小节有提及)集群才能上线。
分配槽位命令:cluster addslots slot [slot ...]
给主节点分配槽位

/usr/local/bin/redis-cli -p 7001 cluster addslots {0..5461}
/usr/local/bin/redis-cli -p 7002 cluster addslots {5462..10922}
/usr/local/bin/redis-cli -p 7003 cluster addslots {10923..16383}

再次查看集群运行状态:

[root@localhost ~]# /usr/local/bin/redis-cli -p 7001 cluster info
cluster_state:ok #表示集群上线
...

第四步:主从复制
集群成功上线,不过还没有给主节点指定从节点,此时如果有一个节点故障,那么整个集群也就挂了,也就无法实现高可用
集群中需要使用 cluster replicate 命令手动给从节点配置主节点
集群复制命令:cluster replicate node-id
节点的node-id可以用cluster nodes命令查看

[root@localhost /]# /usr/local/bin/redis-cli -p 7002 cluster nodes
61e8c4ed8d1ff2a765a4dd2c3d300d8121d26e12 127.0.0.1:7001@17001 master - 0 1552220691885 4 connected
a8a41694f22977fda78863bdfb3fc03dd1fab1bd 127.0.0.1:7005@17005 master - 0 1552220691000 5 connected
51987c4b5530c81f2845bb9d521daf6d3dce3659 127.0.0.1:7004@17004 master - 0 1552220690878 3 connected
1b4b3741945d7fed472a1324aaaa6acaa1843ccb 127.0.0.1:7002@17002 myself,master - 0 1552220690000 1 connected
19147f56e679767bcebb8653262ff7f56ca072a8 127.0.0.1:7003@17003 master - 0 1552220691000 2 connected
ed6fd72e61b747af3705b210c7164bc68739303e 127.0.0.1:7006@17006 master - 0 1552220690000 0 connected

根据预先设定7001—>7004,7002----->7005,7003----->7006完成主从复制

/usr/local/bin/redis-cli -p 7004 cluster replicate 61e8c4ed8d1ff2a765a4dd2c3d300d8121d26e12
/usr/local/bin/redis-cli -p 7005 cluster replicate 1b4b3741945d7fed472a1324aaaa6acaa1843ccb
/usr/local/bin/redis-cli -p 7006 cluster replicate 19147f56e679767bcebb8653262ff7f56ca072a8

至此我们就手动搭建了一个redis的集群环境

[root@localhost ~]# /usr/local/bin/redis-cli -p 8002 cluster nodes
1b4b3741945d7fed472a1324aaaa6acaa1843ccb 127.0.0.1:7002@17002 master - 0 1552233328337 1 connected 5462-10922
ed6fd72e61b747af3705b210c7164bc68739303e 127.0.0.1:7006@17006 slave 19147f56e679767bcebb8653262ff7f56ca072a8 0 1552233327000 2 connected
19147f56e679767bcebb8653262ff7f56ca072a8 127.0.0.1:7003@17003 master - 0 1552233325000 2 connected 10923-16383
a8a41694f22977fda78863bdfb3fc03dd1fab1bd 127.0.0.1:7005@17005 myself,slave 1b4b3741945d7fed472a1324aaaa6acaa1843ccb 0 1552233327000 5 connected
61e8c4ed8d1ff2a765a4dd2c3d300d8121d26e12 127.0.0.1:7001@17001 master - 0 1552233327327 4 connected 0-5461
51987c4b5530c81f2845bb9d521daf6d3dce3659 127.0.0.1:7004@17004 slave 61e8c4ed8d1ff2a765a4dd2c3d300d8121d26e12 0 1552233326320 4 connected

你可能感兴趣的:(Redis,redis,数据库,nosql)