【Redis学习】--Redis集群搭建

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/YYZZHC999/article/details/83038344

1. Redis部署

以Linux(CentOS7.4)为例

1.1 安装依赖环境

Redis是c语言开发的。
安装redis需要c语言的编译环境。如果没有gcc需要在线安装。

yum install gcc-c++

1.2 安装 Redis

第一步:redis的源码包上传到linux系统,或在线下载

wget http://download.redis.io/releases/redis-3.0.0.tar.gz 

第二步:解压缩redis。

tar xzf redis-3.0.0.tar.gz

第三步:编译。进入redis源码目录,其内置了Makefile文件,我们可以直接编译。

make

第四步:安装,PREFIX参数指定redis的安装目录。一般软件安装到/usr目录下。

make install PREFIX=/usr/local/redis

1.3 启动Redis

前台启动:

在redis的安装目录下直接启动redis-server

[root@localhost bin]# ./redis-server 

后台启动:

把源文件中/root/redis-3.0.0/redis.conf配置文件复制到安装目录/usr/local/redis/bin目录下

[root@localhost redis-3.0.0]# cp redis.conf /usr/local/redis/bin/

修改配置文件
修改安装目录下redis.conf文件的daemonize参数为yes,指定配置文件启动,例如:

 [root@localhost bin] vim redis.conf
    
# By default Redis does not run as a daemon. Use 'yes' if you need it.
# Note that Redis will write a pid file in /var/run/redis.pid when daemonized.
daemonize yes

后台启动

[root@localhost bin]# ./redis-server redis.conf

查看redis进程:

[root@localhost bin]# ps aux|grep redis
root      5190  0.1  0.3  33936  1712 ?        Ssl  18:23   0:00 ./redis-server *:6379    
root      5196  0.0  0.1   4356   728 pts/0    S+   18:24   0:00 grep redis

1.4 测试客户端可用情况:

使用ping-pong机制检测健康状态

[root@localhost bin]# ./redis-cli
127.0.0.1:6379> ping
PONG
127.0.0.1:6379> set str1 Hepburn 
OK
127.0.0.1:6379> get str1
"Hepburn"
127.0.0.1:6379> 

2.Redis集群原理

为了在大流量访问下提供稳定的业务,集群化是存储的必然形态,Redis 集群是一个可以在多个 Redis 节点之间进行数据共享的设施installation。

2.1 redis-cluster架构图

在这里插入图片描述

  1. 所有的redis节点彼此互联(PING-PONG机制),内部使用二进制协议优化传输速度和带宽.
  2. 节点的fail是通过集群中超过半数的节点检测失效时才生效,所以最少需要三个master节点,然后每个master要有一个从节点,三主三从,所以至少需要6个redis实例。(ps:为什么主节点数要>3?? 如果是两个master节点,其中一个宕机后,只有另一个master发现,这样永远无法超过半数,感觉这个解释有点搞笑。)
  3. 客户端与redis节点直连,不需要中间proxy层.客户端不需要连接集群所有节点,连接集群中任何一个可用节点即可
  4. redis-cluster把所有的物理节点映射到[0-16383]slot上,cluster 负责维护node<->slot<->value
  5. 整个Redis 集群中共内置了 16384 个哈希槽,当需要在 Redis 集群中放置一个 key-value 时,redis 先对 key 使用 crc16 算法算出一个结果,然后把结果对 16384 求余数,这样每个 key 都会对应一个编号在 0-16383 之间的哈希槽,redis 会根据节点数量大致均等的将哈希槽映射到不同的节点,这样可以保证缓存比较均匀的存到每个节点,让每个节点都工作。

2.1.1 实例展示

如下图所示:整个redis集群中的第0-5000哈希槽是在节点1上的,第5001-10000哈希槽是在节点2上的,第10001-16383个哈希槽是在节点3上的,哈希槽数是固定的,每个节点上有多少个哈希槽是我们可以自定义配置的,但总数永远都是16384,这也就决定了整个redis集群最多有16384个节点。
在这里插入图片描述

存入缓存的过程:

当第一个字符串Hello利用C16算法,假定得出的key是500,所以这个字符串将会存到对应区间哈希槽数在(0-5000)的Server1,以此类推,Hello2,Hello3等字符串也根据C16算法得到相应的key,存到对应的哈希槽存入。取值的时候同理反之,根据Key直接找到对应的哈希槽,到相应的节点上获取缓存数据,避免了遍历查找的过程,这也就是从缓存中读取数据高效的原因。

