Redis 集群搭建

6,306 阅读3分钟

概述

最近想写些小项目---加深对理论知识的理解(比如zk, redis,kafaka之类的),就先从环境搭建开始吧 本文搭建有六台server的redis cluster,其中3 master,3 slave (每个master 一个slave),主要有下面几步。(搭建集群之前希望你懂redis cluster的原理!!

  1. redis 安装
  2. 集群模式启动六台redis-server,端口分别为(7000-7005)
  3. 六台server搭建一个集群(用redis-cli 的 --cluster选项)
  4. 对每台server进行密码配置

redis下载 & 安装

# 下载
wget http://download.redis.io/releases/redis-5.0.7.tar.gz
tar -xzvf redis-5.0.7.tar.gz
mv redis-5.0.7 redis
# 编译 安装
cd redis
make  //(可能需要先安装gcc: yum install gcc)
make install
make clean

集群模式启动六台redis server

redis.conf 文件准备

redis server集群模式需要一些特殊的配置,下为参考

port 7000 # server端口,6台server对应7000-7005。
# bind 127.0.0.1 //这一行要注释,否则无法远程连接
cluster-enabled yes
cluster-config-file nodes.conf //node.conf文件不用管。
cluster-node-timeout 5000
appendonly yes //aof
daemonize yes 
protected-mode no

准备六台sever的配置文件

 mkdir redis-cluster
 cd redis-cluster
 mkdir 7000 7001 7002 7003 7004 7005

然后将redis.conf文件拷贝到 7000 到 7005 目录里面(每个redis.conf的只有端口不同)

启动服务器

对应每一个目录,启动一个服务器

redis-server redis.conf

到这里我们就有以集群模式启动的6台(端口7000-7005)redis server,但是每台服务器还没有进行slot指派,此时是不能对外提供服务的。

搭建集群(slot指派)

redis集群管理有多种方案(网上看到有用ruby的,没深入),我这里用redis官方提供的redis-cli 命令的--cluster选项。 下面的命令将7000-7005的六台服务器组成一个集群 其中复制因子为1所,以会有3台master,另外3台为slave。 16384个slot会尽可能均匀的指派给3台master, 而3台slave异步的从其master进行复制。

redis-cli --cluster create 127.0.0.1:7000 127.0.0.1:7001 127.0.0.1:7002 127.0.0.1:7003 127.0.0.1:7004 127.0.0.1:7005 --cluster-replicas 1

到这里整个集群就可以对外提供服务了

密码设置

通过redis-cli连接每一台server,然后设置密码

 config set masterauth [password]\n
 config set requirepass [password]\n

写在最后

  1. 密码一定要最后设置,否则搭建集群时会报auth错
  2. 如果需要外网访问,上面 redis-cli --cluster 选项后面主机地址要改成主机外部ip地址(因为Moved错误客户端处理的, 客户端只有拿到外部ip才知道该move to哪台机器);这里还有一个坑,如果ip换成外部ip之后,需求开通17000-17005端口(安全组和防火墙都要考虑),因为搭建集群服务器之间通过这些端口通信(监听客户端连接的端口 + 10000)
  3. 自己写了一个脚本,贴在文末,以简化整个启动流程(脚本没怎么写过, 大佬勿喷)
  4. 待实验:redis-cli --cluster 这种方式搭建的集群是否用的一致性hash算法呐?

参考

  1. redis 官网集群搭建
  2. Linux下搭建Redis集群、JedisCluster带密码访问

集群启动脚本

#! /bin/sh
# step1: start six redis-server in cluster mode.
PREFIX=/usr/local/redis-cluster/
for((PORT=7000;PORT<=7005;PORT++));
do
cd $PREFIX$PORT
pwd
(redis-server redis.conf);
done

# step2: cluster
redis-cli --cluster create 49.235.250.8:7000 49.235.250.8:7001 49.235.250.8:7002 49.235.250.8:7003 49.235.250.8:7004 49.235.250.8:7005 --cluster-replicas 1

# step3: set auth
commands='
config set masterauth qwerty\n
config set requirepass qwerty\n
auth qwerty\n
config rewrite\n
exit\n'

for((PORT=7000;PORT<=7005;PORT++));
do
echo -e $commands | redis-cli -p $PORT ;
done
echo 'success'