Docker安装Redis,单机与集群

提高Docker的下载速度

  • 修改 /etc/docker/daemon.json 文件
vi /etc/docker/daemon.json 
  • 配置加速器
{
  "registry-mirrors": ["https://registry.docker-cn.com",
    "http://hub-mirror.c.163.com"
  ]
} 
  • 重启docker
service docker restart

1、取最新版的 Redis 镜像

docker pull redis:latest

2、查看本地镜像

  • 使用以下命令来查看是否已安装了 redis:
docker images

3、Docker挂载配置文件

接下来就是要将redis 的配置文件进行挂载,以配置文件方式启动redis 容器。(挂载:即将宿主的文件和容器内部目录相关联,相互绑定,在宿主机内修改文件的话也随之修改容器内部文件)

  1. 挂载redis的配置文件
  • liunx 下redis.conf文件位置: /home/wq/redis/myredis.conf
  1. 挂载redis 的持久化文件(为了数据的持久化)。
  • liunx 下redis的data文件位置 : /home/wq/redis/data

配置文件可以自定义

  • 创建目录
# 不存在就直接创建/home/redis 文件夹
mkdir -p /home/wq/redis/data

4、配置文件

# bind 192.168.1.100 10.0.0.1
# bind 127.0.0.1 ::1
#bind 127.0.0.1

protected-mode no

port 6379

tcp-backlog 511

timeout 0

tcp-keepalive 300

daemonize no

supervised no

pidfile /var/run/redis_6379.pid

loglevel notice

logfile ""

databases 1

always-show-logo yes

save 900 1
save 300 10
save 60 10000

stop-writes-on-bgsave-error yes

rdbcompression yes

rdbchecksum yes

dbfilename dump.rdb

dir ./

replica-serve-stale-data yes

replica-read-only yes

repl-diskless-sync no

repl-disable-tcp-nodelay no

replica-priority 100

lazyfree-lazy-eviction no
lazyfree-lazy-expire no
lazyfree-lazy-server-del no
replica-lazy-flush no

appendonly yes

appendfilename "appendonly.aof"

# 表示每执行一次写命令,立即记录到AOF文件
# appendfsync always
# 写命令执行完先放入A0F缓冲区,然后表示每隔1秒将缓冲区数据写到AOF文件,是默认方案
appendfsync everysec
# 写命令执行完先放入A0F缓冲区,由操作系统决定何时将缓冲区内容写回磁盘
# appendfsync no

# 禁止在rewrite期间做aof,避免因AOF引起的阻塞,性能要求高选择yes/高可用建议选择no
no-appendfsync-on-rewrite yes

# A0F文件比上次文件增长超过多少百分比则触发重写
auto-aof-rewrite-percentage 100
# AOF文件体积最小多大以上才触发重写
auto-aof-rewrite-min-size 64mb

aof-load-truncated yes

aof-use-rdb-preamble yes

lua-time-limit 5000

slowlog-max-len 128

notify-keyspace-events ""

hash-max-ziplist-entries 512
hash-max-ziplist-value 64

list-max-ziplist-size -2

list-compress-depth 0

set-max-intset-entries 512

zset-max-ziplist-entries 128
zset-max-ziplist-value 64

hll-sparse-max-bytes 3000

stream-node-max-bytes 4096
stream-node-max-entries 100

activerehashing yes

hz 10

dynamic-hz yes

aof-rewrite-incremental-fsync yes

rdb-save-incremental-fsync yes
# 利用rename-command修改或者禁用敏感命令
rename-command CONFIG jnacuq9lkncsiajc981

Redis的持久化虽然可以保证数据安全,但也会带来很多额外的开销,因此持久化请遵循下列建议:

  • 用来做缓存的Redis实例尽量不要开启持久化功能
  • 建议关闭RDB持久化功能,使用AOF持久化
  • 利用脚本定期在slave节点做RDB,实现数据备份
  • 设置合理的rewrite阈值,避免频繁的bgrewrite
  • 配置no-appendfsync-on-rewrite = yes,禁止在rewrite期间做aof,避免因AOF引起的阻塞
  • 部署有关建议:
    • Redis实例的物理机要预留足够内存,应对fork和rewrite
    • 单个Redis实例内存上限不要太大,例如4G或8G。可以加快fork的速度、减少主从同步、数据迁移压力
    • 不要与CPU密集型应用部署在一起
    • 不要与高硬盘负载应用一起部署。例如:数据库、消息队列
  • 慢查询的阈值可以通过配置指定:
    • slowlog-log-slower-than:慢查询阈值,单位是微秒。默认是10000,建议1000
  • 慢查询会被放入慢查询日志中,日志的长度有上限,可以通过配置指定:
    • slowlog-max-len:慢查询日志(本质是一个队列)的长度。默认是128,建议1000
  • 禁止线上使用下面命令:keys、flushall、flushdb、config set等命令。
    • 可以利用rename-command禁用。

