使用Docker安裝部署Redis Cluster叢集
阿新 • • 發佈:2018-12-23
本文主要展示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