Redis集群搭建

  • 搭建环境

  1. c语言的编译环境。需要在线安装gcctcl

yum install gcc –yyum install tcl -y

   2.使用ruby(5.x以上版本不用)

脚本搭建集群,需要ruby的运行环境。yum install ruby   yum install rubygems  gem install redis(5.x以后不用ruby)

安装ruby脚本运行所需的依赖包 redis-3.0.0.gem。gem install redis-.3.0.X.gem(或以上,与redis版本一致。

     3.JDK 1.8

若之前有残留需清理干净之前的rpm -a|grep java查找。Java Downloads | Oracle。这里不详细介绍,网上有很多

      4.redis环境变量:(可选配)

export NODE_HOME=/usr/local/redis/bin;(redis路径)

export PATH= $PATH:NODE_HOME;

编辑完成,执行刷新使其生效source /etc/profile

  • 安装步骤

  1. 上传安装包至指定位置进行解压 tar xzvf xxx或直接wget http://download.redis.io/releases/redis-5.0.7.tar.gz下载
  2. 规划redis目录。进入redis源码目录进行编译。Make
  3. 编译成功后进行安装。make install PREFIX=/xx/xx/redis-cluster/ PREFIX指定安装路径)
  4. 规划redis.conf位置并修改配置文件。规划data、logs文件夹目录。(最好与bin同级)
  5. 进入bin目录下执行 sh redis-server xx/xx/redis.conf(需redis.conf全路径)进行启动,执行ps aux| grep redis 查看进程是否启动成功。
  6. 启动成功后关闭redis,修改基本配置并将其复制到各机器上(集群)。并修改配对应端口号和主从相关配置。之后再逐个启动redis。或是编写脚本*(需加权限)一起启动。
  7. 使用ruby脚本搭建集群需ruby环境,yum -y install ruby ruby-devel rubygems rpm-build gem install redis需要使用redis-trib.rb,在源码src目录下。将redis-trib.rb复制到/xx/xx/redis-cluster/下。并执行redis-trib.rb create --replicas 1 192.168.25.131:7001 192.168.25.131:7002 192.168.25.131:7003 192.168.25.131:7004 192.168.25.131:7005 192.168.25.131:7006replicas 指定一个master跟几个slave

redis5以后不用redis-trib.rb,用redis-cli。执行命令./redis-cli -a 密码 --cluster create 192.168.25.131:7001 192.168.25.131:7002 192.168.25.131:7003 192.168.25.131:7004 192.168.25.131:7005 192.168.25.131:7006 --cluster-replicas 1

进入src客户端执行 sh redis-cli -c -p 7001验证集群。

  • 参数配置

1、redis.conf配置

必配:

Include xxx/xx/xx/redis.conf(要全路径)

port  端口号

daemonize  yes(异步启动)

cluster-enabled  yes(集群开启)

appendonly  yes (开启AOF)

bind  192.168.119.131(绑定当前机器 IP)

pidfile  /var/run/redis_端口号.pid(进程文件位置)

appendfilename appendonly-端口号.aof(AOF文件名)

cluster-config-file  nodes-端口号.conf(集群配置文件)

logfile  /xxx/xx/logs/xxx.log(指定日志位置)

dir  /xx/xx/redis_8288/ (快照路径)

rename-command KEYS ""(禁用命令)

rename-command FLUSHDB ""(禁用命令)

rename-command FLUSHALL ""(禁用命令)

选配:

repl-disable-tcp-nodelay  no(主从复制,保证数据一致。默认)

maxclients  10000 (默认)

cluster-node-timeout  15000(节点等待超时,默认)

auto-aof-rewrite-percentage  80 (aof文件增长比例)

stop-writes-on-bgsave-error  no(出rdb也可继续使用)

maxmemory  20gb (内存)

maxmemory-policy  allkeys-lru/volatile-lru (淘汰策略)

appendfsync everysec/always (待定?)

tcp-backlog  551(取值不能超过系统的/proc/sys/net/core/somaxconn,默认)

requirepass  密码 (是否免密)

cluster-migration-barrier  1 (最少slave数,多从时设置)

2、其余配置

修改文件/etc/security/limits.conf

root soft nofile 102400(一个进程最大可以打开的文件个数,当与RedisServer的连接数多时,需要设定为合适的值)

root hard nofile 102400

修改文件/etc/sysctl.conf

net.core.somaxconn = 32767(TCP监听队列大小,默认128想,较小)

