Redis Cluster集群模式容器化部署

news/2024/6/3 17:02:06 标签: docker, redis, 容器

Redis Cluster集群模式容器化部署

  • 安装Docker和docker-compose
  • 准备docker-compose文件
  • 准备Redis配置文件
  • Linux内核参数优化
  • 启停Redis实例
  • Redis集群搭建

环境准备:

IP版本角色端口
172.x.x.11RHEL 7.9master6379
172.x.x.12RHEL 7.9master6379
172.x.x.13RHEL 7.9master6379
172.x.x.11RHEL 7.9replica6380
172.x.x.12RHEL 7.9replica6380
172.x.x.13RHEL 7.9replica6380

dockercompose_12">安装Docker和docker-compose

安装docker-ce:

# 移除旧版本
sudo yum remove docker \
                  docker-client \
                  docker-client-latest \
                  docker-common \
                  docker-latest \
                  docker-latest-logrotate \
                  docker-logrotate \
                  docker-engine
		  
# 配置仓库
sudo yum install -y yum-utils device-mapper-persistent-data lvm2
#官方源
#sudo yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo
#阿里云源
sudo yum-config-manager --add-repo https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
sudo yum makecache fast

# 检查可安装的版本
yum list docker-ce --showduplicates | sort -r

# 安装指定版本
#sudo yum install docker-ce-<VERSION_STRING> docker-ce-cli-<VERSION_STRING> containerd.io docker-buildx-plugin docker-compose-plugin
yum install -y docker-ce-25.0.1 docker-ce-cli-25.0.1 containerd.io docker-buildx-plugin docker-compose-plugin

# 启动
sudo systemctl enable docker
sudo systemctl start docker		  

配置阿里云镜像源:

cat > /etc/docker/daemon.json << EOF
{
 "registry-mirrors" : ["https://b9pmyelo.mirror.aliyuncs.com"]
}
EOF

sudo systemctl restart docker

🐬Docker社区版部署参见:

  • https://docs.docker.com/engine/install/centos/
  • https://gottdeskrieges.blog.csdn.net/article/details/113242029

安装docker-compose:

curl -SL https://github.com/docker/compose/releases/download/v2.24.6/docker-compose-linux-x86_64 -o /usr/local/bin/docker-compose

chmod 755 /usr/local/bin/docker-compose

📖参考:https://docs.docker.com/compose/install/standalone/

dockercompose_72">准备docker-compose文件

  • Redis版本:7.2.4
  • Redis安装路径:/opt/docker-compose/redis

准备单台服务的compose文件,每台服务器上部署两个Redis实例(服务端口分别为6379和6380)和一个redis exporter。容器网络采用仅主机模式。

version: '3'

services:
  redis-server-6379:
    image: redis:7.2.4
    network_mode: host
    container_name: redis-server-6379
    restart: unless-stopped
    #ports:
    #  - 6379:6379
    environment:
      TZ: "Asia/Shanghai"
    command: ["/6379/conf/redis.conf"]
    volumes:
      - ./6379/conf/:/6379/conf/
      - ./6379/data/:/6379/data/
    
  redis-server-6380:
    image: redis:7.2.4
    network_mode: host
    container_name: redis-server-6380
    restart: unless-stopped
    #ports:
    #  - 6380:6380
    environment:
      TZ: "Asia/Shanghai"
    command: ["/6380/conf/redis.conf"]
    volumes:
      - ./6380/conf/:/6380/conf/
      - ./6380/data/:/6380/data/ 
   
  redis-exporter:
    image: oliver006/redis_exporter
    network_mode: host
    restart: unless-stopped
    environment:
      TZ: Asia/Shanghai
      REDIS_ADDR: redis://localhost:6379,redis://localhost:6380
      REDIS_USER: redis_monitor
      REDIS_PASSWORD: Monpass_xxxx
    # ports:
    #   - 9121:9121

准备Redis配置文件

本机创建目录结构,并配置好redis.conf和users.acl文件。

