1. 程式人生 > >使用Docker安裝部署Redis Cluster叢集

使用Docker安裝部署Redis Cluster叢集

本文主要展示Redis Cluster的部署步驟。

1準備階段:

Dockerfile檔案內容

FROM alpine:3.7

# add our user and group first to make sure their IDs get assigned consistently, regardless of whatever dependencies get added
RUN addgroup -S redis && adduser -S -G redis redis

# grab su-exec for easy step-down from root
RUN apk add --no-cache 'su-exec>=0.2'

ENV REDIS_VERSION 4.0.9
ENV REDIS_DOWNLOAD_URL http://download.redis.io/releases/redis-4.0.9.tar.gz
ENV REDIS_DOWNLOAD_SHA df4f73bc318e2f9ffb2d169a922dec57ec7c73dd07bccf875695dbeecd5ec510

# for redis-sentinel see: http://redis.io/topics/sentinel
RUN set -ex; \
	\
	apk add --no-cache --virtual .build-deps \
		coreutils \
		gcc \
		linux-headers \
		make \
		musl-dev \
	; \
	\
	wget -O redis.tar.gz "$REDIS_DOWNLOAD_URL"; \
	echo "$REDIS_DOWNLOAD_SHA *redis.tar.gz" | sha256sum -c -; \
	mkdir -p /usr/src/redis; \
	tar -xzf redis.tar.gz -C /usr/src/redis --strip-components=1; \
	rm redis.tar.gz; \
	\
# disable Redis protected mode [1] as it is unnecessary in context of Docker
# (ports are not automatically exposed when running inside Docker, but rather explicitly by specifying -p / -P)
# [1]: https://github.com/antirez/redis/commit/edd4d555df57dc84265fdfb4ef59a4678832f6da
	grep -q '^#define CONFIG_DEFAULT_PROTECTED_MODE 1$' /usr/src/redis/src/server.h; \
	sed -ri 's!^(#define CONFIG_DEFAULT_PROTECTED_MODE) 1$!\1 0!' /usr/src/redis/src/server.h; \
	grep -q '^#define CONFIG_DEFAULT_PROTECTED_MODE 0$' /usr/src/redis/src/server.h; \
# for future reference, we modify this directly in the source instead of just supplying a default configuration flag because apparently "if you specify any argument to redis-server, [it assumes] you are going to specify everything"
# see also https://github.com/docker-library/redis/issues/4#issuecomment-50780840
# (more exactly, this makes sure the default behavior of "save on SIGTERM" stays functional by default)
	\
	make -C /usr/src/redis -j "$(nproc)"; \
	make -C /usr/src/redis install; \
	\
	rm -r /usr/src/redis; \
	\
	runDeps="$( \
		scanelf --needed --nobanner --format '%n#p' --recursive /usr/local \
			| tr ',' '\n' \
			| sort -u \
			| awk 'system("[ -e /usr/local/lib/" $1 " ]") == 0 { next } { print "so:" $1 }' \
	)"; \
	apk add --virtual .redis-rundeps $runDeps; \
	apk del .build-deps; \
	\
	redis-server --version

RUN mkdir /data && chown redis:redis /data
VOLUME /data
WORKDIR /data

CMD ["redis-server"]

redis.conf檔案內容

port 7000 ##每個容器的埠設定成不一樣
pidfile /var/run/redis_6379.pid
maxmemory 50m
appendonly yes
################################ REDIS CLUSTER  ###############################
cluster-enabled yes
cluster-config-file nodes-6379.conf
cluster-node-timeout 5000
# cluster-slave-validity-factor 10
# cluster-migration-barrier 1
# cluster-require-full-coverage yes
# cluster-slave-no-failover no

################################## SLOW LOG ###################################
slowlog-log-slower-than 10000
slowlog-max-len 128

在7000、7001、7002、7003、7004、7005目錄下面各有一個redis.conf,除了port不一致,其他都一致。

2、部署階段:

[[email protected] home]# pwd
/home
[[email protected] home]# ll
drwxrwxrwx. 3 root root       44 5月  14 23:41 redis
-rwxrwxrwx. 1 root root  1710169 5月  14 13:04 redis-4.0.0.tar.gz
-rwxrwxrwx. 1 root root 15923244 5月  13 23:35 ruby-2.5.1.tar.gz
[
[email protected]
home]# cd redis [[email protected] redis]# ll drwxrwxrwx. 8 root root 78 5月 14 23:41 cluster_conf -rwxrwxrwx. 1 root root 2352 5月 15 2018 Dockerfile 1、構建redis的docker映象 [[email protected] redis]# docker build -f Dockerfile -t lee9213/redis:4.0.9 /home/redis/ 2、檢視映象構建成功 [[email protected] redis]# docker images REPOSITORY TAG IMAGE ID CREATED SIZE lee9213/redis 4.0.9 49fb78432b3c About a minute ago 27.8 MB docker.io/alpine 3.7 3fd9065eaf02 4 months ago 4.15 MB 3、啟動docker容器,redis規定使用docker叢集,容器的網路模式必須是host模式 [[email protected] redis]# docker run -t -P --restart=always --net=host --privileged=true -v /home/redis/cluster_conf/7000/redis.conf:/etc/redis.conf --name redis7000 49fb78432b3c redis-server /etc/redis.conf [[email protected] redis]# docker run -t -P --restart=always --net=host --privileged=true -v /home/redis/cluster_conf/7001/redis.conf:/etc/redis.conf --name redis7001 49fb78432b3c redis-server /etc/redis.conf [[email protected] redis]# docker run -t -P --restart=always --net=host --privileged=true -v /home/redis/cluster_conf/7002/redis.conf:/etc/redis.conf --name redis7002 49fb78432b3c redis-server /etc/redis.conf [[email protected] redis]# docker run -t -P --restart=always --net=host --privileged=true -v /home/redis/cluster_conf/7003/redis.conf:/etc/redis.conf --name redis7003 49fb78432b3c redis-server /etc/redis.conf [[email protected] redis]# docker run -t -P --restart=always --net=host --privileged=true -v /home/redis/cluster_conf/7004/redis.conf:/etc/redis.conf --name redis7004 49fb78432b3c redis-server /etc/redis.conf [[email protected] redis]# docker run -t -P --restart=always --net=host --privileged=true -v /home/redis/cluster_conf/7005/redis.conf:/etc/redis.conf --name redis7005 49fb78432b3c redis-server /etc/redis.conf 4、檢視redis容器啟動成功 [[email protected] redis]# docker ps CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 92ff2de33ab5 49fb78432b3c "redis-server /etc..." 4 seconds ago Up 3 seconds redis7005 87322567c038 49fb78432b3c "redis-server /etc..." 11 seconds ago Up 10 seconds redis7004 78d3f4f57c15 49fb78432b3c "redis-server /etc..." 17 seconds ago Up 16 seconds redis7003 face88181023 49fb78432b3c "redis-server /etc..." 24 seconds ago Up 23 seconds redis7002 4669751d068f 49fb78432b3c "redis-server /etc..." 31 seconds ago Up 30 seconds redis7001 69ad687fd7d3 49fb78432b3c "redis-server /etc..." 38 seconds ago Up 37 seconds redis7000 5、檢視redis容器埠 [[email protected] redis]# netstat -tnlp | grep redis tcp 0 0 0.0.0.0:7000 0.0.0.0:* LISTEN 58842/redis-server tcp 0 0 0.0.0.0:7001 0.0.0.0:* LISTEN 58876/redis-server tcp 0 0 0.0.0.0:7002 0.0.0.0:* LISTEN 58910/redis-server tcp 0 0 0.0.0.0:7003 0.0.0.0:* LISTEN 58945/redis-server tcp 0 0 0.0.0.0:7004 0.0.0.0:* LISTEN 58979/redis-server tcp 0 0 0.0.0.0:7005 0.0.0.0:* LISTEN 59014/redis-server [[email protected] redis]# cd .. 6、解壓ruby [[email protected] home]# tar -zxvf ruby-2.5.1.tar.gz [[email protected] home]# cd ruby-2.5.1 7、編譯ruby [[email protected] ruby-2.5.1]# ./configure --prefix=/usr/local/ruby 8、安裝ruby [[email protected] ruby-2.5.1]# make && make install 9、設定ruby環境變數 [[email protected] ruby-2.5.1]# vi ~/.bash_profile 10、將.bash_profile中的PATH=$PATH:$HOME/bin修改為PATH=/usr/local/ruby/bin:$PATH:$HOME/bin 11、使.bash_profile生效 [[email protected] home]# source ~/.bash_profile 12、檢視ruby安裝成功沒有 [[email protected] ruby-2.5.1]# ruby -v ruby 2.5.1p57 (2018-03-29 revision 63029) [x86_64-linux] 13、安裝redis的ruby包,安裝過程出現問題,解決方案在最後 [[email protected] ruby-2.5.1]# gem install redis Fetching: redis-4.0.1.gem (100%) Successfully installed redis-4.0.1 Parsing documentation for redis-4.0.1 Installing ri documentation for redis-4.0.1 Done installing documentation for redis after 0 seconds 1 gem installed [[email protected] ruby-2.5.1]# cd .. 14、解壓redis原始碼,安裝過程問題,解決方案在最後 [[email protected] home]# tar -zxvf redis-4.0.0.tar.gz [[email protected] home]# cd redis-4.0.0 [[email protected] redis-4.0.0]# make [[email protected] redis-4.0.0]# cd src 15、建立叢集 [[email protected] src]# ./redis-trib.rb create --replicas 1 127.0.0.1:7000 127.0.0.1:7001 127.0.0.1:7002 127.0.0.1:7003 127.0.0.1:7004 127.0.0.1:7005 >>> Creating cluster >>> Performing hash slots allocation on 6 nodes... Using 3 masters: 127.0.0.1:7000 127.0.0.1:7001 127.0.0.1:7002 Adding replica 127.0.0.1:7003 to 127.0.0.1:7000 Adding replica 127.0.0.1:7004 to 127.0.0.1:7001 Adding replica 127.0.0.1:7005 to 127.0.0.1:7002 M: 043600424fc401d14a2f6602a5b690bf43441144 127.0.0.1:7000 slots:0-5460 (5461 slots) master M: d89c1011fb29402aeed179113201b98eb6ff4a1c 127.0.0.1:7001 slots:5461-10922 (5462 slots) master M: fe7acf3f59751166f7ed8d7cf1f90e8dbaac35b4 127.0.0.1:7002 slots:10923-16383 (5461 slots) master S: 8f9226923a030e6213377aeee225b508b970404f 127.0.0.1:7003 replicates 043600424fc401d14a2f6602a5b690bf43441144 S: 8112b942c00e9e00bbc329da801274fc953847c6 127.0.0.1:7004 replicates d89c1011fb29402aeed179113201b98eb6ff4a1c S: a14bafac7cfd1160564aa1f3362d03203ec9cae8 127.0.0.1:7005 replicates fe7acf3f59751166f7ed8d7cf1f90e8dbaac35b4 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 127.0.0.1:7000) M: 043600424fc401d14a2f6602a5b690bf43441144 127.0.0.1:7000 slots:0-5460 (5461 slots) master 1 additional replica(s) M: d89c1011fb29402aeed179113201b98eb6ff4a1c 127.0.0.1:7001 slots:5461-10922 (5462 slots) master 1 additional replica(s) S: 8f9226923a030e6213377aeee225b508b970404f 127.0.0.1:7003 slots: (0 slots) slave replicates 043600424fc401d14a2f6602a5b690bf43441144 M: fe7acf3f59751166f7ed8d7cf1f90e8dbaac35b4 127.0.0.1:7002 slots:10923-16383 (5461 slots) master 1 additional replica(s) S: a14bafac7cfd1160564aa1f3362d03203ec9cae8 127.0.0.1:7005 slots: (0 slots) slave replicates fe7acf3f59751166f7ed8d7cf1f90e8dbaac35b4 S: 8112b942c00e9e00bbc329da801274fc953847c6 127.0.0.1:7004 slots: (0 slots) slave replicates d89c1011fb29402aeed179113201b98eb6ff4a1c [OK] All nodes agree about slots configuration. >>> Check for open slots... >>> Check slots coverage... [OK] All 16384 slots covered.

