NoSQL之redis高可用及管理集群

redis集群高可用集群

  功能:1:数据分部署存储

      2:解决单点故障

      3:实现数据的自动备份

环境准备:

ip 服务
192.168.4.51 redis
192.168.4.52 redis
192.168.4.53 redis
192.168.4.54 redis
192.168.4.55 redis
192.168.4.56 redis

每台机器启用集群功能

cluster-enabled  yes          //启用汲取功能

cluster-config-file  nodes-6379.conf    //存储集群信息文件

cluster-node-timeout  15000      //通信超时时间

 

查看:

~]# netstat -utnlp  | grep redis-server
tcp        0      0 192.168.4.52:6379       0.0.0.0:*               LISTEN      13094/redis-server  
tcp        0      0 192.168.4.52:16379      0.0.0.0:*               LISTEN      13094/redis-server    



]# redis-cli -h 192.168.4.52
192.168.4.52:6379> cluster info 查看集群信息
cluster_state:fail
cluster_slots_assigned:0
cluster_slots_ok:0
cluster_slots_pfail:0
cluster_slots_fail:0
cluster_known_nodes:1
cluster_size:0
cluster_current_epoch:0
cluster_my_epoch:0
cluster_stats_messages_sent:0


 

准备管理主机(管理redis集群)ip 192.168.4.57
配置如下:
1 准备ruby脚本的运行环境
]# yum -y install ruby
]# which gem || yum -y install rubygems
]# gem install redis-3.2.1.gem

 

2 创建ruby脚本

[root@host57 ~]# tar -zxvf redis-4.0.8.tar.gz
[root@host57 ~]# cd redis-4.0.8/
]# tar -zxvf redis-4.0.8.tar.gz 
]# mkdir /root/bin
]# cp src/redis-trib.rb /root/bin/
]# redis-trib.rb  help   可以查看到命令的帮助信息

3 创建集群

***务必在51-56 做如下检查
1 必须保证内存里没有数据
2 必须没有连接密码
3 必须关闭firewalld
4 必须启用了集群功能
[root@host57 ~]# redis-trib.rb create  --replicas 1  192.168.4.51:6379 
192.168.4.52:6379 192.168.4.53:6379 192.168.4.54:6379 192.168.4.55:6379 
192.168.4.56:6379
Adding replica 192.168.4.55:6379 to 192.168.4.51:6379
Adding replica 192.168.4.56:6379 to 192.168.4.52:6379
Adding replica 192.168.4.54:6379 to 192.168.4.53:6379
M: 25b9c9fd991b859c23935bedba3e7b22565aefe0 192.168.4.51:6379
   slots:0-5460 (5461 slots) master
M: eed58010ef711bdb313a8ceadcbc6bff5d8b8278 192.168.4.52:6379
   slots:5461-10922 (5462 slots) master
M: 196a0e98868d7b6fb08c548730f28f6a729eef62 192.168.4.53:6379
   slots:10923-16383 (5461 slots) master
S: 8feff919774986515289bb656831ee9e5d4d8d93 192.168.4.54:6379
   replicates 196a0e98868d7b6fb08c548730f28f6a729eef62
S: d6e866731303ffe8cf7eb48ff924e3493bceb8f2 192.168.4.55:6379
   replicates 25b9c9fd991b859c23935bedba3e7b22565aefe0
S: a48a379acebf34b736eb5f2b1f67c55180b96d95 192.168.4.56:6379
   replicates eed58010ef711bdb313a8ceadcbc6bff5d8b8278
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.4.51:6379)
M: 25b9c9fd991b859c23935bedba3e7b22565aefe0 192.168.4.51:6379
   slots:0-5460 (5461 slots) master
   1 additional replica(s)
S: a48a379acebf34b736eb5f2b1f67c55180b96d95 192.168.4.56:6379
   slots: (0 slots) slave
   replicates eed58010ef711bdb313a8ceadcbc6bff5d8b8278
S: d6e866731303ffe8cf7eb48ff924e3493bceb8f2 192.168.4.55:6379
   slots: (0 slots) slave
   replicates 25b9c9fd991b859c23935bedba3e7b22565aefe0
S: 8feff919774986515289bb656831ee9e5d4d8d93 192.168.4.54:6379
   slots: (0 slots) slave
   replicates 196a0e98868d7b6fb08c548730f28f6a729eef62
M: eed58010ef711bdb313a8ceadcbc6bff5d8b8278 192.168.4.52:6379
   slots:5461-10922 (5462 slots) master
   1 additional replica(s)