mkdir -vp /opt/docker-compose/redis/6379/conf/
mkdir -vp /opt/docker-compose/redis/6379/data/

mkdir -vp /opt/docker-compose/redis/6380/conf/
mkdir -vp /opt/docker-compose/redis/6380/data/

主实例配置文件/opt/docker-compose/redis/6379/conf/redis.conf

bind 0.0.0.0
port 6379
timeout 3600
tcp-keepalive 300
loglevel notice
databases 16

save 600 100
save 120 10000
save 7200 1

dir /6379/data/
masteruser clusterrepl  
masterauth Replpass_xxxx

aclfile /6379/conf/users.acl
replica-read-only yes

cluster-announce-ip ""172.x.x.11""
cluster-announce-port 6379

maxclients 10000
maxmemory 10gb
maxmemory-policy noeviction

appendonly yes
appendfsync everysec
auto-aof-rewrite-percentage 100
auto-aof-rewrite-min-size 64mb

cluster-enabled yes
cluster-config-file nodes-6379.conf
cluster-node-timeout 15000

从实例配置文件/opt/docker-compose/redis/6380/conf/redis.conf

bind 0.0.0.0
port 6380
timeout 3600
tcp-keepalive 300
loglevel notice
databases 16

save 600 100
save 120 10000
save 7200 1

dir /6380/data/
masteruser clusterrepl  
masterauth Replpass_xxxx

aclfile /6380/conf/users.acl
replica-read-only yes

cluster-announce-ip "172.x.x.11"
cluster-announce-port 6380

maxclients 10000
maxmemory 10gb
maxmemory-policy noeviction

appendonly yes
appendfsync everysec
auto-aof-rewrite-percentage 100
auto-aof-rewrite-min-size 64mb

cluster-enabled yes
cluster-config-file nodes-6380.conf
cluster-node-timeout 15000

在/6379/conf/和/6380/conf/下配置ACL文件,定义好管理员用户、redis-exporter监控用户、主从同步用户、应用用户的相关权限。示例如下:

user default off nopass &* -@all
user root on >Rootpass_xxxx allkeys allchannels +@all
user redis_monitor on >Monpass_xxxx +client +ping +info +config|get +cluster|info +slowlog +latency +memory +select +get +scan +xinfo +type +pfcount +strlen +llen +scard +zcard +hlen +xlen +eval allkeys
user clusterrepl on >Replpass_xxxx +psync +replconf +ping
user appuser on >Apppass_xxxx allkeys allchannels +@all -@admin -@dangerous

Linux内核参数优化

修改Linux内核参数:

sed -i '/vm.overcommit_memory/d' /etc/sysctl.conf
echo "vm.overcommit_memory = 1" >> /etc/sysctl.conf
echo "net.core.somaxconn=2048" >> /etc/sysctl.conf
sysctl -p

禁用透明大页:

cat <<EOF >> /etc/rc.d/rc.local
if test -f /sys/kernel/mm/transparent_hugepage/enabled; then
  echo never > /sys/kernel/mm/transparent_hugepage/enabled
fi
EOF

chmod +x /etc/rc.d/rc.local

编辑/etc/security/limits.conf和/etc/security/limits.d/90-nproc.conf,添加以下配置:

*       soft    core    unlimited
*       hard    core    unlimited
*       soft    nofile  65536
*       hard    nofile  65536
*       soft    nproc   65536
*       hard    nproc   65536

最后重启服务器生效。

启停Redis实例

修改文件权限:

cd /opt/docker-compose/
chown -R polkitd:root redis/

docker-compose.yml文件所在路径下执行以下命令来启停单个节点上的两个REDIS实例。

#启动容器
cd /opt/docker-compose/redis && docker-compose up -d

#停止容器
cd /opt/docker-compose/redis && docker-compose stop

Redis集群搭建

将三台服务器上的6个实例搭建成一个三主三从的集群模式:

docker exec -it redis-server-6379 redis-cli --user root -a <PASSWORD> \
--cluster create 172.x.x.11:6379 172.x.x.11:6380 172.x.x.12:6379 172.x.x.12:6380 172.x.x.13:6379 172.x.x.13:6380 \
--cluster-replicas 1 

集群创建过程中输出信息如下:

>>> Performing hash slots allocation on 6 nodes...
Master[0] -> Slots 0 - 5460
Master[1] -> Slots 5461 - 10922
Master[2] -> Slots 10923 - 16383
Adding replica 172.x.x.11:6380 to 172.x.x.11:6379
Adding replica 172.x.x.12:6380 to 172.x.x.12:6379
Adding replica 172.x.x.13:6380 to 172.x.x.13:6379
>>> Trying to optimize slaves allocation for anti-affinity
[WARNING] Some slaves are in the same host as their master
M: a12d5d8daf4f7ef18a490f8db4766d66736c51e5 172.x.x.11:6379
   slots:[0-5460] (5461 slots) master
M: 7e6923ec3063d0833b134c3e30012d3a6605884b 172.x.x.12:6379
   slots:[5461-10922] (5462 slots) master
M: aa89fb16d032f62d58ac13d0b29450580f5f6337 172.x.x.13:6379
   slots:[10923-16383] (5461 slots) master
S: 26bfdc8f75bf45870e77b392e077b52380833bd9 172.x.x.11:6380
   replicates a12d5d8daf4f7ef18a490f8db4766d66736c51e5
S: 025b9b7e1163a39c4fcb76c6c8cb53b4c5a6604a 172.x.x.12:6380
   replicates 7e6923ec3063d0833b134c3e30012d3a6605884b
S: 042b02321735a6995f474703adb8d73601fc1773 172.x.x.13:6380
   replicates aa89fb16d032f62d58ac13d0b29450580f5f6337
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 172.x.x.11:6379)
M: a12d5d8daf4f7ef18a490f8db4766d66736c51e5 172.x.x.11:6379
   slots:[0-5460] (5461 slots) master
   1 additional replica(s)
M: 7e6923ec3063d0833b134c3e30012d3a6605884b 172.x.x.12:6379
   slots:[5461-10922] (5462 slots) master
   1 additional replica(s)
S: 042b02321735a6995f474703adb8d73601fc1773 172.x.x.13:6380
   slots: (0 slots) slave
   replicates aa89fb16d032f62d58ac13d0b29450580f5f6337
S: 025b9b7e1163a39c4fcb76c6c8cb53b4c5a6604a 172.x.x.12:6380
   slots: (0 slots) slave
   replicates 7e6923ec3063d0833b134c3e30012d3a6605884b
S: 26bfdc8f75bf45870e77b392e077b52380833bd9 172.x.x.11:6380
   slots: (0 slots) slave
   replicates a12d5d8daf4f7ef18a490f8db4766d66736c51e5
M: aa89fb16d032f62d58ac13d0b29450580f5f6337 172.x.x.13:6379
   slots:[10923-16383] (5461 slots) master
   1 additional replica(s)
[OK] All nodes agree about slots configuration.
>>> Check for open slots...
>>> Check slots coverage...
[OK] All 16384 slots covered.

检查集群节点:

docker exec -it redis-server-6379 redis-cli -c -h 172.x.x.11 -p 6379 cluster nodes

其中 -c 表示以集群模式执行,不加的话只会从当前连接的实例查询。

输出信息如下:

a12d5d8daf4f7ef18a490f8db4766d66736c51e5 172.x.x.11:6379@16379 myself,master - 0 1710740884000 1 connected 0-5460
7e6923ec3063d0833b134c3e30012d3a6605884b 172.x.x.12:6379@16379 master - 0 1710740885000 2 connected 5461-10922
042b02321735a6995f474703adb8d73601fc1773 172.x.x.13:6380@16380 slave aa89fb16d032f62d58ac13d0b29450580f5f6337 0 1710740887000 3 connected
025b9b7e1163a39c4fcb76c6c8cb53b4c5a6604a 172.x.x.12:6380@16380 slave 7e6923ec3063d0833b134c3e30012d3a6605884b 0 1710740885837 2 connected
26bfdc8f75bf45870e77b392e077b52380833bd9 172.x.x.11:6380@16380 slave a12d5d8daf4f7ef18a490f8db4766d66736c51e5 0 1710740886839 1 connected
aa89fb16d032f62d58ac13d0b29450580f5f6337 172.x.x.13:6379@16379 master - 0 1710740887841 3 connected 10923-16383