vm.overcommit_memory=1(默认0开启,1关闭Overcommit,表示允许申请超过CommitLimmit大小的内存)

执行命令“sysctl -p”以生效。

四、基于docker集群搭建

1、run方式搭建

1)指定配置文件启动容器

sudo docker run --name=node1 \

--restart=always \

--privileged=true \

-v /mnt/data/redis/node1/:/data \

-v /mnt/logs/redis/redis.log:/logs \

-v /mnt/data/redis/node1/node1.conf:/data/node1.conf  \

-d redis redis-server /data/node1.conf 

sudo docker run --name=node2 \

--restart=always \

--privileged=true \

-v /mnt/data/redis/node2/:/data \

-v /mnt/logs/redis/redis.log:/logs  \

-v /mnt/data/redis/node2/node2.conf:/data/node2.conf  \

-d redis redis-server /data/node2.conf 

sudo docker run --name=node3 \

--restart=always \

--privileged=true \

-v /mnt/data/redis/node3/:/data \

-v /mnt/logs/redis/redis.log:/logs  \

-v /mnt/data/redis/node3/node3.conf:/data/node3.conf  \

-d redis redis-server /data/node3.conf

配置文件样例:参看靠上文配置

说明:

-v /data/redis/redis.conf:/etc/redis/redis.conf:把宿主机配置好的redis.conf放到容器内的这个位置

--name= 容器名

-v /data/redis/data:/data:把redis持久化的数据在宿主机内显示,做数据备份

redis-server /etc/redis/redis.conf:这个是关键配置,让redis不是无配置启动,而是按照这个redis.conf的配置启动

--net host 指定网络类型host,不需做端口映射。共享物理机的所有端口与IP服务,使项目和集群可在不同服务器上,这里单机部署暂时不用

敲黑板:

“:”后面的是容器的路径,后面的redis.conf也是容器内的路径,包配置文件里配置的路径。启动后若报容器内xx文件无权限则添加参数--privileged=true,增加特权。

2)查看集群窗台确定启动成功

docker ps   

docker logs 容器名

3)获取节点信息-容器IP(若host类型则不用)

docker inspect node1

docker inspect node2

docker inspect node3

4)进入容器

docker exec -it node1 bash

5)集群组建

redis-cli --cluster create 172.17.0.6:25001  172.17.0.7:25002  172.17.0.8:25003 --cluster-replicas 0 (无从节点)

6)进入客户端验证集群

进入容器交互,sudo docker exec -it 容器名 bash

执行redis-cli -c  -p端口

或者直接外部链接

sudo docker run -it --link 容器名:redis --rm redis redis-cli -h redis -p 端口

2.dockerfile方式搭建

1)解压配置

下载xxx.tar.gz,解压至xxx/docker_redis/,并执行make编译。配置好redis.conf。进入到xxx/docker_redis/下编写vi Dockerfile。

2)编写dockerfile

示例:

# Redis
# Version 5.0.14

#指定基础镜像
FROM centos:7

#镜像作者
MAINTAINER yinsy 

#定义路径的环境变量
ENV REDIS_HOME /mnt/software/

#将本地Dockerfile同级目录下的redis源码包复制到镜像的根路径下
#ADD命令会在复制过后自动解包。ADD后面必须使用相对路径
ADD redis-5.0.14.tar.gz /

#创建安装目录 
RUN mkdir -p $REDIS_HOME/redis

#将Dockerfile同级目录下redis-5.0.14中的redis配置文件拷贝到容器的目录中
ADD redis-5.0.14/redis.conf $REDIS_HOME/redis/

#更新镜像的yum,安装gcc相关编译工
RUN yum -y update
RUN yum install -y gcc make

#指定工作目录 
WORKDIR /redis-5.0.14

#执行编译
RUN make

#移动编译后的redis-server到容器相关的目录,容器中只需要可执行文件redis-server ???
RUN mv /redis-5.0.14/src/redis-server  $REDIS_HOME/redis/

#移动到上一级,删除解压文件 
WORKDIR /
RUN rm -rf /redis-5.0.14

#安装编译完成之后,删除多余的gcc、make
RUN yum remove -y gcc make

#添加数据卷 
#/usr/local/redis/logs/redis-server.log
#此目录需要和redis.conf中logfile一致
VOLUME ["/mnt/logs/redis/"]

#暴露25100的端口
EXPOSE 25100

