Redis集群搭建与简单使用
用两台虚拟机6个节点,一台机器3个节点,创建出3 master、3 salve环境。
redis采用 redis-3.2.9.tar.gz 版本。
虚拟机环境:CentOS release 6.8 (Final)
部署目录及文件目录
软件安装存放目录:/opt/install
软件日志存放目录:/opt/logs
软件数据存放目录:/opt/data
安装过程:
1、下载并解压
cd /root/software wget http://download.redis.io/releases/redis-3.2.9.tar.gz tar zxvf redis-3.2.9.tar.gz -C /opt/install/
2、编译安装,并创建bin,conf目录
cd /opt/install/redis-3.2.9/ make && make install
mkdir bin conf
3、将src下的一些文件拷贝到/opt/install/redis-3.2.9/bin目录下,并软链接到/usr/bin/
cd src cp mkreleasehdr.sh redis-benchmark redis-check-aof redis-check-rdb redis-cli redis-sentinel redis-server redis-trib.rb ../bin/ ln -s /opt/install/redis-3.2.9/bin/redis-* /usr/bin/
4、在conf目录下创建redis-6382.conf,redis-6383.conf,redis-6384.conf文件,并将redis.conf拷贝这三个配置文件进行修改
cd /opt/install/redis-3.2.9/ cp redis.con conf/redis-6382.conf cp redis.con conf/redis-6383.conf cp redis.con conf/redis-6384.conf
分别修改这三个配置文件,修改如下内容(端口6282、6283、6284对应做相应的更改)
# START CONFIG daemonize yes pidfile /var/run/redis-6382.pid port 6382 bind 0.0.0.0 protected-mode no unixsocket /var/lib/redis/redis-6382.sock unixsocketperm 700 timeout 300 loglevel notice logfile /opt/logs/redis/redis-6382.log databases 16 dbfilename dump-6382.rdb dir /opt/data/redis # AOF STAND ALONG appendonly yes appendfilename appendonly-6382.aof appendfsync everysec no-appendfsync-on-rewrite yes auto-aof-rewrite-percentage 80-100 auto-aof-rewrite-min-size 64mb lua-time-limit 5000 # CLUSTER CONFIG cluster-enabled yes cluster-config-file /opt/install/redis-3.2.9/conf/nodes-6382.conf cluster-node-timeout 5000
创建配置文件中对应的一些目录
mkdir -p /opt/logs/redis /var/lib/redis /opt/data/redis
5、启动各节点,可以在bin目录下写个简单启动脚本start.sh
第一台上 vim start.sh #!/bin/bash /opt/install/redis-3.2.9/bin/redis-server /opt/install/redis-3.2.9/conf/redis-6379.conf sleep 1 /opt/install/redis-3.2.9/bin/redis-server /opt/install/redis-3.2.9/conf/redis-6380.conf sleep 1 /opt/install/redis-3.2.9/bin/redis-server /opt/install/redis-3.2.9/conf/redis-6381.conf sleep 1 第二台上 vim start.sh #!/bin/bash /opt/install/redis-3.2.9/bin/redis-server /opt/install/redis-3.2.9/conf/redis-6382.conf sleep 1 /opt/install/redis-3.2.9/bin/redis-server /opt/install/redis-3.2.9/conf/redis-6383.conf sleep 1 /opt/install/redis-3.2.9/bin/redis-server /opt/install/redis-3.2.9/conf/redis-6384.conf sleep 1
6.检查redis启动情况(这里列举其中一台)
ps -ef |grep redis root 6048 1 0 11:40 ? 00:00:08 /opt/install/redis-3.2.9/bin/redis-server 0.0.0.0:6379 [cluster] root 6053 1 0 11:40 ? 00:00:07 /opt/install/redis-3.2.9/bin/redis-server 0.0.0.0:6380 [cluster] root 6058 1 0 11:40 ? 00:00:09 /opt/install/redis-3.2.9/bin/redis-server 0.0.0.0:6381 [cluster] root 41921 2791 0 14:05 pts/3 00:00:00 grep redis netstat -ntlp|grep redis tcp 0 0 0.0.0.0:16381 0.0.0.0:* LISTEN 6058/redis-server 0 tcp 0 0 0.0.0.0:6379 0.0.0.0:* LISTEN 6048/redis-server 0 tcp 0 0 0.0.0.0:6380 0.0.0.0:* LISTEN 6053/redis-server 0 tcp 0 0 0.0.0.0:6381 0.0.0.0:* LISTEN 6058/redis-server 0 tcp 0 0 0.0.0.0:16379 0.0.0.0:* LISTEN 6048/redis-server 0 tcp 0 0 0.0.0.0:16380 0.0.0.0:* LISTEN 6053/redis-server 0
7、创建集群
Redis 官方提供了 redis-trib.rb 这个工具,就在解压目录的 src 目录中,第三步中已将它复制到/opt/install/redis-3.2.9/bin 目录中,可以直接在/opt/install/redis-3.2.9/bin使用下面这个命令即可完成安装。
./redis-trib.rb create --replicas 1 192.168.190.111:6379 192.168.190.111:6380 192.168.190.111:6381 192.168.190.112:6382 192.168.190.112:6383 192.168.190.112:6384
其中,前三个ip:pront 为第一台机器的节点,剩下三个为第二台机器
出错了,这个工具是用 ruby 实现的,所以需要安装 ruby,centos6系列ruby版本太低,需要源码安装ruby,然后按照上述步骤创建集群。
源码安装ruby详见:https://www.cnblogs.com/zhong-11/articles/9884883.html
之后再运行redis-trib.rb命令会有如下提示:
输入 yes 即可,然后会出现如下内容,说明安装成功。
8、集群验证
在第一台机器上连接集群的6380端口的节点,在另外一台连接6382节点,连接方式为
redis-cli -h 192.168.190.111 -c -p 6380 ,加参数 -C 可连接到集群,因为上面 redis.conf 将 bind 改为了ip地址,所以 -h 参数不可以省略。
在6382节点执行命令:set hello world,执行结果如下:
然后在另外一台6380端口,查看key为hello的内容,get hello ,执行结果如下:
说明集群运作正常,至此Redis集群搭建完成,对应访问(ip:pront):
192.168.190.111:6379 192.168.190.111:6380 192.168.190.111:6381 192.168.190.112:6382 192.168.190.112:6383 192.168.190.112:6384
简单说一下原理
redis cluster在设计的时候,就考虑到了去中心化,去中间件,也就是说,集群中的每个节点都是平等的关系,都是对等的,每个节点都保存各自的数据和整个集群的状态。每个节点都和其他所有节点连接,而且这些连接保持活跃,这样就保证了我们只需要连接集群中的任意一个节点,就可以获取到其他节点的数据。
Redis 集群没有并使用传统的一致性哈希来分配数据,而是采用另外一种叫做哈希槽 (hash slot)
的方式来分配的。redis cluster 默认分配了 16384 个slot,当我们set一个key 时,会用CRC16
算法来取模得到所属的slot
,然后将这个key 分到哈希槽区间的节点上,具体算法就是:CRC16(key) % 16384。所以我们在测试的时候看到set 和 get 的时候,直接跳转到了7000端口的节点。
Redis 集群会把数据存在一个 master 节点,然后在这个 master 和其对应的salve 之间进行数据同步。当读取数据时,也根据一致性哈希算法到对应的 master 节点获取数据。只有当一个master 挂掉之后,才会启动一个对应的 salve 节点,充当 master 。
需要注意的是:必须要3个或以上
的主节点,否则在创建集群时会失败,并且当存活的主节点数小于总节点数的一半时,整个集群就无法提供服务了。