我将redis安装到 /usr/local/目录下,下载redis包,我这里用的redis-4.0.9版本。
下载地址:https://redis.io/
上传安装包到/usr/local/:
然后解压,我这里就不看解压过程了:
tar -zxf redis-4.0.9.tar.gz
然后我们进入安装的redis目录下,进行编译安装:这里会出现一个错误,下面我会解决这个问题。
出现以下错误:因为缺少依赖包gcc的相关依赖包。
然后我们在进行依赖包安装:
yum install gcc*
然后再进行编译,发现还是错误,这是因为你已经编译过了,存在编译了的文件
然后返回上一级删除你解压的redis文件,重新解压一个,再进行编译。
cd ..
rm -rf redis-4.0.9
tar -zxf redis-4.0.9.tar.gz
cd redis-4.0.9
make && make install
成功信息:
然后我们要开启端口号 6379,16379;
查看防火墙状态:
systemctl status firewalld
开启状态:
然后开启端口号:
firewall-cmd --permanent --zone=public --add-port=6379/tcp
firewall-cmd --permanent --zone=public --add-port=16379/tcp
然后重启防火墙:
systemctl restart firewalld
然后修改配置文件:
vi redis.conf
修改以下信息:然后保存。
#端口:
port 6379
#默认ip为127.0.0.1 需要改为其他节点机器可访问的ip 否则创建集群时无法访问对应的端口,无法创建集群
bind 192.168.131.139
#redis后台运行
daemonize yes
#pidfile文件对应6379
pidfile /var/run/redis_6379.pid
#开启集群 把注释#去掉
cluster-enabled yes
#集群的配置 配置文件首次启动自动生成 6379 把注释#去掉
cluster-config-file nodes_6379.conf
#请求超时 默认15秒,可自行设置
cluster-node-timeout 15000
#设置密码
requirepass guest
然后启动redis:
src/redis-server redis.conf
查询reids端口情况:
ps aux | grep redis
然后用Redis Desktop Manager连接:
关闭reids,我们直接杀这个进程。
kill -9 1303
然后我们准备安装集群的环境:
1.Redis-trib.rb 需要ruby环境,先安装ruby环境
yum -y install zlib ruby rubygems
成功信息:
然后升级版本:
gem update --system
然后安装redis
gem install redis
出现错误,以下版本过低:Ruby至少需要2.2.2版本以上。
然后我们吧Ruby进行升级:
gpg --keyserver hkp://keys.gnupg.net --recv-keys 409B6B1796C275462A1703113804BB82D39DC0E3 7D2BAF1CF37B13E2069D6956105BD0E739499BDB
curl -sSL https://get.rvm.io | bash -s stable
find / -name rvm -print
source /usr/local/rvm/scripts/rvm
查看rvm库中已知的ruby版本:
rvm list known
我们选择最新版本2.4.1,设置成默认。
rvm install 2.4.1
使用安装的版本:
rvm use 2.4.1
设置默认版本:
rvm use 2.4.1 --default
查看版本:
ruby --version
安装redis:
gem install redis
然后关闭虚拟机,我们进行克隆,因为redis集群需要6个节点(redis集群要求最小3主3从),所以还需要克隆5台,或者是你开其它的端口来充当,由于我的电脑比较刚,那就直接复制5台。
复制的5台修改修改以下信息:如果说你复制的5台,IP分别是:192.168.131.140,192.168.131.141,192.168.131.142,192.168.131.143,192.168.131.144;那么你要将你复制的虚拟机的redis。
修改你的这个IP,改成你本机的IP:
bind 192.168.131.139
然后就启动redis,每台都要启动:
cd /usr/local/redis/
src/redis-server redis.conf
启动集群,再安装的redis的目录下:
src/redis-trib.rb create --replicas 1 192.168.131.139:6379 192.168.131.140:6379 192.168.131.141:6379 192.168.131.142:6379 192.168.131.143:6379 192.168.131.144:6379
重新启动出现错误:
可能是密码设置没有对;要找到 client.rb这个配置文件,路径/usr/local/rvm/gems/ruby-2.4.1/gems/redis-4.0.1/lib/redis/client.rb,因为我们上面是安装的ruby2.4.1版本。
find / -name ruby
找到 :password => nil,把nil改为"guest"
找到 :password => nil,把nil改为"guest"
vi /usr/local/rvm/gems/ruby-2.4.1/gems/redis-4.0.1/lib/redis/client.rb
如果是正式环境可以先修复
redis-trib.rb fix 192.168.131.139:6379
把单节点全部关掉,先备份,先备份,先备份,重要的事情说3边。然后删除 dump.rdb; nodes-6379.conf; appendonly.aof。
rm -rf dump.rdb nodes-6379.conf appendonly.aof
然后重启
redis-5.0.5集群搭建(三台服务器:192.168.33.101,192.168.33.102,192.168.33.103),在101;102;103上分别搭建2台,
端口分别为7001,7002,然后在home文件下创建两个redis,然后创建集群。
cd /home
cp -rf redis/ redis01/
cp -rf redis/ redis02/
vi redis01/redis-7001.conf
vi redis01/redis-7002.conf
然后将192.168.33.101克隆两台服务器:192.168.33.102;192.168.33.103
然后分别启动redis,
ps aux|grep redis
然后创建集群:redis-cli --cluster create 192.168.33.101:7001 192.168.33.101:7002 192.168.33.102:7001 192.168.33.102:7002 192.168.33.103:7001 192.168.33.103:7002 --cluster-replicas 1
redis-5使用 redis-cli的方式创建
redis-cli --cluster create 192.168.33.101:7001 192.168.33.101:7002 192.168.33.102:7001 192.168.33.102:7002 192.168.33.103:7001 192.168.33.103:7002 --cluster-replicas 1
当出现一下情况,一直在等待其他节点加入。出现以上问题,我们需要在192.168.33.102(非主节点)执行
$: cd /home/redis01/src/
$: ./redis-cli -c -p 7001 -h 192.168.33.102
然后我们kill掉一个redis
然后我们在查看集群节点信息如图:
我们发现102:7001 这个已经fail掉了。然后我们在重启它
清除redis所有数据
172.16.51.65:7001> flushall
我们发现它又成功加入了集群。
当我们发现出现如下错误时:
在节点上的redis.conf配置中加入 masterauth guest
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状态
127.0.0.1:8001> 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
127.0.0.1:8001> 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
原文链接:https://blog.csdn.net/mysqldba23/article/details/67640478