redis集群配置

我这里有6台机器:

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

1. 下载并解压

# 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

2. 编译安装

cd redis3
make && make install

单机启动办法:redis-server redis.conf

3.创建集群配置目录

第一台: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

163211_AisH_3226688.png

保存 退出 重启防火墙

# service iptables restart

---------------------------------------------------------------------

5.分别 启动各个节点

第一台:

 # /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

 

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

105940_4Yuj_3226688.png

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

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

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

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

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

 

7.创建集群

安装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 :
[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

113428_L1LT_3226688.png

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
[ERR] Sorry, can't connect to node 192.168.40.143:7143
[root@localhost src]# 
[root@localhost src]# 
[root@localhost src]# 
[root@localhost src]# 
[root@localhost src]# 
[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.

141519_zdv0_3226688.png

说明:  /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集群节点 增删

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

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

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

192.168.40.145> ok

163920_uHEz_3226688.jpg

删除从节点

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

2,删除主节点
如果主节点有从节点,将从节点转移到其他主节点
如果主节点有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为从节点

164741_O8iW_3226688.png

redis cluster命令行(redis-cli -h 192.168.40.145 -p 7145
   
//集群(cluster) 
CLUSTER INFO 打印集群的信息 
CLUSTER NODES 列出集群当前已知的所有节点(node),以及这些节点的相关信息。  
 
//节点(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)。  
 
//键 (key) 
CLUSTER KEYSLOT <key> 计算键 key 应该被放置在哪个槽上。 
CLUSTER COUNTKEYSINSLOT <slot> 返回槽 slot 目前包含的键值对数量。 
CLUSTER GETKEYSINSLOT <slot> <count> 返回 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 


二,添加节点


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 & 


2,添加主节点


# 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集群任一个旧节点
3,添加从节点
# 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集群任一个旧节点


4,重新分配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的话,就好比从某个节点,抽牌。

 

 

转载于:https://my.oschina.net/u/3226688/blog/845664

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值