Java多线程之volatile关键字
在java多线程并发编程中,为了解决多线程并发的问题,在语言内部引入了同步块和volatile关键字机制。volatile是java的一个类型修饰符,它被设计用来修饰被不同线程访问和修改的变量。被volatile关键字修饰的变量,线程在每次使用变量的时候,都会读取变量修改后的最新的值。
volatile关键字的作用保证线程可见性volatile保证线程可见性是指:被volatile修饰的变量在多线程情况下线程能够自动发现volatile变量的最新值。
为什么多线程之间共同访问的变量的值是相互不可见的?这就需要从JMM开始说起:在java内存模型中,每个线程都会被分配一个线程栈,如果对象是多线程间的共享资源时,当线程访问某一个对象值的时候,首先通过对象的引用找到对应在堆内存的变量的值,然后把堆内存变量的值load到线程栈中,建立一个变量副本,之后线程操作的都是副本变量,当修改完副本变量之后,会将值写回到主内存中。但由于线程栈是线程间相互隔离的,即多线程间不可见,如果有其他线程修改了这个变量,但还未写回到主内存中时,其他线程读取的仍是自己线程栈的副本时,就会出现数据不一致的问题。
下面我通 ...
使用Hexo写第一篇文章
欢迎来到Hexo这是你的第一篇文章, 查看文档Hexo文档 以获取更多信息。 如果你在使用Hexo时遇到任何问题,你可以在故障排除文档中找到答案,或者也可以在GitHub上咨询。
建一篇新文章1$ hexo new "使用Hexo写第一篇文章"
更多信息: 请参考Hexo官网 Writing写作文档
启动Hexo服务1$ hexo server (hexo s)
更多信息: 请参考Hexo官网 Server服务文档
生成静态资源1$ hexo generate (hexo g)
更多信息: 请参考Hexo官网 Generating静态化文档
远程部署站点1$ hexo deploy (hexo d)
更多信息: 请参考Hexo官网 Deployment部署文档
分布式文件系统FastDFS安装部署(高可用)
本文会搭建一个适合低业务访问业务量的高可用的FastDFS集群环境:两个Tracker服务,一个storage group中两个storage服务节点;该方案仅适用于业务访问量较低的环境下。对于大量业务系统的高并发访问,为了保证存储系统正常工作一般的架构思路:安装多个Tracker服务(至少两个,根据业务量调整),搭建多个storage group(至少两个,根据业务量调整),每个storage group中多个storage node(至少两个,做数据的冗余备份,进行容灾机制,而且node必须在不同的机器上)
FastDFS简介FastDFS是一个开源的轻量级分布式文件系统,它对文件进行管理,功能包括:文件存储、文件同步、文件访问(文件上传、文件下载)等,解决了大容量存储和负载均衡的问题。特别适合以文件为载体的在线服务,如相册网站、视频网站等等。FastDFS为互联网量身定制,充分考虑了冗余备份、负载均衡、线性扩容等机制,并注重高可用、高性能等指标,使用FastDFS很容易搭建一套高性能的文件服务器集群提供文件上传、下载等服务。FastDFS服务端有两个角色:跟踪器(tracker) ...
分布式文件系统FastDFS安装部署(非高可用)
本文会搭建一个适合低业务访问业务量的非高可用的FastDFS集群环境:一个Tracker服务,一个storage group中两个storage服务节点;该场景不适合生产环境使用,生产环境应该增加Tracker服务数量使用负载均衡器负载或者使用keepalived进行主备,对于storage group应该搭建多个,每组storage group内节点至少在两个及以上。
在后台管理的web项目中,对于文件存储、上传、下载等操作是必不可少的。对于单节点部署的系统还可将文件存储在本机上进行操作,但是对于分布式部署的系统来说,文件存储操作问题就显现出来了,必须将文件集中存储在某处。目前一般的存储方案有:1.使用云厂商的对象存储服务;2.使用自建的文件服务器(ftp…);3.文件磁盘挂在方案;4.使用HDFS或FDFS等文件存储解决方案… 如果项目部署在可连接互联网的网络环境中可以使用云厂商的对象存储服务(安全、便利、低成本…);但是对于很多政企或者金融的项目大部分都是部署在不能连接互联网的网络环境中,那么我们就只能选择在内网搭建文件服务的方式。为了保证文件数据的安全性和完整性,本文使用分 ...
K8S(04)模拟生产环境搭建高可用集群之Etcd集群部署
本文我们首先要说到什么是etcd,为什么kubernetes要使用etcd ,然后实践下二进制安装部署etcd集群。
Etcd组件简介Etcd是一个高可用的键值存储系统,快速地保存和提供对关键数据的访问。它通过分布式锁定,领导者选举和写入障碍实现可靠的分布式协调。etcd集群旨在实现高可用性和永久数据存储和检索。主要用于共享配置和服务发现,它通过Raft一致性算法处理日志复制以保证强一致性,我们可以理解它为一个高可用强一致性的服务发现存储仓库。Etcd主要解决的是分布式系统中数据一致性的问题,而分布式系统中的数据分为控制数据和应用数据,etcd处理的数据类型为控制数据,对于很少量的应用数据也可以进行处理。
Etcd和Zookeeper的比较:1.zk相比部署维护复杂复杂,使用也复杂,学习成本较高。而etcd部署简单,使用HTTP作为接口使用简单,使用Raft算法保证强一致性让用户易于理解。2.zk使用Java编写,需要jvm才能运行,会引入大量的依赖,相对偏于中性应用。3.zk发展缓慢。而etcd被k8s作为默认存储系统,升级迭代迅速。4.etcd更安全,支持SSL客户端安全认证。
K ...
K8S(03)模拟生产环境搭建高可用集群之Master节点高可用方案
注意:本高可用方案不仅适用于本文的K8S主控节点的高可用,还适用于任何需要高可用的业务场景,haproxy可改用nginx或其他负载均衡器实现大家都知道在生产环境部署服务一定要坚持一条:不允许出现单点故障。我们在测试环境部署k8s的架构一般是单主控Master节点多个工作Node节点,生产上部署K8S集群要避免主控节点宕机,我们需要对主控节点进行高可用部署。生产环境对主控节点的高可用的解决方案:对主控节点部署多台(3台以上),然后多部署多台(一般2台以上)负载均衡器(一般选用Nginx或者Haproxy)来对主控节点的api-server服务进行负载以防止单点故障。本文将详细说明怎么对主控节点的api-server服务高可用,主要讲负载均衡器配置值部署这一块,集群的详细搭建在后面的文章中。
主工作节点:192.168.100.107从工作节点:192.168.100.108虚拟IP :192.168.100.110
环境说明系统环境:CentOS7.7Keepalived版本:2.0.19Haproxy版本:2.0.8
安装配置Keepalived服务下载Keepalive ...
K8S(02)模拟生产环境搭建高可用集群之Docker私服
由于kubernetes是对docker容器的编排,kubernetes搭建过程中需要从docker仓库中去拉取所需要的镜像。生产的k8s集群一般是搭建在内网中,因此需要在内网搭建一个Docker仓库私服。
安装docker服务下载docker二进制安装包:https://download.docker.com/linux/static/stable/x86_64/docker-19.03.4.tgz
解压docker二进制包将下载的docker二进制包上传到服务器上,然后解压:tar -zxvf docker-19.03.4.tgz
移动到系统bin目录在解压目录执行:sudo cp docker/* /usr/bin/
开启 docker 守护进程sudo dockerd &此时docker info 可以看到docker服务的信息
增加docker启动参数文件sudo cat > /etc/docker/daemon.json <<EOF{ “insecure-registries”:[“192.168.100.101”]}EOF
注册dock ...
K8S(01)模拟生产环境搭建高可用集群之环境规划和基础准备
在微服务盛行的今天,大大小小的公司都在实践自己的微服务架构。并且近年来又兴起了以istio为代表的Service Mesh技术体系,专注为服务之间的网络调用、限流、熔断和监控等,解耦了微服务业务。随着微服务业务增加,那么使用传统的管理和部署方式显然成本很高,而且对于开发人员的专业素质有很高要。于是后面出现了容器化技术,将微服务结合自动化发布技术部署在docker容器中。但是随着业务不断增长,越来越多的容器很难管理,于是出现了容器编排技术,目前占据份额最多的当属google开源的kubernetes项目。从本文开始将会从0开始模拟搭建一个高可用的kubernetes集群,由于生产环境机器一般不允许访问外部网络,因此我们这个系列的实践都是在断网下使用二进制部署。
模拟环境机器规划
集群环境说明操作系统:CentOS7.7Kubernetes版本:1.16.2Docker版本:19.03
集群主控和工作节点基础准备配置hosts文件12345678910sudo cat >> /etc/hosts<<EOF 192.168.100.111 kube_clus ...
使用Kubeadm部署Kubernetes集群V1.15.3
上文我们使用最新的kubernetes v1.16.0搭建了集群,但是由于版本导致了遇到问题,首先是dashboard不兼容1.16.0的Api,其次是flannel-cni的问题,本文重新用稳定版v1.15.3部署。
基础环境配置准备三台虚拟机docker 192.168.100.10node01 192.168.100.11 kube-node01 masternode01 192.168.100.12 kube-node02 minionnode01 192.168.100.13 kube-node03 minion
配置hosts文件12345cat >> /etc/hosts<<EOF 192.168.100.11 kube-node01 192.168.100.12 kube-node02 192.168.100.13 kube-node03 EOF
修改hostname文件sudo hostnamectl set-hostname
关闭系统防火墙systemctl stop firewalld ...
搭建Docker私有镜像仓库
docker仓库的工作原理和maven的类似,他们都提供了提供了一个中央仓库,允许用户科技直接从中央仓库下载,同时我们也可以搭建自己的本地私有仓库。下面我们将完整的说明使用docker registry 搭建docker私有镜像仓库和管理工具harbor的过程。docker本地私有镜像仓库的优点:
从私有仓库中下载节省网络带宽;
从私有仓库中下载速度快,一般都是局域网络内部署;
托管不对外的内部镜像;
安装dokcer服务配置源wget https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo -O /etc/yum.repos.d/docker-ce.repo安装docker-ce容器服务: yum -y install docker-ce添加docker服务开机自启动: systemctl enable docker && systemctl start docker修改docker启动参数:
1234567891011cat > /etc/docker/daemon.json ...