Redis集群搭建

mac2024-08-21  70

文章目录

Redis集群Redis集群的必要性Redis集群的搭建恢复集群给集群添加新的节点为新节点分配哈希槽均等分配哈希槽

Redis集群

Redis集群的必要性

Redis 集群是一个提供在多个Redis间节点间共享数据的程序集。Redis集群并不支持处理多个keys的命令,因为这需要在不同的节点间移动数据,从而达不到像Redis那样的性能,在高负载的情况下可能会导致不可预料的错误.Redis 集群通过分区来提供一定程度的可用性,在实际环境中当某个节点宕机或者不可达的情况下继续处理命令. Redis 集群的优势:自动分割数据到不同的节点上。整个集群的部分节点失败或者不可达的情况下能够继续处理命令。

Redis集群的搭建

可以查看Redis的官方文档进行配置http://www.redis.cn/topics/cluster-tutorial.html

搭建Redis集群之前一定要关闭Redis [root@server1 ~]# /etc/init.d/redis_6379 stop

新建redis目录 要让集群正常运作至少需要三个主节点,不过刚开始试用集群功能时,强烈建议使用六个节点:其中3个为主节点,而其余3个则是各个主节点的从节点 并创建六个以端口号为名字的子目录,稍后我们在每个目录中运行一个Redis实例

[root@server1 ~]# mkdir /usr/local/rediscluster cd /usr/local/rediscluster [root@server1 rediscluster]# mkdir 700{1..6} 编辑配置文件 在文件夹7001到7006中,各创建一个redis.conf文件,文件的内容可以使用下面的示例配置文件,但记得将配置中的端口号从7000改为与文件夹名字相同的号码。 [root@server1 7001]# cat redis.conf port 7001 cluster-enabled yes cluster-config-file nodes.conf cluster-node-timeout 5000 appendonly yes pidfile "/usr/local/rediscluster/7001/redis.pid" logfile "/usr/local/rediscluster/7001/redis.log" daemonize yes dir "/usr/local/rediscluster/7001" 启动

==每个文件都要进行启动,每启动一次要进行查看,以保证程序只能

[root@server1 7001]# redis-server redis.conf

查看

ps ax 1332 ? Ssl 0:00 redis-server *:7000 [cluster] 测试 [root@server1 7001]# redis-cli -p 7001 127.0.0.1:7001> info # Cluster cluster_enabled:1 ##集群激活

同理配置7002~7006,并启动

ps ax 1348 ? Ssl 0:00 redis-server *:7001 [cluster] 1382 ? Ssl 0:00 redis-server *:7002 [cluster] 1388 ? Ssl 0:00 redis-server *:7003 [cluster] 1394 ? Ssl 0:00 redis-server *:7004 [cluster] 1400 ? Ssl 0:00 redis-server *:7005 [cluster] 1405 ? Ssl 0:00 redis-server *:7006 [cluster] 拷贝ruby脚本 [root@server1 src]# pwd /root/redis-5.0.3/src [root@server1 src]# cp redis-trib.rb /usr/local/bin/ 执行命令 [root@server1 src]# redis-trib.rb /usr/bin/env: ruby: No such file or directory ##报错了,因为没有ruby [root@server1 src]# yum install -y ruby [root@server1 src]# redis-trib.rb WARNING: redis-trib.rb is not longer available! You should use redis-cli instead. ##redis-trib.rb不可用了,用redis-cli [root@server1 ~]# redis-cli --cluster help 创建集群 [root@server1 ~]# redis-cli --cluster create --cluster-replicas 1 127.0.0.1:7001 127.0.0.1:7002 127.0.0.1:7003 127.0.0.1:7004 127.0.0.1:7005 127.0.0.1:7006

–cluster-replicas 1表示为每一个master创建1个slave

端口角色7001-7004master->slave7002-7005master->slave7003-7006master->slave 然后输入yes [OK] All 16384 slots covered. #看到这个表示16384个槽都分配好了

查看集群信息

