Redis 中间件

一、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"

五、搭建简单的集群

5.1 redis配置文件模板redis.cluster.template

  1. #关闭保护模式
  2. protected-mode no
  3. #端口
  4. port ${PORT}
  5. #后台运行
  6. daemonize no
  7. #配置,数据文件路径
  8. dir ./
  9. #是否开启持久化
  10. appendonly yes
  11. #是否开启集群
  12. cluster-enabled yes
  13. #集群配置文件
  14. cluster-config-file nodes.conf
  15. #节点连接超时时间
  16. 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>

5.7 这里还涉及(待续…)

  • 添加节点
  • 移除节点
  • 重新调整节点分片大小

参考