模型
原理
·去中心化,去中间件,也就是说,集群中的每个节点都是平等的关系,都是对等的,每个节点都保存各自的数据和整个集群的状态。每个节点都和其他所有节点连接,而且这些连接保持活跃,这样就保证了我们只需要连接集群中的任意一个节点,就可以获取到其他节点的数据。
·内置哈希槽(0-16383个编号的哈希槽) 确定我们的请求属于哪个哈希槽编号。确定请求该有那一组集群请求
通过请求key来通过CRC16算法来确定属于哪个哈希槽编号,每一个哈希槽编号均匀分布到每一组数据服务器上面
·Redis 集群会把数据存在一个 master 节点,然后在这个 master 和其对应的salve 之间进行数据同步。当读取数据时,也根据一致性哈希算法到对应的 master 节点获取数据。只有当一个master 挂掉之后,才会启动一个对应的 salve 节点,充当 master 。
·redis提供集群管理工具redis-trib:无非就是将集群下面的每一组数据服务器联系起来
注意: 必须要3个或以上的主节点,否则在创建集群时会失败,并且当存活的主节点数小于总节点数的一半时,整个集群就无法提供服务了。
搭建
1.在/usr/local新建一个cluster-redis目录,并在里面创建1000 1001 2000 2001 3000 3001 目录,模拟六台redis服务
# mkdir cluster-redis
# cd cluster-redis
#mkdir 1000 1001 2000 2001 3000 3001
2.将redis-server redis-cli redis.conf 拷贝到1000目录
3.进入1000目录,修改redis.conf
# vi redis.conf
# ##########常规参数修改
bind 192.168.171.135 # 绑定ip
port 1000 #绑定port
daemonize yes # 开启后台启动
pidfile /usr/local/cluster-redis/1000/redis.pid #pid存放的对应路径
logfile /usr/local/cluster-redis/1000/redis.log #log 存放的对应路径
appendonly yes # 开启AOF持久化
# ##########常规参数修改
cluster-enadled yes # 开启集群
cluster-config-file nodes-1000.conf #集群节点
cluster-node-timeout 5000 # 集群几点超时
注意: #requirepass redis 一定要把登入密码注释,否则集群失败
错误如下:
[root@localhost src]# ./redis-trib.rb create --replicas 1 192.168.171.135:1000 192.168.171.135:2000 192.168.171.135:3000 192.168.171.135:1001 192.168.171.135:2001 192.168.171.135:3001
>>> Creating cluster
[ERR] Sorry, can't connect to node 192.168.171.135:1000
4.分别将 1000目录中的redis-server redis-cli sredis.conf拷贝到其余的5个目录中,并修改port,pidfile,logfile,cluster-config-file 的对应的端口
5.分别启动六台服务,并查看进程
[root@localhost cluster-redis]# ps -aux | grep redis
root 12348 0.1 0.7 136932 7572 ? Ssl 00:13 0:00 ./1000/redis-server 192.168.171.135:1000 [cluster]
root 12804 0.0 0.7 136932 7572 ? Ssl 00:24 0:00 ./1001/redis-server 192.168.171.135:1001 [cluster]
root 12821 0.0 0.7 136932 7572 ? Ssl 00:24 0:00 ./2000/redis-server 192.168.171.135:2000 [cluster]
root 12808 0.0 0.7 136932 7572 ? Ssl 00:24 0:00 ./2001/redis-server 192.168.171.135:2001 [cluster]
root 12816 0.1 0.6 136932 6632 ? Ssl 00:24 0:00 ./3000/redis-server 192.168.171.135:3000 [cluster]s's
root 12812 0.0 0.7 136932 7576 ? Ssl 00:24 0:00 ./3001/redis-server 192.168.171.135:3001 [cluster]
root 12833 0.0 0.0 112648 964 pts/3 R+ 00:24 0:00 grep --color=auto redis
6.启动客户端来查看集群信息
[root@localhost 1000]# ./redis-cli -c -h 192.168.171.135 -p 1000
192.168.171.135:1000> cluster info
cluster_state:fail #不成功
cluster_slots_assigned:0
cluster_slots_ok:0
cluster_slots_pfail:0
cluster_slots_fail:0
cluster_known_nodes:1
cluster_size:0
cluster_current_epoch:0
cluster_my_epoch:0
cluster_stats_messages_sent:0
cluster_stats_messages_received:0
-c 就是代表集群模式
-h 主机ip
-p 端口
通过这个集群命令cluster info来查询集群是否搭建成功
主从在在集群的时候不需要开发人员去设置 它的集群管理器会根据你创建集群规则自动来隐射主从关系
7. ruby 下载安装,本机在/usr/local/src
redis3.0以上支持集群,自带集群管理工具redis-trib.rb;在搭建集群前,安装ruby环境
7.1安装开发工具
yum groupinstall "Development tools"
7.2清理已安装过的
yum erase ruby ruby-libs ruby-mode ruby-rdoc ruby-irb ruby-ri ruby-docs
7.3安装依赖
# yum -y install zlib-devel curl-devel openssl-devel httpd-devel apr-devel apr-util-devel mysql-devel
7.4安装ruby
刚开始用命令yum install ruby安装,但是是2.0以下的版本。我把它卸载了,重新下的2.0以上的包安装
把安装包上传到指定目录
# wget https://cache.ruby-lang.org/pub/ruby/2.4/ruby-2.4.1.tar.gz
解压
# tar zxvf ruby-2.4.1.tar.gz
解压后,进入ruby-2.2.3目录下,依次执行下面命令
#cd ruby-2.4.1
#./configure #配置信息,检查是否具备安装ruby的环境
#make #编译
#make install #安装
7.5查看ruby信息
如果没有卸载centos7 自带的ruby2.00,则需要
#设置PATH路径,把自己安装的ruby放在系统PATH前面,避免调用操作系统自带的ruby
#export PATH=/usr/local/ruby-2.4.1/bin:$PATH
查看ruby 版本
[root@localhost ruby-2.4.1]# ruby -v
ruby 2.4.1p173 (2015-08-18 revision 51636) [x86_64-linux]
7.6要支持redis通信,下载redis相关包
命令:
# gem install redis
查看:
[root@localhost src]# gem list
*** LOCAL GEMS ***
bigdecimal (1.2.6)
io-console (0.4.3)
json (1.8.1)
minitest (5.4.3)
power_assert (0.2.2)
psych (2.0.8)
rake (10.4.2)
rdoc (4.2.0)
redis (4.0.0)
test-unit (3.0.8)
8. Redis-trib.rb 设置
redis-trib.rb是redis官方推出的管理redis集群的工具,集成在redis的源码src目录下,是基于redis提供的集群命令封装成简单、便捷、实用的操作工具。redis-trib.rb是redis作者用ruby完成的
[root@localhost cluster-redis]# ./redis-trib.rb create --replicas 1 192.168.171.135:1000 192.168.171.135:2000 192.168.171.135:3000 192.168.171.135:1001 192.168c.171.135:2001 192.168.171.135:3001
[root@localhost src]#ll
>>> Creating cluster
>>> Performing hash slots allocation on 6 nodes...
Using 3 masters:s
192.168.171.135:1000
192.168.171.135:2000
192.168.171.135:3000
Adding replica 192.168.171.135:1001 to 192.168.171.135:1000
Adding replica 192.168.171.135:2001 to 192.168.171.135:2000
Adding replica 192.168.171.135:3001 to 192.168.171.135:3000
M: 8b52f96e52407569e194ac009f0ede42c67b3e18 192.168.171.135:1000 # 主机id
slots:0-5460 (5461 slots) master # 主机槽点
M: 4c2cb7069aa7056d64bf17f56a0b260f8ec4edae 192.168.171.135:2000
slots:5461-10922 (5462 slots) master
M: efb3a759b392187135207a66741b42f0f2adbc77 192.168.171.135:3000
slots:10923-16383 (5461 slots) master
S: f1597b4b6fa6ed035129249acf1d40b5ed5a6ca9 192.168.171.135:1001
replicates 8b52f96e52407569e194ac009f0ede42c67b3e18 # 从机的id
S: 3867feaade1c6c32ca6b7738975197fd9323a211 192.168.171.135:2001
replicates 4c2cb7069aa7056d64bf17f56a0b260f8ec4edae
S: e72e7fa55e4511ed6edc847a564e51b975a470aa 192.168.171.135:3001
replicates efb3a759b392187135207a66741b42f0f2adbc77
Can I set the above configuration? (type 'yes' to accept): yes
>>> Nodes configuration updated
>>> Assign a different config epoch to each node
>>> Sending CLUSTER MEET messages to join the cluster
Waiting for the cluster to join..
>>> Performing Cluster Check (using node 192.168.171.135:1000)
M: 8b52f96e52407569e194ac009f0ede42c67b3e18 192.168.171.135:1000
slots:0-5460 (5461 slots) master
M: 4c2cb7069aa7056d64bf17f56a0b260f8ec4edae 192.168.171.135:2000
slots:5461-10922 (5462 slots) master
M: efb3a759b392187135207a66741b42f0f2adbc77 192.168.171.135:3000
slots:10923-16383 (5461 slots) master
M: f1597b4b6fa6ed035129249acf1d40b5ed5a6ca9 192.168.171.135:1001
slots: (0 slots) master
replicates 8b52f96e52407569e194ac009f0ede42c67b3e18
M: 3867feaade1c6c32ca6b7738975197fd9323a211 192.168.171.135:2001
slots: (0 slots) master
replicates 4c2cb7069aa7056d64bf17f56a0b260f8ec4edae
M: e72e7fa55e4511ed6edc847a564e51b975a470aa 192.168.171.135:3001
slots: (0 slots) master
replicates efb3a759b392187135207a66741b42f0f2adbc77
[OK] All nodes agree about slots configuration.
>>> Check for open slots...
>>> Check slots coverage...
[OK] All 16384 slots covered.
我们的槽点的分配都是分配到主机上面,从服务器上并没有,但是通过redis服务id建立主从关系
9. 验证集群是否成功
[root@localhost cluster-redis]# ./1001/redis-cli -c -h 192.168.171.135 -p 1001
192.168.171.135:1001> 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:1
cluster_stats_messages_sent:10520
cluster_stats_messages_received:10520
并且验证crc16算法处理写数据请求 key
192.168.171.135:1001> set dongnaoxueyuan 1
-> Redirected to slot [12439] located at 192.168.171.135:3000
OK
192.168.171.135:3000> set do