热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

dockercompose部署rediscluster集群(v5.0)缓存服务最佳实践

基于目前烂大街微服务的情况下,Redis在企业中使用非常频繁,比如:缓存服务、分布式锁、分布式原子计数锁、队列等等。本文主要讲解redis

基于目前烂大街微服务的情况下,Redis在企业中使用非常频繁,比如:缓存服务、分布式锁、分布式原子计数锁、队列等等。本文主要讲解redis-cluster集群搭建,规划模拟6个节点,三主三从。

系统

CentOS 7

CPU

2核

内存

4G

硬盘

50G

Docker

19.03.5(安装)

Docker-compose

1.16.1(与docker版本映射表格)(安装)

Redis

5.0

节点规划

容器名

IP

端口映射

运行模式

redis-master1

172.50.0.2

6391 -> 6391

Master

redis-master2

172.50.0.3

6392 -> 6392

Master

redis-master3

172.50.0.4

6393 -> 6393

Master

redis-slave1

172.50.0.5

6394 -> 6394

Slave

redis-slave2

172.50.0.6

6395 -> 6395

Slave

redis-slave3

172.50.0.7

6396 -> 6396

Slave


准备 redis.conf

创建数据存放目录

# 注意:以下命令均在/mnt/redis/目录下执行
mkdir /mnt/rediscd /redis# data 数据目录,config 配置文件目录
mkdir -p {redis-master1/data,redis-master2/data,redis-master3/data,redis-slave1/data,redis-slave2/data,redis-slave3/data,redis-master1/config,redis-master2/config,redis-master3/config,redis-slave1/config,redis-slave2/config,redis-slave3/config}

获取5.0版本redis.conf文件(坚~单击跳转),对redis.conf内如下配置内容进行修改:

# 修改 可以接受连接的网卡地址,0.0.0.0 接受所有
bind 0.0.0.0
# 端口
port 6391
# 节点超时时间,毫秒
cluster-node-timeout 15000
# 集群内部配置文件
cluster-config-file "nodes-6379.conf"## 设置密码
###1、如果对集群设置密码,那么requirepass和masterauth都需要设置,否则发生主从切换时,就会遇到授权问题,可以模拟并观察日志
###2、各个节点的密码都必须一致,否则Redirected就会失败
###3、设置密码后,操作redis-cli需(redis-cli -c -p 端口)通过auth password进行密码验证
### -c 集群方式登陆客户端程序
masterauth 123456
requirepass 123456

将redis.conf复制6份到对应的config文件夹下:

echo redis-master1 redis-master2 redis-master3 redis-slave1 redis-slave2 redis-slave3 | xargs -n 1 cp -v redis.sh

  • -n 1 - 告诉 xargs 命令每个命令行最多使用一个参数,并发送到 cp 命令中。
  • cp – 用于复制文件。
  • -v – 启用详细模式来显示更多复制细节。

修改redis.conf端口号以及文件名

# 批量修改端口
sed -i 's/port 6391/port 6392/' redis-master2/redis.conf &&

sed -i ‘s/port 6391/port 6393/’ redis-master3/redis.conf &&
sed -i ‘s/port 6391/port 6394/’ redis-slave1/redis.conf &&
sed -i ‘s/port 6391/port 6395/’ redis-slave2/redis.conf &&
sed -i ‘s/port 6391/port 6396/’ redis-slave3/redis.conf

# 批量修改文件名
mv redis-master1/redis.conf redis-master1/nodes-3691.conf &&

mv redis-master2/redis.conf redis-master2/nodes-3692.conf &&
mv redis-master3/redis.conf redis-master3/nodes-3693.conf &&
mv redis-slave1/redis.conf redis-slave1/nodes-3694.conf &&
mv redis-slave2/redis.conf redis-slave2/nodes-3695.conf &&
mv redis-slave3/redis.conf redis-slave3/nodes-3696.conf


编写启动文件

vim redis.sh# 内容:
redis-server /config/nodes-${PORT}.conf

编写 redis-docker-compose.yml

