【Redis学习】--Redis集群搭建
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
[[email protected] bin]# ./redis-server
后台启动:
把源文件中/root/redis-3.0.0/redis.conf配置文件复制到安装目录/usr/local/redis/bin目录下
[[email protected] redis-3.0.0]# cp redis.conf /usr/local/redis/bin/
修改配置文件
修改安装目录下redis.conf文件的daemonize参数为yes,指定配置文件启动,例如:
[[email protected] 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
后台启动
[[email protected] bin]# ./redis-server redis.conf
查看redis进程:
[[email protected] 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机制检测健康状态
[[email protected] 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架构图
- 所有的redis节点彼此互联(PING-PONG机制),内部使用二进制协议优化传输速度和带宽.
- 节点的fail是通过集群中超过半数的节点检测失效时才生效,所以最少需要三个master节点,然后每个master要有一个从节点,三主三从,所以至少需要6个redis实例。(ps:为什么主节点数要>3?? 如果是两个master节点,其中一个宕机后,只有另一个master发现,这样永远无法超过半数,感觉这个解释有点搞笑。)
- 客户端与redis节点直连,不需要中间proxy层.客户端不需要连接集群所有节点,连接集群中任何一个可用节点即可
- redis-cluster把所有的物理节点映射到[0-16383]slot上,cluster 负责维护node<->slot<->value
- 整个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投票:容错
- 投票过程是集群中所有master参与,如果半数以上master节点与master节点通信超时(cluster-node-timeout),认为当前master节点挂掉.
- 什么时候整个集群不可用(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实例放置其中
[[email protected] 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实例,不嫌麻烦可以一个一个启。
[[email protected] 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运行环境
[[email protected] ~] yum install ruby
# 安装ruby第三方包管理工具
[[email protected] ~] yum install rubygems
# 运行ruby脚本使用的第三方依赖包。
[[email protected] ~] gem install redis-3.0.0.gem
3.4.2 执行redis-trib.rb脚本
将redis源文件中的ruby脚本复制到安装目录下
[[email protected] ~]# cp redis-trib.rb /usr/local/redis-cluster/
[[email protected] 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实例所在的位置。
[[email protected] 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参数是连接集群的标志
[[email protected] 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端口所在的节点上,这样保证每个主节点都有一定的数据,做到均衡分配,主从的配置也实现了高可用。
完美收官,感谢您的阅读~