忠告:在学习搭建redis集群之前,先学会搭建单个的redis。上一篇我们就介绍了单个的redis搭建,有兴趣的朋友可以参照一下。
两台服务器,个启动三个实例,形成三主三从。
ip: 192.9.200.159 192.9.200.160
1、使用yum安装所需环境和工具。
yum -y install wget vim tcl gcc make
2、下载redis并解压。
cd /usr/local/ (本人用的是local目录,当然其他目录也是可以。)
wget http://download.redis.io/releases/redis-3.2.x.tar.gz
tar -zxf redis-3.2.x.tar.gz
(也可以在网站上下载下来,然后上传解压,付网址:http://download.redis.io/releases/redis-3.2.5.tar.gz)
3、编译安装redis源文件
cd /redis
make (若安装报错,可以改为这一句:make MALLOC=libc)
make install
(如果 /usr/local/bin/ 文件夹内没有 redis-server 那几个文件,就从 /usr/local/redis-3.2.8/src/ 中拷贝过去,命令:cp redis-server redis-cli redis-sentinel redis-benchmark redis-check-aof redis-check-rdb /usr/local/bin/)
4、配置内核参数(可以省略)
--配置 vm.overcommit_memory 为1,这可以避免数据被截断
systcl -w vm.overcommit_memory=1
5、创建多实例的文件夹
cd /usr/local/
mkdir cluster
cd cluster
mkdir 7000 7001 7002
6、修改配置文件
vim /usr/local/redis/redis.conf
bind 192.9.200.159 (需要不同的服务器进行节点的联通,就不能设为127.0.0.1)
protected-mode no (需要不同的服务器进行节点的联通,就不能设为yes)
daemonize yes (设置后台运行redis)
cluster-enabled yes(开启集群,把#去掉)
cluster-node-timeout 15000 (设置请求超时时间,默认为15秒,可以自行修改)
appendonly yes (aop日志开启,会每次进行写操作都记录一条日志)
--根据不同的端口需要设置的地方
port 7000
pidfile /var/run/redis_7000.pid
logfile /var/log/redis/redis_7000.log
dbfilename dump_7000.rdb
applendfilename "applendonly_7000.aof"
cluster-config-file nodes_7000.conf
7、复制配置文件到各个实例文件夹,并且对相应的端口号和参数进行配置。
cp -f /usr/local/redis/redis.conf /usr/local/cluster/7000/
cp -f /usr/local/redis/redis.conf /usr/local/cluster/7001/
cp -f /usr/local/redis/redis.conf /usr/local/cluster/7002/
8、启动各个节点
redis-server /usr/local/cluster/7000/redis.conf
redis-server /usr/local/cluster/7001/redis.conf
redis-server /usr/local/cluster/7002/redis.conf
--使用ps -ef|grep redis | grep cluster查看是否都启动成功,ip和端口号是否都正确。
9、防火墙开通策略 (防火墙未开就不用配置)
firewall-cmd --zone=public --add-port=7000-7002/tcp --permanent
firewall-cmd --zone=public --add-port=17000-17002/tcp --permanent (必须开集群总线端口,集群总线端口=端口号 +10000,例:7000的集群总线端口是17000。这个集群总线端口不开放,集群的时候外部服务器的节点添加不进来)
===============================一条华丽的分割线=================================
以上1-9的步骤在另一台服务器上也需要配置,另一台服务器端口可以设为7003,7004,7005,或者跟上面一样也可以
===============================一条华丽的分割线=================================
10、测试两台服务器是否都能 telnet 得通另一台的 7000~7002 和 17000~17002
telnet -tlnp | grep redis
11、安装ruby环境
yum -y install ruby rubygems
12、跟新gem源
gem sources -a http://ruby.taobao.org/
13、使用gem安装redis和ruby接口
gem install redis (或者gem install redis --version3.2.x)
14、创建集群
cd /usr/local/redis/src/
(redis官方提供了redis-trib.rb 这个工具,就这解压目录src目录中,第3步中已将它复制到/usr/local/bin目录中,可以直接在命令行中使用。)
redis-trib.rb create --replicas 1 192.9.200.159:7000 192.9.200.159:7001 192.9.200.159:7002 192.9.200.160:7000 192.9.200.160:7001 192.9.200.160:7002
留意一下屏幕,会有一句(type 'yes' or accept),输入yes,回车。(意思是:接受自主分配三主三从)
如果最后出现
说明搭建成功。
如果出现
一直出现'...',说明另一台服务器的端口策略没通,一直在等那边的节点加入集群,O(∩_∩)O哈哈哈~~那么恭喜你,悲剧发生咯!!
15、验证集群
在第一台服务器上连接集群的某一端口(7000)节点,在另一台服务器上连接某一端口(7002)节点,连接方式为:redis-cli -h 192.9.200.159 -c -p 7000 (加参数 -c 可以连接到集群,因为redis.conf将bind改为了ip地址,所以 -h 不可以省略)
在7000节点上执行命令 set hello world
在另一台服务器上7002节点执行命令查看kay为‘hello’的内容 get hello
说明集群运行正常。
16、总结
redis cluster在设计的时候,就考虑到了去中心化,去中间件,也就是说,集群中的每个节点都是平等的关系,每个节点都保存着各自的数据和整个集群的状态。每个节点都和其他所有节点连接,而且这些节点保持着活跃,这样就保证了我们只需要连接集群中的任意一个节点,就可以获取到其他节点的数据。
redis集群并没有使用传统的一致性hash来分配数据,而是采用另外一种叫做hash槽(hash slot)的方式来进行分配。redis cluster默认分配了16384个槽,当我们set一个key时,会用CRC16算法来取模得到所属的slot,然后将这个key分配到hash slot区间的节点上,具体的算法就是:CRC16(key) %16384。
redis集群会把数据存在一个master节点,然后在这个master和其对应的salve之间进行数据同步。当读取数据时,也根据一致性hash算法到对应的master节点获取数据。只有当一个master挂掉之后,才会启动一个对应的salve节点,充当master。
值得注意的是:必须要3个以及以上的主节点,否则会创建集群不成功,并且当存活的主节点树小于总结点数一半的时候,整个集群就 无法提供服务了。