一、Windown 下安装

1.1 下载: https://github.com/MSOpenTech/redis/releases

2. 解压:

3. 加入环境变量(就不需要到解压目录运行命令)

  1. //redis-server.exe运行程序
  2. //redis.windows.conf配置文件, 可以不加,会使用默认配置
  3. redis-server.exe redis.windows.conf

clipboard (2).png

二、Linux 下安装

2.1 下载 安装及编译

  1. //放到特定位置
  2. //这里放到/usr/local/
  3. cd /usr/local/
  4. //注意权限问题,需要权限,则加上sudo 运行
  5. //下载
  6. wget http://download.redis.io/releases/redis-6.0.0.tar.gz
  7. //解压
  8. tar xzf redis-6.0.0.tar.gz
  9. //切换到解压目录
  10. cd redis-6.0.0
  11. //编译
  12. make
  • 问题
    1. linux 安装
    2. sudo apt remove apparmor
    3. 解决:
    4. Could not create server TCP listening socket 0.0.0.0:6379: unable to bind socket, errno: 13

    2.2 启动

    1. src/redis-server

三、Docker 安装(推荐)

3.1 创建文件夹

  1. mkdir -p $PWD/redis/{data,conf}

3.2 拷贝配置文件

  1. #先启动一个redis 服务
  2. docker run -p 6379:6379 --name redis -d redis:6.0
  3. #拷贝配置文件(可能找不到)
  4. docker cp redis:/etc/redis/redis.conf $PWD/conf
  5. #到官网下载
  6. #https://redis.io/download
  7. #https://github.com/antirez/redis/blob/6.0/redis.conf
  8. wget https://raw.githubusercontent.com/antirez/redis/6.0/redis.conf

3.3 配置(进入配置文件修改以下属性)

  1. port 6379
  2. requirepass 123456 #设置密码
  3. protected-mode no #保护模式(yes|no)
  4. bind 127.0.0.1  #绑定访问的地址,如果想任何地址都能访问,加上注释

3.4 启动

  1. docker container stop redis
  2. docker container rm redis
  3. docker run -d -p 6379:6379 \
  4. --name redis \
  5. -v $PWD/redis/conf/redis.conf:/conf/redis.conf \
  6. -v $PWD/redis/data:/data \
  7. --restart=always \
  8. --privileged=true \
  9. redis:6.0 redis-server /conf/redis.conf #指定配置文件启动

四、docker搭建主从