2.1.2 redis-cluster投票:容错

在这里插入图片描述

  1. 投票过程是集群中所有master参与,如果半数以上master节点与master节点通信超时(cluster-node-timeout),认为当前master节点挂掉.
  2. 什么时候整个集群不可用(cluster_state:fail)?

如果集群任意一个master挂掉,且当前master没有slave.或者slave与master同时挂掉,集群就进入fail状态,也可以理解成集群的slot映射[0-16383]哈希槽不完整时就进入fail状态.
redis-3.0.0.rc1加入cluster-require-full-coverage参数,默认关闭,打开集群兼容部分失败.
如果集群超过半数以上master挂掉,无论是否有slave,集群进入fail状态.

3. Redis集群搭建

明白了原理之后,现在开始搭建集群

3.1 创建6个Redis实例

建立redis-cluster文件夹,将6个Redis实例放置其中

    [root@localhost redis-cluster]# ll
    total 52
    drwxr-xr-x 2 root root   171 Oct 11 18:28 redis01
    drwxr-xr-x 2 root root   193 Oct 11 18:28 redis02
    drwxr-xr-x 2 root root   171 Oct 11 18:28 redis03
    drwxr-xr-x 2 root root   171 Oct 11 18:28 redis04
    drwxr-xr-x 2 root root   171 Oct 11 18:28 redis05
    drwxr-xr-x 2 root root   171 Oct 11 18:28 redis06

3.2 分别修改配置文件

修改以上6个Redis实例中bin目录下的redis.conf文件
本次是在一台服务器的六个不同端口搭建的伪集群,若在多台服务器上不必修改端口这项。

# 该项设置后台方式运行(可选操作)
 daemonize yes 
# 端口分别为7001,7002,7003,7004,7005,7006 (可选操作)
port 7001 
# 可详细查看Cluster模块关于集群配置参数的说明 (此处为打开集群模式)
cluster-enabled yes

3.3 集体启动Redis

写个脚本方便集体启动redis实例,不嫌麻烦可以一个一个启。

[root@localhost redis-cluster]# vim start-all.sh 
cd redis01
./redis-server redis.conf
cd ..   
cd redis02
./redis-server redis.conf
cd ..   
cd redis03
./redis-server redis.conf
cd ..  
cd redis04
./redis-server redis.conf
cd .. 
cd redis05
./redis-server redis.conf
cd .. 
cd redis06
./redis-server redis.conf
cd .. 

你以为到这就结束了么,其实并没有……

3.4 集群环境搭建

3.4.1 ruby环境

因为Redis使用ruby脚本搭建集群,所以需要ruby的运行环境。

#  安装ruby运行环境
[root@localhost ~] yum install ruby

# 安装ruby第三方包管理工具
[root@localhost ~] yum install rubygems

#  运行ruby脚本使用的第三方依赖包。
[root@localhost ~] gem install redis-3.0.0.gem

3.4.2 执行redis-trib.rb脚本

将redis源文件中的ruby脚本复制到安装目录下

[root@localhost ~]# cp redis-trib.rb /usr/local/redis-cluster/
[root@localhost redis-cluster]# ll
total 52
drwxr-xr-x 2 root root   171 Oct 11 18:28 redis01
drwxr-xr-x 2 root root   193 Oct 11 18:28 redis02
drwxr-xr-x 2 root root   171 Oct 11 18:28 redis03
drwxr-xr-x 2 root root   171 Oct 11 18:28 redis04
drwxr-xr-x 2 root root   171 Oct 11 18:28 redis05
drwxr-xr-x 2 root root   171 Oct 11 18:28 redis06
-rwxr-xr-x 1 root root 48141 Oct 11 18:32 redis-trib.rb
-rwxr--r-- 1 root root   264 Oct 11 18:24 start-all.sh

执行脚本,create --replicas是创建集群的命令,replicas后面的1是指每个节点有一个slave备份,后面是6个redis实例所在的位置。

[root@localhost redis-cluster]# ./redis-trib.rb create --replicas 1
192.168.178.12:7001 192.168.178.12:7002 192.168.178.12:7003 192.168.178.12:7004 192.168.178.12:7005 192.168.178.12:7006

执行结果:

