“Redis5 cluster”的版本间的差异

来自linux中国网wiki
跳到导航 跳到搜索
 
(未显示同一用户的94个中间版本)
第1行: 第1行:
=节点信息=
+
=Memcached集群=
 +
 
 +
[http://blog.itpub.net/69955379/viewspace-2690744/ 教你用Magent实现Memcached集群 ]
 +
 
 +
=优化=
 +
==remove RDB固化==
 +
#dbfilename dump_7000.rdb
 +
 
 +
=pre 常用脚本=
 +
<pre>
 +
 
 +
 
 +
cat  /data/evan/redisloop.sh
 +
#!/bin/bash
 +
#usage  redisloop.sh  rr
 +
cat  $1  | while read line
 +
do
 +
 
 +
redis-cli    -c  -h    172.31.22.218  -p 7000  -a hell $line
 +
redis-cli    -c  -h    172.31.22.218  -p 7001  -a hell  $line
 +
redis-cli    -c  -h  172.31.16.135  -p 7002  -a hell  $line 
 +
redis-cli    -c  -h  172.31.16.135  -p 7003  -a hell  $line
 +
redis-cli    -c  -h  172.31.23.43  -p 7004  -a hell  $line
 +
redis-cli    -c  -h  172.31.23.43  -p 7005  -a hell  $line
 +
done
 +
 
 +
 
 +
vi rr
 +
del hello_coin_limit_045617153_2
 +
del hello_coin_limit_9811460_2
 +
 
 +
 
 +
 
 +
 
 +
 
 +
cat  redisin.sh
 +
#!/bin/bash
 +
redis-cli    -c  -h    172.31.22.218  -p 7000  -a hello  `cat $1`
 +
redis-cli    -c  -h    172.31.22.218  -p 7001  -a hello  `cat $1`
 +
#
 +
redis-cli    -c  -h  172.31.16.135  -p 7002  -a hello  `cat $1` #$1 # del hello_coin_list
 +
redis-cli    -c  -h  172.31.16.135  -p 7003  -a hello `cat $1` #$1 #del hello_coin_list
 +
#
 +
redis-cli    -c  -h  172.31.23.43  -p 7004  -a hello  `cat $1`#$1 #del hello_coin_list
 +
redis-cli    -c  -h  172.31.23.43  -p 7005  -a hello  `cat $1` #$1 #del hello_coin_list
 +
 
 +
</pre>
 +
 
 +
=docker-compose=
 +
docker 18.09.6  太新版本可能不行
 +
相关脚本和配置 https://github.com/evan886/redis/tree/master/redis-cluster-docker_host
 +
==升级 or 降级 redis 版本 ==
 +
升级 or 降级 redis 版本 直接换 docker-compose.yml 里面的版本就行了
 +
==host 网络 要手工添加集群==
 +
同样要用firewall etc
 +
要优化的地方    restart  已添加 
 +
 
 +
升级 or 降级 redis 版本 直接换 docker-compose.yml 里面的版本就行了
 +
 
 +
但是在2021 新版本的docker #network_mode: host 要注释了 bind也要0.0.0.0
 +
按照 Redis 官网:https://redis.io/topics/cluster-tutorial 的提示,为了使 Docker 与 Redis Cluster 兼容,您需要使用 Docker 的 host 网络模式。
 +
 
 +
Redis Cluster and Docker
 +
 
 +
Currently Redis Cluster does not support NATted environments and in general environments where IP addresses or TCP ports are remapped.
 +
 
 +
Docker uses a technique called port mapping: programs running inside Docker containers may be exposed with a different port compared to the one the program believes to be using. This is useful in order to run multiple containers using the same ports, at the same time, in the same server.
 +
 
 +
In order to make Docker compatible with Redis Cluster you need to use the host networking mode of Docker. Please check the --net=host option in the Docker documentation for more information.
 +
 
 +
相关脚本和配置
 +
https://github.com/evan886/redis/tree/master/redis-cluster-docker_host
 +
 
 +
<pre>
 +
 
 +
2021 单机版本
 +
# cat docker-compose.yml
 +
version: "3"
 +
services:
 +
    redis-cluster-6379:
 +
        image: ccr.ccs.tencentyun.com/evan/devops:redis-alpine-v6.2.5
 +
        container_name: node-6379
 +
        ports:
 +
            - "7379:6379"
 +
        restart: always
 +
        #network_mode: host
 +
        volumes:
 +
            - ./conf/redis-6379.conf:/usr/local/etc/redis/redis.conf
 +
            - ./log:/var/log/redis
 +
            - ./data:/data/redis
 +
        command: sh -c "redis-server /usr/local/etc/redis/redis.conf"
 +
 
 +
 
 +
# cat conf/redis-6379.conf
 +
port 6379
 +
bind 0.0.0.0
 +
#bind 192.168.10.120 127.0.0.1
 +
#cluster-enabled yes
 +
appendfilename "appendonly-6379.aof"
 +
#cluster-node-timeout 15000
 +
appendonly yes
 +
appendfsync everysec
 +
#daemonize yes
 +
dbfilename dump_6379.rdb
 +
requirepass "xxxxxxmhw3xd34"
 +
 
 +
 
 +
redis-cli  -c  -h 192.168.10.120  -p 7379  -a 你的密码
 +
 
 +
cat redis6
 +
Warning: Could not create server TCP listening socket 192.168.10.120:6379: bind: Address not available
 +
node-6379            | 1:M 24 Sep 2021 08:12:19.283 # Failed listening on port 6379 (TCP), aborting.
 +
 
 +
# head  conf/redis-6379.conf
 +
port 6379
 +
bind 0.0.0.0
 +
#bind 192.168.10.120 127.0.0.1
 +
改为4个0 
 +
 
 +
compose文件的
 +
      #network_mode: host
 +
 
 +
关掉后
 +
 
 +
 
 +
 
 +
 
 +
 
 +
cluster 操作开始
 +
Usage:
 +
NOTE2020
 +
 
 +
git  clone https://github.com/evan886/redis.git
 +
cd /data/apps && mv  redis/redis-cluster-docker_host/  redis-cluster-docker && rm  -rf redis
 +
 
 +
#运行
 +
docker-compose up -d
 +
 
 +
#要改的地方
 +
bind  172.18.178.218 127.0.0.1
 +
批量替换 sed 
 +
sed -i 's!old!new!' filename
 +
 
 +
sed  -i 's!5.0.2-alpine!5.0.9-alpine!' docker-compose.yml
 +
 
 +
sed -i 's!192.168.11.236!172.31.16.4!' *.conf
 +
 
 +
aliyu 不能 绑定外网NAT IP  bind 内网IP 然后 创建集群用 外网IP就可以了
 +
 
 +
不然后
 +
(error) CLUSTERDOWN Hash slot not served  cluster没起来
 +
 
 +
#docker exec -it  node-7000  redis-cli -p 7000  --cluster create  10.25.196.78:7000    10.25.196.78:7001  10.25.196.78:7002  10.25.196.78:7003  10.25.196.78:7004  10.25.196.78:7005  --cluster-replicas 1
 +
 
 +
IP='192.168.10.193'
 +
docker exec -it  node-7000  redis-cli -p 7000  --cluster create  $IP:7000    $IP:7001  $IP:7002  $IP:7003  $IP:7004  $IP:7005  --cluster-replicas 1
 +
 
 +
#如果是三台机器 6个节点
 +
 
 +
#mark
 +
IP='172.31.127.221'
 +
IP2='172.31.127.222'
 +
IP3='172.31.127.223'
 +
docker exec -it  node-7000  redis-cli -p 7000  --cluster create  ${IP}:7000    ${IP}:7001  ${IP2}:7002  ${IP2}:7003  ${IP3}:7004  ${IP3}:7005  --cluster-replicas 1
 +
 
 +
 
 +
# #要改的地方 不要交互
 +
echo 'masterauth passwd123d
 +
requirepass passwd123d' >>redis-7000.conf
 +
 
 +
 
 +
 
 +
 
 +
check
 +
 
 +
docker exec -it  node-7000  redis-cli -p 7000  -c  -h 483.284.7.34 -a passwd12Trttt3d
 +
 
 +
 
 +
 
 +
 
 +
bind 要记得改为你要的IP  如果用0.0.0.0 那就不要127.0.0.1
 +
有问题多看log 目录
 +
 
 +
#这里是母机的ip 如果是三台机器 那么就有 三个 IP
 +
docker exec -it  node-7000  redis-cli -p 7000  --cluster create  ip:7000    ip:7001  ip:7002  ip:7003  ip:7004  ip:7005  --cluster-replicas 1
 +
 
 +
docker exec -it  node-7000  redis-cli -p 7000  --cluster create --cluster-replicas 1 ip:7000    ip:7001  ip:7002  ip:7003  ip:7004  ip:7005
 +
 
 +
三台母机的情形 就是每个docker-compose.yml 只启动两个 ,其它的删除就行了  201912
 +
 
 +
</pre>
 +
 
 +
== 数据损坏重做 2020==
 +
<pre>
 +
内网的193机器  PHP老是搞坏,或者强行restart os  常常会有几个节点起不来 这时 只能重新做 cluster
 +
 
 +
data 目录下的mv 走或删除掉
 +
conf 目录下的 先去掉密码 
 +
up -d 起所有节点
 +
conf 用追加再添加回密码
 +
docker-compose restart 起回所有的节点
 +
 
 +
 
 +
 
 +
</pre>
 +
 
 +
==laradock方法==
 +
===相关文件===
 +
<pre>
 +
 
 +
#注意  网络是这个, 还有就是多台机器之间 也不太可能能这个网络 那样 容器之间的redis 是不通的
 +
NETWORKS_DRIVER=bridge
 +
 
 +
less  docker-compose.yml
 +
### Redis Cluster evan##########################################
 +
    redis-cluster:
 +
      build: ./redis-cluster
 +
      ports:
 +
        - "${REDIS_CLUSTER_PORT_RANGE}:7000-7005"
 +
      networks:
 +
        - backend
 +
 
 +
 
 +
cat  redis-cluster/Dockerfile  #注意 redis版本
 +
FROM grokzen/redis-cluster:5.0.6
 +
#FROM grokzen/redis-cluster:latest
 +
LABEL maintainer="hareku <[email protected]>"
 +
</pre>
 +
 
 +
=== 添加密码===
 +
<pre>
 +
添加密码 可以进入容器里面直接添加 ,不过不够好 ,有空要 放到母机出来,有如我上面
 +
004  7005  redis-cluster.tmpl redis.tmpl  sentinel.tmpl
 +
root@401a49002b88:/data# ls /redis-conf/700
 +
7000/ 7001/ 7002/ 7003/ 7004/ 7005/
 +
root@401a49002b88:/data# ls /redis-conf/7000/redis.conf
 +
/redis-conf/7000/redis.conf
 +
root@401a49002b88:/data# tail /redis-conf/7000/redis.conf
 +
bind 0.0.0.0
 +
port 7000
 +
cluster-enabled yes
 +
cluster-config-file nodes.conf
 +
cluster-node-timeout 5000
 +
appendonly yes
 +
dir /redis-data/7000
 +
 
 +
 
 +
进入redis-cluster 容器 直接非交互  这里以7005 端口为例子
 +
 
 +
redis-cli  -c  -h 127.0.0.1  -p 7005  config set masterauth 36DbRGvv66
 +
redis-cli  -c  -h 127.0.0.1  -p 7005  config set requirepass 36DbRGvv66
 +
redis-cli  -c  -h 127.0.0.1  -p 7005 auth  36DbRGvv66
 +
 
 +
redis-cli  -c  -h 127.0.0.1  -p 7005  -a 36DbRGvv66  config rewrite
 +
redis-cli  -c  -h 127.0.0.1  -p 7005  config rewrite  # 最后这一步 有时得 加上密码
 +
 
 +
 
 +
 
 +
Usage:  可以直接用物理机的ip  内网或者外网
 +
 
 +
上次搞了几天 ,是忙晕了 不记得打开防火墙 7000-7005的端口
 +
</pre>
 +
===  "host" network_mode is incompatible with port_bindings ===
 +
 
 +
[https://win-man.github.io/2020/02/03/docker-compost-network-mode-mysql-connect/  docker-compose 中 network_mode 设置导致无法从容器外部访问 MySQL ]
 +
 
 +
=源码手工=
 +
==单独安装redis-cli==
 +
<pre>
 +
国内镜像
 +
https://mirrors.huaweicloud.com/redis/
 +
 
 +
debian 上可以单独安装 redis-cli (packname redis-tools)
 +
但是rhel居然不行 只能编译一下 
 +
 
 +
make  -j  2 之后 ,copy 走这个 bin 文件就行了  is centos  make MALLOC=libc  zmalloc.h:50:31: fatal error: jemalloc/jemalloc.h: No such file or directory
 +
 
 +
./src/redis-cli -c  这个二进制包放        /usr/bin/  #或者放 /usr/sbin  只有超级用户可以用到  如果其它用户要用 就不要放这里了
 +
 
 +
 
 +
redis cluster 执行脚本 不用老是一个一个的搞 麻烦  其实只要在三个主上执行就行了 你6个全执行也没事,反正是脚本的
 +
 
 +
#!/bin/bash
 +
##Usage  bash redisin.sh  你的redis脚本
 +
redis-cli    -c  -h    172.31.22.218  -p 7000  -a hello  `cat $1`
 +
redis-cli    -c  -h    172.31.22.218  -p 7001  -a hello  `cat $1`
 +
#
 +
redis-cli    -c  -h  172.31.16.135  -p 7002  -a hello  `cat $1` #$1 # del hello_list
 +
 
 +
 
 +
</pre>
 +
 
 +
==节点信息==
 
<pre>
 
<pre>
 
角色                        主机名                                                            IP1              IP2       
 
角色                        主机名                                                            IP1              IP2       
第10行: 第302行:
 
姐妹篇 [[Redis4 cluster]]
 
姐妹篇 [[Redis4 cluster]]
  
=防火墙设置=
+
==防火墙设置==
 
<pre>
 
<pre>
 
第一台:
 
第一台:
第35行: 第327行:
 
</pre>
 
</pre>
  
=系统参数设置=
+
==系统参数设置==
 
<pre>#vi /etc/sysctl.conf
 
<pre>#vi /etc/sysctl.conf
 
echo 'vm.overcommit_memory = 1
 
echo 'vm.overcommit_memory = 1
第43行: 第335行:
 
</pre>
 
</pre>
  
=redis 5 安装=
+
==redis 5 安装==
 
<pre>
 
<pre>
 
#bash redisins.sh 2>&1 | tee redislog
 
#bash redisins.sh 2>&1 | tee redislog
第88行: 第380行:
 
</pre>
 
</pre>
  
=创建节点 =
+
==创建节点 ==
 
<pre>
 
<pre>
 
#第一台:192.168.10.211 #here
 
#第一台:192.168.10.211 #here
第131行: 第423行:
 
</pre>
 
</pre>
  
=修改配置文件(三台机器6个配置)=
+
==修改配置文件(三台机器6个配置)==
 
<pre>
 
<pre>
 
note  日志在系统那  因为我们配置文件没指定 /var/log/redis/
 
note  日志在系统那  因为我们配置文件没指定 /var/log/redis/
第256行: 第548行:
 
</pre>
 
</pre>
  
=启动redis=
+
==启动redis==
 
<pre>
 
<pre>
 
#cd /usr/local/redis/etc/redis_cluster #on freebsd
 
#cd /usr/local/redis/etc/redis_cluster #on freebsd
第一台:
+
第一台: #注意用 "" 不要'' 要替换变量的值
 
mkdir /var/log/redis
 
mkdir /var/log/redis
 
redis_install_dir=/data/apps/redis
 
redis_install_dir=/data/apps/redis
echo 'redis_install_dir=/data/apps/redis
+
echo "redis_install_dir=/data/apps/redis
 
${redis_install_dir}/bin/redis-server ${redis_install_dir}/redis_cluster/7000/redis_7000.conf
 
${redis_install_dir}/bin/redis-server ${redis_install_dir}/redis_cluster/7000/redis_7000.conf
${redis_install_dir}/bin/redis-server ${redis_install_dir}/redis_cluster/7001/redis_7001.conf'>${redis_install_dir}/redis_cluster/run
+
${redis_install_dir}/bin/redis-server ${redis_install_dir}/redis_cluster/7001/redis_7001.conf">${redis_install_dir}/redis_cluster/run
  
 
chmod +x ${redis_install_dir}/redis_cluster/run && bash ${redis_install_dir}/redis_cluster/run
 
chmod +x ${redis_install_dir}/redis_cluster/run && bash ${redis_install_dir}/redis_cluster/run
 
chmod  +x /etc/rc.d/rc.local
 
chmod  +x /etc/rc.d/rc.local
echo "${redis_install_dir}/redis_cluster/run" >/etc/rc.d/rc.local #把变量替换为值,不建议用''
+
echo "${redis_install_dir}/redis_cluster/run" > >/etc/rc.d/rc.local #把变量替换为值,不建议用''
  
 
第二台
 
第二台
 
mkdir /var/log/redis
 
mkdir /var/log/redis
 
redis_install_dir=/data/apps/redis
 
redis_install_dir=/data/apps/redis
echo 'redis_install_dir=/data/apps/redis
+
echo "${redis_install_dir}/bin/redis-server ${redis_install_dir}/redis_cluster/7002/redis_7002.conf
${redis_install_dir}/bin/redis-server ${redis_install_dir}/redis_cluster/7002/redis_7002.conf
+
${redis_install_dir}/bin/redis-server ${redis_install_dir}/redis_cluster/7003/redis_7003.conf">${redis_install_dir}/redis_cluster/run
${redis_install_dir}/bin/redis-server ${redis_install_dir}/redis_cluster/7003/redis_7003.conf'>${redis_install_dir}/redis_cluster/run
 
  
 
chmod +x ${redis_install_dir}/redis_cluster/run && bash ${redis_install_dir}/redis_cluster/run
 
chmod +x ${redis_install_dir}/redis_cluster/run && bash ${redis_install_dir}/redis_cluster/run
 
chmod  +x /etc/rc.d/rc.local
 
chmod  +x /etc/rc.d/rc.local
echo "${redis_install_dir}/redis_cluster/run" >/etc/rc.d/rc.local #把变量替换为值
+
echo "${redis_install_dir}/redis_cluster/run" > >/etc/rc.d/rc.local #把变量替换为值
  
  
第285行: 第576行:
 
mkdir /var/log/redis
 
mkdir /var/log/redis
 
redis_install_dir=/data/apps/redis
 
redis_install_dir=/data/apps/redis
echo 'redis_install_dir=/data/apps/redis
+
echo "${redis_install_dir}/bin/redis-server ${redis_install_dir}/redis_cluster/7004/redis_7004.conf
${redis_install_dir}/bin/redis-server ${redis_install_dir}/redis_cluster/7004/redis_7004.conf
+
${redis_install_dir}/bin/redis-server ${redis_install_dir}/redis_cluster/7005/redis_7005.conf">${redis_install_dir}/redis_cluster/run
${redis_install_dir}/bin/redis-server ${redis_install_dir}/redis_cluster/7005/redis_7005.conf'>${redis_install_dir}/redis_cluster/run
 
  
 
chmod +x ${redis_install_dir}/redis_cluster/run && bash ${redis_install_dir}/redis_cluster/run
 
chmod +x ${redis_install_dir}/redis_cluster/run && bash ${redis_install_dir}/redis_cluster/run
 
chmod  +x /etc/rc.d/rc.local
 
chmod  +x /etc/rc.d/rc.local
echo "${redis_install_dir}/redis_cluster/run"  >/etc/rc.d/rc.local #把变量替换为值
+
echo "${redis_install_dir}/redis_cluster/run"  >>/etc/rc.d/rc.local #把变量替换为值
  
 
</pre>
 
</pre>
第306行: 第596行:
 
redis-cli -h 10.3.10.143 -p 7005
 
redis-cli -h 10.3.10.143 -p 7005
 
</pre>
 
</pre>
=创建集群=
+
==创建集群==
 
<pre>注意:在任意一台上运行 不要在每台机器上都运行,一台就够了
 
<pre>注意:在任意一台上运行 不要在每台机器上都运行,一台就够了
 
#要开通端口  firewalld
 
#要开通端口  firewalld
 
+
#在geany 有: 格式可能有点不对 要注意
 
redis-cli --cluster create --cluster-replicas 1 192.168.10.211:7000 192.168.10.211:7001 192.168.10.212:7002 192.168.10.212:7003 192.168.10.213:7004  192.168.10.213:7005
 
redis-cli --cluster create --cluster-replicas 1 192.168.10.211:7000 192.168.10.211:7001 192.168.10.212:7002 192.168.10.212:7003 192.168.10.213:7004  192.168.10.213:7005
 
#--replicas  1  表示 自动为每一个master节点分配一个slave节点    上面有6个节点,程序会按照一定规则生成 3个master(主)3个slave(从)
 
#--replicas  1  表示 自动为每一个master节点分配一个slave节点    上面有6个节点,程序会按照一定规则生成 3个master(主)3个slave(从)
 
</pre>
 
</pre>
==执行详情==
+
===执行详情===
 
<pre>
 
<pre>
 
  [root@dev-hello-1 redis_cluster]# redis-cli --cluster create --cluster-replicas 1 192.168.10.201:7000 192.168.10.201:7001 192.168.10.202:7002 192.168.10.202:7003 192.168.10.203:7004  192.168.10.203:7005
 
  [root@dev-hello-1 redis_cluster]# redis-cli --cluster create --cluster-replicas 1 192.168.10.201:7000 192.168.10.201:7001 192.168.10.202:7002 192.168.10.202:7003 192.168.10.203:7004  192.168.10.203:7005
第420行: 第710行:
  
 
测试通过了  
 
测试通过了  
 +
 +
 +
 +
 +
#20191113 
 +
要加 -a 密码访问  不然老是提示要密码
 +
[root@prod-02 ~]# redis-cli  -c -h 172.16.200.12 -p 7002
 +
172.16.200.12:7002> auth ci1723
 +
OK
 +
172.16.200.12:7002> get evan
 +
-> Redirected to slot [14924] located at 172.16.200.7:7004
 +
(error) NOAUTH Authentication required.
 +
172.16.200.7:7004> auth ci1723
 +
OK
 +
172.16.200.7:7004> get evan
 +
"56;"
 +
 +
 +
 +
 
</pre>
 
</pre>
  
第425行: 第735行:
 
==方式一:修改所有Redis集群中的redis.conf文件加入==  
 
==方式一:修改所有Redis集群中的redis.conf文件加入==  
 
<pre>  
 
<pre>  
 +
#不要交互
 +
 +
for file  in  `ls *.conf`
 +
 +
do
 +
echo 'masterauth passwd123dHello
 +
requirepass passwd123dHello' >>$file
 +
 +
done
 +
 +
test visa
 +
  docker exec -it  node-7000  redis-cli -p 7000  -c  -h 172.31.16.4 -a passwd12Trttt3d
 +
 +
 +
 +
 +
 +
echo 'masterauth passwd123d
 +
requirepass passwd123d' >>redis-7000.conf
 +
 +
 +
 +
 +
 +
 
# NOTE  还是这个办法好  不然可能有些 没加载到配置文件去呢  
 
# NOTE  还是这个办法好  不然可能有些 没加载到配置文件去呢  
 
masterauth passwd123  
 
masterauth passwd123  
第431行: 第766行:
 
</pre>
 
</pre>
  
==方式二:进入各个实例进行设置  就是所有节点:==
+
==方式二:进入各个实例进行设置  就是所有节点:不建议==
 
<pre>  
 
<pre>  
 
redis-cli -c -h 10.3.10.141 -p 7001
 
redis-cli -c -h 10.3.10.141 -p 7001
第444行: 第779行:
 
-a 后 再执行命令就再 auth , 而如果是进入后 auth password 要每次 都再验证一下密码 麻烦  
 
-a 后 再执行命令就再 auth , 而如果是进入后 auth password 要每次 都再验证一下密码 麻烦  
  
 +
</pre>
 +
 +
=redis client  redis-tools  or redis-cli=
 +
<pre>
 +
 +
下载 解压源码
 +
sudo make -j 9
 +
sudo cp  src/redis-cli  /usr/bin/redis-cli
 
</pre>
 
</pre>
  
第449行: 第792行:
 
=开机自己启动=
 
=开机自己启动=
 
<pre>
 
<pre>
 +
#非交互
 +
redis_install_dir=/data/apps/redis
 +
echo "${redis_install_dir}/bin/redis-server ${redis_install_dir}/redis_cluster/7004/redis_7004.conf
 +
${redis_install_dir}/bin/redis-server ${redis_install_dir}/redis_cluster/7005/redis_7005.conf">${redis_install_dir}/redis_cluster/run
 +
 +
chmod +x ${redis_install_dir}/redis_cluster/run && bash ${redis_install_dir}/redis_cluster/run
 +
chmod  +x /etc/rc.d/rc.local
 +
echo "${redis_install_dir}/redis_cluster/run"  >>/etc/rc.d/rc.local #把变量替换为值
 +
 +
#交互
 
vi /apps/redis/redis_cluster/run
 
vi /apps/redis/redis_cluster/run
  
第462行: 第815行:
  
 
</pre>
 
</pre>
 +
 
=开启关闭=
 
=开启关闭=
 
<pre>
 
<pre>
redis-cli -a xxx -c -h 192.168.0.60 -p 8001 shutdown  #集群cluster_state变成了fail状态?
+
redis-cli -a xxx -c -h 192.168.0.60 -p 8001 shutdown  #集群cluster_state变成了fail状态? 不过要服务正常的情况下才行
 
 
 
 
  
 
</pre>
 
</pre>
第472行: 第824行:
 
=troubleshooting=
 
=troubleshooting=
 
<pre>
 
<pre>
 +
收到报警
 +
 +
Labels
 +
alertname = vm_host_down
 +
instance = redis://10.3.10.141:7000
 +
job = redis_cluster
 +
 +
severity = page
 +
Annotations
 +
description = redis://10.3.10.141:7000 of job market_redis_cluster has been down for more than 1 minutes..
 +
summary = Instance redis://10.3.10.141:7000 down
 +
 +
 +
 +
7000 进程在但是 登录不进去
 +
 +
日志如下
 +
03:01:16.166 # Unable to connect to MASTER: No such file or directory
 +
22283:S 16 Jun 03:01:17.167 * Connecting to MASTER ?:7003
 +
22283:S 16 Jun 03:01:17.175 # Unable to connect to MASTER: No such file or directory
 +
22283:S 16 Jun 03:01:18.177 * Connecting to MASTER ?:7003
 +
 +
 +
处理办法 
 +
kill -9 7000的 再启动  暂时正常
 +
 +
 +
 +
 +
 +
 
ISCONF Errors writing to the AOF file: No space left on device; nested exception is redis.clients.jedis.exceptions.JedisDataException: MISCONF Errors writing to the AOF file: No space left on device
 
ISCONF Errors writing to the AOF file: No space left on device; nested exception is redis.clients.jedis.exceptions.JedisDataException: MISCONF Errors writing to the AOF file: No space left on device
  
第477行: 第860行:
  
 
原因 有一个台redis的机器 空间100%  
 
原因 有一个台redis的机器 空间100%  
 +
 +
 +
 +
 +
 +
tail  boot.log
 +
[  OK  ] Started Network Time Service.
 +
[FAILED] Failed to start /etc/rc.d/rc.local Compatibility.
 +
See 'systemctl status rc-local.service' for details.
 +
 +
#启动rc-local 服务  on aliyun 不要不小心 不清空了  /etc/rc.d/rc.local
 +
systemctl enable  rc-local.service
 +
 +
redis 安装报错 jemalloc/jemalloc.h: No such file or directory
 +
 +
理上次编译残留文件,重新编译
 +
 +
make distclean  && make
 +
 +
导致出现这个错误的原因
 +
 +
  错误的本质是我们在开始执行make 时遇到了错误(大部分是由于gcc未安装),然后我们安装好了gcc 后,我们再执行make ,这时就出现了jemalloc/jemalloc.h: No such file or directory。这是因为上次的
 +
 +
 +
ERROR: for redis-cluster-8005  Cannot start service redis-cluster-8005: OCI runtime create failed: container_linux.go:346: starting container process caused "process_linux.go:449: container init caused \"rootfs_linux.go:58: mounting \\\"/home/redis-cluster-docker_host/conf/redis-8005.conf\\\" to rootfs \\\"/var/lib/docker/overlay2/f80340e6f1abc4aa43cde08ba4c5aa48787b092cbbbb64f01c5f0ad213d71368/merged\\\" at \\\"/var/lib/docker/overlay2/f80340e6f1abc4aa43cde08ba4c5aa48787b092cbbbb64f01c5f0ad213d71368/merged/usr/local/etc/redis/redis.conf\\\" caused \\\"not a directory\\\"\"": unknown: Are you trying to mount a directory onto a file (or vice-versa)? Check if the specified host path exists and is the expected type
 +
ERROR: Encountered errors while bringing up the project.
 +
[root@stage-secret-im-rabbitmq03 redis-cluster-docker_host]# docker -V
 +
^C
 +
[root@stage-secret-im-rabbitmq03 redis-cluster-docker_host]# docker -v
 +
Docker version 19.03.5, build 633a0ea
 +
[root@stage-secret-im-rabbitmq03 redis-cluster-docker_host]# docker-compose  down
 +
Removing node-8004 ... done
 +
Removing node-8005 ... done
 +
Removing node-8003 ... done
 +
Removing node-8001 ... done
 +
Removing node-8002 ... done
 +
Removing node-8006 ... done
 +
 +
 +
 +
断电后,node文件  nodes-7002.conf 内容中多了一个V 删除后正常
 +
 +
 +
他们用  jedis 连接报的错
 +
redis.clients.jedis.exceptions.JedisConnectionException: Could not get a resource from the pool
 +
  at redis.clients.jedis.util.Pool.getResource(Pool.java:59)
 +
 +
 +
 +
应该是有些配置文件没写入密码  也可能是我当时写错  写到上一个目录来了
 +
 +
 +
</pre>
 +
 +
== Creating Server TCP listening socket *:6379: bind: No such file or directory==
 +
问题描述
 +
 +
Creating Server TCP listening socket *:6379: bind: No such file or directory
 +
解决思路
 +
 +
我这边检查之后发现Redis服务已经启动了
 +
 +
    redis-cli 去看是否能连接上,进的去执行 shutdown 就断开连接,重新执行就可以启动 如果可以的话
 +
    ps -ef | grep redis 查看服务是否已经启动,kill -9 PID 杀掉服务重新启动
 +
 +
[https://www.bbsmax.com/A/xl5613k1Jr/ redis 安装报错 jemalloc/jemalloc.h: No such file or directory。]
 +
 +
==make  jemalloc/jemalloc.h: No such file or directory==
 +
<pre>
 +
make时报如下错误:
 +
 +
zmalloc.h:50:31: error: jemalloc/jemalloc.h: No such file or directory
 +
zmalloc.h:55:2: error: #error "Newer version of jemalloc required"
 +
make[1]: *** [adlist.o] Error 1
 +
make[1]: Leaving directory `/data0/src/redis-2.6.2/src'
 +
make: *** [all] Error 2
 +
 +
原因是jemalloc重载了Linux下的ANSI C的malloc和free函数。解决办法:make时添加参数。
 +
 +
make MALLOC=libc
 +
</pre>
 +
 +
==断电后 cluster损坏  ==
 +
<pre>
 +
查看日志
 +
tail  log/7000.log
 +
1:M 31 Aug 2020 02:20:53.960 # Bad file format reading the append only file: make a backup of your AOF file, then use ./redis-check-aof --fix <filename>
 +
 +
不知道存放路径的可以查找find / -name redis-check-aof
 +
 +
apt install redis-tools
 +
 +
-7000.conf  nodes-7003.conf  temp-169.rdb
 +
 +
因为起不来的是 7004节点容器 所以有针对的 修复 命令如下
 +
root@cailuw-dev:/home/apps/redis_cluster/data# redis-check-aof --fix appendonly-7004.aof
 +
The AOF appears to start with an RDB preamble.
 +
Checking the RDB preamble to start:
 +
[offset 0] Checking RDB file --fix
 +
[offset 26] AUX FIELD redis-ver = '5.0.2'
 +
[offset 40] AUX FIELD redis-bits = '64'
 +
[offset 52] AUX FIELD ctime = '1598476864'
 +
[offset 67] AUX FIELD used-mem = '3217224'
 +
[offset 83] AUX FIELD aof-preamble = '1'
 +
[offset 85] Selecting DB ID 0
 +
[offset 226540] Checksum OK
 +
[offset 226540] \o/ RDB looks OK! \o/
 +
[info] 1999 keys read
 +
[info] 134 expires
 +
[info] 110 already expired
 +
RDB preamble is OK, proceeding with AOF tail...
 +
0x        2eaac6d: Expected prefix '*', got: '
 +
AOF analyzed: size=48934026, ok_up_to=48933997, diff=29
 +
This will shrink the AOF from 48934026 bytes, with 29 bytes, to 48933997 bytes
 +
Continue? [y/N]: y
 +
Successfully truncated AOF
 +
 +
 +
</pre>
 +
 +
=Warning: AUTH failed=
 +
 +
<pre>
 +
7002> get evan
 +
-> Redirected to slot [14924] located at 192.168.10.53:7004
 +
Warning: AUTH failed
 +
"36"
 +
 +
 +
(error) ERR Client sent AUTH, but no password is set
 +
 +
cli版本太高了
 +
evan@myxps:~$ redis-cli  --version
 +
redis-cli 6.0.6
 +
  
 
</pre>
 
</pre>
  
 
=see also=
 
=see also=
 +
[https://my.oschina.net/magebyte/blog/4959114 Redis 日志篇:无畏宕机快速恢复的杀手锏]
 +
 +
https://redis.io/topics/cluster-tutorial
 +
 +
http://redisdoc.com/topic/cluster-tutorial.html
 +
 +
[https://my.oschina.net/u/4126211/blog/4546776?utm_source=new_idx Docker 搭建 Redis Cluster 集群环境]
 +
 +
[https://blog.csdn.net/truelove12358/article/details/79612954 Redis cluster集群:原理及搭建]
 +
 +
[https://blog.csdn.net/yaomingyang/article/details/79057973 (八)Redis集群常用命令、集群节点新增删除]
 +
 +
[https://my.oschina.net/u/4126211/blog/4555576 Docker Compose 搭建 Redis Cluster 集群环境]
 +
 +
[https://www.cnblogs.com/xmxkkk/p/8038190.html redis集群,添加删除槽]
 +
 
[https://blog.51cto.com/kerry/2316700 redis-5.0 cluster带认证及客户端连接]
 
[https://blog.51cto.com/kerry/2316700 redis-5.0 cluster带认证及客户端连接]
  
 
[https://www.jianshu.com/p/8045b92fafb2 Redis 5 之后版本的高可用集群搭建]
 
[https://www.jianshu.com/p/8045b92fafb2 Redis 5 之后版本的高可用集群搭建]
 +
 +
[https://blog.csdn.net/zhengzhaoyang122/article/details/94321292 Redis——Cluster集群搭建及节点的添加、删除]
 +
 +
 +
[https://www.cnblogs.com/amei0/p/8177076.html  redis(二)集群 redis-cluster & redis主从同步 ]
 +
 +
[https://blog.csdn.net/duzm200542901104/article/details/83002655  redis cluster查找key的流程]
 +
 +
 +
[https://blog.csdn.net/weixin_40576010/article/details/88418300  主从服务器与集群的区别以及Redis中主从服务器的搭建]
 +
 +
[https://blog.csdn.net/u010627840/article/details/105089785?utm_medium=distribute.pc_relevant.none-task-blog-BlogCommendFromMachineLearnPai2-2.nonecase&depth_1-utm_source=distribute.pc_relevant.none-task-blog-BlogCommendFromMachineLearnPai2-2.nonecase  redis cluser查看每个主节点管理的slot和从节点]
 +
 +
[https://blog.csdn.net/u014403825/article/details/84572425 redis 集群查看key在某一个具体的节点上]
 +
 +
单节点
 +
[https://www.jianshu.com/p/95cd92a0fd66 Docker docker-compose安装redis单节点]
 +
 +
https://kb.objectrocket.com/redis/run-redis-with-docker-compose-1055
 +
 +
 +
[https://www.cnblogs.com/netonline/p/7875067.html Redis 4集群配置]
 
[[category:ops]] [[category:redis]]
 
[[category:ops]] [[category:redis]]

2021年9月24日 (五) 08:41的最新版本

Memcached集群

教你用Magent实现Memcached集群

优化

remove RDB固化

#dbfilename dump_7000.rdb

pre 常用脚本



 cat  /data/evan/redisloop.sh
#!/bin/bash
#usage  redisloop.sh   rr
cat  $1  | while read line
do

redis-cli    -c  -h    172.31.22.218   -p 7000  -a hell $line
redis-cli    -c  -h    172.31.22.218   -p 7001  -a hell   $line
redis-cli    -c  -h   172.31.16.135   -p 7002  -a hell   $line  
redis-cli    -c  -h   172.31.16.135   -p 7003  -a hell  $line
redis-cli    -c  -h   172.31.23.43   -p 7004  -a hell  $line
redis-cli    -c  -h   172.31.23.43   -p 7005  -a hell   $line
done


vi rr
del hello_coin_limit_045617153_2
del hello_coin_limit_9811460_2





 cat  redisin.sh 
#!/bin/bash
redis-cli    -c  -h    172.31.22.218   -p 7000  -a hello   `cat $1`
redis-cli    -c  -h    172.31.22.218   -p 7001  -a hello   `cat $1`
#
redis-cli    -c  -h   172.31.16.135   -p 7002  -a hello   `cat $1` #$1 # del hello_coin_list 
redis-cli    -c  -h   172.31.16.135   -p 7003  -a hello `cat $1` #$1 #del hello_coin_list 
# 
redis-cli    -c  -h   172.31.23.43   -p 7004  -a hello  `cat $1`#$1 #del hello_coin_list
redis-cli    -c  -h   172.31.23.43   -p 7005  -a hello   `cat $1` #$1 #del hello_coin_list

docker-compose

docker 18.09.6  太新版本可能不行 

相关脚本和配置 https://github.com/evan886/redis/tree/master/redis-cluster-docker_host

升级 or 降级 redis 版本

升级 or 降级 redis 版本 直接换 docker-compose.yml 里面的版本就行了

host 网络 要手工添加集群

同样要用firewall etc 要优化的地方 restart 已添加

升级 or 降级 redis 版本 直接换 docker-compose.yml 里面的版本就行了

但是在2021 新版本的docker #network_mode: host 要注释了 bind也要0.0.0.0 按照 Redis 官网:https://redis.io/topics/cluster-tutorial 的提示,为了使 Docker 与 Redis Cluster 兼容,您需要使用 Docker 的 host 网络模式。

Redis Cluster and Docker

Currently Redis Cluster does not support NATted environments and in general environments where IP addresses or TCP ports are remapped.

Docker uses a technique called port mapping: programs running inside Docker containers may be exposed with a different port compared to the one the program believes to be using. This is useful in order to run multiple containers using the same ports, at the same time, in the same server.

In order to make Docker compatible with Redis Cluster you need to use the host networking mode of Docker. Please check the --net=host option in the Docker documentation for more information.

相关脚本和配置 https://github.com/evan886/redis/tree/master/redis-cluster-docker_host


2021 单机版本
# cat docker-compose.yml 
version: "3"
services: 
    redis-cluster-6379:
        image: ccr.ccs.tencentyun.com/evan/devops:redis-alpine-v6.2.5
        container_name: node-6379
        ports:
            - "7379:6379"
        restart: always
        #network_mode: host
        volumes:
            - ./conf/redis-6379.conf:/usr/local/etc/redis/redis.conf
            - ./log:/var/log/redis
            - ./data:/data/redis
        command: sh -c "redis-server /usr/local/etc/redis/redis.conf"


# cat conf/redis-6379.conf 
port 6379
bind 0.0.0.0
#bind 192.168.10.120 127.0.0.1
#cluster-enabled yes
appendfilename "appendonly-6379.aof"
#cluster-node-timeout 15000
appendonly yes
appendfsync everysec
#daemonize yes
dbfilename dump_6379.rdb
requirepass "xxxxxxmhw3xd34"


redis-cli  -c  -h 192.168.10.120   -p 7379  -a 你的密码 

cat redis6 
Warning: Could not create server TCP listening socket 192.168.10.120:6379: bind: Address not available
node-6379             | 1:M 24 Sep 2021 08:12:19.283 # Failed listening on port 6379 (TCP), aborting.

# head  conf/redis-6379.conf 
port 6379
bind 0.0.0.0
#bind 192.168.10.120 127.0.0.1
改为4个0  

compose文件的 
      #network_mode: host

关掉后 





cluster 操作开始
Usage:
NOTE2020

git  clone https://github.com/evan886/redis.git
cd /data/apps && mv   redis/redis-cluster-docker_host/  redis-cluster-docker && rm  -rf redis

#运行
docker-compose up -d

#要改的地方
bind   172.18.178.218 127.0.0.1
批量替换 sed  
sed -i 's!old!new!' filename

 sed  -i 's!5.0.2-alpine!5.0.9-alpine!' docker-compose.yml
   
 sed -i 's!192.168.11.236!172.31.16.4!' *.conf

aliyu 不能 绑定外网NAT IP   bind 内网IP 然后 创建集群用 外网IP就可以了 

不然后
(error) CLUSTERDOWN Hash slot not served  cluster没起来 

#docker exec -it  node-7000  redis-cli -p 7000  --cluster create  10.25.196.78:7000     10.25.196.78:7001  10.25.196.78:7002  10.25.196.78:7003  10.25.196.78:7004  10.25.196.78:7005  --cluster-replicas 1

IP='192.168.10.193'
docker exec -it  node-7000  redis-cli -p 7000  --cluster create  $IP:7000     $IP:7001  $IP:7002  $IP:7003  $IP:7004  $IP:7005  --cluster-replicas 1

#如果是三台机器 6个节点 

#mark 
IP='172.31.127.221'
IP2='172.31.127.222'
IP3='172.31.127.223'
docker exec -it  node-7000  redis-cli -p 7000  --cluster create  ${IP}:7000     ${IP}:7001  ${IP2}:7002  ${IP2}:7003  ${IP3}:7004  ${IP3}:7005  --cluster-replicas 1


# #要改的地方 不要交互
echo 'masterauth passwd123d 
requirepass passwd123d' >>redis-7000.conf




check 

docker exec -it  node-7000  redis-cli -p 7000  -c   -h 483.284.7.34 -a passwd12Trttt3d




bind 要记得改为你要的IP  如果用0.0.0.0 那就不要127.0.0.1 
有问题多看log 目录 

#这里是母机的ip 如果是三台机器 那么就有 三个 IP 
docker exec -it  node-7000  redis-cli -p 7000  --cluster create  ip:7000     ip:7001  ip:7002  ip:7003  ip:7004  ip:7005  --cluster-replicas 1

docker exec -it  node-7000  redis-cli -p 7000  --cluster create --cluster-replicas 1 ip:7000     ip:7001  ip:7002  ip:7003  ip:7004  ip:7005 

三台母机的情形 就是每个docker-compose.yml 只启动两个 ,其它的删除就行了  201912

数据损坏重做 2020

内网的193机器  PHP老是搞坏,或者强行restart os   常常会有几个节点起不来 这时 只能重新做 cluster 

 data 目录下的mv 走或删除掉 
 conf 目录下的 先去掉密码  
 up -d 起所有节点 
 conf 用追加再添加回密码 
 docker-compose restart 起回所有的节点



laradock方法

相关文件


#注意  网络是这个, 还有就是多台机器之间 也不太可能能这个网络 那样 容器之间的redis 是不通的 
NETWORKS_DRIVER=bridge 

less  docker-compose.yml 
### Redis Cluster evan##########################################
    redis-cluster:
      build: ./redis-cluster
      ports:
        - "${REDIS_CLUSTER_PORT_RANGE}:7000-7005"
      networks:
        - backend


cat  redis-cluster/Dockerfile  #注意 redis版本
FROM grokzen/redis-cluster:5.0.6
#FROM grokzen/redis-cluster:latest
LABEL maintainer="hareku <[email protected]>"

添加密码

添加密码 可以进入容器里面直接添加 ,不过不够好 ,有空要 放到母机出来,有如我上面
004  7005  redis-cluster.tmpl	redis.tmpl  sentinel.tmpl
root@401a49002b88:/data# ls /redis-conf/700
7000/ 7001/ 7002/ 7003/ 7004/ 7005/ 
root@401a49002b88:/data# ls /redis-conf/7000/redis.conf 
/redis-conf/7000/redis.conf
root@401a49002b88:/data# tail /redis-conf/7000/redis.conf 
bind 0.0.0.0
port 7000
cluster-enabled yes
cluster-config-file nodes.conf
cluster-node-timeout 5000
appendonly yes
dir /redis-data/7000


进入redis-cluster 容器 直接非交互  这里以7005 端口为例子 

redis-cli  -c  -h 127.0.0.1  -p 7005   config set masterauth 36DbRGvv66 
redis-cli  -c  -h 127.0.0.1  -p 7005   config set requirepass 36DbRGvv66 
redis-cli  -c  -h 127.0.0.1  -p 7005 auth  36DbRGvv66

redis-cli  -c  -h 127.0.0.1  -p 7005   -a 36DbRGvv66  config rewrite
redis-cli  -c  -h 127.0.0.1  -p 7005  config rewrite  # 最后这一步 有时得 加上密码 



Usage:  可以直接用物理机的ip  内网或者外网 

上次搞了几天 ,是忙晕了 不记得打开防火墙 7000-7005的端口

"host" network_mode is incompatible with port_bindings

docker-compose 中 network_mode 设置导致无法从容器外部访问 MySQL

源码手工

单独安装redis-cli

国内镜像
https://mirrors.huaweicloud.com/redis/

debian 上可以单独安装 redis-cli (packname redis-tools)
但是rhel居然不行 只能编译一下  

make  -j  2 之后 ,copy 走这个 bin 文件就行了  is centos   make MALLOC=libc  zmalloc.h:50:31: fatal error: jemalloc/jemalloc.h: No such file or directory

./src/redis-cli -c   这个二进制包放        /usr/bin/  #或者放 /usr/sbin  只有超级用户可以用到  如果其它用户要用 就不要放这里了 


redis cluster 执行脚本 不用老是一个一个的搞 麻烦   其实只要在三个主上执行就行了 你6个全执行也没事,反正是脚本的 

#!/bin/bash
##Usage  bash redisin.sh   你的redis脚本
redis-cli    -c  -h    172.31.22.218   -p 7000  -a hello   `cat $1`
redis-cli    -c  -h    172.31.22.218   -p 7001  -a hello   `cat $1`
#
redis-cli    -c  -h   172.31.16.135   -p 7002  -a hello   `cat $1` #$1 # del hello_list 


节点信息

角色                        主机名                                                             IP1               IP2       

7000  7001               01                   192.168.10.211     
7002  7003               02                   192.168.10.212      
7004  7005               03                   192.168.10.213      

姐妹篇 Redis4 cluster

防火墙设置

第一台:
firewall-cmd --permanent --add-port=7000/tcp
firewall-cmd --permanent --add-port=17000/tcp
firewall-cmd --permanent --add-port=7001/tcp
firewall-cmd --permanent --add-port=17001/tcp
firewall-cmd --reload
firewall-cmd --list-all-zones
第二台:
firewall-cmd --permanent --add-port=7002/tcp
firewall-cmd --permanent --add-port=17002/tcp
firewall-cmd --permanent --add-port=7003/tcp
firewall-cmd --permanent --add-port=17003/tcp
firewall-cmd --reload
firewall-cmd --list-all-zones
第三台:
firewall-cmd --permanent --add-port=7004/tcp
firewall-cmd --permanent --add-port=17004/tcp
firewall-cmd --permanent --add-port=7005/tcp
firewall-cmd --permanent --add-port=17005/tcp
firewall-cmd --reload
firewall-cmd --list-all-zones

系统参数设置

#vi /etc/sysctl.conf
echo 'vm.overcommit_memory = 1
net.core.somaxconn = 1024' >>/etc/sysctl.conf

/sbin/sysctl -p /etc/sysctl.conf

redis 5 安装

#bash redisins.sh 2>&1 | tee redislog

wget -c http://download.redis.io/releases/redis-5.0.6.tar.gz
#set var
redis_install_dir=/data/apps/redis
redis_ver=5.0.6

THREAD=4
tar xzf redis-${redis_ver}.tar.gz
pushd redis-${redis_ver} > /dev/null

make  -j ${THREAD}

make PREFIX=${redis_install_dir} 
make distclean
#cd src && make install #这个才行 特别是cluster ? 2019年 8月16日 星期五 23时29分41秒 CST
make install  PREFIX=${redis_install_dir}  
echo "export PATH=${redis_install_dir}/bin/:$PATH" >> /etc/profile && source /etc/profile

####**********************下面是老的
wget -c http://download.redis.io/releases/redis-5.0.5.tar.gz
redis_install_dir=/home/apps/redis
redis_ver=5.0.5

THREAD=4
tar xzf redis-${redis_ver}.tar.gz
pushd redis-${redis_ver} > /dev/null
make  -j ${THREAD}
make PREFIX=/home/apps/redis #here
make distclean
#cd src && make install #这个才行 特别是cluster ? 2019年 8月16日 星期五 23时29分41秒 CST
make install  PREFIX=/home/apps/redis  # make install #这个有时没有创建出目录来呀

#这个我没做 根本没用 哈哈 
#复制rb 或者放到安装的bin目录 然后再加path 
#cp /opt/redis-5.0.0/src/redis-trib.rb /usr/local/bin

echo 'export PATH=/home/apps/redis/bin/:$PATH' >> /etc/profile && source /etc/profile
##**********************上面是老的
NOTE
redis5 用redis-cli创建整个redis集群(redis5以前的版本集群是依靠ruby脚本redis-trib.rb实现

创建节点

#第一台:192.168.10.211 #here
redis_install_dir=/data/apps/redis
 mkdir -p ${redis_install_dir}
cd ${redis_install_dir} 
mkdir -p redis_cluster
cd redis_cluster
mkdir data 7000 7001

#cp /root/src/redis-5.0.5/redis.conf  ${redis_install_dir}/redis_cluster
#cd  /home/apps/redis/redis_cluster
#cp redis.conf 7000/redis_7000.conf
#mv redis.conf  7001/redis_7001.conf


#第2台:192.168.10.212
redis_install_dir=/data/apps/redis
mkdir -p ${redis_install_dir}
cd ${redis_install_dir} 
mkdir -p redis_cluster
cd redis_cluster
mkdir data 7002 7003

#cp /root/src/redis-5.0.5/redis.conf  .
#cp  redis.conf 7002/redis_7002.conf
#mv redis.conf  7003/redis_7003.conf


#第3台:192.168.10.213
redis_install_dir=/data/apps/redis
mkdir -p ${redis_install_dir}
cd ${redis_install_dir} 
mkdir -p redis_cluster
cd redis_cluster
mkdir data 7004 7005
#cp /root/src/redis-5.0.5/redis.conf  .
#cp redis.conf 7004/redis_7004.conf
#mv redis.conf 7005/redis_7005.conf


修改配置文件(三台机器6个配置)

note  日志在系统那  因为我们配置文件没指定 /var/log/redis/

ls /home/apps/redis/redis_cluster/data/
appendonly-7000.aof  dump_7000.rdb  nodes_7000.conf
appendonly-7001.aof  dump_7001.rdb  nodes_7001.conf
# 生成在这里了  /home/apps/redis/redis_cluster/data/nodes_7000.conf  nodes_7001.conf

配置建议加上这个  下面这些配置还加上的 
# appendfsync always
appendfsync everysec
# appendfsync no

第一台:
 pushd /home/apps/redis/redis_cluster
mkdir -p /var/log/redis
: > 7000/redis_7000.conf
#vi 7000/redis_7000.conf
#非交互进行
echo 'port 7000
bind 192.168.10.211 127.0.0.1
cluster-enabled yes
appendfilename "appendonly-7000.aof"
cluster-config-file nodes_7000.conf 
cluster-node-timeout 15000
appendonly yes
appendfsync everysec
daemonize yes
dbfilename dump_7000.rdb
dir /data/apps/redis/redis_cluster/data 
logfile "/var/log/redis/7000.log"
protected-mode yes
pidfile /var/run/redis_7000.pid'>7000/redis_7000.conf


:>7001/redis_7001.conf
echo 'port 7001
bind 192.168.10.211 127.0.0.1
cluster-enabled yes
appendfilename "appendonly-7001.aof"
cluster-config-file nodes_7001.conf
cluster-node-timeout 15000
appendonly yes
appendfsync everysec
daemonize yes
dbfilename dump_7001.rdb
dir /home/apps/redis/redis_cluster/data 
logfile "/var/log/redis/7001.log"
protected-mode yes
pidfile /var/run/redis_7001.pid'>7001/redis_7001.conf


第二台 
 pushd /home/apps/redis/redis_cluster
mkdir -p /var/log/redis
:>7002/redis_7002.conf
echo 'port 7002
bind 192.168.10.212 127.0.0.1
cluster-enabled yes
appendfilename "appendonly-7002.aof"
cluster-config-file nodes_7002.conf
cluster-node-timeout 15000
appendonly yes
appendfsync everysec
daemonize yes
dbfilename dump_7002.rdb
dir /home/apps/redis/redis_cluster/data 
logfile "/var/log/redis/7002.log"
protected-mode yes
pidfile /var/run/redis_7002.pid' >7002/redis_7002.conf

:>7003/redis_7003.conf
echo 'port 7003
bind 192.168.10.212 127.0.0.1
cluster-enabled yes
appendfilename "appendonly-7003.aof"
cluster-config-file nodes_7003.conf
cluster-node-timeout 15000
appendonly yes
appendfsync everysec
daemonize yes
dbfilename dump_7003.rdb
dir /home/apps/redis/redis_cluster/data 
logfile "/var/log/redis/7003.log"
protected-mode yes
pidfile /var/run/redis_7003.pid'>7003/redis_7003.conf


第3台
 pushd /home/apps/redis/redis_cluster
mkdir -p /var/log/redis
:>7004/redis_7004.conf
echo 'port 7004
bind 192.168.10.213 127.0.0.1
cluster-enabled yes
appendfilename "appendonly-7004.aof"
cluster-config-file nodes_7004.conf
cluster-node-timeout 15000
appendonly yes
appendfsync everysec
daemonize yes
dbfilename dump_7004.rdb
dir /home/apps/redis/redis_cluster/data 
logfile "/var/log/redis/7004.log"
protected-mode yes
pidfile /var/run/redis_7004.pid ' > 7004/redis_7004.conf

:>7005/redis_7005.conf
echo 'port 7005
bind 192.168.10.213 127.0.0.1
cluster-enabled yes
appendfilename "appendonly-7005.aof"
cluster-config-file nodes_7005.conf
cluster-node-timeout 15000
appendonly yes
daemonize yes
dbfilename dump_7005.rdb
dir /home/apps/redis/redis_cluster/data 
logfile "/var/log/redis/7005.log"
protected-mode yes
pidfile /var/run/redis_7005.pid' >7005/redis_7005.conf

启动redis

#cd /usr/local/redis/etc/redis_cluster #on freebsd
第一台: #注意用 "" 不要'' 要替换变量的值
mkdir /var/log/redis
redis_install_dir=/data/apps/redis
echo  "redis_install_dir=/data/apps/redis
${redis_install_dir}/bin/redis-server ${redis_install_dir}/redis_cluster/7000/redis_7000.conf
${redis_install_dir}/bin/redis-server ${redis_install_dir}/redis_cluster/7001/redis_7001.conf">${redis_install_dir}/redis_cluster/run

chmod +x ${redis_install_dir}/redis_cluster/run && bash ${redis_install_dir}/redis_cluster/run
chmod  +x /etc/rc.d/rc.local
echo "${redis_install_dir}/redis_cluster/run" > >/etc/rc.d/rc.local #把变量替换为值,不建议用''

第二台
mkdir /var/log/redis
redis_install_dir=/data/apps/redis
echo "${redis_install_dir}/bin/redis-server ${redis_install_dir}/redis_cluster/7002/redis_7002.conf
${redis_install_dir}/bin/redis-server ${redis_install_dir}/redis_cluster/7003/redis_7003.conf">${redis_install_dir}/redis_cluster/run

chmod +x ${redis_install_dir}/redis_cluster/run && bash ${redis_install_dir}/redis_cluster/run
chmod  +x /etc/rc.d/rc.local
echo "${redis_install_dir}/redis_cluster/run" > >/etc/rc.d/rc.local #把变量替换为值


第三台:
mkdir /var/log/redis
redis_install_dir=/data/apps/redis
echo "${redis_install_dir}/bin/redis-server ${redis_install_dir}/redis_cluster/7004/redis_7004.conf
${redis_install_dir}/bin/redis-server ${redis_install_dir}/redis_cluster/7005/redis_7005.conf">${redis_install_dir}/redis_cluster/run

chmod +x ${redis_install_dir}/redis_cluster/run && bash ${redis_install_dir}/redis_cluster/run
chmod  +x /etc/rc.d/rc.local
echo "${redis_install_dir}/redis_cluster/run"  >>/etc/rc.d/rc.local #把变量替换为值

登陆redis

/home/apps/redis/bin/redis-cli  -c -h  192.168.10.211 -p 7000
redis-cli -h 10.3.10.141 -p 7001

redis-cli -h 10.3.10.142 -p 7002
redis-cli -h 10.3.10.142 -p 7003

redis-cli -h 10.3.10.143 -p 7004
redis-cli -h 10.3.10.143 -p 7005

创建集群

注意:在任意一台上运行 不要在每台机器上都运行,一台就够了
#要开通端口  firewalld
#在geany 有: 格式可能有点不对 要注意 
redis-cli --cluster create --cluster-replicas 1 192.168.10.211:7000 192.168.10.211:7001 192.168.10.212:7002 192.168.10.212:7003 192.168.10.213:7004  192.168.10.213:7005
#--replicas  1  表示 自动为每一个master节点分配一个slave节点    上面有6个节点,程序会按照一定规则生成 3个master(主)3个slave(从)

执行详情

 [root@dev-hello-1 redis_cluster]# redis-cli --cluster create --cluster-replicas 1 192.168.10.201:7000 192.168.10.201:7001 192.168.10.202:7002 192.168.10.202:7003 192.168.10.203:7004  192.168.10.203:7005
>>> Performing hash slots allocation on 6 nodes...
Master[0] -> Slots 0 - 5460
Master[1] -> Slots 5461 - 10922
Master[2] -> Slots 10923 - 16383
Adding replica 192.168.10.202:7003 to 192.168.10.201:7000
Adding replica 192.168.10.203:7005 to 192.168.10.202:7002
Adding replica 192.168.10.201:7001 to 192.168.10.203:7004
M: caf3a2c83f4f34498d9152161d3d62ca499094eb 192.168.10.201:7000
   slots:[0-5460] (5461 slots) master
S: ecbc0c648ff15c4ff2c176563afa580c7c8b7f3b 192.168.10.201:7001
   replicates 3792aae886d957e1a0272bcd198a06798f05c26d
M: 9c2f0b7827180d93371b493e8ca59b6eea776b0c 192.168.10.202:7002
   slots:[5461-10922] (5462 slots) master
S: b66f09b38e321ce3f8ee000b7cb40fe804f3a450 192.168.10.202:7003
   replicates caf3a2c83f4f34498d9152161d3d62ca499094eb
M: 3792aae886d957e1a0272bcd198a06798f05c26d 192.168.10.203:7004
   slots:[10923-16383] (5461 slots) master
S: a027592b56eb7477fe039786490318efdda8a0d6 192.168.10.203:7005
   replicates 9c2f0b7827180d93371b493e8ca59b6eea776b0c
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.10.201:7000)
M: caf3a2c83f4f34498d9152161d3d62ca499094eb 192.168.10.201:7000
   slots:[0-5460] (5461 slots) master
   1 additional replica(s)
S: a027592b56eb7477fe039786490318efdda8a0d6 192.168.10.203:7005
   slots: (0 slots) slave
   replicates 9c2f0b7827180d93371b493e8ca59b6eea776b0c
M: 3792aae886d957e1a0272bcd198a06798f05c26d 192.168.10.203:7004
   slots:[10923-16383] (5461 slots) master
   1 additional replica(s)
M: 9c2f0b7827180d93371b493e8ca59b6eea776b0c 192.168.10.202:7002
   slots:[5461-10922] (5462 slots) master
   1 additional replica(s)
S: ecbc0c648ff15c4ff2c176563afa580c7c8b7f3b 192.168.10.201:7001
   slots: (0 slots) slave
   replicates 3792aae886d957e1a0272bcd198a06798f05c26d
S: b66f09b38e321ce3f8ee000b7cb40fe804f3a450 192.168.10.202:7003
   slots: (0 slots) slave
   replicates caf3a2c83f4f34498d9152161d3d62ca499094eb
[OK] All nodes agree about slots configuration.
>>> Check for open slots...
>>> Check slots coverage...
[OK] All 16384 slots covered.

查看redis集群情况

redis-cli -h 192.168.10.211 -p 7000 cluster nodes

a027592b56eb7477fe039786490318efdda8a0d6 192.168.10.203:7005@17005 slave 9c2f0b7827180d93371b493e8ca59b6eea776b0c 0 1567502665000 6 connected
3792aae886d957e1a0272bcd198a06798f05c26d 192.168.10.203:7004@17004 master - 0 1567502666171 5 connected 10923-16383
9c2f0b7827180d93371b493e8ca59b6eea776b0c 192.168.10.202:7002@17002 master - 0 1567502664166 3 connected 5461-10922
ecbc0c648ff15c4ff2c176563afa580c7c8b7f3b 192.168.10.201:7001@17001 slave 3792aae886d957e1a0272bcd198a06798f05c26d 0 1567502664000 5 connected
caf3a2c83f4f34498d9152161d3d62ca499094eb 192.168.10.201:7000@17000 myself,master - 0 1567502663000 1 connected 0-5460
b66f09b38e321ce3f8ee000b7cb40fe804f3a450 192.168.10.202:7003@17003 slave caf3a2c83f4f34498d9152161d3d62ca499094eb 0 1567502665169 4 connected

cluster 完整性检查


redis-trib.rb check 10.3.10.140:7000
redis-trib.rb check 10.3.10.140:7001
redis-trib.rb check 10.3.10.140:7002
redis-trib.rb check 10.3.10.140:7003
redis-trib.rb check 10.3.10.140:7004
redis-trib.rb check 10.3.10.140:7005

结果如下  16384个槽都分配到了 节点 

[OK] All nodes agree about slots configuration.
>>> Check for open slots...
>>> Check slots coverage...
[OK] All 16384 slots covered.

测试

  
redis-cli -c -h  192.168.10.201 -p 7000

[root@dev-hello-1 redis_cluster]# redis-cli -c -h  192.168.10.201 -p 7000
192.168.10.201:7000> set evan 36
-> Redirected to slot [14924] located at 192.168.10.203:7004
OK
192.168.10.203:7004> 

[root@dev-hello-2 redis_cluster]# redis-cli -c -h  192.168.10.202 -p 7002
192.168.10.202:7002> get evan 
-> Redirected to slot [14924] located at 192.168.10.203:7004
"36"
192.168.10.203:7004> 

dev-hello-3 redis_cluster]#  redis-cli -c -h  192.168.10.203  -p 7005
192.168.10.203:7005> get evan
-> Redirected to slot [14924] located at 192.168.10.203:7004
"36"
192.168.10.203:7004>

测试通过了 




#20191113  
要加 -a 密码访问  不然老是提示要密码
[root@prod-02 ~]# redis-cli  -c -h 172.16.200.12 -p 7002
172.16.200.12:7002> auth ci1723
OK
172.16.200.12:7002> get evan
-> Redirected to slot [14924] located at 172.16.200.7:7004
(error) NOAUTH Authentication required.
172.16.200.7:7004> auth ci1723
OK
172.16.200.7:7004> get evan 
"56;"




添加redis集群密码

方式一:修改所有Redis集群中的redis.conf文件加入

 
#不要交互 

for file  in  `ls *.conf`

do
echo 'masterauth passwd123dHello 
requirepass passwd123dHello' >>$file

done 

test visa
  docker exec -it  node-7000  redis-cli -p 7000  -c   -h 172.31.16.4 -a passwd12Trttt3d





echo 'masterauth passwd123d 
requirepass passwd123d' >>redis-7000.conf






# NOTE   还是这个办法好  不然可能有些 没加载到配置文件去呢 
masterauth passwd123 
requirepass passwd123 
说明:这种方式需要重新启动各节点

方式二:进入各个实例进行设置 就是所有节点:不建议

 
redis-cli -c -h 10.3.10.141 -p 7001
#好像不能一起执行
config set masterauth 36DbRGvv 
config set requirepass 36DbRGvv 
auth  36DbRGvv
config rewrite 

添加redis集群密码 一开始忘记加-c 导致 143 两个都加不上了  redis本身的密码这样就有了

-a 后 再执行命令就再 auth , 而如果是进入后 auth password 要每次 都再验证一下密码 麻烦 

redis client redis-tools or redis-cli


下载 解压源码
sudo make -j 9
sudo cp  src/redis-cli  /usr/bin/redis-cli


开机自己启动

#非交互
redis_install_dir=/data/apps/redis
echo "${redis_install_dir}/bin/redis-server ${redis_install_dir}/redis_cluster/7004/redis_7004.conf
${redis_install_dir}/bin/redis-server ${redis_install_dir}/redis_cluster/7005/redis_7005.conf">${redis_install_dir}/redis_cluster/run

chmod +x ${redis_install_dir}/redis_cluster/run && bash ${redis_install_dir}/redis_cluster/run
chmod  +x /etc/rc.d/rc.local
echo "${redis_install_dir}/redis_cluster/run"  >>/etc/rc.d/rc.local #把变量替换为值

#交互
vi /apps/redis/redis_cluster/run

/apps/redis/bin/redis-server /home/apps/redis/redis_cluster/7004/redis_7004.conf
/apps/redis/bin/redis-server /home/apps/redis/redis_cluster/7005/redis_7005.conf

chmod  +x  /apps/redis/redis_cluster/run
chmod +x /etc/rc.d/rc.local

 vi  /etc/rc.d/rc.local
/apps/redis/redis_cluster/run


开启关闭

redis-cli -a xxx -c -h 192.168.0.60 -p 8001 shutdown  #集群cluster_state变成了fail状态?  不过要服务正常的情况下才行 

troubleshooting

收到报警 

Labels
alertname = vm_host_down
instance = redis://10.3.10.141:7000
job = redis_cluster

severity = page
Annotations
description = redis://10.3.10.141:7000 of job market_redis_cluster has been down for more than 1 minutes..
summary = Instance redis://10.3.10.141:7000 down



 7000 进程在但是 登录不进去 

日志如下 
03:01:16.166 # Unable to connect to MASTER: No such file or directory
22283:S 16 Jun 03:01:17.167 * Connecting to MASTER ?:7003
22283:S 16 Jun 03:01:17.175 # Unable to connect to MASTER: No such file or directory
22283:S 16 Jun 03:01:18.177 * Connecting to MASTER ?:7003


处理办法   
kill -9 7000的 再启动   暂时正常






ISCONF Errors writing to the AOF file: No space left on device; nested exception is redis.clients.jedis.exceptions.JedisDataException: MISCONF Errors writing to the AOF file: No space left on device

org.springframework.dao.InvalidDataAccessApiUsageException: MISCONF Errors writing to the AOF file: No space left on device; nested exception is redis.clients.jedis.exceptions.JedisDataException: MISCONF Errors writing to the AOF file: No space left on device

原因 有一个台redis的机器 空间100% 





tail  boot.log
[  OK  ] Started Network Time Service.
[FAILED] Failed to start /etc/rc.d/rc.local Compatibility.
See 'systemctl status rc-local.service' for details.

#启动rc-local 服务  on aliyun 不要不小心 不清空了  /etc/rc.d/rc.local
 systemctl enable  rc-local.service

redis 安装报错 jemalloc/jemalloc.h: No such file or directory

理上次编译残留文件,重新编译

make distclean  && make

导致出现这个错误的原因

  错误的本质是我们在开始执行make 时遇到了错误(大部分是由于gcc未安装),然后我们安装好了gcc 后,我们再执行make ,这时就出现了jemalloc/jemalloc.h: No such file or directory。这是因为上次的


ERROR: for redis-cluster-8005  Cannot start service redis-cluster-8005: OCI runtime create failed: container_linux.go:346: starting container process caused "process_linux.go:449: container init caused \"rootfs_linux.go:58: mounting \\\"/home/redis-cluster-docker_host/conf/redis-8005.conf\\\" to rootfs \\\"/var/lib/docker/overlay2/f80340e6f1abc4aa43cde08ba4c5aa48787b092cbbbb64f01c5f0ad213d71368/merged\\\" at \\\"/var/lib/docker/overlay2/f80340e6f1abc4aa43cde08ba4c5aa48787b092cbbbb64f01c5f0ad213d71368/merged/usr/local/etc/redis/redis.conf\\\" caused \\\"not a directory\\\"\"": unknown: Are you trying to mount a directory onto a file (or vice-versa)? Check if the specified host path exists and is the expected type
ERROR: Encountered errors while bringing up the project.
[root@stage-secret-im-rabbitmq03 redis-cluster-docker_host]# docker -V 
^C
[root@stage-secret-im-rabbitmq03 redis-cluster-docker_host]# docker -v
Docker version 19.03.5, build 633a0ea
[root@stage-secret-im-rabbitmq03 redis-cluster-docker_host]# docker-compose  down 
Removing node-8004 ... done
Removing node-8005 ... done
Removing node-8003 ... done
Removing node-8001 ... done
Removing node-8002 ... done
Removing node-8006 ... done



断电后,node文件  nodes-7002.conf 内容中多了一个V 删除后正常


他们用  jedis 连接报的错 
redis.clients.jedis.exceptions.JedisConnectionException: Could not get a resource from the pool
  at redis.clients.jedis.util.Pool.getResource(Pool.java:59)



应该是有些配置文件没写入密码  也可能是我当时写错  写到上一个目录来了 


Creating Server TCP listening socket *:6379: bind: No such file or directory

问题描述

Creating Server TCP listening socket *:6379: bind: No such file or directory 解决思路

我这边检查之后发现Redis服务已经启动了

   redis-cli 去看是否能连接上,进的去执行 shutdown 就断开连接,重新执行就可以启动 如果可以的话 
   ps -ef | grep redis 查看服务是否已经启动,kill -9 PID 杀掉服务重新启动

redis 安装报错 jemalloc/jemalloc.h: No such file or directory。

make jemalloc/jemalloc.h: No such file or directory

make时报如下错误:

zmalloc.h:50:31: error: jemalloc/jemalloc.h: No such file or directory
zmalloc.h:55:2: error: #error "Newer version of jemalloc required"
make[1]: *** [adlist.o] Error 1
make[1]: Leaving directory `/data0/src/redis-2.6.2/src'
make: *** [all] Error 2

原因是jemalloc重载了Linux下的ANSI C的malloc和free函数。解决办法:make时添加参数。

make MALLOC=libc

断电后 cluster损坏

查看日志 
tail  log/7000.log
1:M 31 Aug 2020 02:20:53.960 # Bad file format reading the append only file: make a backup of your AOF file, then use ./redis-check-aof --fix <filename>

不知道存放路径的可以查找find / -name redis-check-aof

apt install redis-tools

-7000.conf  nodes-7003.conf  temp-169.rdb

因为起不来的是 7004节点容器 所以有针对的 修复 命令如下 
root@cailuw-dev:/home/apps/redis_cluster/data# redis-check-aof --fix appendonly-7004.aof
The AOF appears to start with an RDB preamble.
Checking the RDB preamble to start:
[offset 0] Checking RDB file --fix
[offset 26] AUX FIELD redis-ver = '5.0.2'
[offset 40] AUX FIELD redis-bits = '64'
[offset 52] AUX FIELD ctime = '1598476864'
[offset 67] AUX FIELD used-mem = '3217224'
[offset 83] AUX FIELD aof-preamble = '1'
[offset 85] Selecting DB ID 0
[offset 226540] Checksum OK
[offset 226540] \o/ RDB looks OK! \o/
[info] 1999 keys read
[info] 134 expires
[info] 110 already expired
RDB preamble is OK, proceeding with AOF tail...
0x         2eaac6d: Expected prefix '*', got: '
AOF analyzed: size=48934026, ok_up_to=48933997, diff=29
This will shrink the AOF from 48934026 bytes, with 29 bytes, to 48933997 bytes
Continue? [y/N]: y
Successfully truncated AOF


Warning: AUTH failed

7002> get evan 
-> Redirected to slot [14924] located at 192.168.10.53:7004
Warning: AUTH failed
"36"


(error) ERR Client sent AUTH, but no password is set

cli版本太高了 
evan@myxps:~$ redis-cli  --version
redis-cli 6.0.6


see also

Redis 日志篇:无畏宕机快速恢复的杀手锏

https://redis.io/topics/cluster-tutorial

http://redisdoc.com/topic/cluster-tutorial.html

Docker 搭建 Redis Cluster 集群环境

Redis cluster集群:原理及搭建

(八)Redis集群常用命令、集群节点新增删除

Docker Compose 搭建 Redis Cluster 集群环境

redis集群,添加删除槽

redis-5.0 cluster带认证及客户端连接

Redis 5 之后版本的高可用集群搭建

Redis——Cluster集群搭建及节点的添加、删除


redis(二)集群 redis-cluster & redis主从同步

redis cluster查找key的流程


主从服务器与集群的区别以及Redis中主从服务器的搭建

redis cluser查看每个主节点管理的slot和从节点

redis 集群查看key在某一个具体的节点上

单节点 Docker docker-compose安装redis单节点

https://kb.objectrocket.com/redis/run-redis-with-docker-compose-1055


Redis 4集群配置