4.1 修改配置

  • 获取配置

    1. wget http://download.redis.io/redis-stable/redis.conf
  • master 配置

    1. port 6123 #这里修改了默认端口6379
    2. protected-mode no #关闭保护模式
    3. bind 0.0.0.0 #测试,开放给所有ip 都能访问, 生产环境注意绑定特定ip
    4. requirepass test #密码
  • slave1

    1. masterauth test #主节点验证密码
    2. port 6124 #这里修改了默认端口6379
    3. protected-mode no #关闭保护模式
    4. bind 0.0.0.0 #测试,开放给所有ip 都能访问, 生产环境注意绑定特定ip
    5. requirepass test #密码
    6. #指定主节点
    7. replicaof redis-master 6123
  • slave2

    1. masterauth test #主节点验证密码
    2. port 6125 #这里修改了默认端口6379
    3. protected-mode no #关闭保护模式
    4. bind 0.0.0.0 #测试,开放给所有ip 都能访问, 生产环境注意绑定特定ip
    5. requirepass test #密码
    6. #指定主节点
    7. replicaof redis-master 6123

    4.2 docker-compose.yml

    ```shell version: ‘3’ services: redis-master: image: ‘redis:6.0’ container_name: ‘redis-server-master’ restart: always privileged: true expose:

    1. - 6123

    environment:

    1. TZ: "Asia/Shanghai" #时区,保证时间正确

    volumes:

    1. - '$PWD/redis/master/conf/redis.conf:/usr/local/etc/redis/redis.conf'
    2. - '$PWD/redis/master/data:/data'

    networks:

    1. - ms-redis-netword

    command: [“redis-server”, “/usr/local/etc/redis/redis.conf”] redis-slave-1: image: ‘redis:6.0’ container_name: ‘redis-server-slave-1’ restart: always privileged: true expose:

    1. - 6124

    environment:

    1. TZ: "Asia/Shanghai" #时区,保证时间正确

    volumes:

    1. - '$PWD/redis/slave1/conf/redis.conf:/usr/local/etc/redis/redis.conf'
    2. - '$PWD/redis/slave1/data:/data'

    networks:

    1. - ms-redis-netword

    depends_on:

    1. - redis-master

    command: [“redis-server”, “/usr/local/etc/redis/redis.conf”] redis-slave-2: image: ‘redis:6.0’ container_name: ‘redis-server-slave-2’ restart: always privileged: true expose:

    1. - 6125

    environment:

    1. TZ: "Asia/Shanghai" #时区,保证时间正确

    volumes:

    1. - '$PWD/redis/slave2/conf/redis.conf:/usr/local/etc/redis/redis.conf'
    2. - '$PWD/redis/slave2/data:/data'

    networks:

    1. - ms-redis-netword

    depends_on:

    1. - redis-master

    command: [“redis-server”, “/usr/local/etc/redis/redis.conf”]

networks: ms-redis-netword: driver: bridge

  1. <a name="eR4ex"></a>
  2. #### 4.3 启动验证
  3. ```shell
  4. #连接master
  5. docker exec -it redis-server-master bash
  6. #连接redis
  7. redis-cli -p 6123
  8. #验证
  9. 127.0.0.1:6123> auth test
  10. OK
  11. #查看分片情况
  12. 127.0.0.1:6123> info replication
  13. # Replication
  14. role:master
  15. connected_slaves:2 #有两个从节点
  16. slave0:ip=192.168.48.3,port=6125,state=online,offset=826,lag=0
  17. slave1:ip=192.168.48.4,port=6124,state=online,offset=826,lag=0
  18. master_replid:b540d4dbee52d6284bda72186b55bec1b8064ab0
  19. master_replid2:0000000000000000000000000000000000000000
  20. master_repl_offset:826
  21. second_repl_offset:-1
  22. repl_backlog_active:1
  23. repl_backlog_size:1048576
  24. repl_backlog_first_byte_offset:1
  25. repl_backlog_histlen:826
  26. # 设置值
  27. 127.0.0.1:6123> set test1 java
  28. ## 登录从节点,看是否有同步
  29. docker exec -it redis-server-slave-1 bash
  30. #连接redis
  31. redis-cli -p 6124
  32. #验证
  33. 127.0.0.1:6124> auth test
  34. OK
  35. 127.0.0.1:6124> get test1
  36. "java"

4.4、配置 Sentinel 哨兵

Sentinel(哨岗、哨兵)是Redis的高可用性(high availability)解决方案:由一个或多个Sentinel实例(instance)组成的Sentinel系统(system)可以监视任意多个主服务器,以及这些主服务器属下的所有从服务器,并在被监视的主服务器进入下线状态时,自动将下线主服务器属下的某个从服务器升级为新的主服务器,然后由新的主服务器代替已下线的主服务器继续处理命令请求。

image.png

4.4.1、Sentinel系统监视服务器过程
  • 首先,Sentinel系统会挑选 server1 属下的其中一个从服务器,并将这个被选中的从服务器升级为新的主服务器。
  • 之后,Sentinel系统会向 server1 属下的所有从服务器发送新的复制指令,让它们成为新的主服务器的从服务器,当所有从服务器都开始复制新的主服务器时,故障转移操作执行完毕。
  • 另外,Sentinel还会继续监视已下线的server1,并在它重新上线时,将它设置为新的主服务器的从服务器。
  • 之后,如果server1重新上线的话,它将被Sentinel系统降级为server2的从服务器

4.4.2、搭建启动 Sentinel 哨兵 docker-compose.yml

