zoukankan      html  css  js  c++  java
  • centos6搭建redis集群搭建(单机多节点)

    一、安装redis

    1、安装gcc环境

    yum install gcc-c++

    2、下载源码包并解压

    wget http://download.redis.io/releases/redis-3.2.4.tar.gz

    tar -zxvf redis-3.2.4.tar.gz

    cd redis-3.2.4

    3、安装ruby2.4.1并编译(一定要安装大于2.2.2ruby,要不然redismake的时候会报错)

    wget http://ftp.ruby-lang.org/pub/ruby/2.4/ruby-2.4.1.tar.gz

    tar -zxvf ruby-2.4.1.tar.gz

    cd ruby-2.4.1

    mkdir -p /usr/local/ruby

    ./configure --prefix=/usr/local/ruby

    make && make install

    ln -s /usr/local/ruby/bin/ruby /usr/bin/ruby

    4、安装

    make

    make install PREFIX=/usr/local/redis

    cp redis.conf /usr/local/redis/bin/redis.conf

    chmod /usr/local/redis/bin/redis.conf

    5、启动redis

    ./redis-server redis.conf

    6、验证

    [root@host-172-16-80-177 bin]# ./redis-cli -p 6379

    127.0.0.1:6379> get

    (error) ERR wrong number of arguments for 'get' command

    127.0.0.1:6379> set aa hzb

    OK

    127.0.0.1:6379> get aa

    "hzb"

    二、搭建redis集群(集群模式)

    1、在/usr/local/下面创建redis-cluster目录

    mkdir -p /usr/local/redis-cluster

    2、复制/usr/local/redis/bin目录到redis-cluster里面并重命名为redis1

    cd /usr/local

    cp -r redis/bin redis-cluster/redis1

    3、将redis1在同目录复制6份分别起名redis2,redis3,redis4,redis5,redis6(必须6个节点以上才能创建集群)

    [root@host-172-16-80-177 redis-cluster]# pwd

    /usr/local/redis-cluster

    [root@host-172-16-80-177 redis-cluster]# cp -r redis1 redis2

    [root@host-172-16-80-177 redis-cluster]# cp -r redis1 redis3

    [root@host-172-16-80-177 redis-cluster]# cp -r redis1 redis4

    [root@host-172-16-80-177 redis-cluster]# cp -r redis1 redis5

    [root@host-172-16-80-177 redis-cluster]# cp -r redis1 redis6

    rendis.conf文件复制到redisx文件夹下

    分别修改为redis-7001.conf,redis-7002.conf 后面依次到redis-7006.conf

    redis-7001为例:

    daemonize yes

    Port 700x

    bind #服务器ip

    logfile "./redis-700x.log"

    protected-mode no

    pidfile /var/run/redis_700x.pid

    cluster-enabled yes

    4、将redis-trib.rb复到制redis-cluster目录里面

    [root@host-172-16-80-177 redis-cluster]# cp /root/redis-3.2.4/src/redis-trib.rb .

    [root@host-172-16-80-177 redis-cluster]# ll

    total 76

    drwxr-xr-x 2 root root  4096 Oct 19 22:37 redis1

    drwxr-xr-x 2 root root  4096 Oct 19 22:48 redis2

    drwxr-xr-x 2 root root  4096 Oct 19 22:49 redis3

    drwxr-xr-x 2 root root  4096 Oct 19 22:49 redis4

    drwxr-xr-x 2 root root  4096 Oct 19 22:49 redis5

    drwxr-xr-x 2 root root  4096 Oct 19 22:49 redis6

    -rwxr-xr-x 1 root root 60852 Oct 19 22:52 redis-trib.rb

    5、安装gem

     yum install rubygems -y

    6、安装rubyredis

    gem install redis

    上面这一步可能会出现:

    ERROR: Loading command: install (LoadError)

    cannot load such file -- zlib

    ERROR: While executing gem ... (NoMethodError)

    undefined method `invoke_with_build_args' for nil:NilClass

    解决办法是:

    进入ruby源码文件夹

    安装ruby自身提供的zlib

    #cd ext/zlib

    #ruby ./extconf.rb

    #make

    #make install

    进入ruby源码文件夹

    安装ruby自身提供的openssl

    #cd ext/openssl

    #ruby ./extconf.rb

    #make

    #make install

    如果执行make的时候报错:make: *** No rule to make target

    错误原因:makefile里面的文件依赖关系有问题,导致头文件找不到。

    解决办法:打开编译相关模块的makefile文件,找到.o文件的依赖关系,找到.h文件的路径,查看是否出错并改正。

    原因分析:这种情况有时候是因为工程所在的目录改变,例如原来在C盘,现在移到了D盘,而makefile里面的.h文件路径没有改变

    以上问题解决后再执行:

    [root@host-172-16-80-177 include]# gem install redis

    Fetching: redis-4.0.1.gem (100%)

    Successfully installed redis-4.0.1

    Parsing documentation for redis-4.0.1

    Installing ri documentation for redis-4.0.1

    Done installing documentation for redis after 1 seconds

    1 gem installed

    表示rubyredis依赖包安装成功。

    7、分别进入redis1,redis2,redis3,redis4,redis5,redis6里面执行

    ./redis-server redis-7001.conf

    ......

    将6个节点启动

    [root@host-172-16-80-177 redis4]# ps -ef|grep redis

    root      3167     1  0 02:49 ?        00:00:00 ./redis-server 127.0.0.1:7001 [cluster]

    root      3176     1  0 02:50 ?        00:00:00 ./redis-server 127.0.0.1:7002 [cluster]

    root      3187     1  0 02:51 ?        00:00:00 ./redis-server 127.0.0.1:7003 [cluster]

    root      3191     1  0 02:52 ?        00:00:00 ./redis-server 127.0.0.1:7004 [cluster]

    root      3191     1  0 02:52 ?        00:00:00 ./redis-server 127.0.0.1:7005 [cluster]

    root      3191     1  0 02:52 ?        00:00:00 ./redis-server 127.0.0.1:7006 [cluster]

    root      3195  1852  0 02:52 pts/0    00:00:00 grep redis

    8、用redis-trib.rb构建集群

    cd /usr/local/redis-cluster/

    [root@host-172-16-80-177 redis-cluster]# ./redis-trib.rb create --replicas 1 172.16.80.177:7001 172.16.80.177:7002 172.16.80.177:7003 172.16.80.177:7004 172.16.80.177:7005 172.16.80.177:7006

    >>> Creating cluster

    [ERR] Sorry, can't connect to node 172.16.80.177:7001

    以上错误原因是redis.conf里面未开起远程访问

    打开每个redis里面的.conf文件,找到

    # JUST COMMENT THE FOLLOWING LINE.

    # ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

    bind 127.0.0.1

    # Protected mode is a layer of security protection, in order to avoid that

    # Redis instances left open on the internet are accessed and exploited.

    将上面的bind 127.0.0.1改成bind 172.16.80.177(外部可以访问的ip),然后重启各服务

    root      3383     1  0 03:12 ?        00:00:00 ./redis-server 172.16.80.177:7001 [cluster]

    root      3458     1  0 03:20 ?        00:00:00 ./redis-server 172.16.80.177:7002 [cluster]

    root      3464     1  0 03:20 ?        00:00:00 ./redis-server 172.16.80.177:7003 [cluster]

    root      3470     1  0 03:20 ?        00:00:00 ./redis-server 172.16.80.177:7004 [cluster]

    root      3506     1  0 03:25 ?        00:00:00 ./redis-server 172.16.80.177:7005 [cluster]

    root      3518     1  0 03:25 ?        00:00:00 ./redis-server 172.16.80.177:7006 [cluster]

    root      3523  1852  0 03:26 pts/0    00:00:00 grep redis

    再用redis-trib.rb创建集群:

    [root@host-172-16-80-177 redis-cluster]# ./redis-trib.rb create --replicas 1 172.16.80.177:7001 172.16.80.177:7002 172.16.80.177:7003 172.16.80.177:7004 172.16.80.177:7005 172.16.80.177:7006

    >>> Creating cluster

    >>> Performing hash slots allocation on 6 nodes...

    Using 3 masters:

    172.16.80.177:7001

    172.16.80.177:7002

    172.16.80.177:7003

    Adding replica 172.16.80.177:7004 to 172.16.80.177:7001

    Adding replica 172.16.80.177:7005 to 172.16.80.177:7002

    Adding replica 172.16.80.177:7006 to 172.16.80.177:7003

    M: 40bbe8a979fe39f1f0941cc8e118443436fc71d8 172.16.80.177:7001

       slots:0-5460 (5461 slots) master

    M: e6b76ee1540c9be6c44abc3dec42378f8cfd0191 172.16.80.177:7002

       slots:5461-10922 (5462 slots) master

    M: fdc248e24bd9f8690c652213a5781f4e567208e8 172.16.80.177:7003

       slots:10923-16383 (5461 slots) master

    S: 38faede9dd348983b1b8b80edc975e8d34105e5c 172.16.80.177:7004

       replicates 40bbe8a979fe39f1f0941cc8e118443436fc71d8

    S: 38faede9dd348983b1b8b80edc975e8d34105e5c 172.16.80.177:7005

       replicates e6b76ee1540c9be6c44abc3dec42378f8cfd0191

    S: 38faede9dd348983b1b8b80edc975e8d34105e5c 172.16.80.177:7006

       replicates fdc248e24bd9f8690c652213a5781f4e567208e8

    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 172.16.80.177:7001)

    M: 40bbe8a979fe39f1f0941cc8e118443436fc71d8 172.16.80.177:7001

       slots:0-5460 (5461 slots) master

       1 additional replica(s)

    M: e6b76ee1540c9be6c44abc3dec42378f8cfd0191 172.16.80.177:7002

       slots:5461-10922 (5462 slots) master

       0 additional replica(s)

    S: 38faede9dd348983b1b8b80edc975e8d34105e5c 172.16.80.177:7004

       slots: (0 slots) slave

       replicates 40bbe8a979fe39f1f0941cc8e118443436fc71d8

    M: fdc248e24bd9f8690c652213a5781f4e567208e8 172.16.80.177:7003

       slots:10923-16383 (5461 slots) master

       0 additional replica(s)

    [OK] All nodes agree about slots configuration.

    >>> Check for open slots...

    >>> Check slots coverage...

    [OK] All 16384 slots covered.

    至此,redis集群创建成功

     9、验证集群是否成功

    [root@host-172-16-80-177 redis2]# ./redis-cli -h 172.16.80.177 -c -p 7002

    172.16.80.177:7002> set hello helloword

    -> Redirected to slot [866] located at 172.16.80.177:7001

    OK

    172.16.80.177:7006> get hello

    -> Redirected to slot [866] located at 172.16.80.177:7001

    "helloword"

    检查节点状态命令:

    ./redis-cli check ip:port

    ./redis-cli check 192.168.1.88:7001

    三、搭建redis集群(哨兵模式) 

    1、在/usr/local/下面创建redis-sentinel目录

    mkdir -p /usr/local/redis-sentinel

     2、将一大节中的/usr/local/redis/bin复制到redis-sentinel目录底下起名叫redis1,redis2,redis3,redis4,sentinel1,sentinel2

    修改4redis的配置文件(以redis1为例,将redis.conf重命名为redis-7001.conf

    daemonize yes

    Port 7001

    #Bind 127.0.0.1

    logfile "./redis-7001.log"

    protected-mode no

    cluster-config-file nodes-7001.conf

    其他三个redis的端口号为7002,7003,7004

    3、将redis解压包里面的sentinel.conf复制到sentinel1sentinel2里面并重命名为sentinel-7005.conf,sentinel-7006.conf,并赋予可执行权限

    修改配置(以sentinel-7005.conf为例)

    port 7005

    sentinel monitor mymaster 172.16.80.177 7001 2

    protected-mode no

    注:我们稍后要启动四个redis实例,其中端口为7001redis设为master,其他三个设为slave 。所以my mymaster 后跟的是masterip和端口,最后一个’2’代表我要启动只要有2sentinel认为master下线,就认为该master客观下线,启动failover并选举产生新的master。通常最后一个参数不能多于启动的sentinel实例数。

    4.启动4redis实例

    ./redis-server redis-7001.conf

    ......

    [root@host-172-16-80-177 redis4]# ps -ef|grep redis

    root     29967     1  0 22:02 ?        00:00:00 ./redis-server 172.16.80.177:7001

    root     29971     1  0 22:02 ?        00:00:00 ./redis-server 172.16.80.177:7002

    root     29976     1  0 22:02 ?        00:00:00 ./redis-server 172.16.80.177:7003

    root     29985     1  0 22:02 ?        00:00:00 ./redis-server 172.16.80.177:7004

    然后分别登陆7002 7003 7004三个实例,动态改变主从关系,成为7005slave:

    ./redis-cli -h 172.16.80.177 -p 7002

    172.16.80.177:7002> SLAVEOF 172.16.80.177 7001

    5、以后台启动模式启动两个sentinel(哨兵):

    [root@host-172-16-80-177 sentinel1]# ./redis-sentinel sentinel-7005.conf &

    [1] 30038

    [root@host-172-16-80-177 sentinel1]# 30038:X 22 Oct 22:10:49.712 * Increased maximum number of open files to 10032 (it was originally set to 1024).

                    _._                                                  

               _.-``__ ''-._                                             

          _.-``    `.  `_.  ''-._           Redis 3.2.4 (00000000/0) 64 bit

      .-`` .-```.  ```/    _.,_ ''-._                                   

     (    '      ,       .-`  | `,    )     Running in sentinel mode

     |`-._`-...-` __...-.``-._|'` _.-'|     Port: 7005

     |    `-._   `._    /     _.-'    |     PID: 30038

      `-._    `-._  `-./  _.-'    _.-'                                   

     |`-._`-._    `-.__.-'    _.-'_.-'|                                  

     |    `-._`-._        _.-'_.-'    |           http://redis.io        

      `-._    `-._`-.__.-'_.-'    _.-'                                   

     |`-._`-._    `-.__.-'    _.-'_.-'|                                  

     |    `-._`-._        _.-'_.-'    |                                  

      `-._    `-._`-.__.-'_.-'    _.-'                                   

          `-._    `-.__.-'    _.-'                                       

              `-._        _.-'                                           

                  `-.__.-'                                               

    30038:X 22 Oct 22:10:49.713 # WARNING: The TCP backlog setting of 511 cannot be enforced because /proc/sys/net/core/somaxconn is set to the lower value of 128.

    30038:X 22 Oct 22:10:49.744 # Sentinel ID is cbd44de127d84fd7d21f9e4a73e62b94c3b0ea00

    30038:X 22 Oct 22:10:49.744 # +monitor master mymaster 172.16.80.177 7001 quorum 2

    30038:X 22 Oct 22:10:49.745 * +slave slave 172.16.80.177:7004 172.16.80.177 7004 @ mymaster 172.16.80.177 7001

    30038:X 22 Oct 22:10:49.768 * +slave slave 172.16.80.177:7002 172.16.80.177 7002 @ mymaster 172.16.80.177 7001

    30038:X 22 Oct 22:10:49.792 * +slave slave 172.16.80.177:7003 172.16.80.177 7003 @ mymaster 172.16.80.177 7001

    [root@host-172-16-80-177 redis-3.2.4]# ps -ef|grep sentinel

    root     30038 29505  0 22:10 pts/0    00:00:00 ./redis-sentinel *:7005 [sentinel]

    root     30059 29505  0 22:13 pts/0    00:00:00 ./redis-sentinel *:7006 [sentinel]

    6、验证

     sentinel的基本命令

    INFO

    sentinel的基本状态信息

    SENTINEL masters

    列出所有被监视的主服务器,以及这些主服务器的当前状态

    SENTINEL slaves

    列出给定主服务器的所有从服务器,以及这些从服务器的当前状态

    SENTINEL get-master-addr-by-name

    返回给定名字的主服务器的 IP 地址和端口号

    SENTINEL reset

    重置所有名字和给定模式 pattern 相匹配的主服务器。重置操作清除主服务器目前的所有状态, 包括正在执行中的故障转移, 并移除目前已经发现和关联的, 主服务器的所有从服务器和 Sentinel

    SENTINEL failover

    当主服务器失效时, 在不询问其他 Sentinel 意见的情况下, 强制开始一次自动故障迁移,但是它会给其他sentinel发送一个最新的配置,其他sentinel会根据这个配置进行更新

    [root@host-172-16-80-177 redis1]# ./redis-cli -h 172.16.80.177 -p 7001

    172.16.80.177:7001>

    172.16.80.177:7001> set name hzb

    OK

    172.16.80.177:7001> get name

    "hzb"

    172.16.80.177:7001> exit

    [root@host-172-16-80-177 redis1]# cd ../redis2

    [root@host-172-16-80-177 redis2]# ./redis-cli -h 172.16.80.177 -p 7002

    172.16.80.177:7002> get name

    "hzb"

    172.16.80.177:7002> set age 32

    (error) READONLY You can't write against a read only slave.

    上面可以看到slave是只读的

    登录一个sentinel,用sentinel masters命令查看哪个是master

    [root@host-172-16-80-177 sentinel1]# ./redis-cli -h 172.16.80.177 -p 7005

    172.16.80.177:7005>

    172.16.80.177:7005>

    172.16.80.177:7005> sentinel masters

    1)  1) "name"

        2) "mymaster"

        3) "ip"

        4) "172.16.80.177"

        5) "port"

        6) "7001"

        7) "runid"

        8) "8b5d064e4195a1ee6279f5fb06f3fa88e4605854"

        9) "flags"

       10) "master"

       11) "link-pending-commands"

       12) "0"

       13) "link-refcount"

       14) "1"

       15) "last-ping-sent"

       16) "0"

       17) "last-ok-ping-reply"

       18) "624"

       19) "last-ping-reply"

       20) "624"

       21) "down-after-milliseconds"

       22) "30000"

       23) "info-refresh"

       24) "5427"

       25) "role-reported"

       26) "master"

       27) "role-reported-time"

       28) "85727"

       29) "config-epoch"

       30) "0"

       31) "num-slaves"

       32) "3"

       33) "num-other-sentinels"

       34) "1"

       35) "quorum"

       36) "2"

       37) "failover-timeout"

       38) "180000"

       39) "parallel-syncs"

       40) "1"

    目前7001master, 我们强制kill7001 的进程以后,可以看到sentinel打出的信息:

    30325:X 22 Oct 22:51:24.138 # +sdown master mymaster 172.16.80.177 7001

    30325:X 22 Oct 22:51:24.557 # +new-epoch 1

    30325:X 22 Oct 22:51:24.599 # +vote-for-leader 3948b4c445549c51d67bf829553372bca8bc67c8 1

    30325:X 22 Oct 22:51:25.174 # +config-update-from sentinel 3948b4c445549c51d67bf829553372bca8bc67c8 172.16.80.177 7006 @ mymaster 172.16.80.177 7001

    30325:X 22 Oct 22:51:25.174 # +switch-master mymaster 172.16.80.177 7001 172.16.80.177 7003

    30325:X 22 Oct 22:51:25.175 * +slave slave 172.16.80.177:7004 172.16.80.177 7004 @ mymaster 172.16.80.177 7003

    30325:X 22 Oct 22:51:25.175 * +slave slave 172.16.80.177:7002 172.16.80.177 7002 @ mymaster 172.16.80.177 7003

    30325:X 22 Oct 22:51:25.175 * +slave slave 172.16.80.177:7001 172.16.80.177 7001 @ mymaster 172.16.80.177 7003

    30325:X 22 Oct 22:51:55.202 # +sdown slave 172.16.80.177:7001 172.16.80.177 7001 @ mymaster 172.16.80.177 7003

    [root@host-172-16-80-177 sentinel1]# ./redis-cli -h 172.16.80.177 -p 7005

    172.16.80.177:7005> sentinel masters

    1)  1) "name"

        2) "mymaster"

        3) "ip"

        4) "172.16.80.177"

        5) "port"

        6) "7003"

        7) "runid"

        8) "31721c8d1371697d78bf3c6acc2f8d4ba829825a"

        9) "flags"

       10) "master"

       11) "link-pending-commands"

       12) "0"

       13) "link-refcount"

       14) "1"

       15) "last-ping-sent"

       16) "0"

       17) "last-ok-ping-reply"

       18) "454"

       19) "last-ping-reply"

       20) "454"

       21) "down-after-milliseconds"

       22) "30000"

       23) "info-refresh"

       24) "7168"

       25) "role-reported"

       26) "master"

       27) "role-reported-time"

       28) "27254"

       29) "config-epoch"

       30) "1"

       31) "num-slaves"

       32) "3"

       33) "num-other-sentinels"

       34) "1"

       35) "quorum"

       36) "2"

       37) "failover-timeout"

       38) "180000"

       39) "parallel-syncs"

       40) "1"

    上面显示了,master自动从7001变成了7003节点

    再次将7001启动起来

    30385:X 22 Oct 22:55:15.544 * +convert-to-slave slave 172.16.80.177:7001 172.16.80.177 7001 @ mymaster 172.16.80.177 7003

    可以看到自动将7001变成了7003slave

     下面加一个批量启动和停止的脚本:

    #!/bin/bash

    start(){

      ./redis1/redis-server ./redis1/redis.conf  &

      ./redis2/redis-server ./redis2/redis.conf  &

      ./redis3/redis-server ./redis3/redis.conf  &

      ./redis4/redis-server ./redis4/redis.conf  &

      ./sentinel1/redis-sentinel ./sentinel1/sentinel.conf  &

      ./sentinel2/redis-sentinel ./sentinel2/sentinel.conf  &

    }

    stop(){

     ps -ef | grep "redis" | grep -v "grep" |awk '{print $2}'| while read pid

     do

        C_PID=$(ps --no-heading $pid | wc -l)

        echo "当前PID=$pid"

        if [[ $C_PID == "1" ]]; then

            kill -9 $pid

            echo "PID=$pid 已经结束"

        else

            echo "PID=$pid 不存在"

        fi

     done

    }

    case "$1" in

    start)

    start

    ;;

    stop)

    stop

    ;;

    restart)

    stop

    start

    ;;

    *)

    printf 'Usage: %s {start|stop|restart} '"$prog"

    exit 1

    ;;

    esac

  • 相关阅读:
    win7与centos虚拟机的共享文件夹创建
    MySQL视图
    MySQL分区表与合并表
    PHP读写XML文件的四种方法
    备份与恢复
    MySQL日志
    MySQL锁问题
    优化数据库对象
    ActiveReport资料
    对ArrayList 进行深拷贝
  • 原文地址:https://www.cnblogs.com/wenxingxu/p/9405409.html
Copyright © 2011-2022 走看看