2019-06-18 linux安装Redis集群

linux安装Redis集群(三主三备)

2017-08-05

Redis是一个可基于内存亦可持久化的日志型(aof,rdb)、高性能Key-Value数据库,并提供多种语言的API,Redis支持主从同步。数据可以从主服务器向任意数量的从服务器上同步,从服务器可以是关联其他从服务器的主服务器。

-redis

我们这里搭建的集群就需要六台机器,三台为主,redis集群和其他技术的集群有点不一样。redis一共分成16384个槽,并且把这些槽基本算是平均分配到三台机器上,。引入了备机才能算集群+高可用,即存入的数据采用一定策略存到三台机器上,而备用机会实现同步主机的数据,并且当主机发生故障时,备用机能及时的通过选举,上来充当主机,维护集群的稳定。

-准备工作

-六台虚拟机

192.168.40.142

………..

192.168.40.147

-安装

首先安装分别安装:

#yum -y install wget

注意:编译时候如果报错。可能是没安装gcc,请安装后再执行 make && make install

# yum install gcc gcc-c++

安装redis时遇到zmalloc.h:50:31: 致命错误:jemalloc/jemalloc.h:没有那个文件或目录

解决办法

# make MALLOC=libc

下载并解压

# cd /usr/local

# wget http://download.redis.io/releases/redis-3.2.4.tar.gz

# tar -zxvf redis-3.2.4.tar.gz

# mv redis-3.2.4 redis3

编译安装

# cd redis3

# make && make install

单机启动办法:

# redis-server redis.conf

-集群配置

创建集群配置目录

第一台:192.168.40.142

# mkdir -p /usr/local/redis3/cluster/7142

#cp /usr/local/redis3/redis.conf /usr/local/redis3/cluster/7142/redis-7142.conf

第二台:192.168.40.143

# mkdir -p /usr/local/redis3/cluster/7143

#cp /usr/local/redis3/redis.conf /usr/local/redis3/cluster/7143/redis-7143.conf

第三台:192.168.40.144

# mkdir -p /usr/local/redis3/cluster/7144

#cp /usr/local/redis3/redis.conf /usr/local/redis3/cluster/7144/redis-7144.conf

第四台:192.168.40.145

# mkdir -p /usr/local/redis3/cluster/7145

#cp /usr/local/redis3/redis.conf /usr/local/redis3/cluster/7145/redis-7145.conf

第五台:192.168.40.146

# mkdir -p /usr/local/redis3/cluster/7146

#cp /usr/local/redis3/redis.conf /usr/local/redis3/cluster/7146/redis-7146.conf

第六台:192.168.40.147

# mkdir -p /usr/local/redis3/cluster/7147

#cp /usr/local/redis3/redis.conf /usr/local/redis3/cluster/7147/redis-7147.conf

4.修改配置文件redis-7142.conf … redis-7147.conf (6个文件都按照以下格式 一 一修改)

bind 127.0.0.1 # 改为本机地址

port 7142 #改为你设置的端口号

cluster-enabled yes

cluster-node-timeout 15000

cluster-config-file  /usr/local/redis3/cluster/7142/nodes-7142.conf

cluster-migration-barrier 1

注意:6台机器的配置都要改哦 特别容易出错的是7142这种 因为每一台机器设置都不一样

比如我的就分别是7142,7143,7144,7145,7146,7147

在每台机器的防火墙强上,配置redis集群端口,除了设置7142这类端口,还需设置redis集群直接通信的接口,系统默认是在你设置的redis端口上默认加上10000,及1742

编辑防火墙(此处只拿192.168.40.142机器来做演示,其他机器仿照着改 只用改变端口号就行):

  #  vi /etc/sysconfig/iptables

添加如下两个redis端口:

-A INPUT -p tcp -m state --state NEW -m tcp --dport 7147 -j ACCEPT

-A INPUT -p tcp -m state --state NEW -m tcp --dport 17147 -j ACCEPT

保存 退出 重启防火墙

# service iptables restart

##-启动各节点 ##

分别 启动各个节点

第一台:

# /usr/local/redis3/src/redis-server /usr/local/redis3/cluster/7142/redis-7142.conf

第二台:

#  /usr/local/redis3/src/redis-server /usr/local/redis3/cluster/7143/redis-7143.conf

第三台:

# /usr/local/redis3/src/redis-server /usr/local/redis3/cluster/7144/redis-7144.conf

第四台:

#  /usr/local/redis3/src/redis-server /usr/local/redis3/cluster/7145/redis-7145.conf

第五台:

# /usr/local/redis3/src/redis-server /usr/local/redis3/cluster/7146/redis-7146.conf