version: "3.3"
services:redis-master1: image: redis:5.0 # 基础镜像container_name: redis-master1 # 容器服务名working_dir: /config # 工作目录environment: # 环境变量- PORT=6391 # 跟 config/nodes-6391.conf 里的配置一样的端口ports: # 映射端口,对外提供服务- "6391:6391" # redis 的服务端口- "16391:16391" # redis 集群监控端口stdin_open: true # 标准输入打开# docker 网络设置networks: redis-cluster:ipv4_address: 172.50.0.2tty: trueprivileged: true # 拥有容器内命令执行的权限# 映射数据卷,配置目录volumes: ["/mnt/redis/redis-master1/data:/data","/mnt/redis/redis-master1/config:/config","/mnt/redis/redis.sh:/config/redis.sh","/etc/localtime:/etc/localtime" # 时间同步] entrypoint: # 设置服务默认的启动程序- /bin/bash- redis.shredis-master2:image: redis:5.0working_dir: /configcontainer_name: redis-master2environment:- PORT=6392networks:redis-cluster:ipv4_address: 172.50.0.3ports:- "6392:6392"- "16392:16392"stdin_open: truetty: trueprivileged: truevolumes: ["/mnt/redis/redis-master2/data:/data","/mnt/redis/redis-master2/config:/config","/mnt/redis/redis.sh:/config/redis.sh","/etc/localtime:/etc/localtime"]entrypoint:- /bin/bash- redis.shredis-master3:image: redis:5.0container_name: redis-master3working_dir: /configenvironment:- PORT=6393networks:redis-cluster:ipv4_address: 172.50.0.4ports:- "6393:6393"- "16393:16393"stdin_open: truetty: trueprivileged: truevolumes: ["/mnt/redis/redis-master3/data:/data","/mnt/redis/redis-master3/config:/config","/mnt/redis/redis.sh:/config/redis.sh","/etc/localtime:/etc/localtime"]entrypoint:- /bin/bash- redis.shredis-slave1:image: redis:5.0container_name: redis-slave1working_dir: /configenvironment:- PORT=6394networks:redis-cluster:ipv4_address: 172.50.0.5ports:- "6394:6394"- "16394:16394"stdin_open: truetty: trueprivileged: truevolumes: ["/mnt/redis/redis-slave1/data:/data","/mnt/redis/redis-slave1/config:/config","/mnt/redis/redis.sh:/config/redis.sh","/etc/localtime:/etc/localtime"]entrypoint:- /bin/bash- redis.shredis-salve2:image: redis:5.0working_dir: /configcontainer_name: redis-salve2environment:- PORT=6395ports:- "6395:6395"- "16395:16395"stdin_open: truenetworks:redis-cluster:ipv4_address: 172.50.0.6tty: trueprivileged: truevolumes: ["/mnt/redis/redis-slave2/data:/data","/mnt/redis/redis-slave2/config:/config","/mnt/redis/redis.sh:/config/redis.sh","/etc/localtime:/etc/localtime"]entrypoint:- /bin/bash- redis.shredis-salve3:image: redis:5.0container_name: redis-slave3working_dir: /configenvironment:- PORT=6396ports:- "6396:6396"- "16396:16396"stdin_open: truenetworks:redis-cluster:ipv4_address: 172.50.0.7tty: trueprivileged: truevolumes: ["/mnt/redis/redis-slave3/data:/data","/mnt/redis/redis-slave3/config:/config","/mnt/redis/redis.sh:/config/redis.sh","/etc/localtime:/etc/localtime"]entrypoint:- /bin/bash- redis.sh
networks:redis-cluster:driver: bridge # 创建一个docker 的桥接网络ipam:driver: defaultconfig:-subnet: 172.50.0.0/16

Docker编排Redis集群

在这里提供一个批量修改文件,设置密码的方式(如果你再最开始已经设置密码,请忽略!!):

sed -i 's/# masterauth /masterauth 123456/g' `grep nodes-63 -rl --include="*.conf" redis/`sed -i 's/# requirepass foobared/requirepass 123456/g' `grep nodes-63 -rl --include="*.conf" redis/`docker-compose -f redis-cluster-docker-compose.yml up -d


集群初始化

# 进入容器内部
docker exec -it redis-master1 bash# 初始化
redis-cli --cluster create 172.50.0.2:6391 172.50.0.3:6392 172.50.0.4:6393 172.50.0.5:6394 172.50.0.6:6395 172.50.0.7:6396 --cluster-replicas 1########################################## 当然你也可以直接这样执行 ##
########################################docker exec -it redis-master1 redis-cli --cluster create 172.50.0.2:6391 172.50.0.3:6392 172.50.0.4:6393 172.50.0.5:6394 172.50.0.6:6395 172.50.0.7:6396 --cluster-replicas 1# 查看一下集群状态信息,设置密码时,不可用docker exec -it redis-master1 redis-cli -p 6391 --cluster-replicas 1 cluster info


验证集群数据一致性

验证手段:我们再redis-master1创建一条数据(key:testKey,value:1),分别在redis-master2、edis-slave3分片查询数据(get testKey)。

你可能会用到的命令:

# 进入容器内部
docker exec -it redis-master1 bash
# 连接客户端
redis-cli -p 6396 -c
# 创建数据
set testKey 1
# 查看数据
get testKey

从上图可以看出,如果在当前分片没有get到数据,集群会自动切换到特定的分片,如果你想了解更多请百度/Google Redis集群路由规则原理。我们无论从那个节点都能get到数据(slave节点只读),因此我们的Redis-Cluster 集群数据具备一致性。


