在Centos7.5上多臺宿主機使用docker部署redis集羣的過程,redis集羣一般需要6臺redis服務器,使用docker可以節省服務器資源,除開放主從6379和6380端口外還得開放集羣總線端口,集羣總線端口爲redis客戶端連接端口+10000即16379
集羣架構
主機名 |
IP |
redis集羣ip(並非爲redis容器的ip) |
redistest(部署用) |
||
redis1 |
52.82.63.165 |
52.82.63.165:6379 52.82.63.165:6380 |
redis2 |
52.83.47.118 |
52.83.47.118:6379 52.83.47.118:6380 |
redis3 |
52.83.98.202 |
52.83.98.202:6379 52.83.98.202:6380 |
主 |
從 |
redis1:6379 |
redis1:6380 |
redis2:6379 |
redis2:6380 |
redis3:6379 |
redis3:6380 |
一、redistest機器部署docker和ansible
1.安裝docker:yum install docker
2.啓動docker:systemctl start docker
3.我這裏是使用的AWS的機器所以需要使用祕鑰對登錄其它三個Redis節點 如果是用密碼登錄的話就沒必要這麼做 爲了方便登錄此處生成祕鑰
ssh-keygen
cd ~/.ssh
將id_rsa.pub追加到三個Redis節點/root/.ssh/authorized_keys中
4.部署ansible,方便給Redis節點統一部署docker和Redis避免登錄每個節點
yum -y install ansible
5.修改ansible的配置文件和host
修改host方便後面ansible的配置:
vi /etc/hosts
52.82.63.165 redis1
52.83.47.118 redis2
52.83.98.202 redis3
vi /etc/ansible/ansible.cfg
[defualts]
inxentory = /etc/ansible/hosts
host_key_cheking = False
pull_interval = 15
sudo_user = root
transport = paramiko
module_lang = C
sudo_exe = sudo
# SSH timeout
timeout = 30
remote_tmp = ~/.ansible/tmp
[ssh_connection]
scp_if_ssh = True
control_path = ~/.ssh/ #配置登錄其它節點祕鑰的路徑
6.配置ansible命令分發的機器
vi /etc/ansible/hosts
[redis]
redis[1:3] ansible_ssh_private_key_file=~/.ssh/id_rsa ansible_ssh_user=root (如果Redis節點使用密碼登錄的話就使用ansible_ssh_pass=xxxx)
7.使用ansible給各Redis節點安裝docker和下載redis鏡像
ansible redis -m shell -a 'yum -y install docker;systemctl start docker;docker pull redis';
檢查每個節點是否下載了Redis鏡像:
ansible redis -m shell -a 'docker images | grep redis'
8.給各節點創建掛載目錄
ansible redis -m shell -a 'mkdir -p /var/redis/63{79,80}/{conf,logs,data}';
9.創建redis模板配置文件
vi redis.conf.tem
protected-mode no
bind 0.0.0.0
port ${PORT}
daemonize no #關閉以守護進程運行
dir /var/lib/redis
logfile /var/log/redis/redis.log
appendonly yes
appendfilename "appendonly.aof"
appendfsync everysec
cluster-enabled yes
cluster-config-file nodes.conf
cluster-node-timeout 5000
cluster-announce-ip ${IP} #指定redis集羣ip,即爲宿主機ip
cluster-announce-port ${PORT}
cluster-announce-bus-port 1${PORT}
10.使用envsubst命令修改模板文件後分發到各個節點(也可以使用ansible-playbook完成)
for ip in 52.82.63.165 52.83.47.118 52.83.98.202;
do
for port in 63{79,80};
do
scp -i ~/workdir/ssh-keys/id_rsa redis.conf.tem $ip:;
ssh -i ~/workdir/ssh-keys/id_rsa $ip "export IP=$ip PORT=$port;envsubst < redis.conf.tem > /var/redis/${port}/conf/redis.conf";
done;
done
登錄任意節點檢查:tree /var/redis/ 看是否存在相應的文件夾和文件
11.創建redis實例
-p 端口映射,需要把每個實例的63(79|80) 和163(79|80)端口都映射出來
-v 指定目錄映射
–name 給容器命名
-d 容器放入後臺
for i in 63{79,80};
do
ansible redis -m shell -a "docker run -itd -p $i:$i -p 1$i:1$i -v /var/redis/$i/logs:/var/log/redis -v /var/redis/$i/data:/var/lib/redis/ -v /var/redis/$i/conf/redis.conf:/etc/redis/redis.conf --name redis$i redis";
done
驗證redis實例 隨便進入一臺redis服務器,進入redis容器內部,執行完命令後看見6個PONG則驗證成功
二.搭建Redis集羣:
1.安裝ruby環境(也可使用docker裏的ruby鏡像) 創建3個主redis節點分別爲每個redis服務器上的6379端口
yum -y install ruby rubygems ruby-devel
redis-3.2.1.gem 官網被強只能手動下載所以不能使用命令 gem install redis-3.2.1.gem
wget https://rubygems.org/downloads/redis-3.2.1.gem
gem install -l redis-3.2.1.gem
2.將Redis解壓包中 的redis-trib.rb複製到/sbin/中,創建主節點
redis-trib.rb create 52.82.63.165:6379 52.83.47.118:6379 52.83.98.202:6379
3.爲每個主節點添加在不同redis服務器的從節點
redis-trib.rb add-node --slave --master-id 節點的M ip(從節點的ip) : 6380 主節點IP:6379
此處有個疑問就是 爲啥添加從節點的時候 後面這個主節點的IP都是第一個節點的IP也能成功,望各位大佬指教
4.檢查集羣狀態
redis-trib.rb check 52.82.63.165:6379