测试集群节点对应关系 [root@server1 redis-5.0.3]# redis-cli --cluster info 127.0.0.1:7001 [root@server1 ~]# redis-cli -c -p 7001 127.0.0.1:7001> set name wsp -> Redirected to slot [5798] located at 127.0.0.1:7002 OK 127.0.0.1:7002> get name "wsp 数据保存在5798个哈希槽中,在7002上 [root@server1 ~]# redis-cli -c -p 7005 127.0.0.1:7005> get name -> Redirected to slot [5798] located at 127.0.0.1:7002 "wsp" #在任意节点都可以获取到信息,但是都会跳转到7002 将一个master(7002)宕掉,对应的slave(7005),key还会保存在7004上 [root@server1 ~]# redis-cli -c -p 7005 127.0.0.1:7005> get name -> Redirected to slot [5798] located at 127.0.0.1:7002 "wsp" 127.0.0.1:7002> SHUTDOWN not connected> 如果再把slave宕掉,整个集群就不能用了 [root@server1 ~]# redis-cli --cluster info 127.0.0.1:7001 Could not connect to Redis at 127.0.0.1:7004: Connection refused Could not connect to Redis at 127.0.0.1:7002: Connection refused 127.0.0.1:7001 (4f5065af...) -> 0 keys | 5461 slots | 1 slaves. 127.0.0.1:7003 (0b2f0c60...) -> 0 keys | 5461 slots | 1 slaves. [OK] 0 keys in 2 masters. 0.00 keys per slot on average. [root@server1 ~]# redis-cli -c -p 7001

恢复集群

重新加载7002,和7005的配置文件 [root@server1 ~]# cd /usr/local/rediscluster/ [root@server1 rediscluster]# cd 7005 [root@server1 7005]# redis-server redis.conf [root@server1 7005]# cd .. [root@server1 rediscluster]# cd 7002 [root@server1 7002]# redis-server redis.conf 再次查看集群恢复 [root@server1 ~]# redis-cli -cluster info 127.0.0.1:7001

给集群添加新的节点

先添加两个新的节点,包括目录和配置文件 [root@server1 rediscluster]# cp 7001/redis.conf 7007/ [root@server1 rediscluster]# cp 7001/redis.conf 7008/ [root@server1 7007]# redis-server redis.conf [root@server1 7008]# redis-server redis.conf

ps aux可以查看到7007、7008端口已经启动,但是redis-cli -c -p 7001并没有查看到7007、7008 还没有将节点添加到集群中

将7007 7008节点添加到集群中 [root@server1 7008]# redis-cli --cluster add-node 127.0.0.1:7007 127.0.0.1:7001 ##添加节点 查看7007节点信息 [root@server1 7008]# redis-cli -c -p 7007 127.0.0.1:7007> cluster nodes ##查看节点信息 b9ee016d45dde6a0067dd3e19139f1044a621d77 127.0.0.1:7007@17007 myself,master - 0 1554949235000 0 connected redis-cli -c -p 7007

7007没有slave也没有哈希槽 尽管新节点没有包含任何哈希槽, 但它仍然是一个主节点, 但是在集群需要将某个从节点升级为新的主节点时, 这个新节点不会被选中,所以要添加一个slave

查看帮助 root@server2 ~]# redis-cli --cluster help add-node new_host:new_port existing_host:existing_port --cluster-slave --cluster-master-id <arg> 添加7008为7007(master)的slave [root@server1 ~]# redis-cli --cluster add-node 127.0.0.1:7008 127.0.0.1:7007 --cluster-slave --cluster-master-id b9ee016d45dde6a0067dd3e19139f1044a621d77 ##master的IP 此时查看7007已经具有slave [root@server1 ~]# redis-cli --cluster info 127.0.0.1:7001 ##查看集群信息

为新节点分配哈希槽

[root@server1 ~]# redis-cli --cluster reshard 127.0.0.1:7007 How many slots do you want to move (from 1 to 16384)? 300 ##随便分配一点 What is the receiving node ID? b9ee016d45dde6a0067dd3e19139f1044a621d77 ##接收哈希槽的节点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 这个意思是从所以的节点里选出500个槽位

从所有节点获取哈希槽,所以新节点获取到的哈西槽中可能有会有数据,即会发生数据的迁移。

[root@server1 ~]# redis-cli --cluster check 127.0.0.1:7001 ##检查可以看到已经分配哈希槽 检查可以看到新节点已经分配了哈希槽 [root@server1 ~]# redis-cli --cluster check 127.0.0.1:7001

均等分配哈希槽

分配不均等,可能导致数据不同步

均分哈希槽 [root@server1 ~]# redis-cli --cluster rebalance --cluster-threshold 1 --cluster-use-empty-masters 127.0.0.1:7001 查看已经均分哈希槽 [root@server1 ~]# redis-cli --cluster check 127.0.0.1:7001 查看数据 [root@server1 ~]# redis-cli -c -p 7008 127.0.0.1:7008> get name -> Redirected to slot [5798] located at 127.0.0.1:7007 "wsp

至此集群完成

最新回复(0)