注意: 外部访问,目前使用 host 模式

  1. network_mode: host
  1. version: "3"
  2. networks:
  3. redis-replication:
  4. driver: bridge
  5. ipam:
  6. config:
  7. - subnet: 172.25.0.0/24
  8. services:
  9. master:
  10. image: redis
  11. container_name: redis-master
  12. ports:
  13. - "6380:6379"
  14. volumes:
  15. - "./master/redis.conf:/etc/redis.conf"
  16. - "./master/data:/data"
  17. command: ["redis-server", "/etc/redis.conf"]
  18. restart: always
  19. networks:
  20. redis-replication:
  21. ipv4_address: 172.25.0.101
  22. slave1:
  23. image: redis
  24. container_name: redis-slave-1
  25. ports:
  26. - "6381:6379"
  27. volumes:
  28. - "./slave1/redis.conf:/etc/redis.conf"
  29. - "./slave1/data:/data"
  30. command: ["redis-server", "/etc/redis.conf"]
  31. restart: always
  32. networks:
  33. redis-replication:
  34. ipv4_address: 172.25.0.102
  35. slave2:
  36. image: redis
  37. container_name: redis-slave-2
  38. ports:
  39. - "6382:6379"
  40. volumes:
  41. - "./slave2/redis.conf:/etc/redis.conf"
  42. - "./slave2/data:/data"
  43. command: ["redis-server", "/etc/redis.conf"]
  44. restart: always
  45. networks:
  46. redis-replication:
  47. ipv4_address: 172.25.0.103
  48. sentinel1:
  49. image: redis
  50. container_name: redis-sentinel-1
  51. ports:
  52. - "26380:26379"
  53. volumes:
  54. - "./sentinel1/sentinel.conf:/etc/sentinel.conf"
  55. command: ["/bin/bash", "-c", "cp /etc/sentinel.conf /sentinel.conf && redis-sentinel /sentinel.conf"]
  56. restart: always
  57. networks:
  58. redis-replication:
  59. ipv4_address: 172.25.0.201
  60. sentinel2:
  61. image: redis
  62. container_name: redis-sentinel-2
  63. ports:
  64. - "26381:26379"
  65. volumes:
  66. - "./sentinel2/sentinel.conf:/etc/sentinel.conf"
  67. command: ["/bin/bash", "-c", "cp /etc/sentinel.conf /sentinel.conf && redis-sentinel /sentinel.conf"]
  68. restart: always
  69. networks:
  70. redis-replication:
  71. ipv4_address: 172.25.0.202
  72. sentinel3:
  73. image: redis
  74. container_name: redis-sentinel-3
  75. ports:
  76. - "26382:26379"
  77. volumes:
  78. - "./sentinel3/sentinel.conf:/etc/sentinel.conf"
  79. command: ["/bin/bash", "-c", "cp /etc/sentinel.conf /sentinel.conf && redis-sentinel /sentinel.conf"]
  80. restart: always
  81. networks:
  82. redis-replication:
  83. ipv4_address: 172.25.0.203

4.4.3、Redis 配置文件
  • master
    ```java port 6379 pidfile /var/run/redis_6379.pid protected-mode no timeout 0 tcp-keepalive 300 loglevel notice
########################### REPLICATION

slave-serve-stale-data yes slave-read-only yes repl-diskless-sync no repl-diskless-sync-delay 5 repl-disable-tcp-nodelay no

############################### RDB

dbfilename dump.rdb save 900 1 save 300 10 save 60 10000 stop-writes-on-bgsave-error yes rdbcompression yes rdbchecksum yes dir ./

############################### AOF

appendonly yes appendfilename “appendonly.aof” appendfsync everysec no-appendfsync-on-rewrite no aof-load-truncated yes aof-use-rdb-preamble no

  1. - Slave1
  2. ```shell
  3. ################################# REPLICATION #################################
  4. slaveof 172.25.0.101 6379
  • Slave2:

    1. ################################# REPLICATION #################################
    2. slaveof 172.25.0.101 6379
  • sentinel.conf ```shell

    所有哨兵端口都一致,因为使用 Docker 桥接网络映射

    port 26379

哨兵设置,所有哨兵皆一致,都指向 Master

sentinel monitor mymaster 172.25.0.101 6379 2 sentinel parallel-syncs mymaster 1 sentinel down-after-milliseconds mymaster 30000 sentinel failover-timeout mymaster 180000

bind 0.0.0.0 protected-mode no daemonize no pidfile /var/run/redis-sentinel.pid logfile “” dir /tmp

  1. <a name="OKcO6"></a>
  2. ##### 4.4.4、启动测试
  3. - 启动
  4. ```shell
  5. docker-compose up -d
  • 暂停master ,查看哨兵日志

    1. #模拟master 宕机
    2. docker stop redis-master
    3. # 查看哨兵日志
    4. docker logs --tail 100 redis-sentinel-1
    • 哨兵 sdown 主观判断 Master 失活,接着所有哨兵 odown 客观判断 Master 失活。此时 +new-epoch 1 进入第一轮选举。
    • 接着 +selected-slave slave 172.25.0.102:6379 选举出 102,即 Slave2 作为新的 Master,再 +promoted-slave 推举 Slave2 为新的 Master。
    • 最终依旧会去看 101 是否回来了,+sdown slave 172.25.0.101:6379 172.25.0.101 6379 @ mymaster 172.25.0.102 6379 发现 101 还没上线。
  • 重新启动 master ```shell docker restart redis-master

进入master

docker exec -it redis-master bash

查看是否可以写

redis-cli

127.0.0.1:6379> set test “111” (error) READONLY You can’t write against a read only replica.

  1. - redis-master down 状态取消掉
  2. - 然后把 redis-master 作为 Slave2 的从机
  3. <a name="ZhR70"></a>
  4. ### 五、搭建简单的集群
  5. <a name="Cy55Q"></a>
  6. #### 5.1 redis配置文件模板redis.cluster.template
  7. ```shell
  8. #关闭保护模式
  9. protected-mode no
  10. #端口
  11. port ${PORT}
  12. #后台运行
  13. daemonize no
  14. #配置,数据文件路径
  15. dir ./
  16. #是否开启持久化
  17. appendonly yes
  18. #是否开启集群
  19. cluster-enabled yes
  20. #集群配置文件
  21. cluster-config-file nodes.conf
  22. #节点连接超时时间
  23. cluster-node-timeout 15000

