centos7安装redis 配置集群

来源:互联网 发布:java进阶书籍推荐 编辑:程序博客网 时间:2024/05/29 02:13

配置防火墙 开起6379端口

firewall-cmd --zone=public --add-port=6379/tcp --permanent
firewall-cmd --reload

方法一

1.官网下载 redis stable版本 ,我下载的是redis-3.2.8.tar.gz

2.将安装包上传至centos7系统,解压编译安装

tar -zxvf redis-3.2.8.tar.gz  cd redis-3.2.8 makemake install默认安装路径 /usr/local/bin/ 也可自定义安装路径(make PREFIX=/usr/local/redis install)
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6

3.配置自启动 (vim /etc/init.d/redis)

    # chkconfig: 2345 10 90    # description: Start and Stop redis    PATH=/usr/local/bin:/sbin:/usr/bin:/bin    REDISPORT=6379 #实际环境而定    EXEC=/usr/local/bin/redis-server #实际环境而定    REDIS_CLI=/usr/local/bin/redis-cli #实际环境而定    PIDFILE=/var/run/redis_6379.pid    CONF="/etc/redis.conf" #实际环境而定    case "$1" in            start)                    if [ -f $PIDFILE ]                    then                            echo "$PIDFILE exists, process is already running or crashed."                    else                            echo "Starting Redis server..."                            $EXEC $CONF                    fi                    if [ "$?"="0" ]                    then                            echo "Redis is running..."                    fi                    ;;            stop)                    if [ ! -f $PIDFILE ]                    then                            echo "$PIDFILE exists, process is not running."                    else                            PID=$(cat $PIDFILE)                            echo "Stopping..."                            $REDIS_CLI -p $REDISPORT SHUTDOWN                            while [ -x $PIDFILE ]                            do                                    echo "Waiting for Redis to shutdown..."                                    sleep 1                            done                            echo "Redis stopped"                    fi                    ;;            restart|force-reload)                    ${0} stop                    ${0} start                    ;;            *)                    echo "Usage: /etc/init.d/redis {start|stop|restart|force-reload}" >&2                    exit 1    esac

-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------

方法二

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

tar xvf redis-3.2.10.tar.gz

cd redis-3.2.10/

make

make PREFIX=/usr/local/redis install

cp redis-3.2.10/redis.conf /usr/local/redis/


启动和关闭redis服务

启动redis就是执行redis里的bin下的redis-server 命令

cd /usr/local/redis/

bin/redis-server


出现这种图标,说明启动成功;

但是,这种是前台启动,以服务程序运行,必须后台运行,ctrl+c 退出当前程序

设置后台运行

vi打开redis.conf  vi /usr/local/redis/redis.conf

将daemonize no 修改为 daemonize yes


开发阶段 先将绑定ip取消 (需要重启redis服务)


去掉自我保护功能(**不推荐该方法**,需要重启redis服务),推荐方法为redis设置连接密码



设置redis连接密码

进入客户端

bin/redis-cli

config set requirepass *****  (设置密码)



保存退出


后台开启运行 在/usr/local/redis目录下输入命令

bin/redis-server redis.conf

查看redis服务是否开启



通过shutdown命令来停止redis服务

bin/redis-cli shutdown


redis基本使用

bin/redis-cli 进入客户端

------------------------------------------------------------------------------------------------------------------------------------------------------------------

配置集群

在/usr/local/redis下 修改bin文件夹为redis01,redis02...( (多台机器则可不改))

复制redis.conf配置文件

配置redis的配置文件redis.conf


         daemonize yes #后台启动

        port 7001 #修改端口号,从7001到7006 (多台机器则可不改)

        cluster-enabled yes #开启cluster,去掉注释

        cluster-config-file nodes.conf

        cluster-node-timeout 15000

        appendonly yes#开启AOF模式

dir /usr/local/redis/myfile

复制 redis-trib.rb

cp redis-3.2.10/src/redis-trib.rb /usr/local/redis/

安装ruby环境:

[root@localhost redis]# yum install ruby  