第六台:

#  /usr/local/redis3/src/redis-server /usr/local/redis3/cluster/7147/redis-7147.conf

果成功则会显示如下界面:

特别注意:该界面不能关闭,不能退出。必须保持。否则会导致redis不可用

解决办法使用nohup命令来启动 就可以了

注意:此时虽然6台机器都正常运行了redis,但是集群仍未完成

6、查看服务(新开终端)

# ps -ef | grep redis  #查看是否启动成功

# netstat -tnlp | grep redis #可以看到redis监听端口

-创建集群

-安装ruby、rubygems

前面已经准备好了搭建集群的redis节点,接下来我们要把这些节点都串连起来搭建集群。官方提供了一个工具:redis-trib.rb(/usr/local/redis-3.2.1/src/redis-trib.rb) 看后缀就知道不能直接执行,它是用ruby写的一个程序,所以我们还得安装ruby.

# yum -y install ruby ruby-devel rubygems rpm-build

再用 gem 这个命令来安装 redis接口 gem是ruby的一个工具包.

此时会出现一个问题:因为墙的缘故安装gem会没有反应,解决办法是更换为阿里巴巴的ruby源。

# 删除默认的官方源

# gem sources -r https://rubygems.org/

#添加淘宝源

# gem sources -a https://ruby.taobao.org/

#查看当前源 

[root@localhost src]# gem sources -l

*** CURRENT SOURCES ***

https://ruby.taobao.org/

-安装gem

安装gem

[root@localhost src]# gem install redis

Successfully installed redis-3.3.3

Parsing documentation for redis-3.3.3

上面结束了,接下来运行一下redis-trib.rb

# /usr/local/redis3/src/redis-trib.rb

redis集群就是依靠 上面这些操作 完成集群搭建的.

确认所有的节点都启动,接下来使用参数create 创建 (在192.168.40.142中来创建)

/usr/local/redis3/src/redis-trib.rb  create  --replicas  1  192.168.40.142:7142 192.168.40.143:7143  192.168.40.144:7144 192.168.40.145:7145  192.168.40.146:7146  192.168.40.147:7147

集群创建成功:如下所示

[root@localhost src]#  /usr/local/redis3/src/redis-trib.rb  create  --replicas  1  192.168.40.142:7142 192.168.40.143:7143  192.168.40.144:7144 192.168.40.145:7145  192.168.40.146:7146  192.168.40.147:7147

>>> Creating cluster

>>> Performing hash slots allocation on 6 nodes...

Using 3 masters:

192.168.40.142:7142

192.168.40.143:7143

192.168.40.144:7144

Adding replica 192.168.40.145:7145 to 192.168.40.142:7142

Adding replica 192.168.40.146:7146 to 192.168.40.143:7143

Adding replica 192.168.40.147:7147 to 192.168.40.144:7144

M: d80a23c6773fef5456e81f0c1d187d7e51c3d650 192.168.40.142:7142

  slots:0-5460 (5461 slots) master

M: 382ed5a4cb3108c95cab35e27ea0ab340ce45270 192.168.40.143:7143

  slots:5461-10922 (5462 slots) master

M: 909bbc04c98fae3cd17cf4916b1edcec65cb57d1 192.168.40.144:7144

  slots:10923-16383 (5461 slots) master

S: 75cde28bfbfc8f27ead87302a3aa2baba44dd983 192.168.40.145:7145

  replicates d80a23c6773fef5456e81f0c1d187d7e51c3d650

S: 09314222f26560cf405c77ac77d09cae13a26fa5 192.168.40.146:7146

  replicates 382ed5a4cb3108c95cab35e27ea0ab340ce45270

S: 88a5ea69ec4f73b169f6ece244a1a525b86ccd66 192.168.40.147:7147

  replicates 909bbc04c98fae3cd17cf4916b1edcec65cb57d1

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.40.142:7142)

M: d80a23c6773fef5456e81f0c1d187d7e51c3d650 192.168.40.142:7142

  slots:0-5460 (5461 slots) master

  1 additional replica(s)

M: 909bbc04c98fae3cd17cf4916b1edcec65cb57d1 192.168.40.144:7144

  slots:10923-16383 (5461 slots) master

  1 additional replica(s)

S: 88a5ea69ec4f73b169f6ece244a1a525b86ccd66 192.168.40.147:7147

  slots: (0 slots) slave

  replicates 909bbc04c98fae3cd17cf4916b1edcec65cb57d1

M: 382ed5a4cb3108c95cab35e27ea0ab340ce45270 192.168.40.143:7143

  slots:5461-10922 (5462 slots) master

  1 additional replica(s)

