设为首页 收藏本站
查看: 1029|回复: 0

[经验分享] Redis集群快速搭建

[复制链接]

尚未签到

发表于 2018-11-6 10:53:45 | 显示全部楼层 |阅读模式
  Redis 3.0版之前未支持集群功能,一般通过结合Twemproxy(Twitter出品)或者Codis(豌豆荚使用)基于代理方式来实现分布式集群,性能和稳定性都还不错,只是配置和管理方面仍显复杂,性能相比官方自带的集群还是会有些许损失。新发布的3.0版现已默认内置支持集群功能,并完全去除中心化。Redis通过分区来保障集群的可用性,确保即使部分节点失效或者无法连接,集群仍然能够继续处理客户请求。
  Redis使用数据分片而不是一致性哈希的方法来实现集群。集群总共包含16384个哈希槽,每个节点分配一部分哈希槽,每个键存放在其中的一个槽里。这也意味着如果集群未开启主从复制,其中的任何一个节点宕机或断网,这些槽中存放的键将无法访问到。所以开启Redis集群时,最好开启复制,确保当主节点失效或者连接失败时,该主节点对应的从节点能够顶替主节点继续运作。当然,如果是某个主节点发生故障以及该主节点对应的所有从节点也同时出现故障,那么此时集群仍然还是有问题的,也就意味着保存在已发生故障节点的那部分数据无法访问了。
  下面介绍下Redis集群的搭建步骤,暂不涉及到太多的Redis集群理论知识,留待下次讲解。
  一.    安装Redis
  Redis常用安装管理脚本地址:http://dongsong.blog.51cto.com/916653/1649590
mkdir -p /App/src  
cd /App/src
  
wget http://download.redis.io/releases/redis-3.0.1.tar.gz
  
sh redis install
  二.    搭建Redis集群
  测试环境使用一台主机运行6个实例来构建集群,每个Redis实例通过启动时指定不同的配置文件,配置文件存放在6个目录下,区别在于端口号不同,未写明的参数将使用Redis默认的配置。端口号从6380至6385。由于默认配置的缘故,Redis将自动保存快照RDB文件至./目录下,为了避免各个Redis实例自动备份路径冲突,所以应该cd进入每个目录后再启动。或者修改每个配置文件的dir参数也可避免备份冲突。
  (1).    新建集群测试基目录:
mkdir -p /App/redis/cluster  
cd /App/redis/cluster
  (2).    新建Redis集群精简模板配置文件/App/redis/cluster/redis.conf,配置中文件nodes.conf为启动时自动创建,用于保存集群状态信息:
# redis.conf  
port 6380
  
cluster-enabled yes
  
cluster-config-file nodes.conf
  
cluster-node-timeout 5000
  
appendonly yes
  
daemonize yes
  
logfile redis.log
  (3).    添加一集群管理脚本/App/redis/cluster/cluster,该程序只需修改好模板/App/redis/cluster/redis.conf,执行init即可初始化每个实例的配置参数,并启动或停止Redis集群所有实例,(注意事项:Redis集群节点会额外开启一个新端口用于各节点交互通信,额外端口为redis.conf监听端口参数port指定的数值+10000):
#!/bin/sh  
# Redis集群实例管理
  
Redi***v=/App/redis/bin/redis-server
  
RedisCli=/App/redis/bin/redis-cli
  
Dir=$(cd $(dirname $0); pwd)
  
Script=$(basename $0)
  
Conf=redis.conf
  
# 最小端口
  
SPort=6380
  
# 最大端口
  
EPort=6385
  

  
# 初始化
  
fInit() {
  
    for Port in $(seq $SPort $EPort)
  
    do
  
        mkdir -p $Dir/$Port
  
        cp -f $Dir/$Conf $Dir/$Port
  
        sed -i "s#^port $SPort#port $Port#" $Dir/$Port/redis.conf
  
    done
  
}
  

  
# 启动
  
fStart() {
  
    for Port in $(seq $SPort $EPort)
  
    do
  
        cd $Dir/$Port
  
        $Redi***v redis.conf
  
    done
  
}
  

  
# 停止
  
fStop() {
  
    for Port in $(seq $SPort $EPort)
  
    do
  
        cd $Dir/$Port
  
        $RedisCli -p $Port shutdown
  
    done
  
}
  

  
Arg=$1
  
case $Arg in
  
    "init"  )
  
        fInit
  
        ;;
  
    "start" )
  
        fStart
  
        ;;
  
    "stop"  )
  
        fStop
  
        ;;
  
    * )
  
        echo "$Script init|start|stop"
  
        ;;
  
esac
  (4).    初始化,为每个实例都新建一个和端口号一致的目录并修改监听端口:
sh cluster init  (5).    启动集群所有Redis实例:
sh cluster start  (6).    创建Redis集群,需要用到源码包中src下的Ruby程序redis-trib.rb文件:
cp /App/src/redis-3.0.1/src/redis-trib.rb /App/redis/cluster/  
cd /App/redis/cluster/
  
./redis-trib.rb create --replicas 1 127.0.0.1:6380 127.0.0.1:6381 127.0.0.1:6382 127.0.0.1:6383 127.0.0.1:6384 127.0.0.1:6385
          1.    create,表示创建一个新的集群。
  2.    选项 --replicas 1 表示为集群中的每个主节点创建一个从节点。
  3.    其余参数则是新建集群中实例的地址列表。
DSC0000.jpg

  (7).    看到上图类似输出表示:监听6380端口Redis分配了0-5460共5461个槽,6383为6380的从;6381分配了5461-10922共5462个槽,6384为6381的从;6382分配了10923-16383共5461个槽,6385为6382的从。输入yes并回车确认。
DSC0001.jpg

  (8).    看到上图表示集群已新建成功,3主3从节点,每个节点都有不同的ID。总共使用了16384个Hash槽。
  三.    测试集群
  1.    redis-cli程序必须添加 -c 参数选项,才可实现基本的集群支持操作。
DSC0002.jpg

  2.    停掉一个主库后
DSC0003.jpg

  3.    检查集群状况
DSC0004.jpg

  从以上可以看出,6383从节点成功代替了6380主节点并修改为主节点,集群服务未受影响。
  四.    支持Redis集群客户端
  Redis从刚发布的3.0版才正式开始支持集群功能,目前支持集群功能的客户端还比较缺乏,稳定性也尚需时间检验,下面列举一些已开始部分支持Redis集群的编程语言客户端:
  1.    Shell:新版自带redis-cli实用程序,加上 -c 参数已提供基本的集群支持。
  2.    PHP:Predis
  3.    Java:Jedis
  4.    Ruby:redis-rb-cluster
  5.    Python:redis-py-cluster
  6.    C#:StackExchange.Redis
  7.    Node.js:thunk-redis



运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-631464-1-1.html 上篇帖子: redis的事务处理 下篇帖子: keepalived+redis的高可用部署步骤
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表