M: 196a0e98868d7b6fb08c548730f28f6a729eef62 192.168.4.53:6379
   slots:10923-16383 (5461 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.  成功的提示
[root@host57 ~]# 

 

创建集群失败的统一解决办法,在6台主机分别执行如下操作
1 停止redis服务
2 rm -rf /var/lib/redis/6379/*
3 启动redis服务
4 在管理主机再次执行创建集群的命令
 
  4 查看集群信息
  4.1 在管理主机查看
  #查看统计信息
[root@host57 ~]# redis-trib.rb info 192.168.4.54:6379
192.168.4.52:6379 (eed58010...) -> 0 keys | 5462 slots | 1 slaves.
192.168.4.53:6379 (196a0e98...) -> 0 keys | 5461 slots | 1 slaves.
192.168.4.51:6379 (25b9c9fd...) -> 0 keys | 5461 slots | 1 slaves.
[OK] 0 keys in 3 masters.
0.00 keys per slot on average.

 

 

理论:

存储数据的工作过程
16384 slots 0 ~ 16383 平均的分配给3台master服务器存储数据的机会
 
测试服务的高可用
master 角色的服务器宕机后 对应的slave 会自动升级为master并接收hash slot
 
宕机的master恢复后,自动加入集群 自动做当前master的slvae服务器同步数据

 

 

 

二 :管理集群 准备主机 运行Redis服务并启用集群功能

准备两台新的主机:

192.168.4.58

192.168.4.59

 

2.1:向集群添加新主机

  1:添加master角色主机(场景:提高集群处理性能,扩大内存空间)

    把58主机添加到集群内做master服务器

    58主机必须运行redis服务并启用集群功能

  

1 添加主机到集群
[root@host57 ~]# redis-trib.rb add-node 192.168.4.58:6379 192.168.4.52:6379

                   添加节点机    新主机ip端口  访问的原始主机ip:端口
>>> Send CLUSTER MEET to node 192.168.4.58:6379 to make it join the cluster. [OK] New node added correctly.

2 重新分片 (给新的master服务器分配hash slot)

[root@host57 ~]# redis-trib.rb reshard 192.168.4.52:6379

回答问题

1

How many slots do you want to move (from 1 to 16384)?4096

2

What is the receiving node ID? 1cb19e8b2746996da3c3eca7eb7f4246699b2f24

3

all
4

Do you want to proceed with the proposed reshard plan (yes/no)? yes
 

3 查看集群信息

[root@host57 ~]# redis-trib.rb info 192.168.4.52:6379
192.168.4.52:6379 (eed58010...) -> 2 keys | 4096 slots | 1 slaves.
192.168.4.53:6379 (196a0e98...) -> 1 keys | 4096 slots | 1 slaves.
192.168.4.58:6379 (1cb19e8b...) -> 3 keys | 4096 slots | 0 slaves.
192.168.4.55:6379 (d6e86673...) -> 2 keys | 4096 slots | 1 slaves.
[OK] 8 keys in 4 masters.
0.00 keys per slot on average.


检查得到的槽位
~]# redis-trib.rb check 192.168.4.52:6379
M: 1cb19e8b2746996da3c3eca7eb7f4246699b2f24 192.168.4.58:6379
slots:0-1364,5461-6826,10923-12287 (4096 slots) master
0 additional replica(s)

 

2 添加slave角色主机

把59主机添加到集群里做 58 的 slave

59主机必须运行Redis服务并启用集群功能
在管理主机57 做如下操作:
1 添加slave角色主机(因为slave角色主机的数据是在主服务器
同步的,所以不需要分配hash slost)
[root@host57 ~]# redis-trib.rb add-node --slave 192.168.4.59:6379 192.168.4.55:6379

>>> Configure node as replica of 192.168.4.58:6379.
[OK] New node added correctly.
 
 
查看信息:
~]# redis-trib.rb info 192.168.4.58:6379
192.168.4.58:6379 (1cb19e8b...) -> 3 keys | 4096 slots | 1 slaves.
192.168.4.55:6379 (d6e86673...) -> 2 keys | 4096 slots | 1 slaves.
192.168.4.52:6379 (eed58010...) -> 3 keys | 4096 slots | 1 slaves.
192.168.4.53:6379 (196a0e98...) -> 2 keys | 4096 slots | 1 slaves.
[OK] 10 keys in 4 masters.
0.00 keys per slot on average.

 

 

2.2 从集群中移除主机

1 移除master角色主机

2 移除slave角色主机(不占用hash slot 直接执行命令删除就可以)

在管理主机执行删除命令
#查看被移除主机的id 
~]# redis-trib.rb check 192.168.4.58:6379 | grep 192.168.4.59

S: 524f73686be65ffb3422a36c5f3566d150ed9ba9 192.168.4.59:6379
#删除主机
~]# redis-trib.rb del-node 192.168.4.55:6379 524f73686be65ffb3422a36c5f3566d150ed9ba9


>>> Removing node 524f73686be65ffb3422a36c5f3566d150ed9ba9 from cluster 192.168.4.55:6379
>>> Sending CLUSTER FORGET messages to the cluster...
>>> SHUTDOWN the node.
 
 
]# redis-trib.rb info 192.168.4.58:6379    //查看信息
192.168.4.58:6379 (1cb19e8b...) -> 3 keys | 4096 slots | 0 slaves.
192.168.4.55:6379 (d6e86673...) -> 2 keys | 4096 slots | 1 slaves.
192.168.4.52:6379 (eed58010...) -> 3 keys | 4096 slots | 1 slaves.
192.168.4.53:6379 (196a0e98...) -> 2 keys | 4096 slots | 1 slaves.
[OK] 10 keys in 4 masters.
0.00 keys per slot on average.
 

 

清楚之前的信息

[root@host59 ~]# redis-cli -h 192.168.4.59
192.168.4.59:6379> cluster reset  清除前世的记忆
192.168.4.59:6379>    exit

 

添加做指定master 服务器的 slave

 ~]# redis-trib.rb add-node --slave 
--master-id d6e866731303ffe8cf7eb48ff924e3493bceb8f2 192.168.4.59:6379  192.168.4.55:6379

[OK] New node added correctly.

 

 

把master角色的主机移除集群
在管理主机做如下操作:
1 释放hash slot 
host57~]# redis-trib.rb  reshard  192.168.4.51:6379                    

问题1 释放槽的个数
How many slots do you want to move (from 1 to 16384)? 4096    

问题2 接收槽主机的id
What is the receiving node ID? 196a0e98868d7b6fb08c548730f28f6a729eef62    

问题3 释放槽主机的id
Source node #1:1cb19e8b2746996da3c3eca7eb7f4246699b2f24
Source node #2:done 槽的个数已经够了 结束ID指定

Do you want to proceed with the proposed reshard plan (yes/no)?    yes 同意
2 移除集群
                        #查看主机ID
[root@host57 ~]# redis-trib.rb check 192.168.4.51:6379 | grep 192.168.4.58 
M: 1cb19e8b2746996da3c3eca7eb7f4246699b2f24 192.168.4.58:6379
[root@host57 ~]#                         
                        #删除主机
[root@host57 ~]# redis-trib.rb del-node 192.168.4.51:6379 1cb19e8b2746996da3c3eca7eb7f4246699b2f24 
>>> Removing node 1cb19e8b2746996da3c3eca7eb7f4246699b2f24 from cluster 192.168.4.51:6379
>>> Sending CLUSTER FORGET messages to the cluster...
>>> SHUTDOWN the node.
[root@host57 ~]#                    
                    3 查看集群状态
[root@host57 ~]# redis-trib.rb info 192.168.4.51:6379 
192.168.4.53:6379 (196a0e98...) -> 5 keys | 8192 slots | 1 slaves.
192.168.4.52:6379 (eed58010...) -> 3 keys | 4096 slots | 1 slaves.
192.168.4.55:6379 (d6e86673...) -> 2 keys | 4096 slots | 2 slaves.
[OK] 10 keys in 3 masters.
0.00 keys per slot on average.

 

 
    4 清除redis服务器的集群信息
[root@host58 ~]# /etc/init.d/redis_6379 start

[root@host58 ~]# redis-cli -h 192.168.4.58
192.168.4.58:6379> cluster reset

         调试所有的主平均占用hash slot                 
[root@host57 ~]# redis-trib.rb rebalance 192.168.4.51:6379 
                    
把集群中的主机恢复为独立的Redis服务器
[root@host51 ~]# redis-cli  -h 192.168.4.51 shutdown
[root@host51 ~]# rm -rf /var/lib/redis/6379/*
[root@host51 ~]# sed -i ‘815s/^/#/‘ /etc/redis/6379.conf 
[root@host51 ~]# sed -i ‘823s/^/#/‘ /etc/redis/6379.conf 
[root@host51 ~]# sed -i ‘829s/^/#/‘ /etc/redis/6379.conf 
[root@host51 ~]# sed -n ‘815p;823p;829p‘ /etc/redis/6379.conf 
#cluster-enabled yes
#cluster-config-file nodes-6379.conf
#cluster-node-timeout 15000
[root@host51 ~]# 
[root@host51 ~]# /etc/init.d/redis_6379 start
Starting Redis server...
[root@host51 ~]# netstat  -utnlp | grep redis-server
tcp        0      0 192.168.4.51:6379       0.0.0.0:*               LISTEN      26170/redis-server  

 

 总结:
在做redis集群时,最少要准备六台服务器
装环境的时候,注意都要开启集群功能:
如果是以前做过的服务器。记得清楚主配置文件中的信息,否则会出现报错。
在删除或者添加新主机的时候,根据计算好各个服务器的各种硬件性能,合理的分配槽位。使集群发挥高标准的性能。
 
常用命令:
查看集群信息
]# redis-trib.rb info 192.168.4.52:6379    

重新分片 (给新的master服务器分配hash slot)
]# redis-trib.rb reshard 192.168.4.52:6379    

添加主机到集群
]# redis-trib.rb add-node 192.168.4.58:6379 192.168.4.52:6379
    
检查
]# redis-trib.rb check 192.168.4.52:6379

删除主机
~]# redis-trib.rb del-node 192.168.4.55:6379 524f73686be65ffb3422a36c5f3566d150ed9ba9

清楚之前的信息
> cluster reset

 

 

 

NoSQL之redis高可用及管理集群

上一篇:MySQL学习(一)


下一篇:lnmp项目案例搭建(sersync, nginx, php, mariadb, web3台)