高可用篇
集群的基础形式
目标:高可用,突破数据量限制,数据备份容灾,压力分担
1、主从方式
- 主从复制
- 不适合大并发
- 主服务器压力大
- 数据量限制(主从都是相同的数据,冗余大)
- 主从调度
- 主负责调度(k8s整个集群就是这个方式)
2、分片方式
- 数据分片存储,片之间交叉备份
3、选主式
-
分片和主从的结合
- 客户端分片
- 服务端分片
-
容灾选主
-
调度选主

MYSQL集群
1、双主复制(VIP),主从复制
VIP:virtual ip (虚拟ip)
Monitor -> Agent (VIP: ip1,ip2,ip3)
ip1(Master-Write)
ip2(Master-Read) standby
ip3(Read)
双主复制(ip1->ip2,ip2->ip1)
主从复制(ip1->ip3)
如果ip1对应的Master-Write当机,Monitor就会把ip1漂移到standby-master,即ip1 <--> ip2
2、InnoDB Cluster (官方)
- Mysql shell + Mysql Router + Mysql集群 协同工作
- router会出现单点问题,需要引入其它组件
- 部署比较复杂
- 支持failover,强一致,读写分离,读库高可用,读负载,横向扩展
2.1、client app (connector) -> Mysql Router
3、keepalived(master存活检测)
3.1、常用结构
- 主从复制是肯定有的
- master1,master2 (standby)
- 从节点可分角色访问
- slave1,slave2 ...... slave4 (对公网用户)
- slave5,slave6(内部人员:后台,运营,开发,财务,定时任务)
- salve7 (数据备份)
4、主从复制不能解决单表性能问题
-
sharding-jdbc
- 分库分表策略
-
sharding-proxy
- like mycat
Redis集群
0、Codis, con-hash
1、Redis Cluster
- 6个实例(3master + 3slave )
- hash slot (16384)
- CRC16(key) & (16384-1)
- 使用重定向发送请求的(批量请求不友好)
1.1、create cluster
for port in $(seq 7001 7006);\
do\
mkdir -p ~/mydata/redis/node-${port}/conf
touch ~/mydata/redis/node-${port}/conf
cat << EOF>~/mydata/redis/node-${port}/conf/redis.conf
port ${port}
cluster-enabled yes
cluster-config-file nodes.conf
cluster-node-timeout 5000
cluster-announce-ip 192.168.0.10
cluster-announce-port ${port}
cluster-announce-bus-port 1${port}
appendonly yes
EOF
docker run -p ${port}:${port} -p 1${port}:1${port} --name redis-${port}\
--restart always\
-v ~/mydata/redis/node-${port}/data:/data\
-v ~/mydata/redis/node-${port}/conf/redis.conf:/etc/redis/redis.conf\
-d redis-${port} redis-server /etc/redis/redis.conf\
自动部署
1、每个项目使用Dockfile -> 制作镜像 -> push到仓库(私有或hub)
#-t : tag ,构建到当前目录
docker build f Dockerfile -t docker.io/wesley/service1 v1.0 .
docker login -u user -p pass
docker push docker.io/wesley/service1 v1.0
#Dockerfile
FROM java:8 #依赖基础镜像
EXPOSE 8080 #暴露端口
VOLUME /tmp #挂载临时目录
ADD target/*.jar /app.jar #复制服务jar-重命名jar
RUN bash -c 'touch /app.jar' #更新修改时间
#默认运行命令
ENTRYPOINT ["java","-jar", "/app.jar","--spring.profiles.active=prod"]
#
2、编写K8s的Deploy描述文件 (部署到K8s集群yaml)
编写Service暴露到k8s集群yaml
$project目录下 /deploy :projectName-deploy.yaml
port封装(docker容器)
port:
target-port指容器端口
nodePort -> service(pod) -> docker(targetPort)
3、Jenkinsfile
pipeline{
#流水线
}
parameters{
# 2. 参数化构建:
}
stages{
stage('拉取代码'){
steps{
# 流水线
# 1. 拉取代码:git clone url
}
}
stage('unit test'){
steps{
# .....
}
}
stage('snoarqube analysis'){
steps{
# .....
}
}
stage('build & push'){
steps{
# ..... Dockerfile
}
}
stage('deploy k8s'){
}
stage('发布版本'){
}
}
4、访问测试(集群内部,外部访问)
jekins
nginx
-
nginx.conf
- 全局块
- events
- http
- http全局
- server块
- location (s)
-
nginx代理时会丢请求的Host信息,要中转header
location /{ proxy_set_header Host:$host; proxy_pass http://server; }

浙公网安备 33010602011771号