8

Redis 高可用集群模式配置

 3 years ago
source link: https://www.okayjam.com/redis-%e9%ab%98%e5%8f%af%e7%94%a8%e9%9b%86%e7%be%a4%e6%a8%a1%e5%bc%8f%e9%85%8d%e7%bd%ae/
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.

Redis 高可用集群模式配置

Redis集群是redis3.0引入的布式存储方案。Redis 集群是一个提供在多个Redis间节点间共享数据的程序集。
Redis 集群采用了P2P的模式,完全去中心化。Redis 把所有的 Key 分成了 16384 个 slot,每个 Redis 实例负责其中一部分 slot 。集群中的所有信息(节点、端口、slot等),都通过节点之间定期的数据交换而更新。
Redis 客户端可以在任意一个 Redis 实例发出请求,如果所需数据不在该实例中,通过重定向命令引导客户端访问所需的实例。

Redis集群不需要sentinel哨兵也能完成节点移除和故障转移的功能。需要将每个节点设置成集群模式,这种集群模式没有中心节点,可水平扩展,据官方文档称可以线性扩展到上万个节点(官方推荐不超过1000个节点)。redis集群的性能和高可用性均优于之前版本的哨兵模式,且集群配置非常简单

  • 高并发:通过横向拓展实现,通过 –cluster add-node 添加新机器到集群 执行 reshard 命令,重新分配slot ,将相对均摊了 slot 的分布,缓冲了 其他机器的并发压力,从而应对 百万,甚至上千万的并发。
  • 复制:每个小集群都是一个主从复制的架构,从而保证了 主节点挂掉的时候,不至于丢失全部数据,当选举产生新的master节点后,继续对外进行服务,在主备切换过程中,部分key会有影响,但是其他分片上的key不会有任何影响,从而保证了高可用的场景。
  • 分片:每个不同的主从架构小集群,数据是不一致的,客户端通过哈希函数,将数据路由到不同的数据节点,从而实现了数据的分片。这样技术内存不够用的时候,只需要添加新的集群节点进来,重新分配一下slot 就可以了。

想搭建一个最简单的Redis集群,那么至少需要6个节点:3个Master和3个Slave。为什么需要3个Master呢?如果你了解过Hadoop/Storm/Zookeeper这些的话,你就会明白一般分布式要求基数个节点,这样便于选举(少数服从多数的原则)。

思路很简单,我将在一台节点上开启6个Redis实例,并且这6个Redis各自有自己的端口。这样的话,相当于模拟出了6台机器了。然后在以这6个实例组建Redis集群就可以了,3主3从。
需要注意下:由于在一台机器(127.0.0.1)上,因此每个实例应该有不同的端口;同时,每个实例显然会有自己的存放数据的地方;开启AOF模式;开启集群配置;开启后台模式;

安装redis

请参考我以前的文章 redis安装和其他高可用配置

既然是要启动6个Redis实例,自然需要准备各自的配置文件,为这6个实例创建好各自存放的目录

mkdir redis-cluster
cd redis-cluster
mkdir 820{1,2,3,4,5,6}

复制 redis.conf (ubuntu 默认在/etc/redis/redis.conf) 到对应的目录,如果是编译安装,配置文件在redis目录

cp /etc/redis/redis.conf ./8201
cp /etc/redis/redis.conf ./8202
cp /etc/redis/redis.conf ./8203
cp /etc/redis/redis.conf ./8204
cp /etc/redis/redis.conf ./8205
cp /etc/redis/redis.conf ./8206

通常情况需要增加权限

sudo chmod +w ./8201/redis.conf

修改redis.conf

vim ./8201/redis.conf

主要是修改ip和端口(注意不要使用冲突的端口),如下修改(其他六个redis也是一样修改)

appendfilename "appendonly.aof"
appendfsync everysec
appendonly yes

bind 127.0.0.1 # 修改为对应的IP地址,按服务器情况修改

cluster-config-file nodes-8201.conf # 一般以端口设置,需要修改

cluster-enabled yes #开启集群

cluster-node-timeout 5000

daemonize yes # 后台模式,默认为no