S: 75cde28bfbfc8f27ead87302a3aa2baba44dd983 192.168.40.145:7145

  slots: (0 slots) slave

  replicates d80a23c6773fef5456e81f0c1d187d7e51c3d650

S: 09314222f26560cf405c77ac77d09cae13a26fa5 192.168.40.146:7146

  slots: (0 slots) slave

  replicates 382ed5a4cb3108c95cab35e27ea0ab340ce45270

[OK] All nodes agree about slots configuration.

>>> Check for open slots...

>>> Check slots coverage...

[OK] All 16384 slots covered.

说明:

/usr/local/redis3/src/redis-trib.rb create –replicas 1 192.168.40.142:7142 192.168.40.143:7143 192.168.40.144:7144 192.168.40.145:7145 192.168.40.146:7146 192.168.40.147:7147

–replicas 1 表示 自动为每一个master节点分配一个slave节点 上面有6个节点,程序会按照一定规则生成 3个master(主)3个slave(从)

前面已经提醒过的 防火墙一定要开放监听的端口,否则会创建失败。

运行中,提示Can I set the above configuration? (type ‘yes’ to accept): yes //输入yes

接下来 提示 Waiting for the cluster to join………. 安装的时候在这里就一直等等等,没反应,傻傻等半天,看这句提示上面一句,Sending Cluster Meet Message to join the Cluster.

这下明白了,我刚开始在一台Server上去配,也是不需要等的,这里还需要跑到Server2上做一些这样的操作。

在192.168.1.238, redis-cli -c -p 700* 分别进入redis各节点的客户端命令窗口, 依次输入 cluster meet 192.168.1.238 7000……

回到Server1,已经创建完毕了。

查看一下 /usr/local/redis/src/redis-trib.rb check 192.168.1.237:7000

到这里集群已经初步搭建好了。

最后可以测试:

[root@localhost ~]# /usr/local/redis3/src/redis-cli -h 192.168.40.145 -p 7145

192.168.40.145:7145> get test1

"hh"

192.168.40.145:7145> set gg shuaige

OK

192.168.40.145:7145>

在其他几台机器上获取

[root@localhost src]#  redis-cli -h 192.168.40.145 -p 7145

192.168.40.145:7145> set test1 hh

OK

192.168.40.145:7145> get test

(error) MOVED 6918 192.168.40.143:7143

192.168.40.145:7145> get test1

"hh"

192.168.40.145:7145> get gg

"shuaige"

192.168.40.145:7145>

配置成功。

-redis集群操作

-集群(cluster)

CLUSTER INFO 打印集群的信息

CLUSTER NODES 列出集群当前已知的所有节点(node),以及这些节点的相关信息。

-节点(node)

CLUSTER MEET 将 ip 和 port 所指定的节点添加到集群当中,让它成为集群的一份子。

CLUSTER FORGET 从集群中移除 node_id 指定的节点。

CLUSTER REPLICATE 将当前节点设置为 node_id 指定的节点的从节点。

CLUSTER SAVECONFIG 将节点的配置文件保存到硬盘里面。

-槽(slot)

CLUSTER ADDSLOTS [slot …] 将一个或多个槽(slot)指派(assign)给当前节点。

CLUSTER DELSLOTS [slot …] 移除一个或多个槽对当前节点的指派。

CLUSTER FLUSHSLOTS 移除指派给当前节点的所有槽,让当前节点变成一个没有指派任何槽的节点。

CLUSTER SETSLOT NODE 将槽 slot 指派给 node_id 指定的节点,如果槽已经指派给另一个节点,那么先让另一个节点删除该槽>,然后再进行指派。

CLUSTER SETSLOT MIGRATING 将本节点的槽 slot 迁移到 node_id 指定的节点中。

CLUSTER SETSLOT IMPORTING 从 node_id 指定的节点中导入槽 slot 到本节点。

CLUSTER SETSLOT STABLE 取消对槽 slot 的导入(import)或者迁移(migrate)。

-键 (key)

CLUSTER KEYSLOT 计算键 key 应该被放置在哪个槽上。

CLUSTER COUNTKEYSINSLOT 返回槽 slot 目前包含的键值对数量。

CLUSTER GETKEYSINSLOT 返回 count 个 slot 槽中的键。

这些命令是集群所独有的。执行上述命令要先登录

[root@manage redis]# redis-cli -c -p 6382 -h 192.168.10.220    //登录

192.168.10.220:6382> 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:8

cluster_my_epoch:4

cluster_stats_messages_sent:82753

cluster_stats_messages_received:82754

-redis节点操作

redis集群节点 增删