image.png

5、启动redis 容器

docker run --restart=always --log-opt max-size=100m --log-opt max-file=2 -p 6379:6379 --name redis -v /home/wq/redis/myredis.conf:/etc/redis/redis.conf -v /home/wq/redis/data:/data -d redis redis-server /etc/redis/redis.conf  --appendonly yes  --requirepass qifeng
–restart=always 总是开机启动
–log是日志方面的
-p 6379:6379 将6379端口挂载出去
–name 给这个容器取一个名字
-v 数据卷挂载
/home/wq/redis/myredis.conf:/etc/redis/redis.conf 这里是将 liunx 路径下的myredis.conf 和redis下的redis.conf 挂载在一起。
/home/wq/redis/data:/data 这个同上
-d redis 表示后台启动redis
redis-server /etc/redis/redis.conf 以配置文件启动redis,加载容器内的conf文件,最终找到的是挂载的目录 /etc/redis/redis.conf 也就是liunx下的/home/wq/redis/myredis/myredis.conf
–appendonly yes 开启redis 持久化
–requirepass qifeng 设置密码 

6、测试

6.1、通过docker ps指令查看启动状态

docker ps -a |grep redis # 通过docker ps指令查看启动状态,是否成功.

6.2、查看容器运行日志

# 命令:docker logs --since 30m <容器名>
# 此处 --since 30m 是查看此容器30分钟之内的日志情况。
docker logs --since 30m redis

6.3、容器内部连接进行测试

# 命令:docker exec -it <容器名> /bin/bash
# 此处跟着的redis-cli是直接将命令输在上面了。
docker exec -it redis redis-cli
  • 直接获取数据会提示需要认证
  • (error) NOAUTH Authentication required.

image.png

  • 认证密码
auth 密码

image.png

  • 查看当前redis有没有设置密码
config get requirepass

7、删除Redis 容器

7.1、查看所有在运行的容器

docker ps -a
# 停止运行的Redis
docker stop redis

image.png

7.2、删除redis 容器

docker rm redis

7.3、删除Redis镜像

7.3.1、查看全部镜像

docker images

image.png

7.3.2、删除镜像

docker rmi dc7b40a0bo5d

8、分片集群-Docker安装

8.1、配置

  • 创建网卡
docker network create redis-net

image.png

  • 创建配置文件:redis-cluster.tmpl
cd /home/redis/
vi redis-cluster.tmpl
  • 配置文件内容
#port(端口号)
port ${PORT}
#masterauth(设置集群节点间访问密码,跟下面一致)
masterauth qifeng
#requirepass(设置redis访问密码)
requirepass qifeng
#cluster-enabled yes(启动集群模式)
cluster-enabled yes
#cluster-config-file nodes.conf(集群节点信息文件)
cluster-config-file nodes.conf
#cluster-node-timeout 5000(redis节点宕机被发现的时间)
cluster-node-timeout 5000
#cluster-announce-ip(集群节点的汇报ip,防止nat,预先填写为网关ip后续需要手动修改配置文件)
cluster-announce-ip 172.16.156.139
#cluster-announce-port(集群节点的汇报port,防止nat)
cluster-announce-port ${PORT}
#cluster-announce-bus-port(集群节点的汇报bus-port,防止nat)
cluster-announce-bus-port 1${PORT}
#appendonly yes(开启aof)  
appendonly yes

appendfilename "appendonly.aof"
# 表示每执行一次写命令,立即记录到AOF文件
# appendfsync always
# 写命令执行完先放入A0F缓冲区,然后表示每隔1秒将缓冲区数据写到AOF文件,是默认方案
appendfsync everysec
# 写命令执行完先放入A0F缓冲区,由操作系统决定何时将缓冲区内容写回磁盘
# appendfsync no

