Redis集群搭建
在Centos7.5上多台宿主机使用docker部署redis集群的过程,redis集群一般需要6台redis服务器,使用docker可以节省服务器资源,除开放主从6379和6380端口外还得开放集群总线端口,集群总线端口为redis客户端连接端口+10000即16379
集群架构
主机名 |
IP |
redis集群ip(并非为redis容器的ip) |
redistest(部署用) |
52.83.180.202 |
|
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 /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