目录
1、Redis 简介
2、Redis集群搭建
3、Redis 集群搭建问题记录
#详细过程
###1、Redis 简介
Redis 的主从复制技术,当实现了多节点的 master-slave 后,我们也可以把它叫做集群,它主要是利用切片技术来组建的集群。集群要实现的目的是要将不同的 key 分散放置到不同的 redis 节点,这里我们需要一个规则或者算法,通常的做法是获取 key 的哈希值,然后根据节点数来求模,但这种做法有其明显的弊端,当我们需要增加或减少一个节点时,会造成大量的 key 无法命中,这种比例是相当高的,所以就有人提出了一致性哈希的概念。
整体设计包含如下几点:
- 数据Hash分布在不同的Redis Instatnce上;
- M/S的切换采用Sentinel;
- 写:只会写master Instance,从sentinel获取当前的master Instane;
- 读:从Redis Node中基于权重选取一个Redis Instance读取,失败/超时则轮询其他Instance;
- 通过RPC服务访问,RPC server端封装了Redis客户端,客户端基于jedis开发;
- 批量写/删除:不保证事务;
参考:
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上,链接:
###2、Redis集群搭建
####2.1、集群的逻辑结构
要让集群正常工作至少需要3个主节点,在加上Redis的主从架构设计,在这里我们要创建6个redis节点,其中三个为主节点,三个为从节点,对应的redis节点的ip和端口对应关系如下:
- 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
这样,设计正好每个机器上两个节点,每个节点对应一个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 7000
daemonize yes
masterauth 自己的密码
requirepass 自己的密码
cluster-enabled yes
cluster-config-file nodes.conf
cluster-node-timeout 5000
appendonly no
pidfile /srv/run/redis_7000.pid
logfile /data/logs/redis.log
dir /srv/redis_cluster/7000
maxmemory 6gb
######【注意事项】:
(1) redis做内存数据本地持久化的方式有两种: RDB和Aof ,其中
- RDB文件保存过程:
RDB持久化是指在指定的时间间隔内将内存中的数据集快照写入磁盘。
也是默认的持久化方式,这种方式是就是将内存中数据以快照的方式写入到二
进制文件中,默认的文件名为dump.rdb
- AOF文件保存过程:
redis会将每一个收到的写命令都通过write函数追加到文件中(默认是 appendonly.aof)。
当redis重启时会通过重新执行文件中保存的写命令来在内存中重建整个数据
库的内容。当然由于os会在内核中缓存 write做的修改,所以可能不是立即写到磁盘上。这样aof方式的持久化也还是有可能会丢失部分修改。不过我们可以通过配置文件告诉redis我们想要 通过fsync函数强制os写入到磁盘的时机。有三种方式如下(默认是:每秒fsync一次)
appendonly yes //启用aof持久化方式
# appendfsync always //每次收到写命令就立即强制写入磁盘,最慢的,但是保证完全的持久化,不推荐使用
appendfsync everysec //每秒钟强制写入磁盘一次,在性能和持久化方面做了很好的折中,推荐
# appendfsync no //完全依赖os,性能最好,持久化没保证
(2) 由于我们现有的业务不需要把数据持久化到本地磁盘,所以要取消RDB和Aof两种方式。
- RBD的取消以下3个配置
#save 900 1
#save 300 10
#save 60 10000
- Aof的取消以下配置
appendonly no
取消内存数据持久化的一个原因是持久化的时候会再次启动fork出一个和主进程相同的内存的进程,这样会导致系统内存超限(现有系统总内存为16GB),从而导致系统内存吃紧,以及有可能会导致redis主进程被kill掉。
上面为某一节点redis.conf内容,其他节点配置就不再重复,注意端口和pidfile需要修改;
192.168.1.203、192.168.1.208两节点重复以上工作,即完成集群配置文件的工作。
注意事项: 此处必须修改一个文件,加上密码部分,否则在创建集群后出现异常,见下图:
# vim /usr/local/share/gems/gems/redis-3.3.1/lib/redis/client.rb
#####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:7000
192.168.1.208:7002
192.168.1.203:7004
Adding replica 192.168.1.208:7003 to 192.168.1.184:7000
Adding replica 192.168.1.184:7001 to 192.168.1.208:7002
Adding replica 192.168.1.203:7005 to 192.168.1.203:7004
M: a87b0bd7d01184260ebb79f01ebc8c60108c3786 192.168.1.184:7000
slots:0-5460 (5461 slots) master
S: 9623c893341929d1693674ae74c1c76d5d4e58c5 192.168.1.184:7001
replicates 8b8c315d4cf7a1ba3d68586c9fdbefac6e58d755
M: 8b8c315d4cf7a1ba3d68586c9fdbefac6e58d755 192.168.1.208:7002
slots:5461-10922 (5462 slots) master
S: 0ed40b206f5da1a1caf0c8e90917efeba4074594 192.168.1.208:7003
replicates a87b0bd7d01184260ebb79f01ebc8c60108c3786
M: f16d03c9afa777c0aca78867f81c0da155c21ffa 192.168.1.203:7004
slots:10923-16383 (5461 slots) master
S: 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 cluster
Waiting 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) master
M: 9623c893341929d1693674ae74c1c76d5d4e58c5 192.168.1.184:7001
slots: (0 slots) master
replicates 8b8c315d4cf7a1ba3d68586c9fdbefac6e58d755
M: 8b8c315d4cf7a1ba3d68586c9fdbefac6e58d755 192.168.1.208:7002
slots:5461-10922 (5462 slots) master
M: 0ed40b206f5da1a1caf0c8e90917efeba4074594 192.168.1.208:7003
slots: (0 slots) master
replicates a87b0bd7d01184260ebb79f01ebc8c60108c3786
M: f16d03c9afa777c0aca78867f81c0da155c21ffa 192.168.1.203:7004
slots:10923-16383 (5461 slots) master
M: 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
#####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:7004
OK
192.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
#####4、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 redis
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
>>> Creating cluster
[ERR] Sorry, can't connect to node 192.168.1.184:7000
解决:
注意端口对应关系要正确。