Performing hash slots allocation on 6 nodes...
Using 3 masters:
192.168.178.12:7001                                #三个主机
192.168.178.12:7002
192.168.178.12:7003
Adding replica 192.168.178.12:7004 to 192.168.178.12:7001        #主从关系设定
Adding replica 192.168.178.12:7005 to 192.168.178.12:7002
Adding replica 192.168.178.12:7006 to 192.168.178.12:7003
  
  # 下面分别是master的id, 所在ip端口,设定的哈希槽范围      
M: 1043a01095d309de69bd4c508299b3fef347bf8e 192.168.178.12:7001
   slots:0-5460 (5461 slots) master                     
M: 24425aa5c7a31fee5dfe6742c609bb70b351cc43 192.168.178.12:7002
   slots:5461-10922 (5462 slots) master
M: 791626e062c8f676a2f41ea5a4d32ec527c1f07a 192.168.178.12:7003
   slots:10923-16383 (5461 slots) master
S: 56e8ebf36a827b044ed23b7bbab7b2e7e3ca7229 192.168.178.12:7004
   replicates 1043a01095d309de69bd4c508299b3fef347bf8e
S: 9b953784c34116fa58b0cc973e772654b5b1e0de 192.168.178.12:7005
   replicates 24425aa5c7a31fee5dfe6742c609bb70b351cc43
S: 0337e5dfecbf29e9c81a6b8a6c429774e4b24c63 192.168.178.12:7006
   replicates 791626e062c8f676a2f41ea5a4d32ec527c1f07a
Can I set the above configuration? (type 'yes' to accept): 

这是redis为我们做的默认设定,回复yes表示接受设定,即可照此设定搭建集群。

3.4.2 集群搭建成功

看到下面的图示表示集群搭建成功
在这里插入图片描述

3.5 测试集群连接状态

3.5.1 查看集群状态

192.168.178.12:7002> cluster info
cluster_state:ok                               #集群状态
cluster_slots_assigned:16384                #被分配的槽位数
cluster_slots_ok:16384                   #正确分配的槽位                   
cluster_slots_pfail:0
cluster_slots_fail:0
cluster_known_nodes:6                      #当前节点总数
cluster_size:3
cluster_current_epoch:6
cluster_my_epoch:2
cluster_stats_messages_sent:2260
cluster_stats_messages_received:2260

3.5.1 查看节点状态

192.168.178.12:7002> cluster nodes
1043a01095d309de69bd4c508299b3fef347bf8e 192.168.178.12:7001 master - 0 1539261504890 1 connected 0-5460
791626e062c8f676a2f41ea5a4d32ec527c1f07a 192.168.178.12:7003 master - 0 1539261506904 3 connected 10923-16383
56e8ebf36a827b044ed23b7bbab7b2e7e3ca7229 192.168.178.12:7004 slave 1043a01095d309de69bd4c508299b3fef347bf8e 0 1539261507910 4 connected
9b953784c34116fa58b0cc973e772654b5b1e0de 192.168.178.12:7005 slave 24425aa5c7a31fee5dfe6742c609bb70b351cc43 0 1539261502874 5 connected
24425aa5c7a31fee5dfe6742c609bb70b351cc43 192.168.178.12:7002 myself,master - 0 0 2 connected 5461-10922
0337e5dfecbf29e9c81a6b8a6c429774e4b24c63 192.168.178.12:7006 slave 791626e062c8f676a2f41ea5a4d32ec527c1f07a 0 1539261505896 6 connected

3.5.2 连接集群

使用任意一个客户端连接集群
此处是用redis01连接端口为7004的节点,-c参数是连接集群的标志

[root@localhost redis-cluster]# redis01/redis-cli -p 7004 -c
127.0.0.1:7004> set a 123456
-> Redirected to slot [15495] located at 192.168.178.12:7003
OK
192.168.178.12:7003> set b 66666
-> Redirected to slot [3300] located at 192.168.178.12:7001
OK
192.168.178.12:7001> set c 77777
-> Redirected to slot [7365] located at 192.168.178.12:7002
OK
192.168.178.12:7002> 

此时,存入了a,b,c三个key,他们各自通过C16算法被分配到了 [15495],[3300], [7365]三个哈希槽上,即数据存在了对应的7003,7001,7002端口所在的节点上,这样保证每个主节点都有一定的数据,做到均衡分配,主从的配置也实现了高可用。

完美收官,感谢您的阅读~

猜你喜欢

转载自blog.csdn.net/YYZZHC999/article/details/83038344
今日推荐