推荐阅读
  • 本文介绍了操作系统的定义和功能,包括操作系统的本质、用户界面以及系统调用的分类。同时还介绍了进程和线程的区别,包括进程和线程的定义和作用。 ... [详细]
  • baresip android编译、运行教程1语音通话
    本文介绍了如何在安卓平台上编译和运行baresip android,包括下载相关的sdk和ndk,修改ndk路径和输出目录,以及创建一个c++的安卓工程并将目录考到cpp下。详细步骤可参考给出的链接和文档。 ... [详细]
  • MySQL数据库锁机制及其应用(数据库锁的概念)
    本文介绍了MySQL数据库锁机制及其应用。数据库锁是计算机协调多个进程或线程并发访问某一资源的机制,在数据库中,数据是一种供许多用户共享的资源,如何保证数据并发访问的一致性和有效性是数据库必须解决的问题。MySQL的锁机制相对简单,不同的存储引擎支持不同的锁机制,主要包括表级锁、行级锁和页面锁。本文详细介绍了MySQL表级锁的锁模式和特点,以及行级锁和页面锁的特点和应用场景。同时还讨论了锁冲突对数据库并发访问性能的影响。 ... [详细]
  • Python项目实战10.2:MySQL读写分离性能优化
    本文介绍了在Python项目实战中进行MySQL读写分离的性能优化,包括主从同步的配置和Django实现,以及在两台centos 7系统上安装和配置MySQL的步骤。同时还介绍了创建从数据库的用户和权限的方法。摘要长度为176字。 ... [详细]
  • 在Docker中,将主机目录挂载到容器中作为volume使用时,常常会遇到文件权限问题。这是因为容器内外的UID不同所导致的。本文介绍了解决这个问题的方法,包括使用gosu和suexec工具以及在Dockerfile中配置volume的权限。通过这些方法,可以避免在使用Docker时出现无写权限的情况。 ... [详细]
  • 安装mysqlclient失败解决办法
    本文介绍了在MAC系统中,使用django使用mysql数据库报错的解决办法。通过源码安装mysqlclient或将mysql_config添加到系统环境变量中,可以解决安装mysqlclient失败的问题。同时,还介绍了查看mysql安装路径和使配置文件生效的方法。 ... [详细]
  • 如何在服务器主机上实现文件共享的方法和工具
    本文介绍了在服务器主机上实现文件共享的方法和工具,包括Linux主机和Windows主机的文件传输方式,Web运维和FTP/SFTP客户端运维两种方式,以及使用WinSCP工具将文件上传至Linux云服务器的操作方法。此外,还介绍了在迁移过程中需要安装迁移Agent并输入目的端服务器所在华为云的AK/SK,以及主机迁移服务会收集的源端服务器信息。 ... [详细]
  • 本文讨论了clone的fork与pthread_create创建线程的不同之处。进程是一个指令执行流及其执行环境,其执行环境是一个系统资源的集合。在调用系统调用fork创建一个进程时,子进程只是完全复制父进程的资源,这样得到的子进程独立于父进程,具有良好的并发性。但是二者之间的通讯需要通过专门的通讯机制,另外通过fork创建子进程系统开销很大。因此,在某些情况下,使用clone或pthread_create创建线程可能更加高效。 ... [详细]
  • mac php错误日志配置方法及错误级别修改
    本文介绍了在mac环境下配置php错误日志的方法,包括修改php.ini文件和httpd.conf文件的操作步骤。同时还介绍了如何修改错误级别,以及相应的错误级别参考链接。 ... [详细]
  • 一句话解决高并发的核心原则
    本文介绍了解决高并发的核心原则,即将用户访问请求尽量往前推,避免访问CDN、静态服务器、动态服务器、数据库和存储,从而实现高性能、高并发、高可扩展的网站架构。同时提到了Google的成功案例,以及适用于千万级别PV站和亿级PV网站的架构层次。 ... [详细]
  • Linux的uucico命令使用方法及工作模式介绍
    本文介绍了Linux的uucico命令的使用方法和工作模式,包括主动模式和附属模式。uucico是用来处理uucp或uux送到队列的文件传输工具,具有操作简单快捷、实用性强的特点。文章还介绍了uucico命令的参数及其说明,包括-c或--quiet、-C或--ifwork、-D或--nodetach、-e或--loop、-f或--force、-i或--stdin、-I--config、-l或--prompt等。通过本文的学习,读者可以更好地掌握Linux的uucico命令的使用方法。 ... [详细]
  • Node.js学习笔记(一)package.json及cnpm
    本文介绍了Node.js中包的概念,以及如何使用包来统一管理具有相互依赖关系的模块。同时还介绍了NPM(Node Package Manager)的基本介绍和使用方法,以及如何通过NPM下载第三方模块。 ... [详细]
  • CentOS7.8下编译muduo库找不到Boost库报错的解决方法
    本文介绍了在CentOS7.8下编译muduo库时出现找不到Boost库报错的问题,并提供了解决方法。文章详细介绍了从Github上下载muduo和muduo-tutorial源代码的步骤,并指导如何编译muduo库。最后,作者提供了陈硕老师的Github链接和muduo库的简介。 ... [详细]
  • node.jsrequire和ES6导入导出的区别原 ... [详细]
  • 本文介绍了5个基本Linux命令行工具的现代化替代品,包括du、top和ncdu。这些替代品在功能上进行了改进,提高了可用性,并且适用于现代化系统。其中,ncdu是du的替代品,它提供了与du类似的结果,但在一个基于curses的交互式界面中,重点关注占用磁盘空间较多的目录。 ... [详细]
author-avatar
知足幸福_21942
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有