no-appendfsync-on-rewrite no

# A0F文件比上次文件增长超过多少百分比则触发重写
auto-aof-rewrite-percentage 100
# AOF文件体积最小多大以上才触发重写
auto-aof-rewrite-min-size 64mb

# 保护模式
protected-mode no
# 数据库数量
databases 1
# 日志
logfile /home/redis/${PORT}/run.log
  • 配置文件脚本
vi mkdirConfig.sh
# 内容如下
for port in `seq 6379 6384`; do \
  mkdir -p ${port}/conf \
  && PORT=${port} envsubst < redis-cluster.tmpl > ${port}/conf/redis.conf \
  && mkdir -p ${port}/data;\
done

8.2、启动

  • 启动文件脚本
vi redisStart.sh
for port in $(seq 6379 6384); do \
  docker run -di -p ${port}:${port} -p 1${port}:1${port} \
  --restart always --log-opt max-size=100m --log-opt max-file=2 \
	--name redis-${port} --net redis-net \
  -v /home/redis/${port}/conf/redis.conf:/usr/local/etc/redis/redis.conf \
  -v /home/redis/${port}/data:/data \
  redis redis-server /usr/local/etc/redis/redis.conf; \
done
  • 执行 脚本
chmod +x *.sh
./mkdirConfig.sh
./redisStart.sh

image.png

8.3、创建集群

  • 选择其中一个进入
docker exec -it redis-6384 /bin/bash
  • 执行集群创建命令
redis-cli --cluster create 172.16.156.139:6379 172.16.156.139:6380 172.16.156.139:6381 172.16.156.139:6382 172.16.156.139:6383 172.16.156.139:6384 --cluster-replicas 1 -a qifeng

image.png

8.4、查看集群状态

# 进入容器
docker exec -it redis-6384 /bin/bash
# 使用 IP
redis-cli -a qifeng --cluster check 172.16.156.139:6382
# 使用容器名称
redis-cli -a qifeng --cluster check redis-6382:6382

image.png

8.5、查看集群信息和节点信息

# 进入容器
docker exec -it redis-6384 /bin/bash
# 连接至集群某个节点
redis-cli -c -a qifeng -h redis-6383 -p 6383
# 查看集群信息
cluster info
# 查看集群结点信息
cluster nodes
# 查看状态
info replication

image.png
image.png
image.png

8.6、新增一个节点7004

  • 向集群中添加一个新的master节点7004,并向其中存储 num = 10

8.6.1、添加配置

cd /home/redis/
mkdir -p 7004/conf
mkdir -p 7004/data
cd 7004/conf
vi redis.conf
# 内容如下
#port(端口号)
port 7004
#masterauth(设置集群节点间访问密码,跟下面一致)
masterauth qifeng
#requirepass(设置redis访问密码)
requirepass qifeng
#cluster-enabled yes(启动集群模式)
cluster-enabled yes
#cluster-config-file nodes.conf(集群节点信息文件)
cluster-config-file nodes.conf
#cluster-node-timeout 5000(redis节点宕机被发现的时间)
cluster-node-timeout 5000
#cluster-announce-ip(集群节点的汇报ip,防止nat,预先填写为网关ip后续需要手动修改配置文件)
cluster-announce-ip 172.16.156.139
#cluster-announce-port(集群节点的汇报port,防止nat)
cluster-announce-port 7004
#cluster-announce-bus-port(集群节点的汇报bus-port,防止nat)
cluster-announce-bus-port 17004
#appendonly yes(开启aof)
appendonly yes

appendfilename "appendonly.aof"
# 表示每执行一次写命令,立即记录到AOF文件
# appendfsync always
# 写命令执行完先放入A0F缓冲区,然后表示每隔1秒将缓冲区数据写到AOF文件,是默认方案
appendfsync everysec
# 写命令执行完先放入A0F缓冲区,由操作系统决定何时将缓冲区内容写回磁盘
# appendfsync no

no-appendfsync-on-rewrite no

# A0F文件比上次文件增长超过多少百分比则触发重写
auto-aof-rewrite-percentage 100
# AOF文件体积最小多大以上才触发重写
auto-aof-rewrite-min-size 64mb

# 保护模式
protected-mode no
# 数据库数量
databases 1
# 日志
logfile /home/redis/7004/run.log

