redis 集群搭建过程及搭建问题处理

来源:互联网 发布:闪恋 知乎 编辑:程序博客网 时间:2024/06/04 22:03

文章目录

1、Redis 简介2、Redis 集群搭建3、Redis 集群搭建问题记录

1、Redis 简介

    Redis 的主从复制技术,当实现了多节点的 master-slave 后,我们也可以把它叫做集群,它主要是利用切片技术来组建的集群。集群要实现的目的是要将不同的 key 分散放置到不同的 redis 节点,这里我们需要一个规则或者算法,通常的做法是获取 key 的哈希值,然后根据节点数来求模,但这种做法有其明显的弊端,当我们需要增加或减少一个节点时,会造成大量的 key 无法命中,这种比例是相当高的,所以就有人提出了一致性哈希的概念。整体设计包含如下几点:1. 数据Hash分布在不同的Redis Instatnce上;2. M/S的切换采用Sentinel;3. 写:只会写master Instance,从sentinel获取当前的master Instane;4. 读:从Redis Node中基于权重选取一个Redis Instance读取,失败/超时则轮询其他Instance;5. 通过RPC服务访问,RPC server端封装了Redis客户端,客户端基于jedis开发;6. 批量写/删除:不保证事务;

参考:
http://blog.csdn.net/yfkiss/article/details/38944179
http://www.cnblogs.com/zhaoguihua/p/redis-005.html

Redis集群搭建准备工作:

* 准备3台机器,IP地址分别为:192.168.1.184、192.168.1.203、192.168.1.208;其中有两台物理机一台虚拟机,192.168.1.208为虚拟机Centos系统,192.168.1.184、192.168.1.203为物理机ubuntu系统;* 下载Redis,当前版本为:Redis-3.2.1.tar.gz,将该文件拷贝到以上三台机器的安装目录,然后解压安装到 /srv/redis/ 下,安装过程参考《diq_业务增强镜像配置说明(基于服务器基础镜像制作)》,文档在tower上,链接:https://tower.im/projects/c7fb7cf9e6fa461a956743fe37e61fbd/todos/4f10f4a6ab5e43f08c416ea35799294b/

2、Redis集群搭建

