Redis编译时需要使用C/C++环境:
yum install -y gcc gcc-c++ make
wget https://download.redis.io/releases/redis-5.0.13.tar.gz
//依赖库安装 yum install gcc gcc-c++ pcre pcre-devel zlib zlib-devel openssl openssl-devel -y tar -zxvf redis-5.0.13.tar.gz cd redis-5.0.13 make
mkdir /data/redis/redis-cluster/{data/{redis_8001,redis_8002},conf,log} -p
cp /data/redis/redis-5.0.13/redis.conf /data/redis/redis-cluster/conf/redis_8001.conf cp /data/redis/redis-5.0.13/redis.conf /data/redis/redis-cluster/conf/redis_8002.conf
port 8001 #修改redis监听端口(可以自定义) 8001与端口号同步 bind 0.0.0.0 #表示redis允许所有地址连接。默认127.0.0.1,仅允许本地连接。 daemonize yes #允许redis后台运行 pidfile /var/run/redis_8001.pid #pid存放目录 8001与端口号同步 logfile "/data/redis/redis-cluster/log/redis_8001.log" #设置日志存放路径 8001与端口号同步 dir /data/redis/redis-cluster/data/redis_8001 #工作目录 8001与端口号同步 cluster-enabled yes #是否开启集群 cluster-config-file /data/redis/redis-cluster/conf/nodes_8001.conf #集群配置文件的名称,每个节点都有一个集群相关的配置文件,持久化保存集群的信息 8001与端口号同步 #这个文件并不需要手动配置,这个配置文件有Redis生成并更新, cluster-node-timeout 15000 #节点互连超时的阀值。集群节点超时毫秒数,默认15秒 appendonly yes #Redis会把每次写入的数据在接收后都写入 appendonly.aof 文件, #每次启动时Redis都会先把这个文件的数据读入内存里,先忽略RDB文件。 appendfsync everysec #Redis会把每次写入的数据在接收后每秒写入一次 appendonly.aof 文件 requirepass 123456 #设置redis密码 masterauth 123456 #主从同步master的密码(如果没有设置redis密码,则无需配置)
集群内每台服务器分别启动两个redis
cd /data/redis/redis-5.0.13/src/ ./redis-server /data/redis/redis-cluster/conf/redis_8001.conf ./redis-server /data/redis/redis-cluster/conf/redis_8002.conf
./redis-cli -a {redis密码} --cluster create {redis集群地址} --cluster-replicas 1
//登录redis集群 ./redis-cli -a {redis密码} -h {redis地址} -p {redsi端口} -c //验证集群信息 {redis地址}:{redis端口}>cluster info #查看集群信息 {redis地址}:{redis端口}>cluster nodes #查看集群节点列表 //查看集群内主从关系 {redis地址}:{redis端口}>cluster slots //数据验证 插入数据: {redis地址}:{redis端口}> set mykey "Hello Redis" {redis地址}:{redis端口}> get mykey 登录其他节点查看数据: redis-cli -a {redis密码} -h {redis地址} -p {redsi端口} -c {redis地址}:{redis端口}> get mykey
假设你现在有一个3主3从的redis cluster,很不幸运,你丢了2个节点
redis cluster集群状态为fail,丢失了一些分片
集群坏了原因分析: * master节点能启动,但是master节点的IP变化了,集群还是根据旧的IP去连接节点,导致集群不能自愈。 * master节点某种原因不能启动,slave节点坏掉,有部分槽位slot丢失 * master节点因为网络原因不能连接,部分分片丢失,有部分槽位slot丢失 修复步骤: //需要把dump.rdb或者appendonly.aof文件拷贝出来,目的是先恢复redis节点数据, 如果数据能恢复,可能不需要fix修复命令,集群就可能恢复 //连接任意一个集群节点,cluster forget删除掉有故障的节点。这个时候建议你用call命令,这个命令很好用 redis-cli --cluster call 192.168.8.101:6381 cluster forget <xxx_node_id> redis-cli --cluster call 192.168.8.101:6381 cluster nodes //meet命令添加节点 redis-cli --cluster call 192.168.8.101:6381 cluster meet 192.168.8.101 6384 //查询检查集群信息是否一致 redis-cli --cluster call 192.168.8.101:6381 cluster nodes redis-cli --cluster check 192.168.8.101:6381 //如果这个时候足够幸运,cluster应该是恢复了。如果提示[ERR] Not all 16384 slots are covered by nodes. //接下来需要fix修复命令,在这个步骤你也可以使用命令add-node节点增加集群节点 redis-cli --cluster add-node 192.168.8.102:6384 192.168.8.101:6381 //fix修复节点命令,fix修复命令,不仅可以自动删除disconnected的节点,而且会迁移没有分配的slots到正常节点,可以使集群状态fail转变为ok。我之所以手动先给集群增加一个节点,手动删除有故障节点,然后fix修复命令,fix是会迁移的slots,需要代价的,fix完成后,还需要再平衡rebalance集群。 redis-cli --cluster fix 192.168.8.101 6381 //再平衡rebalance集群 redis-cli --cluster rebalance --cluster-use-empty-masters --cluster-pipeline 1000 --cluster-simulate 192.168.8.101 6384 rebalance host:port # 指定集群的任意一节点进行平衡集群节点slot数量 --cluster-weight <node1=w1...nodeN=wN> # 指定集群节点的权重 --cluster-use-empty-masters # 设置可以让没有分配slot的主节点参与,默认不允许 --cluster-timeout <arg> # 设置migrate命令的超时时间 --cluster-simulate # 模拟rebalance操作,不会真正执行迁移操作 --cluster-pipeline <arg> # 定义cluster getkeysinslot命令一次取出的key数量,默认值为10 --cluster-threshold <arg> # 迁移的slot阈值超过threshold,执行rebalance操作 --cluster-replace # 是否直接replace到目标节点 //最后不忘记保存配置 cluster saveconfig