0x00 概述
想搭建一个最简单的Redis集群,那么至少需要6个节点:3个Master和3个Slave。为什么需要3个Master呢?如果你了解过Hadoop/Storm/Zookeeper这些的话,你就会明白一般分布式要求基数个节点,这样便于选举(少数服从多数的原则)。
思路很简单,我将在一台节点上开启6个Redis实例,并且这6个Redis各自有自己的端口。这样的话,相当于模拟出了6台机器了。然后在以这6个实例组建Redis集群就可以了。
具体来说,需要注意下:由于在一台机器(127.0.0.1)上,因此每个实例应该有不同的端口;同时,每个实例显然会有自己的存放数据的地方;开启AOF模式;开启集群配置;开启后台模式;
基于ubuntu 17.04
0x01 安装redis
参考网址: http://www.runoob.com/redis/redis-install.html
$sudo apt-get update
$sudo apt-get install redis-server
$ redis-server #启动redis(默认端口6379,无密码)
$ redis-cli #连接本机redis
Redis实例配置
既然是要启动6个Redis实例,自然需要准备各自的配置文件,为这6个实例创建好各自存放的目录
$ mkdir redis-cluster $ cd redis-cluster $ mkdir 820{1,2,3,4,5,6}
复制 redis.conf (ubuntu 默认在/etc/redis/redis.conf) 到对应的目录
cp /etc/redis/redis.conf ./8201 cp /etc/redis/redis.conf ./8202 cp /etc/redis/redis.conf ./8203 cp /etc/redis/redis.conf ./8204 cp /etc/redis/redis.conf ./8205 cp /etc/redis/redis.conf ./8206
通常情况需要增加权限
sudo chmod +w ./8201/redis.conf
修改配置文件redis.conf
vim ./8201/redis.conf
主要是修改ip和端口(注意不要使用冲突的端口),如下修改(其他六个redis也是一样)
appendfilename "appendonly.aof" appendfsync everysec appendonly yes bind 127.0.0.1 # 修改为对应的IP地址,按服务器情况修改 cluster-config-file nodes-8201.conf # 一般以端口设置,需要修改 cluster-enabled yes cluster-node-timeout 5000 daemonize yes # 后台模式,默认为yes dir /home/jam/work/redis-cluster/8201 # 设置文件目录,会生成aof文件,需要修改 pidfile /home/jam/work/redis-cluster/8201/redis-server.pid # pid 文件,需要修改 port 8201 #端口,需要修改
查看配置文件,不看注释 grep -v '^#' 8201/redis.conf | sort -u
配置的时候,可以先把第一个配置文件先配置好,然后复制到其他目录,然后使用替换,把端口号替换即可
vim的替换命令,按Esc 进入命令模式,输入
:%s/8201/8202/g
其中,s表示替换;%全文替换,不加默认一行;8021,要查找被替换的文本,8022新的文本;g整行替换,不加g只替换行中第一个匹配文本。
管理Redis集群
Redis集群的操作在后文你可以看到是通过Ruby脚本来完成的,因此我们需要安装Ruby相关的RPM包,以及Redis和Ruby的接口包。
sudo apt install ruby sudo gem install redis
下载集群管理脚本redis-trib.rb。redis-trib.rb是redis官方推出的管理redis集群的工具,集成在redis的源码src目录下,是基于redis提供的集群命令封装成简单、便捷、实用的操作工具。redis-trib.rb是redis作者用ruby完成的。
wget http://download.redis.io/redis-stable/src/redis-trib.rb
确保了redis服务可以了,就开始使用脚本创建集群了。一般检查完毕需要输入 yes 确认,输入之后就可以安装完毕。
sudo ./redis-trib.rb create --replicas 1 127.0.0.1:8201 127.0.0.1:8202 127.0.0.1:8203 127.0.0.1:8204 127.0.0.1:8205 127.0.0.1:8206
我们来看一下创建集群命令中 --replicas 1,这个代表什么意思呢?1其实代表的是一个比例,就是主节点数/从节点数的比例。那么想一想,在创建集群的时候,哪些节点是主节点呢?哪些节点是从节点呢?答案是将按照命令中IP:PORT的顺序,先是3个主节点,然后是3个从节点。
slot对于Redis集群而言,就是一个存放数据的地方,就是一个槽。对于每一个Master而言,会存在一个slot的范围,而Slave则没有。在Redis集群中,依然是Master可以读、写,而Slave只读。数据的写入,实际上是分布的存储在slot中,这和以前1.X的主从模式是不一样的(主从模式下Master/Slave数据存储是完全一致的),因为Redis集群中3台Master的数据存储并不一样。
验证redis集群
redis-cli -c -h 127.0.0.1 -p 8201
连接成功后可以进入redis命令模式
127.0.0.1:8201>pin
返回pong
输入查看集群信息的命令,会有对应的信息。
127.0.0.1:8201> cluster nodes a7cfbaee7af907e4d2a51ae3f4f28a8df2d3858f 127.0.0.1:8204 slave a88057ab04c7fd7d10d83c5c313b24eaaa65541d 0 1509004191221 4 connected 68c45609c72927cabb5c73e453865427df563852 127.0.0.1:8206 slave 3377888e3c9ae0a45cab0895aa16d9f77bf5509d 0 1509004192243 6 connected 1a1ff27396a66fb1f821d3f2df3bcc9a3941726f 127.0.0.1:8202 master - 0 1509004190204 2 connected 5461-10922 3377888e3c9ae0a45cab0895aa16d9f77bf5509d 127.0.0.1:8203 master - 0 1509004191735 3 connected 10923-16383 c109bf48f2bd3eca1c6cded7932bc218ade7a727 127.0.0.1:8205 slave 1a1ff27396a66fb1f821d3f2df3bcc9a3941726f 0 1509004191732 5 connected a88057ab04c7fd7d10d83c5c313b24eaaa65541d 127.0.0.1:8201 myself,master - 0 0 1 connected 0-5460 127.0.0.1:8201> 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:10810 cluster_stats_messages_received:10810
参考: http://www.jianshu.com/p/dbc62ed27f03