8.6.2、启动7004节点

 docker run -di -p 7004:7004 -p 17004:17004 --restart always --log-opt max-size=100m --log-opt max-file=2 --name redis-7004 --net redis-net -v /home/redis/7004/conf/redis.conf:/usr/local/etc/redis/redis.conf -v /home/redis/7004/data:/data redis redis-server /usr/local/etc/redis/redis.conf

8.6.3、7004加入集群

docker exec -it redis-6384 /bin/bash
redis-cli --cluster add-node 172.16.156.139:7004 172.16.156.139:6381 -a qifeng

8.6.4、查看集群

docker exec -it redis-6384 /bin/bash
redis-cli -c -a qifeng -h redis-6383 -p 6383
cluster nodes

image.png

  • 可以看到7004并没有分配插槽

8.6.5、移动插槽

  • 查看num分配的插槽
docker exec -it redis-6384 /bin/bash
redis-cli -c -a qifeng -h redis-6383 -p 6383
set num 10

image.png

  • num分配的插槽为2765,在6379上
  • 开始移动插槽,给分配7004分配插槽,从6379上分配300个包含了2765
  • 重新分配6379的插槽

image.png

redis-cli --cluster reshard 172.16.156.139:6379 -a qifeng

image.png

  • 确定移动插槽

image.png

8.6.6、验证

redis-cli -c -a qifeng -h redis-6383 -p 6383
get num

image.png

8.6.7、移除7004

  • 将插槽移回6379,重新分配7004的插槽

image.png

  • 移除7004节点

image.png

redis-cli --cluster del-node 172.16.156.139:7004 48763ae603dc6844dcae9381b68171182184502f -a qifeng

9、哨兵集群-Linux 源码安装

9.1、单机安装

1、安装依赖

yum install -y gcc tcl

2、下载源码编译

cd /home/redis
wget https://github.com/redis/redis/archive/7.0.5.tar.gz
tar xzf 7.0.5.tar.gz
cd redis-7.0.5/
make && make install

image.png

  • 执行完 make 命令后,redis-7.0.5 的 src 目录下会出现编译后的 redis 服务程序 redis-server,还有用于测试的客户端程序 redis-cli

3、修改redis.conf文件中的一些配置

# 绑定地址,默认是127.0.0.1,会导致只能在本地访问。修改为0.0.0.0则可以在任意IP访问
bind 0.0.0.0
# 保护模式,关闭保护模式
protected-mode no
# 数据库数量,设置为1
databases 1

4、启动 redis 服务

cd src
./redis-server ../redis.conf

9.2、搭建主从集群

1、创建目录

cd /home/redis
mkdir 7001 7002 7003

image.png

2、恢复原始配置

# 开启RDB
# save ""
save 3600 1
save 300 100
save 60 10000

# 关闭AOF
appendonly no

3、拷贝配置文件到每个实例目录

  • 然后将redis-7.0.5/redis.conf文件拷贝到三个目录中
cd /home/redis
# 方式一:逐个拷贝
cp redis-7.0.5/redis.conf 7001
cp redis-7.0.5/redis.conf 7002
cp redis-7.0.5/redis.conf 7003

# 方式二:管道组合命令,一键拷贝
echo 7001 7002 7003 | xargs -t -n 1 cp redis-7.0.5/redis.conf

4、修改每个实例的端口、工作目录

sed -i -e 's/6379/7001/g' -e 's/dir .\//dir \/home\/redis\/7001\//g' 7001/redis.conf
sed -i -e 's/6379/7002/g' -e 's/dir .\//dir \/home\/redis\/7002\//g' 7002/redis.conf
sed -i -e 's/6379/7003/g' -e 's/dir .\//dir \/home\/redis\/7003\//g' 7003/redis.conf

5、修改每个实例的声明IP

  • 为了避免将来混乱,在redis.conf文件中指定每一个实例的绑定ip信息
# redis实例的声明 IP
replica-announce-ip 172.16.156.139
  • 每个目录都要改,我们一键完成修改
cd /home/redis
# 逐一执行
sed -i '1a replica-announce-ip 172.16.156.139' 7001/redis.conf
sed -i '1a replica-announce-ip 172.16.156.139' 7002/redis.conf
sed -i '1a replica-announce-ip 172.16.156.139' 7003/redis.conf

