CODY

CODY 关注TA

一坑未平,一坑起

CODY

CODY

关注TA

一坑未平,一坑起

  •  深圳南山
  • java酱油党
  • 写了59,448字

该文章投稿至Nemo社区   编程综合  板块 复制链接


redis伪集群搭建

发布于 2018/02/02 16:44 2,103浏览 2回复 7,520

模型

redis集群

原理

·去中心化,去中间件,也就是说,集群中的每个节点都是平等的关系,都是对等的,每个节点都保存各自的数据和整个集群的状态。每个节点都和其他所有节点连接,而且这些连接保持活跃,这样就保证了我们只需要连接集群中的任意一个节点,就可以获取到其他节点的数据。

·内置哈希槽(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
本文标签
 {{tag}}
点了个评