[root@localhost redis]# yum install rubygems 

安装redis-trib.rb运行依赖的ruby的包redis-*.gem:

[root@localhost redis]# gem install redis

----------------------------

其中 gem install redis命令执行时出现了:

redis requires Ruby version >= 2.2.2的报错,查了资料发现是Centos默认支持ruby到2.0.0,可gem 安装redis需要最低是2.2.2

参考:

http://blog.csdn.net/daxiangqqcom/article/details/78329496

----------------------------

我用了6台虚拟机 端口6379 bing 各自的IP



开启每台的redis


创建集群

 ./redis-trib.rb create --replicas 1 192.168.84.200:6379 192.168.84.201:6379 192.168.84.202:6379 192.168.84.203:6379 192.168.84.205:6379 192.168.84.206:6379


数据存储测试



set foo abc本想在206的6379节点保存foo这个key,但206的6379节点并没有存,而是将请求转发给了202的6379节点存储。而且客户端自动切换到了6379节点。这是神马情况?这其实是redis集群数据存储的机制,通过crc16算法计算key的hash值,然后对12182取模,得到一个0~16384以内的slot值来决定由哪个节点存储,而每一个节点在创建集群的时候,都会均匀的分配相应的slot数量


----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------

redis cluster命令


集群(cluster)  
cluster info       打印集群的信息
cluster nodes   列出集群当前已知的所有节点(node),以及这些节点的相关信息   
节点(node)  
cluster meet <ip> <port>       将ip和port所指定的节点添加到集群当中,让它成为集群的一份子  
cluster forget <node_id>        从集群中移除node_id指定的节点
cluster replicate <node_id>   将当前节点设置为node_id指定的节点的从节点
cluster saveconfig                   将节点的配置文件保存到硬盘里面
cluster slaves <node_id>       列出该slave节点的master节点
cluster set-config-epoch        强制设置configEpoch 
槽(slot)  
cluster addslots <slot> [slot ...]                         将一个或多个槽(slot)指派(assign)给当前节点
cluster delslots <slot> [slot ...]                          移除一个或多个槽对当前节点的指派 
cluster flushslots                                                移除指派给当前节点的所有槽,让当前节点变成一个没有指派任何槽的节点 
cluster setslot <slot> node <node_id>            将槽slot指派给node_id指定的节点,如果槽已经指派给另一个节点,那么先让另一个节点删除该槽,然后再进行指派 
cluster setslot <slot> migrating <node_id>   将本节点的槽slot迁移到node_id指定的节点中  
cluster setslot <slot> importing <node_id>   从node_id 指定的节点中导入槽slot到本节点 
cluster setslot <slot> stable                             取消对槽slot的导入(import)或者迁移(migrate) 
键(key)  
cluster keyslot <key>                                       计算键key应该被放置在哪个槽上  
cluster countkeysinslot <slot>                         返回槽slot目前包含的键值对数量 
cluster getkeysinslot <slot> <count>              返回count个slot槽中的键
其它
cluster myid       返回节点的ID
cluster slots       返回节点负责的slot
cluster reset      重置集群,慎用


redis cluster配置


cluster-enabled yes
如果配置yes则开启集群功能,此redis实例作为集群的一个节点,否则,它是一个普通的单一的redis实例。

cluster-config-file nodes-6379.conf
虽然此配置的名字叫"集群配置文件",但是此配置文件不能人工编辑,它是集群节点自动维护的文件,主要用于记录集群中有哪些节点、他们的状态以及一些持久化参数等,方便在重启时恢复这些状态。通常是在收到请求之后这个文件就会被更新。
 
cluster-node-timeout 15000
这是集群中的节点能够失联的最大时间,超过这个时间,该节点就会被认为故障。如果主节点超过这个时间还是不可达,则用它的从节点将启动故障迁移,升级成主节点。注意,任何一个节点在这个时间之内如果还是没有连上大部分的主节点,则此节点将停止接收任何请求。一般设置为15秒即可。

cluster-slave-validity-factor 10

