浅谈云原生基础入坑与docker 搭建redis-cluster集群
浅谈云原生基础入坑与docker 搭建redis-cluster集群
开篇来点自己的小感触:自从走上后端开发这条无法回头的互卷道路以后,在视野内可见新的技术在迭代,更新的技术在不断发行。就拿最近的OpenAI的chat-GPT来说,它具有强大的语言模型,让使用者感觉人工智能真的像人。看了很多篇文章,从一个刚刚科班入门的我来说,这条不归路是真的要硬着头皮走下去,新的技术不管它怎么更新,它也是人创造出来的,只要在不断的学习,终有一天技术能够为你而用,也能发挥自己的特长和其他的不同创造属于自己的优秀作品。从决定学习云原生那天开始,我发现很多东西回过头就会忘记,今天是入园的第一篇博客,目的为记录自己的学习过程,也希望帮助到和我一样在不断进步的你。下面我们进入正题
一、什么是集群。
很简单的一个道理(一根筷子容易折断,而10双或者更多的筷子呢?是不是需要使用一些其他手段才能将其折断。),其实集群也可以这样理解,虽然说redis在业内打出了它很快的口号,但是就一台redis在面临大量的读写请求时候它会不会也存在一些问题呢,或者它不小心让服务挂掉了,哈哈哈哈...,再大的收益都会付诸东流。伴随着微服务架构的不断精进发展,对系统的运行效率要求从以前传统的单机架构更上了一个档次,最终压力给到存储的库--->redis,mysql。面对大量的请求,一台会有问题,那我来很多台,一台挂了还有一台,或者读写分离,这样就能够很好契合微服务架构。从而本人理解的集群就是有一定规约的统一管理的一组服务器。
二、容器化
上面介绍了我对集群的一些见解,而这里在其基础上记录一下容器化技术。
2.1什么是容器化:
容器化是一种软件部署流程,可将应用程序的代码与应用程序在任何基础设施上运行所需的所有文件和库进行捆绑。通俗来说,容器化就是不需要多台计算机,而在一台计算机你可以借助容器化技术创建很多不同环境的容器实例来满足你的开发与运行需求。
这里打个比方:就拿我们的redis集群来看,我现在需要一个三主三从的redis集群,如果没有容器化,没有虚拟机技术等等,我需要购买6台计算机,六台呀!再有钱也得为维护成本等等多方面进行考虑,再从虚拟机技术出发,我可以在一台物理机上虚拟出六台虚拟机,哎!好像不用花那么多钱了,但是又想一下,维护成本好像还是差不多的,没有那么方便。最后来到容器化技术,只需要在一台物理机上创建多个redis容器实例就好了。我一键启动,一键关闭进行统一管理这些容器,大大的降低了维护成本,方便快捷,如果我还需要多几台我可以继续再加几个容器实例就好。这个就是容器化
//这里要加图片
2.2容器化的好处:
便携性
软件开发人员使用容器化在多个环境中部署应用程序,而无需重新编写程序代码。他们只需构建一个应用程序,然后将其部署到多个操作系统上。例如,他们在 Linux 和 Windows 操作系统上运行相同的容器。开发人员还使用容器将传统应用程序代码升级到现代版本进行部署。
可扩展性
容器是可以高效运行的轻量级软件组件。例如,虚拟机可以更快地启动容器化应用程序,因其不需要引导操作系统。因此,软件开发人员可以轻松在单个计算机上为不同的应用程序添加多个容器。容器集群使用来自相同共享操作系统的计算资源,但一个容器不会干扰其他容器的运行。
容错能力
软件开发团队使用容器来构建容错应用程序。他们使用多个容器在云上运行微服务。由于容器化微服务在独立的用户空间中运行,因此单个故障容器不会影响其他容器。这提高了应用程序的弹性和可用性。
敏捷性
容器化应用程序在独立的计算环境中运行。软件开发人员可以进行故障排除并更改应用程序代码,而不会干扰操作系统、硬件或其他应用程序服务。他们可以缩短软件发布周期,并使用容器模型快速进行更新。
2.3容器技术有哪些类型?
Docker
Docker 或 Docker Engine 是一种热门的开源容器运行时,使软件开发人员能够在各种平台上构建、部署和测试容器化应用程序。Docker 容器是使用 Docker 框架创建的应用程序和相关文件的独立软件包。
Linux
Linux 是一种内置容器技术的开源操作系统。Linux 容器是独立的环境,使多个基于 Linux 的应用程序能够在单个主机上运行。软件开发人员使用 Linux 容器来部署写入或读取大量数据的应用程序。Linux 容器不会将整个操作系统复制到容器的虚拟化环境中。相反,容器由 Linux 命名空间中分配的必要功能组成。
Kubernetes
Kubernetes 是一种热门的开源容器编排工具,软件开发人员使用它来部署、扩展和管理大量微服务。Kubernetes 有一个声明式模型,可更轻松地实现容器自动化。声明式模型确保 Kubernetes 根据配置文件采取适当的操作以满足要求。
三、云原生
什么是云原生:
从它的名字中来看,云原生就是将我们的原生代码生产的应用程序在云端开发部署运行,利用容器化的高扩展性,便捷性等等优势。
四、容器化搭建redis三主三从集群(docker)
4.1MySQL主从同步安装:
搭建MySQL8版本:
主机:
1.创建搭建所需要的文件夹(不创建也行,docker run 时候会自动创建):
#bin/bash mpath="/data/mysql-master/" spath="/data/mysql-slave/" mkdir ${mpath}"data" mkdir ${mpath}"conf" mkdir ${spath}"data" mkdir ${spath}"conf"
2.运行MySQL容器将容器数据卷进行挂载:
docker run -p 3307:3306 --name mysql-master -v /data/mysql-master/log:/var/log/mysql -v /data/mysql-master/data:/var/lib/mysql -v /data/mysql-master/conf:/etc/mysql -e MYSQL_ROOT_PASSWORD=root -d mysql:8.0.27
3.进入容器修改密码规则:
-
docker exec -it 容器id /bin/bash # 修改为mysql_native_password* alter user 'root'@'%' identified with mysql_native_password by '123456'; create user 'slave'@'%' identified with mysql_native_password by '123456'; # 刷新权限 flush privileges;
不修改会踩坑:
**Authentication plugin 'caching_sha2_password' reported error: Authentication requires secure connection. Error_code: MY-002061**
3.进入/data/mysql-master/conf新建my.cnf
vim 输入以下内容:
[mysqld] #服务id,在一个主从复制集群中要唯一,值范围1-255 server-id = 1 character-set-server=utf8 default_authentication_plugin=mysql_native_password secure_file_priv=/var/lib/mysql #开启log-bin日志,非常重要,复制原理也是基于这一个,后面的值随便写我这里就写mysql-master-bin了 log-bin = mysql-master-bin #从机复制时,忽略的数据库,也就是说这里配置的数据库不会被从机同步 binlog-ignore-db = mysql,information_schema,performance_schema,sys
4.重新启动容器:
docker restart 容器Id或name
从机:
1.运行从机容器:
docker run -p 3308:3306 --name mysql-slave \ -v /data/mysql-slave/log:/var/log/mysql \ -v /data/mysql-slave/data:/var/lib/mysql \ -v /data/mysql-slave/conf:/etc/mysql -e MYSQL_ROOT_PASSWORD=root -d mysql:8.0.27
2.编辑my.cnf:
[mysqld] #设置server_id,注意要唯一 server-id=2 character-set-server=utf8 default_authentication_plugin=mysql_native_password secure_file_priv=/var/lib/mysql #开启二进制日志功能,以备Slave作为其它Slave的Master时使用 log-bin=mysql-slave-bin #relay_log配置中继日志 relay_log=edu-mysql-relay-bin
3.重新启动容器:
docker restart 容器Id或name
4.进入容器:登录mysql ,密码直接回车,后面需要直接修改用户密码
docker exec -it 容器ID/容器name /bin/bash
5.配置:
先进入主机容器查看主机:show master status; 将里面信息记住。
输入以下指令进行配置
change master to master_host='容器宿主机Ip', master_user='用户', master_password='密码', master_port=3307, master_log_file='查看到的日志文件', master_log_pos=156, master_connect_retry=30;
参数解读:
# master_host 容器宿主机Ip # master_user 使用来同步的用户 # master_password 密码 # master_port 端口号 # master_log_file slave从哪个日志文件开始复制数据,即上文中提到的File字段的值 # master_log_pos 指定从哪个position开始读,即上文中提到的 Position 字段的值 # master_connect_retry 如果连接失败,重试的时间间隔,单位是秒,默认是60秒
开启主从同步:start slave;
6查看slave状态:show slave status \G; 如果SlaveIORunning 和 SlaveSQLRunning 都是Yes,说明主从复制已经开启。此时可以测试数据同步是否成功。
springBoot整合MySql:https://blog.csdn.net/KIMTOU/article/details/121570095
4.2搭建redis-cluster集群
在开始之前先记录一下哈希槽分区:
Redis 集群中内置了 16384 个哈希槽,redis 会根据节点数量大致均等的将哈希槽映射到不同的节点。当需要在 Redis 集群中放置一个 key-value时,redis 先对 key 使用 crc16 算法算出一个结果,然后把结果对 16384 求余数,这样每个 key 都会对应一个编号在 0-16383 之间的哈希槽,也就是映射到某个节点上。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· 开源Multi-agent AI智能体框架aevatar.ai,欢迎大家贡献代码
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· AI技术革命,工作效率10个最佳AI工具