Linux运维笔记
我们一直在努力

Redis集群配置

Redis

Cluster(集群):
· 分布式数据库:通过分片机制来进行数据分布,Cluster内的每个节点仅持有数据库的一部分数据
· 一个Redis集群就是由多个节点组成,刚开始每个节点都是相互独立的,假如集群后,就称为集群中的节点了。
· Redis的集群属于去中心化的集群,意味着对Redis而言,他的集群中的每一个节点都可以作为整个集群的接入点。
· 每一个节点都可以直接接入客户端请求,所以客户端连入每一个节点都是OK的。
· 这个节点会对整个数据集群内的数据,持有全局视角。
· 也就是说我们数据是分片的,假设有10000个键,由4个节点分摊,各自至持有2500个,客户端连入到第一个节点获取某个键时,每一个节点都有全局眼光,知道哪个键在哪个节点上,所以每个节点都有全局元数据列表,这个列表当中明确映射指明了,哪个键有哪个节点持有。
· 所以当某个服务器发起请求操作时,这个服务器会告诉你应该去找哪个节点,客户端会自动去找那个真正持有这个键的的节点来获取数据。

 

每个集群中至少需要3个主数据库才能正常运行集群会将当前节点记录的集群状态持久化地存储在指定文件中,这个文件默认为当前工作目录下的nodes.conf文件。每个节点对应的文件必须不同,否则会造成启动失败,所以启动节点时要注意最后为每个节点使用不同的工作目录或者通过cluster-config-file选项修改持久化文件的名称。

 

首先安装配置动3主从集群环境:


  • 192.168.254.111:6379
  • 192.168.254.2:6379
  • 192.168.254.3:6379
  • 192.168.254.4:6379
  • 192.168.254.5:6379
  • 192.168.254.6:6379

 

1、为每个节点安装Redis 3.2.12


由于一台主机上只运行一个实例(共6台主机),默认都是6379端口,配置和启动都是一样的步骤

如果是在同服务器运行多个实例,那就需要改变端口了,请注意。

这里启动Redis使用的是redis_init_script脚本,在启动前务必检查脚本内对应的路径

  • 下载Redis:wget http://download.redis.io/releases/redis-3.2.12.tar.gz
  • 解压进入Redis:tar -xf redis-3.2.12.tar.gz && cd redis-3.2.12
  • 安装GCC-C++:yum install -y gcc-c++
  • 编译Redis:make && make install
  • 创建Redis实例目录:mkdir /etc/redis/bin
  • 为运行实例复制配置文件:cp redis.conf /etc/redis/6379.conf
  • 复制使用脚本来启动Redis:cp utils/redis_init_script /etc/redis/bin/redis_init_script_6379
  • 修改实例的配置文件:vim /etc/redis/6379.conf
bind 0.0.0.0      # 监听所有地址
daemonize yes     # 以进程方式启动 
logfile "/tmp/redis-6379.log"      # 每个实例的日志文件
cluster-enabled yes                # 启用Redis的集群
cluster-config-file /etc/redis/nodes-6379.conf      # 集群nodes文件位置

 

2、启动查看Redis实例情况:

 


  • 启动Redis,如果嫌目录长可以设置环境变量:
/etc/redis/bin/redis_init_script_6379 start
  •  查看Redis情况:
[root@Node-01 redis-3.2.12]# redis-cli info cluster 
# Cluster cluster_enabled:1 <==如果现实启用则表示可以继续配置集群了
  • 如果需要关闭Redis实例可以使用两种方式:

1、使用脚本关闭              /etc/redis/bin/redis_init_script_6379 stop

2、通过客户端交互关闭   redis-cli shutdown

 

3、为创建Redis集群安装Ruby:


Redis源代码中提供了一个辅助工具redis-trib.rb可以非常方便地完成这一任务。

因为redis-trib.rb是用Ruby语言编写的,所以运行前需要在服务器上安装Ruby程序

  • 1.安装yum源:yum install -y centos-release-scl-rh
  • 2.安装Ruby23:yum install -y rh-ruby23
  • 3.启用Ruby23:scl enable rh-ruby23 bash
  • 4.安装gem包redis:gem install redis
  • 5.查看是否安装成功:ruby -v
  • 6.添加编辑环境变量(只要当前操作的终端关闭,则环境变量会丢失,之后任何提示环境变量的问题都可以检查这步是否完成)

vim /etc/profile.d/rh-ruby23.sh

