目录
一、集群节点搭建
当前使用redis版本为3.2.11,但是已经上传多个版本至阿里云 https://pan.baidu.com/s/1mY_kLZxwCqHrJ_ZCL6sfIw 密码: 0117。准备三台服务器,搭建6个节点的redis分片集群,端口分别为 7001 ~ 7006。为方便理解,服务器和端口信息分别如下:
192.168.31.1 启用7001、7002、17001、17002端口
192.168.31.2 启用7003、7004、17003、17004端口
192.168.31.3 启用7005、7006、17005、17006端口
服务器节点的目录分别为:
/usr/local/redis-cluster
/redis-1
/redis-2
将下载是tar.gz包上传到三台服务器后,都执行如下安装过程(Centos7都安装了yum,非常的方便):
1、安装c++相关服务
# 安装c相关的服务,否则后面不能进行
yum install gcc-c++
2、获取redis的tar.gz文件
可以从上面的百度云盘获取并上传到服务器,也可以使用 wget 获取 http://download.redis.io/releases/下的不同版本的redis安装包,如:http://download.redis.io/releases/redis-3.2.11.tar.gz,若没有wget命令,可以使用yum install wget进行安装。
3、解压安装包
tar -zxvf redis-3.2.11.tar.gz
4、进行编译
现在cd到解压包redis-3.2.11目录下,进行编译,若没有执行第一步安装c++相关包则会编译报错。
cd ....../redis-3.2.11
# 直接执行编译,并且安装到目录 /usr/local/redis下:
make & make install --prefix=/usr/local/redis
5、复制redis.conf配置文件
cp .../redis-3.2.11/redis.conf /usr/local/redis/bin
5、复制集群节点
集群节点安装在 /usr/local/redis-cluster/redis-1这样的目录下,所以先创建节点目录:
cd /usr/local
mkdir redis-cluster
cd redis-cluster
mkdir redis-1 redis-2
将安装的redis(/usr/local/redis/)下的bin全部复制到刚创建的节点目录下:
cp -r /usr/local/redis /usr/local/redis-cluster/redis-1
cp -r /usr/local/redis /usr/local/redis-cluster/redis-2
6、修改每个节点下的redis.conf 配置文件
bind 192.168.31.1 # 这里需要改成自己虚拟机的ip即可,安装到一台服务器上就可以不改了
port 7001 # 端口后依次从 7001 到 7006进行配置
pidfile /usr/local/redis_7001.pid # 每个节点的pid文件
# 这个我是在每个节点目录下创建了一个端口号名的文件夹,只要每个节点不适用不同一个地址就行
dir /usr/local/redis-cluster/redis-1/7001cluster-enabled yes # 启动redis cluster模式
# 该配置可以配置也可以使用节点自身的,我没有配置该项
cluster-config-file /etc/redis-cluster/node-7001.conf
cluster-node-timeout 15000 # 节点之间会有心跳,这是超时时间
daemonize yes # 是否后台启动,默认配置为 no
logfile /var/log/redis/7001.log # 日志文件地址一样,只要不同就行
appendonly yes
7、启动各个节点
cd 到6个 [/usr/local/redis-cluster/redis-1] bin目录下, 启动命令为:
# 启动redis集群节点服务
./redis-server redis.conf
# 查看是否启动成功
ps -ef|grep redis
若服务是以节点方式启动成功,则后面会跟一个 [cluster] 的标识,如下:
[root@localhost bin]# ps -ef|grep redis
root 25477 1 0 10:43 ? 00:00:11 ./redis-server 192.168.31.220:7001 [cluster]
root 25496 1 0 10:47 ? 00:00:11 ./redis-server 192.168.31.220:7002 [cluster]
root 25915 25842 0 15:14 pts/4 00:00:00 grep --color=auto redis
8、开放端口
可能启动后没有问题,但是后续各个节点需要进行心跳时,则需要能够访问端口。一般生产环境肯定是不能直接关闭防火墙的,则需要开启防火墙端口。由于redis cluster集群的通信是通过总线端口,则还需要开启总线端口,一般若端口为7001则总线端口为17001。 一共开启12个端口。
firewall-cmd --zone=public --add-port=7001/tcp --permanent
到目前为止,各个节点以集群的模式进行启动了,但是各个节点之间还没有相互知道各种的存在,需要将他们组成一个集群,这就需要使用解压目录 ....../redis-3.2.11/src/redis-trib.rb 的ruby脚本,如下第二部分。该部分在任意一个节点执行即可。
二、集群节点链接
1、安装Ruby
由于Centos7的yum支持的最高版本的ruby为2.0.0, 而运行redis的ruby版本则必须高于2.2.2(redis requires Ruby version >= 2.2.2),则直接安装高版本的ruby。一般安装方式可以使用yum、tar包,或者rvm。网上很多使用rvm去安装的,麻烦不说还一大堆问题,所以还是直接使用yum安装。自己安装的时候走了一些坑,最后看到了http://www.cnblogs.com/ding2016/p/7903147.html。
yum install centos-release-scl-rh # 会在/etc/yum.repos.d/目录下多出一个CentOS-SCLo-scl-rh.repo源
yum install rh-ruby23 -y # yum安装ruby
scl enable rh-ruby23 bash # 必要一步
ruby -v # 查看安装版本
gem install redis
[root@localhost data]# ruby -v
ruby 2.3.8p459 (2018-10-18 revision 65136) [x86_64-linux]
2、执行Ruby脚本
./redis-trib.rb文件放在了解压目录的src目录下, 在执行ruby脚本之前,请一定先保证各服务器之间开启了上面说的12个端口。都在会一直处于链接中.......。
./redis-trib.rb create --replicas 1 192.168.31.1:7001 192.168.31.1:7002 192.168.31.2:7003 192.168.31.2:7004 192.168.31.3:7005 192.168.31.3:7006
当看到下面的部分时,表示启动成功:
[root@localhost src]# ./redis-trib.rb create --replicas 1 192.168.31.220:7001
192.168.31.220:7002 192.168.31.147:7003 192.168.31.147:7004 192.168.31.109:7005 192.168.31.109:7006
>>> Creating cluster
>>> Performing hash slots allocation on 6 nodes...
Using 3 masters:
192.168.31.220:7001
192.168.31.147:7003
192.168.31.109:7005
Adding replica 192.168.31.147:7004 to 192.168.31.220:7001
Adding replica 192.168.31.220:7002 to 192.168.31.147:7003
Adding replica 192.168.31.109:7006 to 192.168.31.109:7005
M: 94fbbeba149e6a2173f5bdca67172c146a905895 192.168.31.220:7001
slots:0-5460 (5461 slots) master
S: c511fa8328b339f56d4be1b028ecef731ea909f0 192.168.31.220:7002
replicates ce9c7eba97475450332a121843ec3a125efe1dcd
M: ce9c7eba97475450332a121843ec3a125efe1dcd 192.168.31.147:7003
slots:5461-10922 (5462 slots) master
S: 987d268f8172305942c5b18ead8fafa03d359eef 192.168.31.147:7004
replicates 94fbbeba149e6a2173f5bdca67172c146a905895
M: ca14e60a255922b4e05a02361e8476b4310422d3 192.168.31.109:7005
slots:10923-16383 (5461 slots) master
S: eb085c7254ec3a04a3941282c7b465baccea9d4d 192.168.31.109:7006
replicates ca14e60a255922b4e05a02361e8476b4310422d3
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.31.220:7001)
M: 94fbbeba149e6a2173f5bdca67172c146a905895 192.168.31.220:7001
slots:0-5460 (5461 slots) master
1 additional replica(s)
M: ca14e60a255922b4e05a02361e8476b4310422d3 192.168.31.109:7005
slots:10923-16383 (5461 slots) master
1 additional replica(s)
S: c511fa8328b339f56d4be1b028ecef731ea909f0 192.168.31.220:7002
slots: (0 slots) slave
replicates ce9c7eba97475450332a121843ec3a125efe1dcd
S: 987d268f8172305942c5b18ead8fafa03d359eef 192.168.31.147:7004
slots: (0 slots) slave
replicates 94fbbeba149e6a2173f5bdca67172c146a905895
M: ce9c7eba97475450332a121843ec3a125efe1dcd 192.168.31.147:7003
slots:5461-10922 (5462 slots) master
1 additional replica(s)
S: eb085c7254ec3a04a3941282c7b465baccea9d4d 192.168.31.109:7006
slots: (0 slots) slave
replicates ca14e60a255922b4e05a02361e8476b4310422d3
[OK] All nodes agree about slots configuration.
>>> Check for open slots...
>>> Check slots coverage...
[OK] All 16384 slots covered.
可以看见16384个hash槽初始化完成,可以看到 7002 是 7003的从节点,7003的hash槽是从5461 ~ 10922。
三、测试集群是否可用
cd到刚才安装的任意bin目录下,使用redis-cli的客户端,连接两个不同的服务器节点,连接方式如下:
# 使用redis客户端链接 指定ip的端口的服务器节点
./redis-cli -c -h 192.168.31.220 -p 7001
一个节点使用set命令设置一个值, 如: set kevin kevin。另一个节点进行get命令获取,看是否进行了redis 去中心化的分片集群的moved机制,如下:
[root@localhost bin]# ./redis-cli -c -h 192.168.31.220 -p 7001
192.168.31.220:7001> set kevin kevin
OK
192.168.31.109:7005> get kevin
-> Redirected to slot [1734] located at 192.168.31.220:7001
"kevin"
finish!