Redis3.0.7集群部署

Redis 是一个高性能的key-value数据库。它支持存储多种value类型,包括string(字符串)、list(链表)、set(集合)、zset(sorted set --有序集合)和hash(哈希类型)。这些数据类型都支持push/pop、add/remove及取交集并集和差集及更丰富的操作,而且这些操作都是原子性的。同时,为了保证效率,数据都是缓存在内存中。Redis会周期性的把更新的数据写入磁盘或者把修改操作写入追加的记录文件,并且在此基础上实现了master-slave(主从)同步。

准备工作

要让集群正常工作至少需要3个主节点,在这里我们要创建6个redis节点并部署到2台物理节点上,其中三个为主节点,三个为从节点,对应的redis节点的ip和端口对应关系如下)

192.168.1.121:7000
192.168.1.121:7001
192.168.1.121:7002

192.168.1.122:7000
192.168.1.122:7001
192.168.1.122:7002

一、安装Redis

  • 下载redis,这里需要下载3.0之后的版本,之前的版本不支持集群模式,本文采用最新的3.0.7版本。(所有节点)
cd /home/soft
wget http://download.redis.io/releases/redis-3.0.7.tar.gz
  • 解压,编译 编译前确保安装好了gcc(所有节点)
tar -zxvf redis-3.0.7.tar.gz
cd /home/soft/redis3.0.7  
make 
make install
  • 创建集群需要的目录(节点1)
mkdir -p /home/soft/cluster
cd /home/soft/cluster
mkdir 7000
mkdir 7001
mkdir 7002
  • 修改配置文件redis.conf(节点1)
cp /home/soft/redis3.0.7/redis.conf  /home/soft/cluster
vi redis.conf

修改配置文件中的下面选项

port 7000
daemonize yes
cluster-enabled yes
cluster-config-file nodes.conf
cluster-node-timeout 5000
appendonly yes
  • 修改完redis.conf配置文件中的这些配置项之后把这个配置文件分别拷贝到7000/7001/7002目录下面(节点1)
cp /home/soft/cluster/redis.conf /home/soft/cluster/7000
cp /home/soft/cluster/redis.conf /home/soft/cluster/7001
cp /home/soft/cluster/redis.conf /home/soft/cluster/7002

注意:拷贝完成之后要修改7001/7002目录下面redis.conf文件中的port参数,分别改为对应的文件夹的名称。

  • 将节点1上的cluster目录拷贝到其他节点上(节点1)
scp -r /home/soft/cluster root@192.168.1.122:/home/soft/
  • 分别启动这6个redis实例
//节点1
cd /home/soft/cluster/7000
redis-server redis.conf
cd /home/soft/cluster/7001
redis-server redis.conf
cd /home/soft/cluster/7002
redis-server redis.conf

//节点2
cd /home/soft/cluster/7000
redis-server redis.conf
cd /home/soft/cluster/7001
redis-server redis.conf
cd /home/soft/cluster/7002
redis-server redis.conf
  • 启动之后使用命令查看redis的启动情况
ps -ef|grep redis

如下图显示则说明对应节点的redis实例启动成功。


redis实例启动

二、创建集群

  • 安装ruby环境
yum -y install ruby
  • 安装rubygems
yum -y install rubygems
  • 安装gem redis
gem install -l redis
  • 执行redis的创建集群命令创建集群(单节点即可)
cd /home/soft/redis3.0.7/src 
./redis-trib.rb  create --replicas 1 192.168.1.121:7000 192.168.1.121:7001 192.168.1.121:7002 192.168.1.122:7000 192.168.1.122:7001 192.168.1.122:7002

--replicas表示为每个master节点创建多少个slave节点。
创建过程中,redis-trib 会打印出一份预想中的配置给你看, 如果你觉得没问题的话, 就可以输入 yes , redis-trib 就会将这份配置应用到集群当中,让各个节点开始互相通讯,配置完成。

至此redis集群即搭建成功!

  • 使用redis-cli命令进入集群环境
redis-cli -c -p 7000
//或者指定访问ip
redis-cli -c -p 7000 -h 192.168.1.121

简单测试下

redis集群模式测试

从图中可以看出,它总是依靠 Redis 集群节点来将它转向(redirect)至正确的节点。

三、设置开机自启

  • 设置redis.conf中daemonize为yes,确保守护进程开启。
  • 编写开机自启动脚本
vi /etc/init.d/redis7000

脚本内容如下:

# chkconfig: 2345 10 90  
# description: Start and Stop redis   
  
PATH=/usr/local/bin:/sbin:/usr/bin:/bin
REDISPORT=7000
EXEC=/usr/local/bin/redis-server
REDIS_CLI=/usr/local/bin/redis-cli

PIDFILE=/var/run/redis.pid
CONF="/home/soft/cluster/7000/redis.conf" 
AUTH=""  

case "$1" in   
        start)   
                if [ -f $PIDFILE ]   
                then   
                        echo "$PIDFILE exists, process is already running or crashed."  
                else  
                        echo "Starting Redis server..."  
                        $EXEC $CONF   
                fi   
                if [ "$?"="0" ]   
                then   
                        echo "Redis is running..."  
                fi   
                ;;   
        stop)   
                if [ ! -f $PIDFILE ]   
                then   
                        echo "$PIDFILE exists, process is not running."  
                else  
                        PID=$(cat $PIDFILE)   
                        echo "Stopping..."  
                       $REDIS_CLI -p $REDISPORT  SHUTDOWN    
                        sleep 2  
                       while [ -x $PIDFILE ]   
                       do  
                                echo "Waiting for Redis to shutdown..."  
                               sleep 1  
                        done   
                        echo "Redis stopped"  
                fi   
                ;;   
        restart|force-reload)   
                ${0} stop   
                ${0} start   
                ;;   
        *)   
               echo "Usage: /etc/init.d/redis {start|stop|restart|force-reload}" >&2  
                exit 1  
