Redis集群
2018-06-24 本文已影响0人
三叉戟渔民
redis集群从3.0开始支持,之前版本是用的Sentinel来进行主从切换。
redis安装参考我之前的文章第7节
这里直接进入安装主题。
集群环境:
划重点!!!至少三个master
两台服务器:
- web1主服务器配置3个master(IP:172.16.69.122)
- web2从服务器配置3个slave(IP:172.16.69.123)
注:我这里为了方便测试,只用了2台虚拟机,实际生产环境可以改用6台服务器,具体情况具体分析。
一、创建集群
1、创建一个文件夹redis-cluster,然后在其下面分别创建3个文件夹如下:
主节点:
[root@web1 ~]# mkdir -p /usr/local/redis-cluster
[root@web1 ~]# cd /usr/local/redis-cluster/
[root@web1 redis-cluster]# mkdir 6001
[root@web1 redis-cluster]# mkdir 6002
[root@web1 redis-cluster]# mkdir 6003
从节点:
[root@web2 redis]# mkdir -p /usr/local/redis-cluster
[root@web2 redis]# cd /usr/local/redis-cluster/
[root@web2 redis-cluster]# mkdir 6004
[root@web2 redis-cluster]# mkdir 6005
[root@web2 redis-cluster]# mkdir 6006
2、复制配置文件并修改
复制配置文件(双节点):
[root@web1 redis-cluster]# cd /usr/local/redis
[root@web01 redis]# ll
总用量 60
drwxr-xr-x 2 root root 134 6月 22 15:01 bin
-rw-r--r-- 1 root root 57764 6月 22 15:02 redis.conf
[root@web1 redis]# cp redis.conf /usr/local/redis-cluster/6001/
[root@web1 redis]# cp redis.conf /usr/local/redis-cluster/6002/
[root@web1 redis]# cp redis.conf /usr/local/redis-cluster/6003/
...
修改配置文件(双节点):
[root@web1 redis]# cd /usr/local/redis-cluster/6001
[root@web1 6001]# ll
总用量 60
-rw-r--r--. 1 root root 57870 5月 22 05:36 redis.conf
[root@web1 6001]# vi redis.conf
daemonize yes
port 6001 #根据节点自适应修改(例:port 6002、port 6003 等等)
bind 172.16.69.122 #必须绑定当前节点IP
dir "/usr/local/redis-cluster/6001" #指定数据文件存放位置(根据节点自适应修改)
cluster-enabled yes #启动集群模式
cluster-config-file nodes-6001.conf #这里6001需要和port对应
cluster-node-timeout 15000 #集群超时时间,默认15秒即可
appendonly yes #开启aof快照模式
3、安装ruby
[root@web1 ~]# yum install ruby
[root@web1 ~]# yum install rubygems
[root@web1 ~]# gem install redis #安装redis和ruby的接口
此时可能会报错(没报错就直接跳到第4步):
[root@web02 ~]# gem install redis
Fetching: redis-4.0.1.gem (100%)
ERROR: Error installing redis:
redis requires Ruby version >= 2.2.2.
#上面提示ruby版本不能小于2.2.2,查询一下,的确版本只有 2.0.0
[root@web02 ~]# ruby -v
ruby 2.0.0p648 (2015-12-16) [x86_64-linux]
采用换yum源更新ruby(双节点):
CentOS7 ruby安装参考
[root@web01 ~]# yum install centos-release-scl-rh
[root@web01 ~]# yum install rh-ruby23 -y
[root@web01 ~]# scl enable rh-ruby23 bash
[root@web01 ~]# ruby -v
ruby 2.3.6p384 (2017-12-14 revision 61254) [x86_64-linux]
[root@web01 ~]# vi /etc/profile
添加以下内容到环境变量
#ruby
source /opt/rh/rh-ruby23/enable
export X_SCLS="`scl enable rh-ruby23 'echo $X_SCLS'`"
[root@web01 ~]# source /etc/profile
#继续安装接口
[root@web01 ~]# gem install redis
Fetching: redis-4.0.1.gem (100%)
Successfully installed redis-4.0.1
Parsing documentation for redis-4.0.1
Installing ri documentation for redis-4.0.1
Done installing documentation for redis after 1 seconds
1 gem installed
4、启动6个实例(双节点)
启动:
[root@web01 ~]# cd /usr/local/redis
[root@web01 redis]# ./bin/redis-server /usr/local/redis-cluster/6001/redis.conf
[root@web01 redis]# ./bin/redis-server /usr/local/redis-cluster/6002/redis.conf
[root@web01 redis]# ./bin/redis-server /usr/local/redis-cluster/6003/redis.conf
...
检测是否启动:
主节点启动成功图示
从节点启动成功图示
此时说明配置已经没有问题,但并不是集群,需要第五步操作
5、配置并启动集群
在启动之前,先将防火墙关闭,或者将端口打开。
到redis安装目录下,执行redis-trib.rb命令:
[root@web01 redis]# cd /home/soft/redis-4.0.2/src
[root@web01 src]# ./redis-trib.rb create --replicas 1 172.16.69.122:6001 172.16.69.122:6002 172.16.69.122:6003 172.16.69.123:6004 172.16.69.123:6005 172.16.69.123:6006
>>> Creating cluster
>>> Performing hash slots allocation on 6 nodes...
Using 3 masters: #表示三个主节点
172.16.69.122:6001
172.16.69.123:6004
172.16.69.122:6002
#表示三个从节点以及所对应的主节点IP、端口
Adding replica 172.16.69.123:6005 to 172.16.69.122:6001
Adding replica 172.16.69.122:6003 to 172.16.69.123:6004
Adding replica 172.16.69.123:6006 to 172.16.69.122:6002
#M表示每个节点的ID,是唯一标示
#slots是槽位,只有主节点才有
M: 7a9869296b47a3431efdbad98662aa85c263f439 172.16.69.122:6001
slots:0-5460 (5461 slots) master
M: 0247e86ec3239557a6d1b198d1ee4ce02385b603 172.16.69.122:6002
slots:10923-16383 (5461 slots) master
S: eba13f8e0a3b3ca2c438f271a3a87da2dee79add 172.16.69.122:6003
replicates 4cfde8efb7b77daf153e024fc9a5142ea2fa2645
M: 4cfde8efb7b77daf153e024fc9a5142ea2fa2645 172.16.69.123:6004
slots:5461-10922 (5462 slots) master
S: 8079c27b2ad9e32dc1bc04f7d2a30d4853f2d41e 172.16.69.123:6005
replicates 7a9869296b47a3431efdbad98662aa85c263f439
S: dc9b0cf74d3274246e23dd2b97d3fa9b00bf3fc7 172.16.69.123:6006
replicates 0247e86ec3239557a6d1b198d1ee4ce02385b603
# 同意创建集群的话输入yes
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 172.16.69.122:6001)
M: 7a9869296b47a3431efdbad98662aa85c263f439 172.16.69.122:6001
slots:0-5460 (5461 slots) master
1 additional replica(s)
M: 4cfde8efb7b77daf153e024fc9a5142ea2fa2645 172.16.69.123:6004
slots:5461-10922 (5462 slots) master
1 additional replica(s)
S: dc9b0cf74d3274246e23dd2b97d3fa9b00bf3fc7 172.16.69.123:6006
slots: (0 slots) slave
replicates 0247e86ec3239557a6d1b198d1ee4ce02385b603
S: 8079c27b2ad9e32dc1bc04f7d2a30d4853f2d41e 172.16.69.123:6005
slots: (0 slots) slave
replicates 7a9869296b47a3431efdbad98662aa85c263f439
S: eba13f8e0a3b3ca2c438f271a3a87da2dee79add 172.16.69.122:6003
slots: (0 slots) slave
replicates 4cfde8efb7b77daf153e024fc9a5142ea2fa2645
M: 0247e86ec3239557a6d1b198d1ee4ce02385b603 172.16.69.122:6002
slots:10923-16383 (5461 slots) master
1 additional replica(s)
[OK] All nodes agree about slots configuration.
>>> Check for open slots...
>>> Check slots coverage...
#总共16384个槽位
[OK] All 16384 slots covered.
备注:--replicas参数指定集群中每个主节点配备几个从节点,这里设置为1。(主从节点的比例)
到这里为止,redis集群以及安装完毕!
验证集群
1、连接客户端测试
语法:
./redis-cli -c -h -p
(-c表示集群模式,指定ip和port)
eg:
[root@web01 redis]# ./bin/redis-cli -c -h 172.16.69.122 -p 6003
172.16.69.122:6003> 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:6
cluster_my_epoch:4
cluster_stats_messages_ping_sent:981
cluster_stats_messages_pong_sent:899
cluster_stats_messages_meet_sent:3
cluster_stats_messages_sent:1883
cluster_stats_messages_ping_received:897
cluster_stats_messages_pong_received:984
cluster_stats_messages_meet_received:2
cluster_stats_messages_received:1883
172.16.69.122:6003> cluster nodes #查看节点列表
0247e86ec3239557a6d1b198d1ee4ce02385b603 172.16.69.122:6002@16002 master - 0 1529768702725 2 connected 10923-16383
eba13f8e0a3b3ca2c438f271a3a87da2dee79add 172.16.69.122:6003@16003 myself,slave 4cfde8efb7b77daf153e024fc9a5142ea2fa2645 0 1529768701000 3 connected
7a9869296b47a3431efdbad98662aa85c263f439 172.16.69.122:6001@16001 master - 0 1529768700707 1 connected 0-5460
4cfde8efb7b77daf153e024fc9a5142ea2fa2645 172.16.69.123:6004@16004 master - 0 1529768702000 4 connected 5461-10922
dc9b0cf74d3274246e23dd2b97d3fa9b00bf3fc7 172.16.69.123:6006@16006 slave 0247e86ec3239557a6d1b198d1ee4ce02385b603 0 1529768703735 6 connected
8079c27b2ad9e32dc1bc04f7d2a30d4853f2d41e 172.16.69.123:6005@16005 slave 7a9869296b47a3431efdbad98662aa85c263f439 0 1529768703000 1 connected
172.16.69.122:6003> set name dk #数据操作验证
-> Redirected to slot [5798] located at 172.16.69.123:6004
OK #这里表示数据被存到了5798这个槽,这个槽在123:6004这个主节点上
172.16.69.122:6003> keys *
1) "name"
172.16.69.122:6003> exit
[root@web01 redis]# ./bin/redis-cli -c -h 172.16.69.122 -p 6001
172.16.69.122:6001> keys *
(empty list or set)
[root@web01 redis]# ./bin/redis-cli -c -h 172.16.69.123 -p 6004
172.16.69.123:6004> keys *
1) "name"
上面测试可以发现,新增数据只在对面的主从节点上才有,而其余的节点上是不存在的。
更多的测试这里不再演示了,页面太乱了。。
2、关闭集群
redis集群关闭需要逐个进行,命令:
[root@web01 redis]# /usr/local/redis/bin//redis-cli -c -h 172.16.69.122 -p 6001 shutdown
[root@web01 redis]# /usr/local/redis/bin//redis-cli -c -h 172.16.69.122 -p 6002 shutdown
...