dir /home/jam/work/redis-cluster/8201 # 设置文件目录,会生成aof文件,最好修改

pidfile /home/jam/work/redis-cluster/8201/redis-server.pid # pid 文件,需要修改

port 8201 #端口,需要修改

查看配置文件,不看注释

grep -v '^#' 8201/redis.conf | sort -u

配置的时候,可以先把第一个配置文件先配置好,然后复制到其他目录,然后使用替换,把端口号替换即可
vim的替换命令,按Esc 进入命令模式,输入

:%s/8201/8202/g
#s表示替换;%全文替换,不加默认一行;8021,要查找被替换的文本,8022新的文本;g整行替换,不加g只替换行中第一个匹配文本

运行redis

src/redis-server ./8201/redis.conf
src/redis-server ./8202/redis.conf
src/redis-server ./8203/redis.conf
src/redis-server ./8204/redis.conf
src/redis-server ./8205/redis.conf
src/redis-server ./8206/redis.conf

查看进程,堪忧没有对应的redis进程,同时可以看到端口号的,6个进程

ps aux | grep 'redis'

如果需要结束所有的redis-server的进程

kill <code>pgrep redis-server</code>

启动集群

用redis-cli创建整个redis集群(redis5以前的版本集群是依靠ruby脚本redis-trib.rb实现,可以参考) 

src/redis-cli --cluster create 127.0.0.1:8201 127.0.0.1:8202 127.0.0.1:8203 127.0.0.1:8204 127.0.0.1:8205 127.0.0.1:8206 --cluster-replicas 1

我们来看一下创建集群命令中 –replicas 1,这个代表什么意思呢?1其实代表的是一个比例,就是主节点数/从节点数的比例。那么想一想,在创建集群的时候,哪些节点是主节点呢?哪些节点是从节点呢?答案是将按照命令中IP:PORT的顺序,先是3个主节点,然后是3个从节点。
如果确认无误输入yes就可以创建,主从关系也可以在输出看到

>>> Performing hash slots allocation on 6 nodes...
Master[0] -> Slots 0 - 5460
Master[1] -> Slots 5461 - 10922
Master[2] -> Slots 10923 - 16383
Adding replica 127.0.0.1:8205 to 127.0.0.1:8201
Adding replica 127.0.0.1:8206 to 127.0.0.1:8202
Adding replica 127.0.0.1:8204 to 127.0.0.1:8203
>>> Trying to optimize slaves allocation for anti-affinity
[WARNING] Some slaves are in the same host as their master
M: c7a92921c238f85d2fee4d99bb93a19d47452223 127.0.0.1:8201
   slots:[0-5460] (5461 slots) master
M: 6f0e490703f329f974becf77e897b53ad1e576a0 127.0.0.1:8202
   slots:[5461-10922] (5462 slots) master
M: 873ed6ee22e4bb0f6b7c1fc1a5764c5c78d4eb19 127.0.0.1:8203
   slots:[10923-16383] (5461 slots) master
S: 84498131f3effb1cf414402fb277efd42bcc3c95 127.0.0.1:8204
   replicates c7a92921c238f85d2fee4d99bb93a19d47452223
S: 04e4ba05fcfa356fd53902e864927b6db9b46949 127.0.0.1:8205
   replicates 6f0e490703f329f974becf77e897b53ad1e576a0
S: aca25c7d1841fd1246652dee7fc88a605834c3df 127.0.0.1:8206
   replicates 873ed6ee22e4bb0f6b7c1fc1a5764c5c78d4eb19
Can I set the above configuration? (type 'yes' to accept): yes

使用ruby启动集群集群

redis5以前是使用ruby脚本启动集群的,因此我们需要安装Ruby相关的RPM包,以及Redis和Ruby的接口包。
ubuntu

sudo apt install ruby
sudo gem install redis 

centOS

sudo yum install ruby
sudo gem install redis 

如果出现ruby版本不符合要求的情况,那就需要重新安装ruby

