zoukankan      html  css  js  c++  java
  • Redis学习之路(二)Redis集群搭建

    一、Redis集群搭建说明

    基于三台虚拟机部署9个节点,一台虚拟机三个节点,创建出4个master、4个slave的Redis集群。

    Redis 集群搭建规划,由于集群至少需要6个节点(3主3从模式),因为我这里有三台虚拟机,因此每台虚拟机部署了3个节点。

    1、下载地址:

    https://redis.io/download

    2、解压(三个节点,这里仅以master节点为例)

    [root@master mnt]# tar -zxvf redis-4.0.2.tar.gz
    [root@master mnt]# mv  redis-4.0.2 redis

    3、由于我下载的是最新版未编译版本,所以安装之前需要安装c的依赖包(三个节点,这里仅以master节点为例)

    [root@master mnt]# yum install -y gcc-c++

    4、执行make操作(三个节点,这里仅以master节点为例)

    [root@master mnt]# cd redis
    [root@master mnt]# make
    等待执行完成

    5、将 redis-trib.rb 复制到 /usr/local/bin 目录下(三个节点,这里仅以master节点为例)

    [root@master redis]# cd src/c
    [root@master src] cp redis-trib.rb /usr/local/bin/ 

    6、创建Redis节点(三个节点,这里仅以master节点为例)

    在master节点:进入redis目录,创建redis_cluster 目录;

    [root@master redis]# pwd
    /mnt/redis
    [root@master redis]# mkdir redis_cluster

    在redis_cluster目录下,创建名为7000、7001、7002的目录,并将 redis.conf 拷贝到这两个目录中

    [root@master redis]# cd redis_cluster/
    [root@master redis_cluster]# mkdir 7000
    [root@master redis_cluster]# mkdir 7001
    [root@master redis_cluster]# mkdir 7002
    [root@master redis_cluster]# ll 
    总用量
    0
    drwxr
    -xr-x 2 root root 6 4月 26 11:39 7000
    drwxr
    -xr-x 2 root root 6 4月 26 11:39 7001
    drwxr-xr-x 2 root root 6 4月 26 11:39 7002

    [root@master redis]# pwd
    /mnt/redis
    [root@master redis]# cp redis.conf /mnt/redis/redis_cluster/7000

    [root@master redis]# cp redis.conf /mnt/redis/redis_cluster/7001

    [root@master redis]# cp redis.conf /mnt/redis/redis_cluster/7002

    分别修改这两个配置文件,修改内容如下:

    [root@master redis_cluster]# cd 7000
    [root@master
    7000]# ls redis.conf

    文件配置:
    port 7000 //端口7000
    bind 192.168.200.100     //默认ip为127.0.0.1 需要改为其他节点机器可访问的ip 否则创建集群时无法访问对应的端口,无法创建集群
    daemonize yes //redis后台运行
    pidfile /var/run/redis_7000.pid //pidfile文件对应7000,7001,7002
    cluster-enabled yes //开启集群 把注释#去掉
    cluster-config-file nodes_7000.conf //集群的配置 配置文件首次启动自动生成 7000,7001,7002
    cluster-node-timeout 15000 //请求超时 默认15秒,可自行设置
    appendonly no   //aof日志开启 有需要就开启,它会每次写操作都记录一条日志
    [root@master 7001]# ls
    redis.conf
    文件配置:
    port 7001 //端口7001
    bind 192.168.200.100     //默认ip为127.0.0.1 需要改为其他节点机器可访问的ip 否则创建集群时无法访问对应的端口,无法创建集群
    daemonize yes //redis后台运行
    pidfile /var/run/redis_7001.pid //pidfile文件对应7000,7001,7002
    cluster-enabled yes //开启集群 把注释#去掉
    cluster-config-file nodes_7001.conf //集群的配置 配置文件首次启动自动生成 7000,7001,7002
    cluster-node-timeout 15000 //请求超时 默认15秒,可自行设置
    appendonly no   //aof日志开启 有需要就开启,它会每次写操作都记录一条日志

    [root@master 7002]# ls
    redis.conf
    文件配置:
    port 7002 //端口7001
    bind 192.168.200.100     //默认ip为127.0.0.1 需要改为其他节点机器可访问的ip 否则创建集群时无法访问对应的端口,无法创建集群
    daemonize yes //redis后台运行
    pidfile /var/run/redis_7002.pid //pidfile文件对应7000,7001,7002
    cluster-enabled yes //开启集群 把注释#去掉
    cluster-config-file nodes_7002.conf //集群的配置 配置文件首次启动自动生成 7000,7001,7002
    cluster-node-timeout 15000 //请求超时 默认15秒,可自行设置
    appendonly no   //aof日志开启 有需要就开启,它会每次写操作都记录一条日志

    然后在节点slave01、slave02下重复第6步操作,把目录改为7003、7004、7005、7006、7007、7008,相应的配置文件也是如此。

    7、第6步配置完成之后,启动各个节点

    master节点:
    [root@master mnt]# cd /mnt/redis/src/ [root@master src]# redis
    -server /mnt/redis/redis_cluster/7000/redis.conf
    [root@master src]# redis
    -server /mnt/redis/redis_cluster/7001/redis.conf
    [root@master src]# redis-server /mnt/redis/redis_cluster/7002/redis.conf

    报错:
    [root@master src]# redis-server redis_cluster/7000/redis.conf
    -bash: redis-server: 未找到命令
    解决:
    [root@master src]# ln -s /mnt/redis/src/redis-server /usr/bin/redis-server
    [root@slav01 src]# ln -s /mnt/redis/src/redis-server /usr/bin/redis-server
    [root@slave02 src]# ln -s /mnt/redis/src/redis-server /usr/bin/redis-server
    slava01节点:
    
    [root@slave01 src]# redis-server /mnt/redis/redis_cluster/7003/redis.conf 
    [root@slave01 src]# redis-server /mnt/redis/redis_cluster/7004/redis.conf
    [root@slave01 src]# redis-server /mnt/redis/redis_cluster/7005/redis.conf
    slave02节点:
    [root@slave02 src]# redis-server /mnt/redis/redis_cluster/7006/redis.conf 
    [root@slave02 src]# redis-server /mnt/redis/redis_cluster/7007/redis.conf
    [root@slave02 src]# redis-server /mnt/redis/redis_cluster/7008/redis.conf
    
    

    8、检查Redis的启动情况

    master节点:
    slave01节点:
    slave02节点:

     

    9、创建集群

    创建集群之前先安装ruby和gem

    yum -y install ruby ruby-devel rubygems rpm-build
    gem install redis 

    说明:在master、slave01、slave02节点执行gem install redis 报错:

    redis requires Ruby version >= 2.2.2的报错,查了资料发现是Centos默认支持ruby到2.0.0,可gem 安装redis需要最低是2.2.2
    解决办法是 先安装rvm,再把ruby版本提升至2.3.3
    1.安装curl
    sudo yum install curl
    2. 安装RVM
    curl -L get.rvm.io | bash -s stable 
    报错:

    解决:分别执行:

     curl -sSL https://rvm.io/mpapis.asc | gpg2 --import -
     curl -sSL https://rvm.io/pkuczynski.asc | gpg2 --import -

    再次执行:
    curl -L get.rvm.io | bash -s stable 
    出现如下情况,说明成功


    3、source /usr/local/rvm/scripts/rvm
    4. 查看rvm库中已知的ruby版本
    rvm list known
    5. 安装一个ruby版本
    rvm install 2.3.3
    6. 使用一个ruby版本
    rvm use 2.3.3
    7. 删除默认版本
    rvm remove 2.0.0
    8. 查看一个已知版本
    ruby --version
    9. 再安装redis就可以了
    gem install redis
    10、如下说明安装成功

     [root@slave01 7002]# gem install redis
     Fetching: redis-4.1.0.gem (100%)
     Successfully installed redis-4.1.0
     Parsing documentation for redis-4.1.0
     Installing ri documentation for redis-4.1.0
     Done installing documentation for redis after 2 seconds
     1 gem installed

    然后再创建集群(因为如下这个是通过ruby工具实现的,所以执行这个之前先安装了ruby):

    Redis 官方提供了 redis-trib.rb 这个工具,就在解压目录的 src 目录中,第5步中已将它复制到 /usr/local/bin 目录中,可以直接在命令行中使用了。使用下面这个命令即可完成安装。

    redis-trib.rb  create  --replicas  1 192.168.200.100:7000 192.168.200.100:7001 192.168.200.100:7002 192.168.200.101:7003  192.168.200.101:7004 192.168.200.101:7005 192.168.200.102:7006  192.168.200.102:7007 192.168.200.102:7008

     结果:

    [root@master ~]# redis-trib.rb  create  --replicas  1 192.168.200.100:7000 192.168.200.100:7001 192.168.200.100:7002 192.168.200.101:7003  192.168.200.101:7004 192.168.200.101:7005 192.168.200.102:7006  192.168.200.102:7007 192.168.200.102:7008
    >>> Creating cluster
    >>> Performing hash slots allocation on 8 nodes...
    Using 4 masters:
    192.168.200.100:7001
    192.168.200.101:7003
    192.168.200.102:7006
    192.168.200.100:7002
    Adding replica 192.168.200.101:7004 to 192.168.200.100:7001
    Adding replica 192.168.200.102:7007 to 192.168.200.101:7003
    Adding replica 192.168.200.101:7005 to 192.168.200.102:7006
    Adding replica 192.168.200.102:7008 to 192.168.200.100:7002
    M: 39a9030929f691a63a4960e5f7fba90b15bdf477 192.168.200.100:7001
       slots:0-4095 (4096 slots) master
    M: e5bc3280725eeb017f6b99894738e96d039a1cf8 192.168.200.100:7002
       slots:12288-16383 (4096 slots) master
    M: dbab7ff79b07a7506f7b34da18fb242545476181 192.168.200.101:7003
       slots:4096-8191 (4096 slots) master
    S: 3629e37c0cc43b89dbce2492a5cc6850f505f86b 192.168.200.101:7004
       replicates 39a9030929f691a63a4960e5f7fba90b15bdf477
    S: d4e021e5fc98719f177aa65cbceaeb0148bed269 192.168.200.101:7005
       replicates db55b7bfc09b45a5b6beaed32709ce004e0f210e
    M: db55b7bfc09b45a5b6beaed32709ce004e0f210e 192.168.200.102:7006
       slots:8192-12287 (4096 slots) master
    S: 43dd4ba558794561e1445a7cf03dec26d94fc880 192.168.200.102:7007
       replicates dbab7ff79b07a7506f7b34da18fb242545476181
    S: a7eabb7752d507b558c43d3323fbdae2ad93c6a7 192.168.200.102:7008
       replicates e5bc3280725eeb017f6b99894738e96d039a1cf8
    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.200.100:7001)
    M: 39a9030929f691a63a4960e5f7fba90b15bdf477 192.168.200.100:7001
       slots:0-4095 (4096 slots) master
       1 additional replica(s)
    M: e5bc3280725eeb017f6b99894738e96d039a1cf8 192.168.200.100:7002
       slots:12288-16383 (4096 slots) master
       1 additional replica(s)
    S: a7eabb7752d507b558c43d3323fbdae2ad93c6a7 192.168.200.102:7008
       slots: (0 slots) slave
       replicates e5bc3280725eeb017f6b99894738e96d039a1cf8
    S: 3629e37c0cc43b89dbce2492a5cc6850f505f86b 192.168.200.101:7004
       slots: (0 slots) slave
       replicates 39a9030929f691a63a4960e5f7fba90b15bdf477
    M: db55b7bfc09b45a5b6beaed32709ce004e0f210e 192.168.200.102:7006
       slots:8192-12287 (4096 slots) master
       1 additional replica(s)
    M: dbab7ff79b07a7506f7b34da18fb242545476181 192.168.200.101:7003
       slots:4096-8191 (4096 slots) master
       1 additional replica(s)
    S: 43dd4ba558794561e1445a7cf03dec26d94fc880 192.168.200.102:7007
       slots: (0 slots) slave
       replicates dbab7ff79b07a7506f7b34da18fb242545476181
    S: d4e021e5fc98719f177aa65cbceaeb0148bed269 192.168.200.101:7005
       slots: (0 slots) slave
       replicates db55b7bfc09b45a5b6beaed32709ce004e0f210e
    [OK] All nodes agree about slots configuration.
    >>> Check for open slots...
    >>> Check slots coverage...
    [OK] All 16384 slots covered.

     测试一下,进行集群验证:

      在192.168.200.100节点上连接192.168.200.102节点的7008端口:

    [root@master src]# ./redis-cli -h 192.168.200.102 -c -p 7008 
    192.168.200.102:7008> set hello world
    -> Redirected to slot [866] located at 192.168.200.100:7001
    OK

    创建了一个key为hello,值为world。
    查看:
    然后在通过192.168.200.101节点访问该数据:

    说明:上面可以看到进行get和set的时候节点跳转到了7000端口所在的节点(192.168.200.100)。详细请查阅原理如下:

     以上说明:Redis集群已经搭建好啦!!!!!!!!!!!!!!!!!!!!!!

     查看集群状态:

    二、简单说一下原理

    1、Redis clutser在设计的时候,就考虑到了去中心话,去中间件,也就是说,集群中的每个节点都是平等的关系,都是对等的,每个节点都保存各自的数据和整个集群的状态。每个节点都和其他所有节点连接,而且这些连接保持活跃,这样就保证了我们只需要连接集群中的任意一个节点,就可以获取其他节点的数据。

    2、Redis集群没有并使用传统的一致性哈希来分配数据,而是采用另外一种叫做哈希槽(hash slot)的方式来分配的。redis cluster默认分配了16384个槽(slot),当我们set一个key时,会采用CRC16算法来取模得到所属的slot,然后将这个key分配到哈希槽区间的节点上,具体算法就是:CRC16(key) % 16834.所以我们在测试的时候可以看到set和get的时候,直接跳转到了7000端口的节点。

    3、Redis集群会把数据存在一个master的主节点,然后在这个master和其对应的slave之间进行数据同步。当读取数据时,也根据一致性哈希算法到对应的master节点获取数据。只有当一个master 挂掉之后,才会启动一个对应的 salve 节点,充当 master 。需要注意的是:必须要3个或以上的主节点,否则在创建集群时会失败,并且当存活的主节点数小于总节点数的一半时,整个集群就无法提供服务了。

  • 相关阅读:
    Android popupwindow和dialog监听返回键
    Android开发常用资料传送门
    Android 自己搭建一个直播系统吧
    js 时间戳转换成几分钟前,几小时前,几天前
    Android 热补丁动态修复框架小结
    【活动】参加葡萄城控件主办的“谁是报表达人”知识评测活动,赢取iPad Mini2团队
    上周热点回顾(3.24-3.30)团队
    C#正则表达式引发的CPU跑高问题以及解决方法团队
    上周热点回顾(3.17-3.23)团队
    实际遭遇GC回收造成的Web服务器CPU跑高团队
  • 原文地址:https://www.cnblogs.com/yfb918/p/10774627.html
Copyright © 2011-2022 走看看