这篇文章参考了以下文章,仅作个人学习记录
1.官方文档【https://redis.io/topics/cluster-tutorial】
2.大神博客【https://blog.csdn.net/yulei_qq/article/details/52166150】
3.大神博客【https://www.jianshu.com/p/0232236688c1】
4.大神博客【https://www.cnblogs.com/haoxinyue/p/redis.html】
-----------------------------------分割线-----------------------------------
一、Redis集群概况
1.Redis3.0版本开始支持redis原生集群,本篇文章简单说下redis cluster的实现。
2.Redis3.0之前的集群方式应该有两种:
(1)使用中间件(可参考 twemproxy redis)来实现。
(2)客户端sharding,这个不是很了解,感兴趣可在网上搜一搜。
二、Redis cluster集群要点
1.Redis cluster实质是一个分布式的系统,对数据的存储,是一个分片的形式。
2.Redis cluster对key的存储和获取,通过分配的slot(内存槽)实现。
3.Redis cluster通过集群总线进行集群的状态检查,集群总线是一个二进制的协议,使用端口是“实例端口+10000”。所以每个redis实例需要监听两个端口,一个是服务端的端口,如6374;另一个就是集群总线端口,如16374。
二、Redis部署信息
1.软件版本:
系统:Centos7.3
Redis:3.2 [http://download.redis.io/releases/]
三、Redis单实例部署
新增:修改内核参数
vm.overcommit_memory = 1 net.core.somaxconn = 2048
echo never > /sys/kernel/mm/transparent_hugepage/enabled
1.编译Redis实例
(1)安装依赖
# yum -y install make cmake gcc tcl
(2)下载并编译redis
# cd /opt/
# wget 'http://download.redis.io/releases/redis-3.2.0.tar.gz'
# tar zxf redis-3.2.0.tar.gz
# mv redis-3.2.0 redis
# cd redis/
# make
# make test
(3)调整redis.conf
# cp redis.conf redis.conf.bak
# vim redis.conf
调整以下参数
bind 10.105.199.48 #只监听内网IP
daemonize yes #开启后台模式
timeout 300 #连接超时时间
dir ./data/ #本地数据库存放目录
pidfile /opt/redis/log/redis.pid #定义pid文件
logfile /opt/redis/log/redis.log #定义log文件
(4)启动测试redis
# /opt/redis/src/redis-server /opt/redis/redis.conf
# /opt/redis/src/redis-cli -h 本机IP -p 6379
10.105.199.48:6379> set foo test
OK
10.105.199.48:6379> get foo
"test"
四、Redis-cluster部署
1.创建redis集群工作目录
# mkdir redis-cluster # cd redis-cluster
# mkdir 7000 7001 7002 7003 7004 7005
2.拷贝redis配置文件
# cd /opt/ # /usr/bin/cp redis/redis.conf /opt/redis-cluster/7000/redis7000.conf
# /usr/bin/cp redis/redis.conf /opt/redis-cluster/7001/redis7001.conf
# /usr/bin/cp redis/redis.conf /opt/redis-cluster/7002/redis7002.conf
# /usr/bin/cp redis/redis.conf /opt/redis-cluster/7003/redis7003.conf
# /usr/bin/cp redis/redis.conf /opt/redis-cluster/7004/redis7004.conf
# /usr/bin/cp redis/redis.conf /opt/redis-cluster/7005/redis7005.conf
#创建各个实例的日志目录
# mkdir -p /opt/redis-cluster/7000/log
# mkdir -p /opt/redis-cluster/7001/log
# mkdir -p /opt/redis-cluster/7002/log
# mkdir -p /opt/redis-cluster/7003/log
# mkdir -p /opt/redis-cluster/7004/log
# mkdir -p /opt/redis-cluster/7005/log
#创建数据目录
# mkdir -p /opt/redis-data
3.调整集群的redis.conf
# vim /opt/redis-cluster/7000/redis7000.conf(7001,7002,7003,7004,7005都需要修改) 调整以下参数 port 7000 cluster-enabled yes cluster-config-file nodes-7000.conf cluster-node-timeout 5000 appendonly yes
dir /opt/redis-data/
pidfile /opt/redis-cluster/7000/log/redis.pid
logfile /opt/redis-cluster/7000/log/redis.log
4.启动实例
# /opt/redis-cluster/src/redis-server /opt/redis-cluster/7000/redis7000.conf # cat /opt/redis-cluster/7000/redis.log #查找redis集群实例ID No cluster configuration found, I'm 7928073bda8e634ba0ff80a4b4978d2e1b00b80d #这个ID是实例永久使用的,所以一定要记住
# opt/redis/src/redis-server /opt/redis-cluster/7000/redis7000.conf
# /opt/redis/src/redis-server /opt/redis-cluster/7001/redis7001.conf
# /opt/redis/src/redis-server /opt/redis-cluster/7002/redis7002.conf
# /opt/redis/src/redis-server /opt/redis-cluster/7003/redis7003.conf
# /opt/redis/src/redis-server /opt/redis-cluster/7004/redis7004.conf
# /opt/redis/src/redis-server /opt/redis-cluster/7005/redis7005.conf
5.安装redis gem(这个工具是使用redis-trib的前提)
# yum -y install gem
# gem install redis
到这里会报错,需要安装ruby2.2以上
# gpg2 --keyserver hkp://keys.gnupg.net --recv-keys D39DC0E3
# curl -L get.rvm.io | bash -s stable
# find / -name rvm -print
# source /usr/local/rvm/scripts/rvm
# rvm list known
# rvm install 2.3.3
# rvm use 2.3.3
# rvm use 2.3.3 --default
# rvm remove 2.0.0
# ruby --version
再继续 gem install redis
6.创建集群
#/opt/redis/src/redis-trib.rb create --replicas 1 10.105.199.48:7000 10.105.199.48:7001 10.105.199.48:7002 10.105.199.48:7003 10.105.199.48:7004 10.105.199.48:7005
>>> Creating cluster
>>> Performing hash slots allocation on 6 nodes...
Using 3 masters:
10.105.199.48:7000
10.105.199.48:7001
10.105.199.48:7002
Adding replica 10.105.199.48:7003 to 10.105.199.48:7000
Adding replica 10.105.199.48:7004 to 10.105.199.48:7001
Adding replica 10.105.199.48:7005 to 10.105.199.48:7002
M: 88370db287d1a30e262167008e9ff60009c33628 10.105.199.48:7000
slots:0-5460 (5461 slots) master
M: 7618157e849b73aeff856f05d4f9a9e860d30da2 10.105.199.48:7001
slots:5461-10922 (5462 slots) master
M: 216694a6a93fdc2bb3231771d0fde5133e19c513 10.105.199.48:7002
slots:10923-16383 (5461 slots) master
S: 9b865041519484766bfa4b0d72f179f767c18091 10.105.199.48:7003
replicates 88370db287d1a30e262167008e9ff60009c33628
S: 0ff033100f41af1f19f2faba600ae60affc47da8 10.105.199.48:7004
replicates 7618157e849b73aeff856f05d4f9a9e860d30da2
S: e93cbc4a0f50b41b2384f582b73b33bb4e598bda 10.105.199.48:7005
replicates 216694a6a93fdc2bb3231771d0fde5133e19c513
Can I set the above configuration? (type 'yes' to accept): yes
[OK] All 16384 slots covered.
7.测试集群
#/opt/redis/src/redis-cli -h 10.105.199.48 -p 7000 10.105.199.48:7000> set key1 value1 (error) MOVED 9189 10.105.199.48:7001 10.105.199.48:7000> quit #/opt/redis/src/redis-cli -h 10.105.199.48 -p 7000 -c 10.105.199.48:7000> 10.105.199.48:7000> set key1 value1 -> Redirected to slot [9189] located at 10.105.199.48:7001 OK 10.105.199.48:7001> 10.105.199.48:7001> 10.105.199.48:7001> 10.105.199.48:7001> 10.105.199.48:7001> quit #/opt/redis/src/redis-cli -h 10.105.199.48 -p 7002 -c 10.105.199.48:7002> get key1 -> Redirected to slot [9189] located at 10.105.199.48:7001 "value1" 10.105.199.48:7001>
8.启用密码认证
(1)停止cluster集群
(2)在各个实例配置文件中修改以下配置
requirepass "dingkai.123" masterauth "dingkai.123"
(3)启动集群
(4)验证
/opt/redis/bin/redis-cli -h 10.140.0.4 -p 7000 -c -a "dingkai.123" 10.140.0.4:7000> cluster info cluster_state:ok cluster_slots_assigned:16384 cluster_slots_ok:16384 cluster_slots_pfail:0 cluster_slots_fail:0 cluster_known_nodes:3 cluster_size:3 cluster_current_epoch:3 cluster_my_epoch:1 cluster_stats_messages_ping_sent:186 cluster_stats_messages_pong_sent:98 cluster_stats_messages_sent:284 cluster_stats_messages_ping_received:98 cluster_stats_messages_pong_received:97 cluster_stats_messages_received:195 10.140.0.4:7000> set authname dingkai -> Redirected to slot [14791] located at 10.140.0.4:7002 OK 10.140.0.4:7002> 10.140.0.4:7002> get authname "dingkai" 10.140.0.4:7002> quit