2.1、集群的逻辑结构要让集群正常工作至少需要3个主节点,在加上Redis的主从架构设计,在这里我们要创建6个redis节点,其中三个为主节点,三个为从节点,对应的redis节点的ip和端口对应关系如下:192.168.1.184:7000192.168.1.184:7001192.168.1.208:7002192.168.1.208:7003192.168.1.203:7004192.168.1.203:7005这样,设计正好每个机器上两个节点,每个节点对应一个redis.conf文件,启动时每个节点对应自己的配置文件。2.2、环境搭建在192.168.1.184节点上开始做如下工作:(1)创建集群文件夹及配置文件redis.conf (带密码认证方式)创建集群文件夹 /srv/redis_cluster;创建2个节点配置文件夹 /srv/redis_cluster/7000和 /srv/redis_cluster/7001;创建节点pidfile配置路径 /srv/run/拷贝安装路径下的redis.conf到这2个节点配置文件夹;然后修改配置文件redis.conf,内容如下:port 7000daemonize yesmasterauth 自己的密码requirepass 自己的密码cluster-enabled yescluster-config-file nodes.confcluster-node-timeout 5000appendonly nopidfile /srv/run/redis_7000.pidlogfile /data/logs/redis.logdir /srv/redis_cluster/7000maxmemory 6gb(2)启动Redis集群:启动方式与正常启动单节点的命令相似,启动时进入 /opt/redis_cluster/7000的配置文件路径下,下面方式启动一个节点:/opt/redis-3.2.1/bin/redis-server  redis.conf启动后 /opt/redis_cluster/7000 文件夹下会产生appendonly.aof、nodes.conf,注意这两个文件的产生在启动路径下,所以为了集群的管理,最近进入配置文件夹启动。 其他节点的启动方式与上相同,这里不重复了。当此时,集群的各节点已经启动完成,但当前各节点尚未建立联系,需要命令将他们联合起来作为一个集群工作,进入某一个节点的终端,进入Redis安装路径 redis-3.2.1/src,使用下面命令建立集群:./redis-trib.rb create --replicas 1 192.168.1.184:7000 192.168.1.184:7001 192.168.1.208:7002 192.168.1.208:7003 192.168.1.203:7004 192.168.1.203:7005开始执行:>>> Creating cluster>>> Performing hash slots allocation on 6 nodes...Using 3 masters:192.168.1.184:7000192.168.1.208:7002192.168.1.203:7004Adding replica 192.168.1.208:7003 to 192.168.1.184:7000Adding replica 192.168.1.184:7001 to 192.168.1.208:7002Adding replica 192.168.1.203:7005 to 192.168.1.203:7004M: a87b0bd7d01184260ebb79f01ebc8c60108c3786 192.168.1.184:7000   slots:0-5460 (5461 slots) masterS: 9623c893341929d1693674ae74c1c76d5d4e58c5 192.168.1.184:7001   replicates 8b8c315d4cf7a1ba3d68586c9fdbefac6e58d755M: 8b8c315d4cf7a1ba3d68586c9fdbefac6e58d755 192.168.1.208:7002   slots:5461-10922 (5462 slots) masterS: 0ed40b206f5da1a1caf0c8e90917efeba4074594 192.168.1.208:7003   replicates a87b0bd7d01184260ebb79f01ebc8c60108c3786M: f16d03c9afa777c0aca78867f81c0da155c21ffa 192.168.1.203:7004   slots:10923-16383 (5461 slots) masterS: 57f9d16a2d50c55440d47202a2fbfe2901c9f044 192.168.1.203:7005   replicates f16d03c9afa777c0aca78867f81c0da155c21ffa提示设置配置信息,选yes回车: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 clusterWaiting for the cluster to join...>>> Performing Cluster Check (using node 192.168.1.184:7000)M: a87b0bd7d01184260ebb79f01ebc8c60108c3786 192.168.1.184:7000   slots:0-5460 (5461 slots) masterM: 9623c893341929d1693674ae74c1c76d5d4e58c5 192.168.1.184:7001   slots: (0 slots) master   replicates 8b8c315d4cf7a1ba3d68586c9fdbefac6e58d755M: 8b8c315d4cf7a1ba3d68586c9fdbefac6e58d755 192.168.1.208:7002   slots:5461-10922 (5462 slots) masterM: 0ed40b206f5da1a1caf0c8e90917efeba4074594 192.168.1.208:7003   slots: (0 slots) master   replicates a87b0bd7d01184260ebb79f01ebc8c60108c3786M: f16d03c9afa777c0aca78867f81c0da155c21ffa 192.168.1.203:7004   slots:10923-16383 (5461 slots) masterM: 57f9d16a2d50c55440d47202a2fbfe2901c9f044 192.168.1.203:7005   slots: (0 slots) master   replicates f16d03c9afa777c0aca78867f81c0da155c21ffa[OK] All nodes agree about slots configuration.>>> Check for open slots...>>> Check slots coverage...[OK] All 16384 slots covered.到此Redis集群配置完毕,从上面的日志信息,我们可以看出,集群中每个机器上2个节点,一主一从。也可以使用如下命令查看当前Redis集群的状态:./redis-trib.rb check  192.168.1.184:7000 该命令后面接的ip:端口,可以是集群中的任意节点。

参考文档:
http://www.linuxidc.com/Linux/2015-08/121845.htm

2.3、集群应用可以使用客户端连接集群,进行相关的应用测试,连接方式与单节点的连接方式类似,使用redis-cli客户端工具进行连接,进入redis-cli所在路径,命令如下:./redis-cli -c -h 192.168.1.184 -p 7000其中,-c 代表集群参数,然后进入提示符:192.168.1.184:7000>set a b-> Redirected to slot [15495] located at 192.168.1.203:7004OK192.168.1.203:7004> get a"b"当set一个key-value时,会占用集群的一个slot,这个slot是在另一个节点192.168.1.203:7004上建立的,同时提示符切入该节点状态,使用get获取a的value为b;到此说明集群已经开始正常工作了。

参考文档:
http://blog.csdn.net/hackerwin7/article/details/43559991


3、Redis 集群搭建问题记录

(1)使用redis-trib.rb建立集群关系时问题:shuzilm@shuzilm:~/Downloads/redis-3.2.1/src$ ./redis-trib.rb create --replicas 1 192.168.1.184:7000 192.168.1.184:7001 192.168.1.203:7002 192.168.1.203:7003 192.168.1.208:7004 192.168.1.208:7005/usr/lib/ruby/1.9.1/rubygems/custom_require.rb:36:in `require': cannot load such file -- redis (LoadError)解决:sudo gem install redisshuzilm@shuzilm:~/Downloads/redis-3.2.1/src$ ./redis-trib.rb create --replicas 1 192.168.1.184:7000 192.168.1.184:7001 192.168.1.203:7002 192.168.1.203:7003 192.168.1.208:7004 192.168.1.208:7005>>> Creating cluster[ERR] Sorry, can't connect to node 192.168.1.184:7000解决:注意端口对应关系要正确。
1 0