也可以直接检查节点信息文件。

cat /opt/docker-compose/redis/6379/data/nodes-6379.conf

http://www.niftyadmin.cn/n/5446891.html

相关文章

HJ103 Redraiment的走法

题目&#xff1a; 题解&#xff1a; dp[i]数组含义&#xff1a;到达第i个桩的最大步数 dp数组初始化全为1 遍历过程&#xff1a;遍历坐标为i之前的数组h&#xff0c;若h[j] < h[i]&#xff0c;那么此时有两种情况&#xff0c;dp[i]要么是dp[j] 1&#xff0c;要么是dp[i]…

Unity:2D

目录 1. 简介 2. 2D Sorting 3. 9-slicing Sprites 3.1 9-slicing and Colliders 4. Sprite Renderer 5. Sprite Creator 6. Sprite Editor 6.1 Slice 6.1 Resize polygons 6.2 Custom Outline 6.3 Custom Physics Shape 6.4 Secondary Textures 6.5 Data Provider…

6、kubenetes 卷

1、什么是卷 在某些场景下&#xff0c;我们可能希望新的容器可以在之前容器结束的位 置继续运⾏&#xff0c;⽐如在物理机上重启进程。可能不需要&#xff08;或者不想要&#xff09; 整个⽂件系统被持久化&#xff0c;但又希望能保存实际数据的⽬录。 Kubernetes通过定义存储…

C++_第四周做题总结

id:19 A.三数论大小&#xff08;引用&#xff09; 题目描述 输入三个整数&#xff0c;然后按照从大到小的顺序输出数值。 要求&#xff1a;定义一个函数&#xff0c;无返回值&#xff0c;函数参数是三个整数参数的引用&#xff0c;例如int &a, int &b, int &c。…

[MAUI]集成高德地图组件至.NET MAUI Blazor项目

文章目录 前期准备&#xff1a;注册高德开发者并创建 key登录控制台创建 key获取 key 和密钥 创建项目创建JS API Loader配置权限创建定义创建模型创建地图组件创建交互逻辑 项目地址 地图组件在手机App中常用地理相关业务&#xff0c;如查看线下门店&#xff0c;设置导航&…

有了 unique_ptr 和 shared_ptr,要weak_ptr 有什么用?【C++】

有了 unique_ptr 和 shared_ptr&#xff0c;要weak_ptr 有什么用&#xff1f; 说明使用场景防止循环引用临时访问共享资源 说明 weak_ptr是C中智能指针的一种&#xff0c;与shared_ptr配合使用&#xff0c;weak_ptr不对对象的生命周期进行管理&#xff0c;即它持有对象的引用…

【java数据结构】基于java提供的ArrayList实现的扑克牌游戏-(附源码~)

【Java数据结构】基于java泛型实现的二维数组完成三人扑克游戏 基本框架的实现创建一副牌如何进行洗牌&#xff1a;每个人抓的牌放到哪里&#xff1a; 源码具体实现cardcardsTest 个人简介&#xff1a;努力学编程 每日鸡汤&#xff1a;stay foolish,stay hungry-史蒂芬.乔布斯斯…

革新水库大坝监测:传统软件与云平台之比较

在水库大坝的监测管理领域&#xff0c;传统监测软件虽然曾发挥了重要作用&#xff0c;但在多方面显示出了其局限性。传统解决方案通常伴随着高昂的运维成本&#xff0c;需要大量的硬件支持和人员维护&#xff0c;且软件整合和升级困难&#xff0c;限制了其灵活性和扩展性。 点击…