正文
为什么需要集群
摘要
设备是廉价的极端容易损坏的
最近世代的数据中心与大型机小型机时代最大的区别在于
大型机小型机时代, 都是scale up.假设基础设施是非常稳定的(也的确如此).
新时代的数据中心,都是scale out的.都是假定设备是非常不稳定,容易损坏的.
最近时代, 不管是内存,CPU还有硬盘,以及整机服务器都变得非常廉价.
也更加容易损坏. 所以数据中心必须考虑硬件损坏的情况.
保证业务不断, 必须保证有很多完全独立的,并且是互相冗余的设备存在.
一方面性能冗余, 一方面功能冗余.
集群的种类
中间价集群
数据库集群
应用集群
基础设施集群
中间件
这里所说的中间件泛指很多提供服务的非自研产品.
主要有:
类型 |
举例 |
缓存,锁session |
redis |
应用负载均衡,发现代理 |
nginx |
消息队列 |
rabbitmq |
服务注册发现 |
nacos |
Redis
Redis的高可用主要有如下几种
1. 哨兵
2. 集群
3. 机遇keepavlie+haproxy实现vip迁移的主从集群
redis主要是存储缓存以及锁信息
缓存需要持久化, 锁和session 根据业务需求进行判断是否需要持久化.
Redis的集群要考虑.安全,性能,以及容量.
要定期进行容灾测试演练. 保证应用可以无感迁移.
建议及群的节点必须分布于不同的机柜上面, 避免机柜Tor或者是电源宕机时无法使用.
Redis的集群需要测试如下方面
1. 性能
2.稳定性
3.容量支撑情况
4.功能准确性(批量锁是否支持)
5.异常宕机对应用的影响
nginx
Nginx最常用的有两个角色:
1. web服务器
2. 反向代理服务器.
都建议需要进行集群化高可用的处理
可以使用多个nginx节点然后牵连使用lvs等工具进行负载
保证单个nginx节点出问题时可以支撑业务应用.
nginx与redis相同点是 都必须保证高可用.
不同点在于:
Redis是有状态的. 数据是由具体含义的
Nginx是可以无状态. 可以自由扩容. 不用担心状态的问题.
Nginx不管是集群还是单点都需要考虑
1. 安全 2.性能.
Redis 一般是不需要开放的熬外网的. 安全漏洞可能还可控
Nginx 一般是需要暴露到外部网络, 对安全性要求极高.
nginx一般是应用的最外城, 往往承载着最多的压力
他需要很多配置来进行优化.
CPU的核心数. 内存数. 以及内核参数都需要优化.
Nginx自己的配置, 比如工作连接数,工作线程数
是否长连接. proxy_pass的长连接设置等等配置
以及linux的tcp_reuse, tcp_timstamp,以及tcp缓存参数等.
消息队列
rabbitmq 为例
消息队列有集群和镜像模式.
集群模式下一般小时是分片的.
镜像模式一般保证消息队列的高可用和保证一定的数据不丢失(需要持久化加持.)
不建议将集群部署到一台机器上面. 建议多台机器分散部署.保证安全
也需要进行集群的测试验证.
1. 功能 配置,最佳实践
2. 性能
3. 稳定性 洪峰流量时的异常处理
4. 异常恢复 部分节点宕机时对应用的影响,以及是否可以保证数据不丢失.
服务注册发现
微服务部署的场景下,最核心的应用其实是服务注册发现
网上zookeeper,consul,其实都可以实现一定程度的服务注册与发现
产品这边用的是 nacos. 其实nacos也是可以进行集群处理的.
可以选择使用 mysql数据库存储一些核心配置.
需要注意的是 注册和反注册都需要进行实现. 需要保证反注册时能够将不提供服务的
在nacos里面剔除, 避免出现服务关闭了.其他人调用出现404的问题.
集群的难点
1. 安装.
2. 配置.
3. 调优.
4. 高可用
5. 分布式一致性.防止脑裂等.
集群的难点
安装是第一步. 需要收敛掌握, 但是跟配置一样,必须有一个全局的规划能力
规划服务器, 网络交换机. 机柜等设备.
云服务的话需要保证高可用区.
配置需要保证一方面安全, 避免数据被脱库. 另一方面需要保证性能.
能够支撑尽可能多的应用负载. 在可用范围内进行使用.
调优. 需要根据现场情况进行配置
修改服务器的配置, 内核参数,应用配置,落盘持久化参数等等.
高可用. 必须进行高可用的设置,多花钱花精力了必须保证可用性.
保证一两台机器宕机的情况下无严重问题.
分布式一致性. paxos以及raft等算法来保证. 可能需要研究源码.
基本上在于 leader 和 选leader 以及半数同意提交等.
为什么要高可用集群
为了sla,为了项目
甲方爸爸给钱多,就得保证高可用
这就好比舔狗必须24小时在线舔女神才可能有机会.
但是前提时得足够有钱, 足够美丽
给不够钱, 没有足够的诱惑力
集群就是镜花水月. 没人维护,没人演练.
时间永远是最宝贵的. 要珍惜所有留给你时间的人.
时间也是所有人的敌人, 耗费很多钱和很多精力也不一定能够买到一点时间.
希望产品项目用不宕机 orz!