esac

编写完成后保存退出。

  • 设置权限
chmod 755 redis
  • 启动
/etc/init.d/redis7000 start

启动成功会提示如下信息:

Starting Redis server...
Redis is running...
  • 设置开机自启动
chkconfig redis on
  • 关机重启测试
reboot

四、Cluster操作

  • 集群
CLUSTER INFO 打印集群的信息  
CLUSTER NODES 列出集群当前已知的所有节点(node),以及这些节点的相关信息。  
  • 节点
CLUSTER MEET <ip> <port> 将 ip 和 port 所指定的节点添加到集群当中,让它成为集群的一份子。  
CLUSTER FORGET <node_id> 从集群中移除 node_id 指定的节点。  
CLUSTER REPLICATE <node_id> 将当前节点设置为 node_id 指定的节点的从节点。  
CLUSTER SAVECONFIG 将节点的配置文件保存到硬盘里面。 
  • 槽(slot)
CLUSTER ADDSLOTS <slot> [slot ...] 将一个或多个槽(slot)指派(assign)给当前节点。  
CLUSTER DELSLOTS <slot> [slot ...] 移除一个或多个槽对当前节点的指派。  
CLUSTER FLUSHSLOTS 移除指派给当前节点的所有槽,让当前节点变成一个没有指派任何槽的节点。  
CLUSTER SETSLOT <slot> NODE <node_id> 将槽 slot 指派给 node_id 指定的节点,如果槽已经指派给另一个节点,那么先让另一个节点删除该槽>,然后再进行指派。  
CLUSTER SETSLOT <slot> MIGRATING <node_id> 将本节点的槽 slot 迁移到 node_id 指定的节点中。  
CLUSTER SETSLOT <slot> IMPORTING <node_id> 从 node_id 指定的节点中导入槽 slot 到本节点。  
CLUSTER SETSLOT <slot> STABLE 取消对槽 slot 的导入(import)或者迁移(migrate)。 
CLUSTER KEYSLOT <key> 计算键 key 应该被放置在哪个槽上。  
CLUSTER COUNTKEYSINSLOT <slot> 返回槽 slot 目前包含的键值对数量。  
CLUSTER GETKEYSINSLOT <slot> <count> 返回 count 个 slot 槽中的键。 

五、客户端操作

需要注意的是集群模式目前不支持多数据库操作,即只能使用database 0,使用select命令会报错

JedisPoolConfig config = new JedisPoolConfig();  
config.setMaxTotal(20);  
config.setMaxIdle(2);

Set<HostAndPort> jedisClusterNodes = new HashSet<HostAndPort>();
jedisClusterNodes.add(new HostAndPort("192.168.1.121", 7000));
jedisClusterNodes.add(new HostAndPort("192.168.1.121", 7001));
jedisClusterNodes.add(new HostAndPort("192.168.1.121", 7002));
jedisClusterNodes.add(new HostAndPort("192.168.1.122", 7000));
jedisClusterNodes.add(new HostAndPort("192.168.1.122", 7001));
jedisClusterNodes.add(new HostAndPort("192.168.1.122", 7002));
 // 超时,最大的转发数,最大链接数,最小链接数都会影响到集群  
JedisCluster jedisCluster = new JedisCluster(jedisClusterNodes, 5000, 10, config);  
jedisCluster.set("key","value");
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 158,736评论 4 362
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 67,167评论 1 291
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 108,442评论 0 243
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 43,902评论 0 204
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 52,302评论 3 287
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 40,573评论 1 216
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 31,847评论 2 312
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 30,562评论 0 197
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 34,260评论 1 241
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 30,531评论 2 245
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 32,021评论 1 258
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 28,367评论 2 253
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 33,016评论 3 235
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 26,068评论 0 8
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 26,827评论 0 194
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 35,610评论 2 274
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 35,514评论 2 269

推荐阅读更多精彩内容

  • 本文档翻译自 http://redis.io/topics/cluster-tutorial 。 本文档是 Red...
    会跳舞的机器人阅读 66,855评论 2 21
  • Spring Cloud为开发人员提供了快速构建分布式系统中一些常见模式的工具(例如配置管理,服务发现,断路器,智...
    卡卡罗2017阅读 134,099评论 18 139
  • 1 Redis介绍1.1 什么是NoSql为了解决高并发、高可扩展、高可用、大数据存储问题而产生的数据库解决方...
    克鲁德李阅读 5,171评论 0 36
  • 抽出 一本落满灰尘的书 泛黄的灯光映照着 厚厚的镜片也看不出 听到 谁家流浪的猫在哭 那条洗到褪色的牛仔裤 和扔在...
    亦丶阅读 208评论 0 0
  • #不是很懂LOFTER屏蔽我的套路,总不能是我装死太久了吧…Q皿Q #暂时只写了喻黄所以先发,其他写完就补上 #以...
    燃一阅读 944评论 0 1