如果设置成0,则无论从节点与主节点失联多久,从节点都会尝试升级成主节点。如果设置成正数,则cluster-node-timeout乘以cluster-slave-validity-factor得到的时间,是从节点与主节点失联后,此从节点数据有效的最长时间,超过这个时间,从节点不会启动故障迁移。假设cluster-node-timeout=5,cluster-slave-validity-factor=10,则如果从节点跟主节点失联超过50秒,此从节点不能成为主节点。注意,如果此参数配置为非0,将可能出现由于某主节点失联却没有从节点能顶上的情况,从而导致集群不能正常工作,在这种情况下,只有等到原来的主节点重新回归到集群,集群才恢复运作。

cluster-migration-barrier 1
主节点需要的最小从节点数,只有达到这个数,主节点失败时,它从节点才会进行迁移。更详细介绍可以看本教程后面关于副本迁移到部分。

cluster-require-full-coverage yes
在部分key所在的节点不可用时,如果此参数设置为"yes"(默认值), 则整个集群停止接受操作;如果此参数设置为”no”,则集群依然为可达节点上的key提供读操作。

redis cluster状态


192.168.84.203:6379> cluster info
cluster_state:ok             

如果当前redis发现有failed的slots,默认为把自己cluster_state从ok个性为fail, 写入命令会失败。如果设置cluster-require-full-coverage为no,则无此限制。
cluster_slots_assigned:16384   #已分配的槽
cluster_slots_ok:16384              #槽的状态是ok的数目
cluster_slots_pfail:0                    #可能失效的槽的数目
cluster_slots_fail:0                      #已经失效的槽的数目
cluster_known_nodes:6             #集群中节点个数
cluster_size:3                              #集群中设置的分片个数
cluster_current_epoch:15          #集群中的currentEpoch总是一致的,currentEpoch越高,代表节点的配置或者操作越新,集群中最大的那个node epoch
cluster_my_epoch:12                 #当前节点的config epoch,每个主节点都不同,一直递增, 其表示某节点最后一次变成主节点或获取新slot所有权的逻辑时间.
cluster_stats_messages_sent:270782059
cluster_stats_messages_received:270732696


192.168.84.203:6379> cluster nodes
25e8c9379c3db621da6ff8152684dc95dbe2e163 192.168.64.102:8002 master - 0 1490696025496 15 connected 5461-10922
d777a98ff16901dffca53e509b78b65dd1394ce2 192.168.64.156:8001 slave 0b1f3dd6e53ba76b8664294af2b7f492dbf914ec 0 1490696027498 12 connected
8e082ea9fe9d4c4fcca4fbe75ba3b77512b695ef 192.168.64.108:8000 master - 0 1490696025997 14 connected 0-5460
0b1f3dd6e53ba76b8664294af2b7f492dbf914ec 192.168.64.170:8001 myself,master - 0 0 12 connected 10923-16383
eb8adb8c0c5715525997bdb3c2d5345e688d943f 192.168.64.101:8002 slave 25e8c9379c3db621da6ff8152684dc95dbe2e163 0 1490696027498 15 connected
4000155a787ddab1e7f12584dabeab48a617fc46 192.168.67.54:8000 slave 8e082ea9fe9d4c4fcca4fbe75ba3b77512b695ef 0 1490696026497 14 connected
#说明
节点ID:例如25e8c9379c3db621da6ff8152684dc95dbe2e163
ip:port:节点的ip地址和端口号,例如192.168.64.102:8002
flags:节点的角色(master,slave,myself)以及状态(pfail,fail)
如果节点是一个从节点的话,那么跟在flags之后的将是主节点的节点ID,例如192.168.64.156:8001主节点的ID就是0b1f3dd6e53ba76b8664294af2b7f492dbf914ec
集群最近一次向节点发送ping命令之后,过了多长时间还没接到回复
节点最近一次返回pong回复的时间
节点的配置纪元(config epoch)
本节点的网络连接情况
节点目前包含的槽,例如192.168.64.102:8002目前包含的槽为5461-10922




原创粉丝点击