高可用篇

集群的基础形式

目标:高可用,突破数据量限制,数据备份容灾,压力分担

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;
    }
    
    
posted @ 2021-06-27 18:13  沉梦匠心  阅读(99)  评论(0)    收藏  举报