# 或者一键修改
printf '%s\n' 7001 7002 7003 | xargs -I{} -t sed -i '1a replica-announce-ip 172.16.156.139' {}/redis.conf

6、启动

cd /home/redis/redis-7.0.5/src
# 第1个
./redis-server ../../7001/redis.conf
# 第2个
./redis-server ../../7002/redis.conf
# 第3个
./redis-server ../../7003/redis.conf

7、开启主从关系

现在三个实例还没有任何关系,要配置主从可以使用replicaof 或者slaveof(5.0以前)命令。
有临时和永久两种模式:

  • 修改配置文件(永久生效)
    • 在redis.conf中添加一行配置:slaveof <masterip> <masterport>
  • 使用redis-cli客户端连接到redis服务,执行slaveof命令(重启后失效)
slaveof <masterip> <masterport>

注意:在5.0以后新增命令replicaof,与salveof效果一致。

  • 使用方式二
cd /home/redis/redis-7.0.5/src
# 连接 7002
redis-cli -p 7002
# 执行slaveof
slaveof 172.16.156.139 7001

# 连接 7003
redis-cli -p 7003
# 执行slaveof
slaveof 172.16.156.139 7001
  • 然后连接 7001节点,查看集群状态:
# 连接 7001
redis-cli -p 7001
# 查看状态
info replication

image.png

9.3、搭建哨兵集群

1、准备实例和配置

# 进入目录
cd /home/redis
# 创建目录
mkdir s1 s2 s3
  • 在s1目录创建一个sentinel.conf文件,添加下面的内容:
port 27001
sentinel announce-ip 172.16.156.139
sentinel monitor mymaster 172.16.156.139 7001 2
sentinel down-after-milliseconds mymaster 5000
sentinel failover-timeout mymaster 60000
dir "/home/redis/s1"

解读:

  • port 27001:是当前sentinel实例的端口
  • sentinel monitor mymaster 172.16.156.139 7001 2:指定主节点信息
    • mymaster:主节点名称,自定义,任意写
    • 172.16.156.139 7001:主节点的ip和端口
    • 2:选举master时的quorum值
  • 将s1/sentinel.conf文件拷贝到s2、s3两个目录中(在/home/redis目录执行下列命令)
cd /home/redis
# 方式一:逐个拷贝
cp s1/sentinel.conf s2
cp s1/sentinel.conf s3
# 方式二:管道组合命令,一键拷贝
echo s2 s3 | xargs -t -n 1 cp s1/sentinel.conf
  • 修改s2、s3两个文件夹内的配置文件,将端口分别修改为27002、27003:
sed -i -e 's/27001/27002/g' -e 's/s1/s2/g' s2/sentinel.conf
sed -i -e 's/27001/27003/g' -e 's/s1/s3/g' s3/sentinel.conf

2、启动

cd /home/redis
# 第1个
redis-sentinel s1/sentinel.conf
# 第2个
redis-sentinel s2/sentinel.conf
# 第3个
redis-sentinel s3/sentinel.conf

Redis默认配置文件

github查看

image.png

  • 34
    点赞
  • 25
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
要在docker安装redis集群,首先需要确保已经安装docker并启动了docker服务。可以按照引用中的步骤来卸载之前可能存在的残留文件,并通过阿里云docker yum源配置好docker安装源。 接下来,需要准备一个Linux系统机器,并在该机器上安装docker。确保已经对docker的基本知识有所了解,并熟悉docker的常用命令,可以参考引用中的博文来学习docker的基础知识。 一旦docker安装完成并启动了服务,就可以开始搭建redis集群了。可以在docker容器安装redis,具体的安装步骤可以通过查阅相关文档或教程来获取。在安装redis之前,可以使用以下命令来启动docker服务: ``` systemctl enable docker systemctl start docker ``` 通过以下命令可以查看docker的版本信息: ``` docker version ``` 以上是在docker安装redis集群的大致步骤,具体的安装和配置过程可能会因为不同的环境和需求而有所差异。建议在安装之前仔细阅读相关的文档和教程,以确保正确地安装和配置redis集群。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* *3* [docker搭建redis集群详细篇](https://blog.csdn.net/m0_55116875/article/details/122220918)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] - *2* [docker下搭建redis集群](https://blog.csdn.net/weixin_44947701/article/details/128161008)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值