ERROR: Error installing redis-4.0.0.gem: 
redis requires Ruby version >= 2.2.2.
yum install curl
curl -L get.rvm.io | bash -s stable
# 下面这句要看具体是哪个文件,也可能是在用户目录的
source /usr/local/rvm/scripts/rvm
# 查看rvm库中已知的ruby版本
rvm list known
# 安装一个ruby版本
rvm install 2.6.3
#使用一个ruby版本
rvm use 2.6.3
#卸载一个已知版本
rvm remove 2.0.0
#查看版本
ruby --version
# 安装redis就可以了
gem install redis

下载集群管理脚本redis-trib.rb。redis-trib.rb是redis官方推出的管理redis集群的工具,集成在redis的源码src目录下,是基于redis提供的集群命令封装成简单、便捷、实用的操作工具。redis-trib.rb是redis作者用ruby完成的。

wget http://download.redis.io/redis-stable/src/redis-trib.rb

确保了redis服务可以了,就开始使用脚本创建集群了。一般检查完毕需要输入 yes 确认,输入之后就可以安装完毕。

sudo ./redis-trib.rb create --replicas 1 127.0.0.1:8201 127.0.0.1:8202 127.0.0.1:8203 127.0.0.1:8204 127.0.0.1:8205 127.0.0.1:8206

我们来看一下创建集群命令中 –replicas 1,这个代表什么意思呢?1其实代表的是一个比例,就是主节点数/从节点数的比例。那么想一想,在创建集群的时候,哪些节点是主节点呢?哪些节点是从节点呢?答案是将按照命令中IP:PORT的顺序,先是3个主节点,然后是3个从节点。

slot对于Redis集群而言,就是一个存放数据的地方,就是一个槽。对于每一个Master而言,会存在一个slot的范围,而Slave则没有。在Redis集群中,依然是Master可以读、写,而Slave只读。数据的写入,实际上是分布的存储在slot中,这和以前1.X的主从模式是不一样的(主从模式下Master/Slave数据存储是完全一致的),因为Redis集群中3台Master的数据存储并不一样。

验证redis集群

redis-cli -c -h 127.0.0.1 -p 8201

连接成功后可以进入redis命令模式

127.0.0.1:8201>ping
返回pong

输入查看集群信息的命令,会有对应的信息。

cluster nodes

127.0.0.1:8201> cluster nodes

a7cfbaee7af907e4d2a51ae3f4f28a8df2d3858f 127.0.0.1:8204 slave a88057ab04c7fd7d10d83c5c313b24eaaa65541d 0 1509004191221 4 connected

68c45609c72927cabb5c73e453865427df563852 127.0.0.1:8206 slave 3377888e3c9ae0a45cab0895aa16d9f77bf5509d 0 1509004192243 6 connected

1a1ff27396a66fb1f821d3f2df3bcc9a3941726f 127.0.0.1:8202 master - 0 1509004190204 2 connected 5461-10922

3377888e3c9ae0a45cab0895aa16d9f77bf5509d 127.0.0.1:8203 master - 0 1509004191735 3 connected 10923-16383

c109bf48f2bd3eca1c6cded7932bc218ade7a727 127.0.0.1:8205 slave 1a1ff27396a66fb1f821d3f2df3bcc9a3941726f 0 1509004191732 5 connected

a88057ab04c7fd7d10d83c5c313b24eaaa65541d 127.0.0.1:8201 myself,master - 0 0 1 connected 0-5460

cluster info

127.0.0.1:8201> 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:1

cluster_stats_messages_sent:10810

cluster_stats_messages_received:10810

参考: http://www.jianshu.com/p/dbc62ed27f03

欢迎关注我的公众号

qrcode_for_gh_360d107cfcf8_344.jpg

此项目被张贴在JAVA大数据技术和标记javaredis技术缓存 。书签的 permalink

发表评论 取消回复

电子邮件地址不会被公开。 必填项已用*标注

评论

姓名 *

电子邮件 *

站点

在此浏览器中保存我的名字、电邮和网站。

此站点使用Akismet来减少垃圾评论。了解我们如何处理您的评论数据


About Joyk


Aggregate valuable and interesting links.
Joyk means Joy of geeK