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

你可能感兴趣的:(2019-06-18 linux安装Redis集群)