5.2 初始化配置文件脚本 init_redis_cluster.sh

  1. #!/bin/bash
  2. #删除创建的文件
  3. rm -rf $PWD/master $PWD/slave
  4. #master 和 slave 文件夹
  5. for port in `seq 7000 7005`; do
  6. ms="master"
  7. if [ $port -ge 7003 ]; then
  8. ms="slave"
  9. fi
  10. mkdir -p $PWD/$ms/$port/conf \
  11. && mkdir -vp $PWD/$ms/$port/data \
  12. && PORT=$port envsubst < ./redis.cluster.template > $PWD/$ms/$port/conf/redis.conf;
  13. done

5.3 创建redis容器脚本(create_redis_cluster.sh)

  1. #!/bin/bash
  2. #运行docker redis 的 master 和 slave 实例
  3. for port in `seq 7000 7005`; do
  4. ms="master"
  5. if [ $port -ge 7003 ]; then
  6. ms="slave"
  7. fi
  8. if [ "$(docker ps -q -f name=redis-cluster-$ms-$port)" ]; then
  9. #stop
  10. docker container stop redis-cluster-$ms-$port
  11. fi
  12. if [ "$(docker ps -aq -f status=exited -f name=redis-cluster-$ms-$port)" ]; then
  13. #cleanup
  14. docker container rm redis-cluster-$ms-$port
  15. fi
  16. # run your container
  17. docker run -d -p $port:$port -p 1$port:1$port \
  18. -v $PWD/$ms/$port/conf:/conf \
  19. -v $PWD/$ms/$port/data:/data \
  20. --privileged=true --restart always \
  21. --name redis-cluster-$ms-$port \
  22. --net network-redis-cluster \
  23. redis redis-server /conf/redis.conf;
  24. done

5.4 执行脚本,启动容器

  1. #注意,模板和脚本要在同一文件目录下
  2. sudo sh ./init_redis_cluster.sh
  3. sudo sh ./create_redis_cluster.sh
  4. #查看容器是否正常启动
  5. docker ps -a --filter "network=network-redis-cluster"

5.5 分配启动集群

  1. #!/bin/bash
  2. #拼接masters : slaves 节点参数
  3. matches=""
  4. for port in `seq 7000 7005`; do
  5. ms="master"
  6. if [ $port -ge 7003 ]; then
  7. ms="slave"
  8. fi
  9. matches=$matches$(docker inspect --format '{{(index .NetworkSettings.Networks "network-redis-cluster").IPAddress}}' "redis-cluster-$ms-${port}"):${port}" ";
  10. done
  11. # 创建docker-cluster
  12. # redis 4 or 3版本
  13. #需要redis-trib 镜像
  14. #docker run -it --rm --net redis-cluster-net redis-trib ruby redis-trib.rb create --replicas 1 $matches
  15. #redis 5 版本
  16. docker run -it --rm --net network-redis-cluster --privileged=true redis redis-cli --cluster create $matches --cluster-replicas 1
  17. #如果权限不够,则添加一下参数
  18. #--privileged=true

image.png

5.6 测试

  1. #登录7001redis
  2. docker exec -it redis-cluster-master-7001 bash
  3. #连接
  4. root@a70b1d940dae:/usr/local# redis-cli -c -p 7001
  5. 127.0.0.1:7001> set foo bar
  6. -> Redirected to slot [12182] located at 172.20.0.5:7002
  7. OK
  8. 172.20.0.5:7002> set hello world
  9. -> Redirected to slot [866] located at 172.20.0.4:7000
  10. OK
  11. 172.20.0.4:7000> get foo
  12. -> Redirected to slot [12182] located at 172.20.0.5:7002
  13. "bar"
  14. 172.20.0.5:7002> get hello
  15. -> Redirected to slot [866] located at 172.20.0.4:7000
  16. "world"
  17. 172.20.0.4:7000>

参考