3)创建镜像

docker build -t jingxiang/redis-cluster

后面还有一个. 这个.表示当前目录下的Dockerfile

查看镜像docker images

4)制作节点镜像

mkdir /xxx/redis_docker/redis-node

cd /xxx/redis_docker/redis-node

vi Dockerfile,具体内容如下:

# Redis Node

# Version 5.0.14<

FROM jingxiang/ redis-cluster:latest

# MAINTAINER_INFO

MAINTAINER jingxiang xxxx@qq.com

#容器serverconf的位置(结合dockerfile中该文件的配置)

ENTRYPOINT ["/mnt/software/redis/redis-server", "/mnt/software/redis/redis.conf"]

5)构建节点镜像

docker build -t jingxiang/redis-node .

查看镜像docker images

6)启动各节点容器

sudo docker run -d --name redis-node-25100 -p 25100:6379 jingxiang/redis-node

sudo docker run -d --name redis-node-25200 -p 25200:6379 jingxiang /redis-node

sudo docker run -d --name redis-node-25300 -p 25300:6379 jingxiang /redis-node

sudo docker run -d --name redis-node-25400 -p 25400:6379 jingxiang /redis-node

sudo docker run -d --name redis-node-25500 -p 25500:6379 jingxiang /redis-node

sudo docker run -d --name redis-node-25600 -p 25600:6379 jingxiang /redis-node

7)查看容器关联IP

容器状态和ID查看docker ps

dIP关联查看ocker inspect 容器ID(根据自己的实际情况填) | grep IPAddress

8)配置集群

进入任意redis节点 redis-cli -h xx.x.x.xx -p 25000

集群感知,将以所有的redis服务都添加到redis集群的节点(节点添加)

CLUSTER MEET 容器IP 6379

CLUSTER MEET 容器IP 6379

CLUSTER MEET 容器IP 6379

CLUSTER MEET 容器IP 6379

CLUSTER MEET 容器IP 6379

CLUSTER MEET 容器IP 6379

查看CLUSTER NODES查看节点,此时未分配slot槽点且配置主从关系

9)分配槽点(选三个节点分配槽点作为master)

cd /xxx/redis_docker

vi addslots.sh 示例如下:

#!/bin/bash

#0-5461的槽点配置在172.17.0.4:6379(宿主机127.0.0.1:7000)的redis

n=0

for ((i=n;i<=5461;i++))

do

   /xxx/bin/redis-cli -h 127.0.0.1 -p 7000 -a 密码  CLUSTER ADDSLOTS $i

done

#5462-10922的槽点配置在172.17.0.5:6379(宿主机127.0.0.1:7001)的redis

n=5462

for ((i=n;i<=10922;i++))

do

   /xxx/bin/redis-cli -h 127.0.0.1 -p 7001 -a 密码  CLUSTER ADDSLOTS $i

done

#10923-16383的槽点配置在172.17.0.6:6379(宿主机127.0.0.1:7002)的redis

n=10923

for ((i=n;i<=16383;i++))

do

   /xxx/bin/redis-cli -h 127.0.0.1 -p 7002 -a 密码  CLUSTER ADDSLOTS $i

done

执行脚本sh  addslots.sh

10)主从配置(选3个未分配槽点的作为从节点)

编写脚本vi addSlaveNodes.sh

#CLUSTER REPLICATE后面跟的是172.17.0.4:6379的集群ID

/xxx/bin/redis-cli -h 127.0.0.1 -p 7003 -a 密码 CLUSTER REPLICATE ae3f32ffe860ab89b7f7e8f3c33e3f83a9b49226

#CLUSTER REPLICATE后面跟的是172.17.0.5:6379的集群ID

/xxx/bin/redis-cli -h 127.0.0.1 -p 7004 -a 密码 CLUSTER REPLICATE b727870ce91ad7389ab62d9088d4146947002af9

#CLUSTER REPLICATE后面跟的是172.17.0.6:6379的集群ID

/xxx/bin/redis-cli -h 127.0.0.1 -p 7005 -a 密码 CLUSTER REPLICATE 6c19857b5bbf4cbd91f3b2b11e9d055e9e288f87

执行脚本sh  addSlaveNodes.sh

11)验证测试

Logo

华为开发者空间,是为全球开发者打造的专属开发空间,汇聚了华为优质开发资源及工具,致力于让每一位开发者拥有一台云主机,基于华为根生态开发、创新。

更多推荐