#!/bin/bash
source /opt/rh/rh-ruby23/enable
export X_SCLS="`scl enable rh-ruby23 'echo $X_SCLS'`"
export PATH=$PATH:/opt/rh/rh-ruby23/root/usr/local/bin

 

4、创建Redis-Cluster集群:


首先redis-trib.rb会以客户端的形式尝试连接所有的节点,并发送PING命令以确定节点能够正常服务。如果有任何节点无法连接,则创建失败。

同时发送 INFO 命令获取每个节点的运行ID以及是否开启了集群功能(即cluster_enabled为1)。

准备就绪后集群会向每个节点发送 CLUSTER MEET命令,格式为 CLUSTER MEET ip port,这个命令用来告诉当前节点指定ip和port上在运行的节点也是集群的一部分,从而使得6个节点最终可以归入一个集群。

然后redis-trib.rb会分配主从数据库节点,分配的原则是尽量保证每个主数据库运行在不同的IP地址上,同时每个从数据库和主数据库均不运行在同一IP地址上,以保证系统的容灾能力。

1.创建集群(只需要在其中1个节点创建集群即可,这里是在192.168.254.111上创建的):

/root/redis-3.2.11/src/redis-trib.rb create –replicas 1 192.168.254.111:6379 192.168.254.2:6379 192.168.254.3:6379 192.168.254.4:6379 192.168.254.5:6379 192.168.254.6:3379

  • create 参数表示要初始化集群
  • –replicas 1表示每个主数据库拥有的从数据库个数为1

开始创建后的输出信息:

>>> Creating cluster
>>> Performing hash slots allocation on 6 nodes...
Using 3 masters:
192.168.254.111:6379
192.168.254.2:6379
192.168.254.3:6379
Adding replica 192.168.254.4:6379 to 192.168.254.111:6379
Adding replica 192.168.254.5:6379 to 192.168.254.2:6379
Adding replica 192.168.254.6:6379 to 192.168.254.3:6379
M: 21dfe9f80790a44ad288b1e45279130c5b1586bb 192.168.254.111:6379
   slots:0-5460 (5461 slots) master
M: a8eb4debabc052090fcb7d22ef3f2a4b9001c35b 192.168.254.2:6379
   slots:5461-10922 (5462 slots) master
M: e1c31ce5068dd5c0d3f6ccf1fca74e6e045eddba 192.168.254.3:6379
   slots:10923-16383 (5461 slots) master
S: 0f5b626fcbb9b3ef11f1b6d8f007db70060ced23 192.168.254.4:6379
   replicates 21dfe9f80790a44ad288b1e45279130c5b1586bb
S: 824ac38e78f2d0c481c486ec17c57783363e986a 192.168.254.5:6379
   replicates a8eb4debabc052090fcb7d22ef3f2a4b9001c35b
S: a8a9872f8b2f1f52e8fe96b0d7b0a50c07dcbd48 192.168.254.6:6379
   replicates e1c31ce5068dd5c0d3f6ccf1fca74e6e045eddba
Can I set the above configuration? (type 'yes' to accept): yes	<== 在这里要输入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.254.111:6379)
M: 21dfe9f80790a44ad288b1e45279130c5b1586bb 192.168.254.111:6379
   slots:0-5460 (5461 slots) master
   1 additional replica(s)
M: e1c31ce5068dd5c0d3f6ccf1fca74e6e045eddba 192.168.254.3:6379
   slots:10923-16383 (5461 slots) master
   1 additional replica(s)
S: a8a9872f8b2f1f52e8fe96b0d7b0a50c07dcbd48 192.168.254.6:6379
   slots: (0 slots) slave
   replicates e1c31ce5068dd5c0d3f6ccf1fca74e6e045eddba
S: 824ac38e78f2d0c481c486ec17c57783363e986a 192.168.254.5:6379
   slots: (0 slots) slave
   replicates a8eb4debabc052090fcb7d22ef3f2a4b9001c35b
S: 0f5b626fcbb9b3ef11f1b6d8f007db70060ced23 192.168.254.4:6379
   slots: (0 slots) slave
   replicates 21dfe9f80790a44ad288b1e45279130c5b1586bb
M: a8eb4debabc052090fcb7d22ef3f2a4b9001c35b 192.168.254.2:6379
   slots:5461-10922 (5462 slots) master
   1 additional replica(s)
[OK] All nodes agree about slots configuration.
>>> Check for open slots...
>>> Check slots coverage...
[OK] All 16384 slots covered.

2.此时可以在任何一台主机上查看集群的信息: redis-cli cluster nodes

 

Redis-Cluster节点的增加:


redis-trib.rb是使用CLUSTER MEET命令来使每个节点认识集群中其他节点的,可想而知如果想要向集群中加入新的节点,也需要使用CLUSTER MEET命令实现。

cluster meet ip port

1.为新节点安装Redis,和之前一样安装2台新的机器,可使用虚拟机,8G内存的物理机,可以开10个512内存的虚拟机。

  • 节点信息如下:
  • 192.168.254.7:6379(主)
  • 192.168.254.8:6379(从)

2.把2个节点添加至集群中:(在任意一个节点上添加新节点都可以,这里是在192.168.254.111上添加的)

  • redis-cli cluster meet 192.168.254.7 6379
  • redis-cli cluster meet 192.168.254.8 6379

 

  • 此时查看集群的信息会发现有2个新节点添加,但是都为master,并且slot都没分配
28c9a2d817752b68..... 192.168.254.7:6379 master - 0 1532670390273 7 connected       <==新添加的节点
ba442257162e5758..... 192.168.254.8:6379 master - 0 1532670393303 0 connected       <==新添加的节点
21dfe9f80790a44a..... 192.168.254.111:6379 myself,master - 0 0 1 connected 0-5460
a8eb4debabc05209..... 192.168.254.2:6379 master - 0 1532670392294 2 connected 5461-10922
e1c31ce5068dd5c0..... 192.168.254.3:6379 master - 0 1532670386237 3 connected 10923-16383
0f5b626fcbb9b3ef..... 192.168.254.4:6379 slave 21dfe9f80790a44a...... 0 1532670388255 4 connected
a8a9872f8b2f1f52..... 192.168.254.6:6379 slave e1c31ce5068dd5c0...... 0 1532670389263 6 connected
824ac38e78f2d0c4..... 192.168.254.5:6379 slave a8eb4debabc05209...... 0 1532670391283 5 connected

3.为新节点配置主从:

  • 可用cluster replicate来赋值每个主数据库来以从库的形式运行
  • 需要在从库上,选择谁成为自己的主库,如果 192.168.254.7 为 192.168.254.8 主机,就要在192.168.254.7上操作

# redis-cli cluster replicate 28c9a2d817752b68897c6efdeb5fbf1c4579a32a

 

4.为新节点分配插槽:

分配插槽可以使用 redis-trib.rb 命令,在任意一个节点上执行即可,这里是在192.168.254.111上,使用127.0.0.1地址都可以。

1)输入命令分配插槽 :/root/redis-3.2.12/rc/redis-trib.rb reshard 127.0.0.1:6379

2)输入分配插槽的信息:

How many slots do you want to move (from 1 to 16384)? 2800  需要分配多少个插槽

What is the receiving node ID?                              这些插槽给谁
# 这里就会询问从哪里拿出这些数量的插槽,有两种方式,你可以指定从哪些节点拿出,也可以输入all,表示从其他所有节点拿出来插槽给那个节点
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:21dfe9f80790a44ad288b1e45279130c5b1586bb
Source node #2:e1c31ce5068dd5c0d3f6ccf1fca74e6e045eddba
Source node #3:a8eb4debabc052090fcb7d22ef3f2a4b9001c35b
Source node #4:done         <== 如果是指定多个节点的,在指定要节点IP后,最后要输入done,表示结束,进行下一步

Do you want to proceed with the proposed reshard plan (yes/no)?     <== 输入yes表示确认

3)此时新节点添加完毕,并且主从和插槽都已经分配好

28c9a2d817752b68..... 192.168.254.7:6379 master - 0 1532673499088 7 connected 0-1386 5461-6847 10923-12308
e1c31ce5068dd5c0..... 192.168.254.3:6379 master - 0 1532673500602 3 connected 12309-16383
21dfe9f80790a44a..... 192.168.254.111:6379 myself,master - 0 0 1 connected 1387-5460
ba442257162e5758..... 192.168.254.8:6379 slave 28c9a2d817752b68..... 0 1532673493539 7 connected
0f5b626fcbb9b3ef..... 192.168.254.4:6379 slave 21dfe9f80790a44a..... 0 1532673499593 4 connected
a8a9872f8b2f1f52..... 192.168.254.6:6379 slave e1c31ce5068dd5c0..... 0 1532673496562 6 connected
a8eb4debabc05209..... 192.168.254.2:6379 master - 0 1532673497572 2 connected 6848-10922
824ac38e78f2d0c4..... 192.168.254.5:6379 slave a8eb4debabc05209..... 0 1532673498584 5 connected
赞(0) 打赏

评论 抢沙发

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址