-添加从节点

添加从节点slave(某个主节点的复制品)

#  ./redis-cli -h 192.168.40.145 -p 7145

192.168.40.145> cluster replicate 此处是主节点master的ID

192.168.40.145> ok

-删除从节点

删除从节点

# redis-trib.rb del-node 192.168.10.220:6385 '9c240333476469e8e2c8e80b089c48f389827265'

-删除主节点

删除主节点

如果主节点有从节点,将从节点转移到其他主节点

如果主节点有slot,去掉分配的slot,然后在删除主节点

# redis-trib.rb reshard 192.168.10.219:6378 //取消分配的slot,下面是主要过程

How many slots do you want to move (from 1 to 16384)? 1000 //被删除master的所有slot数量

What is the receiving node ID? 5d8ef5a7fbd72ac586bef04fa6de8a88c0671052 //接收6378节点slot的master

Please enter all the source node IDs.

Type 'all' to use all the nodes as source nodes for the hash slots.

Type 'done' once you entered all the source nodes IDs.

Source node #1:03ccad2ba5dd1e062464bc7590400441fafb63f2 //被删除master的node-id

Source node #2:done 

Do you want to proceed with the proposed reshard plan (yes/no)? yes //取消slot后,reshard

新增master节点后,也进行了这一步操作,当时是分配,现在去掉。反着的。

# redis-trib.rb del-node 192.168.10.219:6378 '03ccad2ba5dd1e062464bc7590400441fafb63f2'

改变从节点的master

//查看一下6378的从节点

# redis-cli -p 6378 cluster nodes | grep slave | grep 03ccad2ba5dd1e062464bc7590400441fafb63f2

//将6385加入到新的master

# redis-cli -c -p 6385 -h 192.168.10.220

192.168.10.220:6385> cluster replicate 5d8ef5a7fbd72ac586bef04fa6de8a88c0671052  //新master的node id

OK

192.168.10.220:6385> quit

//查看新master的slave

# redis-cli -p 6379 cluster nodes | grep slave | grep 5d8ef5a7fbd72ac586bef04fa6de8a88c0671052

查看一下,集群情况

# /usr/local/redis3/src/redis-trib.rb check 192.168.40.145:7145

可以看到M为主节点,S为从节点

redis cluster命令行(redis-cli -h 192.168.40.145 -p 7145)

1,新配置二个测试节点

# cd /etc/redis

//新增配置

# cp redis-6379.conf redis-6378.conf && sed -i "s/6379/6378/g" redis-6378.conf

# cp redis-6382.conf redis-6385.conf && sed -i "s/6382/6385/g" redis-6385.conf

//启动

# redis-server /etc/redis/redis-6385.conf > /var/log/redis/redis-6385.log 2>&1 &

# redis-server /etc/redis/redis-6378.conf > /var/log/redis/redis-6378.log 2>&1 &

-添加主节点

添加主节点

# redis-trib.rb add-node 192.168.10.219:6378 192.168.10.219:6379

注释:

192.168.10.219:6378是新增的节点

192.168.10.219:6379集群任一个旧节点

-添加从节点

# redis-trib.rb add-node --slave --master-id 03ccad2ba5dd1e062464bc7590400441fafb63f2 192.168.10.220:6385 192.168.10.219:6379

注释:

--slave,表示添加的是从节点

--master-id 03ccad2ba5dd1e062464bc7590400441fafb63f2,主节点的node id,在这里是前面新添加的6378的node id

192.168.10.220:6385,新节点

192.168.10.219:6379集群任一个旧节点

-从新分配slot

重新分配slot

# redis-trib.rb reshard 192.168.10.219:6378 //下面是主要过程

How many slots do you want to move (from 1 to 16384)? 1000 //设置slot数1000

What is the receiving node ID? 03ccad2ba5dd1e062464bc7590400441fafb63f2 //新节点node id

Please enter all the source node IDs.

Type 'all' to use all the nodes as source nodes for the hash slots.

Type 'done' once you entered all the source nodes IDs.

Source node #1:all //表示全部节点重新洗牌

Do you want to proceed with the proposed reshard plan (yes/no)? yes //确认重新分

新增加的主节点,是没有slots的,

M: 03ccad2ba5dd1e062464bc7590400441fafb63f2 192.168.10.219:6378

slots:0-332,5461-5794,10923-11255 (0 slots) master

主节点如果没有slots的话,存取数据就都不会被选中。

可以把分配的过程理解成打扑克牌,all表示大家重新洗牌;输入某个主节点的node id,然后在输入done的话,就好比从某个节点,抽牌。

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

推荐阅读更多精彩内容