gem install redis出現的問題:

問題1:
    ERROR:  Loading command: install (LoadError)
        cannot load such file -- zlib
    ERROR:  While executing gem ... (NoMethodError)
        undefined method `invoke_with_build_args' for nil:NilClass
解決方案:
  1. 安裝zlib庫
    yum install zlib-devel
  2. 整合zlib到ruby環境
    # 進入ruby原始碼資料夾 ,安裝ruby自身提供的zlib包 
    cd ext/zlib
    ruby ./extconf.rb
    make && make install
    如果make時會爆出錯誤:沒有規則可以建立“zlib.o”需要的目標“/include/ruby.h”。 停止//make:*** No rule to make target `/include/ruby.h', needed by `zlib.o'.  Stop
    則修改Makefile檔案新增變數top_srcdir= ../../
問題2:
    ERROR:  While executing gem ... (Gem::Exception)
        Unable to require openssl, install OpenSSL and rebuild Ruby (preferred) or use non-HTTPS sources
解決方案:
  1. 安裝openssl庫
    yum install openssl-devel 
  2. 整合openssl到ruby環境
    # 進入ruby原始碼資料夾 ,安裝ruby自身提供的zlib包 
    cd ext/openssl
    ruby ./extconf.rb
    make && make install
    如果make時會爆出錯誤:沒有規則可以建立“openssl.o”需要的目標“/include/ruby.h”。 停止//make:*** No rule to make target `/include/ruby.h', needed by `openssl.o'.  Stop
    則修改Makefile檔案新增變數top_srcdir= ../../
redis原始碼make是出現問題:
問題3:
    出現致命錯誤:jemalloc/jemalloc.h:沒有那個檔案或目錄
解決方案:
    make MALLOC=libc