这是本人在工作中搭建集群的实践经验,当时遇到很多问题,困扰了我好久,最后查看了好多文章成功解决所有问题,主从集群,哨兵监听都成功。现在分享出来,我就以一台服务器模拟搭建三台服务器的集群。请务必阅读每一行说明字样。。。
参考的作者1
参考的作者2
1、首先安装docker 已安装可以跳过,直接进入第二步骤
我使用的是阿里云的centos7服务器,好像centos必须要7版本以上才支持安装使用docker。不管是什么linux系统基本就几个简单的步骤:更新yum,然后直接用yum安装docker,然后启动docker,还可以设置为开机启动。如果之前有docker的情况下,第一步应该为卸载旧的docker。下面的步骤顺序自己好好看一下说明。
1.1更新yum
yum update
1.2安装docker
yum -y install docker
1.3启动docker,
systemctl start docker
1.4查看docker版本
docker --version
1.5设置docker为开机自启动(可忽略)
systemctl enable docker.service
1.6如果最开始有docker的时候在安装docker之前需要先卸载之前的docker(可忽略)
1.6.1查看docker安装包
yum list installed | grep docker
1.6.2删除安装包:(与看到的安装包对应)
yum remove docker-ce.x86_64 ddocker-ce-cli.x86_64 -y
1.6.3删除容器文件(默认放在/var/lib/docker文件夹下面)
rm -rf /var/lib/docker
docker安装完成,yum安装这是一种比较的简单的方式,还有一种方式是去docker官网手动下载docker的gz.tar包上传至服务器安装,但是稍微比这个复杂一点。
2、拉取docker的redis镜像
2.1
docker pull redis
3、编写一主二从集群的redis的配置文件
3.1我们可以选择直接下载一篇redis的配置文件,直接用于修改,但是里面的累赘信息太多,不方便查看和修改,所以我们直接编写一个配置文件,配置信息其实就几条就行,里面其他没有配置的信息redis启动起来将默认使用默认配置。(经验总结)
创建三个配置文件的目录随意,因为我是测试使用,所以直接在根目录创建了,生产环境切勿。
上图redis.conf/redis1.conf/redis2.conf分别为我的主-从-从配置文件,下面来创建编写
3.2 编写主配置文件
3.2.1创建主配置文件(目录自己更改,或者直接创建在root下)
touch redis.conf
3.2.2编写主配置文件
vim redis.conf
3.2.3在文件内写入一下内容
#端口绑定
bind 0.0.0.0
port 6379
logfile “redis.log”
#data为等会开启docker容器里面的目录
dir /data
#是否持久化
appendonly yes
3.2.4创建从节点的配置文件,两个从节点的配置文件一模一样的(除了端口),创建文件的命令上面有,自己变通文件名。
文件内容如下。如果你也是一台服务器模拟三台服务器端口号切记不要冲突,如果你是三台服务器,端口号都可以命名为6379。我这里是一台服务器模拟三台。(注意ip和端口)
redis1.conf端口为6380
bind 0.0.0.0
#端口号
port 6380
#日志文件
logfile “redis.log”
#docker容器里面的路径
dir /data
#关闭redis自我保护
daemonize no
#开启redis持久化
appendonly yes
#最为关键的一行,是用来给该从节点指定主节点的
replicaof 127.0.0.1 6379
#如果没有这一行从节点不能写入数据只能读取数据
replica-read-only no
redis2.conf端口为6381
#端口号
port 6381
#日志文件
logfile “redis.log”
#docker容器里面的路径
dir /data
#关闭redis自我保护
daemonize no
#开启redis持久化
appendonly yes
#最为关键的一行,是用来给该从节点指定主节点的
replicaof 127.0.0.1 6379
#如果没有这一行从节点不能写入数据只能读取数据
replica-read-only no
vim编辑器编写文件退出的时候先按一下esc,然后直接输入:wq,再回车,就可以保存退出。
:wq
4、编写哨兵的配置文件三份,都是一样的配置文件。唯一不一样的是端口,如果是三台不同的主机端口也可以一样,如果是一台主机模拟集群就需要开通不一样的端口。后面我会详细讲解这个哨兵的配置文件。现在先创建编写好就行了。
4.1创建哨兵配置文件
touch sentinel.conf
4.2编写哨兵配置文件
vim sentinel.conf
4.3写入以下内容(注意ip和端口)
port 26379
dir /data
logfile “sentinel.log”
daemonize yes
#这里是哨兵的关键 配置主节点的ip和端口 ,后面的数字2表示当哨兵集群当中有两个哨兵没有检测到主节点的心跳的时候表明主节点挂掉,开始推选新的主节点。(这里我们的哨兵集群总共会有三个哨兵)
sentinel monitor redismaster 127.0.0.1 6379 2
4.4编写三份该文件 注意端口就行 如果是三台服务器 ,没台放一个文件。
5、启动redis一主二从总共三个docker镜像。根据三个不同的配置文件启动。(因为后续我们会分别在三个容器里面启动哨兵,所以我们启动的时候把redis服务的端口6379和哨兵的端口26379一并做映射,redis服务的配置文件redis.conf和哨兵的配置文件sentinel.conf一并做映射,方便后面我们启用哨兵。后面会讲解意思)
5.1启动主节点容器
5.1.1启动容器
docker run -d -p 6379:6379 -p 26379:26379 -v /root/redis.conf:/data/redis.conf -v /root/sentinel.conf:/data/sentinel.conf --name redis1 redis redis-server redis.conf
reids.conf目录和文件名和端口根据自己的实际情况改写。(哨兵的配置文件和端口也是)
5.1.2进入容器
docker exec -it redis1 /bin/bash
5.1.3进入redis客户端(默认是进入6379端口的redis。还有我们在启动容器的时候已经顺便将redis客户端启动起来了,所以进入容器不用启动redis服务了,直接可以进入客户端了。附上启懂redis服务的命令:redis-server redis.conf)
redis-cli
5.1.4查看redis信息,如果是主节点,role将会为master。
info replication
5.1.5退出redis-cli
exit
5.1.6退出redis1容器
exit
5.2启动从节点容器(两个从节点容器是一样的启动方式,只修改对应的路径,端口映射,名称等,最后面的redis.conf对应的是容器内映射的redis.conf),这里只写出启动一个从节点的命令,自己启动第二个从节点。
5.2.1启动容器,并同时用容器内的redis.conf启动redis
docker run -d -p 6380:6380 -p 26380:26380 -v /root/redis.conf:/data/redis.conf -v /root/sentinel1.conf:/data/sentinel.conf --name redis2 redis redis-server redis.conf
5.2.2进入容器
docker exec -it redis2 bash
5.2.3 进入客户端(注意:如果直接用redis-cli进入,默认会进入6379端口的redis客户端,如果我们三台不同的服务器,主从节点都是用的各自对的6379端口就不会有问题,但是如果像我一样使用的一台服务器,从节点的端口是6380和6381就需要指定端口进入redis客户端)
redis-cli -p 6380
5.2.4查看信息(从节点的role为slave)
info replication
5.2.5备选方案:如果role为master,我们还可以手工指定主节点(ip和端口根据自己的实际情况指定主节点的ip和端口)
slaveof 127.0.0.1 6379
5.2.6再次查看info信息,然后退出就行了。之前有命令就不解释了。
现在我们的一主二从节点已经搭建完成了。可以分别进入三个容器查看我们redis的启动情况和信息。主节点的role为master,会标注有两个从节点,从节点的role为slave,会标注主节点的信息,up代表主节点正常运行,down代表主节点挂了。现在如果我们的主节点挂了,我们的集群就失败了,我们的从节点不会自动选举为主节点。所以我们需要在配置一个哨兵集群来保证我们的集群的稳定性。
注意:
特别说明:哨兵集群和redis主从集群其实互不影响,我们也可以在单独的三台服务器或者一台服务器上面配置哨兵集群,来监听我们的主从集群就行了。哨兵其实也是docker的redis镜像,只是我们只使用它的哨兵功能而已。之前我们启动redis镜像的时候我说把哨兵要用的端口和配置文件一并在redis容器中做了映射,其实就是为这里做铺垫。这里我就直接在我们现有的三个docker容器里面分别添加一个哨兵,做一个哨兵集群就行了。不嫌麻烦也可以再去启动三个redis容器来搭建烧饼集群(我就做过)。因为哨兵的配置文件我们在启动的时候已经映射进去了,所以我们直接进如每一个容器去启动就行了。
6、分别启动每个docker容器里面的哨兵
6.1进入主节点容器,用ls命令,我们就可以看淡sentinel.conf文件,这个配置文件我们就会用来启动redis的哨兵。首先进入容器。
docker exec -it redis1 bash
6.2查看文件
ls
6.3启动哨兵服务
redis-sentinel sentinel.conf
6.4进入哨兵
redis-cli -p 26379
6.5查看哨兵状态(我们会看到哨兵会显示监听的主节点的信息和从节点的数量,以及现在的哨兵数量。现在的哨兵数量应该为1)
info
6.6退出哨兵
exit
6.7退出容器
exit
6.8分别进入其他两个redis容器,同样的方式开启哨兵,注意进入哨兵客户端的时候要注意指定端口。
7现在我们用docker搭建的一主二从三哨兵模式其实已经搭建好了。做一下测试。
我们停掉主节点的redis服务,然后我们进入到另外的两个容器内,进入redis-cli,用info命令查看信息,一会儿就会出现某一个从节点变成了主节点(不会立刻推选出来,哨兵配置里面有默认掉线时间,过了时间才会开始推选的。好像默认是30秒还是多少),role从slave变成了master。然后我们再看哨兵的info信息,可以看到主节点的信息也会变化。最后我们再讲停掉的主节点启动起来。我们会发现它变成了从节点,主节点变成了刚才推选出来的那一个节点。
其实这个集群搭建非常简单,只要理解了整个思路。实在是不懂的地方欢迎留言互相学习,有不对的地方十分感谢您的指正。(第一次写博客)