首页 文章 精选 留言 我的

精选列表

搜索[环境],共10000篇文章
优秀的个人博客,低调大师

YoyoGo v1.8.1 发布,更新配置读取环境变量

Features Get config value for DSL, that support key or ref object. Such as YAML: env: ${CUSTOM_ENV} profile: dns: ${REMOTE_HOST} ip: ${REMOTE_IP:10.0.1.12} namespace: ${MYNAMESPACE:space.localhost} Go Example type Profile struct { DNS string `config:"dns"` IP string `config:"ip"` NS string `config:"namespace"` } config := abstractions.NewConfigurationBuilder(). AddEnvironment(). AddYamlFile("config").Build() config.GetConfigObject("profile", &profile) assert.Equal(t, profile.NS, "space.yoyogo.run") assert.Equal(t, profile.DNS, "my host") assert.Equal(t, profile.IP, "10.0.1.12") or env := config.Get("env") dns := config.Get("profile.dns") ip := config.Get("profile.ip") assert.Equal(t, env, "my env variable") assert.Equal(t, dns, "my host") assert.Equal(t, ip, "10.0.1.12") YoyoGo 是一个用 Go 编写的简单,轻便,快速的微服务框架,目前已实现了Web框架的能力,但是底层设计已支持多种服务架构。 特性 漂亮又快速的路由器 中间件支持 (handler func & custom middleware) 对 REST API 友好 支持 MVC 模式 受到许多出色的 Go Web 框架的启发

优秀的个人博客,低调大师

30个类手写Spring核心原理之环境准备(1)

本文节选自《Spring 5核心原理》 1 IDEA集成Lombok插件 1.1 安装插件 IntelliJ IDEA是一款非常优秀的集成开发工具,功能强大,而且插件众多。Lombok是开源的代码生成库,是一款非常实用的小工具,我们在编辑实体类时可以通过Lombok注解减少getter、setter等方法的编写,在更改实体类时只需要修改属性即可,减少了很多重复代码的编写工作。 首先需要安装IntelliJ IDEA中的Lombok插件,打开IntelliJ IDEA后单击菜单栏中的File→Settings(如下图所示),或者使用快捷键Ctrl+Alt+S进入设置界面。 单击设置界面中的Plugins进行插件的安装,在右侧单击Browse repositories按钮,如下图所示。 然后在搜索界面中输入lombok可以查询到下方的Lombok Plugin,单击Lombok Plugin可在右侧看到Install按钮,单击该按钮便可开始安装,如下图所示。 我们在如下安装界面可以看到Lombok支持的所有注解。 在安装过程中有Downloading Plugins的提示,安装过程中进度条会变化。需要提醒的是,在安装过程中一定要保证网络连接可用且良好,否则可能会安装失败。 安装成功后可以看到下图右侧的Restart IntelliJ IDEA按钮,此时可先不操作,因为还有后续的配置工作。 回到Plugins,此时在下图右侧可以搜索到Lombok(而安装前搜索不到)。 1.2 配置注解处理器 在如下设置界面单击Build, Execution, Deployment→Compiler→Annotation Processors,然后在右侧勾选Enable annotation processing复选项即可。 1.3 使用插件 使用前需要说明的是,安装的插件只是一个调用,就像我们使用maven插件一样,本机需要安装maven才行。我们在使用Lombok前也需要在pom.xml文件中添加Lombok的依赖。 #托管的类扫描包路径# <dependency> <groupId>org.projectlombok</groupId> <artifactId>lombok</artifactId> <version>1.16.10</version> </dependency> 接下来编辑一个Config测试类,添加两个属性,最后在类上添加@Data属性,这个注解可以帮我们在.class文件中生成类中所有属性的get/set、equals、canEqual、hashCode、toString方法等,如下图所示。 我们还可以通过下面的方式查看Lombok生成的方法。在菜单栏中单击View→Tool Windows→Structure,便可以看到类中所有的方法,这些都是Lombok自动生成的,如下面两图所示。 2 从Servlet到ApplicationContext 在“用300行代码手写提炼Spring核心原理”一章中,我们已经了解Spring MVC的入口是DispatcherSerlvet,并实现了DispatcherServlet的init()方法,在init()方法中完成了IoC容器的初始化。而在使用Spring的过程中,见得最多的是ApplicationContext,似乎Spring托管的所有实例Bean都可以通过调用getBean()方法来获得。那么ApplicationContext又是从何而来的呢?从Spring源码中可以看到,DispatcherServlet的类图如下图所示。 DispatcherServlet继承了FrameworkServlet,FrameworkServlet继承了HttpServletBean,HttpServletBean继承了HttpServlet。在HttpServletBean的init()方法中调用了FrameworkServlet的initServletBean()方法,在initServletBean()方法中初始化WebApplicationContext实例。在initServletBean()方法中调用了DispatcherServlet重写的onRefresh()方法。在DispatcherServlet的onRefresh()方法中又调用了initStrategies()方法,初始化Spring MVC的九大组件。 其实,通过上面复杂的调用关系可以得出一个结论:在Servlet的init()方法中初始化了IoC容器和Spring MVC所依赖的九大组件。 在手写之前先将框架类关系画出来,如下图所示,顺便也回顾一下我们之前讲过的IoC容器结构。 3 准备基础配置 在开始手写之前我们先做一个约定,所有的手写类都以GP开头,以区别于Spring框架中的原生类,方便对比理解。如DispatcherServlet在这个Mini版本中会命名为GPDispatcherServlet,所有的方法名尽量和原生Spring保持一致,可能有些参数列表会做一些微调,主要目的是理解设计思路。 3.1 application.properties配置 还是先从application.properties文件开始,用application.properties来代替application.xml,具体配置如下: #托管的类扫描包路径# scanPackage=com.gupaoedu.vip.spring.demo 3.2 pom.xml配置 接下来看pom.xml的配置,主要关注jar包依赖: <properties> <!-- dependency versions --> <servlet.api.version>2.4</servlet.api.version> </properties> <dependencies> <!-- requied start --> <dependency> <groupId>javax.servlet</groupId> <artifactId>servlet-api</artifactId> <version>${servlet.api.version}</version> <scope>provided</scope> </dependency> <!-- requied end --> <dependency> <groupId>org.projectlombok</groupId> <artifactId>lombok</artifactId> <version>1.16.10</version> </dependency> <dependency> <groupId>org.slf4j</groupId> <artifactId>slf4j-api</artifactId> <version>1.7.25</version> </dependency> <dependency> <groupId>ch.qos.logback</groupId> <artifactId>logback-classic</artifactId> <version>1.2.3</version> </dependency> </dependencies> 3.3 web.xml配置 web.xml配置如下: <?xml version="1.0" encoding="UTF-8"?> <web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://java.sun.com/xml/ns/j2ee" xmlns:javaee="http://java.sun.com/xml/ns/javaee" xmlns:web="http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd" xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd" version="2.4"> <display-name>Gupao Spring Application</display-name> <servlet> <servlet-name>gupaomvc</servlet-name> <servlet-class>com.gupaoedu.vip.spring.formework.webmvc.servlet.GPDispatcherServlet </servlet-class> <init-param> <param-name>contextConfigLocation</param-name> <param-value>classpath:application.properties</param-value> </init-param> <load-on-startup>1</load-on-startup> </servlet> <servlet-mapping> <servlet-name>gupaomvc</servlet-name> <url-pattern>/*</url-pattern> </servlet-mapping> </web-app> 3.4 GPDispatcherServlet GPDispatcherServlet代码如下: package com.gupaoedu.vip.spring.formework.webmvc.servlet; import javax.servlet.ServletConfig; import javax.servlet.ServletException; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import java.io.IOException; //Servlet只是作为一个MVC的启动入口 public class GPDispatcherServlet extends HttpServlet { @Override public void init(ServletConfig config) throws ServletException { } @Override protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { this.doPost(req,resp); } @Override protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { } } 用30个类手写一个Spring的准备阶段就到此为止,大家一定要记得自己动手操作。光看不练假把式。 关注微信公众号『 Tom弹架构 』回复“Spring”可获取完整源码。 本文为“Tom弹架构”原创,转载请注明出处。技术在于分享,我分享我快乐! 如果本文对您有帮助,欢迎关注和点赞;如果您有任何建议也可留言评论或私信,您的支持是我坚持创作的动力。关注微信公众号『 Tom弹架构 』可获取更多技术干货! 原创不易,坚持很酷,都看到这里了,小伙伴记得点赞、收藏、在看,一键三连加关注!如果你觉得内容太干,可以分享转发给朋友滋润滋润!

优秀的个人博客,低调大师

电子邮件环境下STARTTLS的安全性分析

STARTTLS,是一种明文通信协议的扩展,能够让明文的通信连线直接成为加密连线(使用SSL或TLS加密),而不需要使用另一个特别的端口来进行加密通信,属于机会性加密。 电子邮件客户端和服务器之间的连接提供了两种使用 TLS 保护的方法:隐性 TLS 从一开始就对连接进行加密并在单独的端口上运行,而 STARTTLS 提供了一种将现有未加密连接升级到 TLS 的机制。 有时 STARTTLS 被视为一种机会加密模式,仅在可用时提供 TLS 保护。这很容易受到降级攻击。但是,现代电子邮件客户端通常期望强制执行 STARTTLS,并且在启用时,不可能进行未加密的通信。 通过STARTTLS升级连接是很脆弱的,容易受到许多安全漏洞和攻击的影响。我们在 STARTTLS 实现中发现了 40 多个漏洞。我们的结论是,这些漏洞是如此普遍,所以我们建议尽可能避免使用STARTTLS。 我们假设中间人 (MitM) 攻击者可以修改电子邮件客户端和提供商的电子邮件服务器之间建立的连接。 通过命令注入使用 SMTP 和 IMAP 窃取登录凭据 2011 年,Postfix 开发人员 Wietse Venema 描述了 STARTTLS 实现中的一个漏洞,该漏洞允许注入服务器将其解释为加密连接的一部分的明文命令。这是通过使用 STARTTLS 命令向同一 TCP 段中的服务器发送附加命令来实现的。 我们发现,尽管自2011年以来人们就知道这个漏洞,但它仍然非常普遍。截止目前共发现了15个易受攻击的实现场景,在扫描中,2%的邮件服务器显示了这个漏洞。 此命令注入可用于通过 SMTP 和 IMAP 协议窃取凭据。 我们的攻击需要一个中间人 (MitM) 攻击者,该攻击者可以修改网络流量并在同一服务器上拥有自己帐户的登录凭据。攻击者可以注入对其进行身份验证的命令,然后开始发送 (SMTP) 或存储 (IMAP) 电子邮件,受害者发送的登录凭据将存储在攻击者可以访问的电子邮件中。 命令注入还可用于跨协议攻击,以使用邮件服务器的证书提供 HTTPS 内容。 通过响应注入伪造邮箱内容 我们发现了一种类似于电子邮件客户端应用程序中的命令注入的攻击,称之为响应注入。此漏洞影响了许多流行的邮件客户端,包括 Apple Mail、Mozilla Thunderbird、Claws Mail 和 Mutt。 通过在 TLS 握手之前向服务器消息注入额外的内容以响应 STARTTLS 命令,我们可以注入服务器命令,客户端将处理这些命令,就好像它们是加密连接的一部分一样,这可用于伪造邮箱内容。 通过 PREAUTH 和 REFERRAL 窃取凭据的 IMAP 连接降级 在 IMAP 协议中,服务器可以通过 PREAUTH 命令在第一条消息中通知客户端它已经通过了身份验证。该协议禁止在已验证状态下使用 STARTTLS 命令。因此,如果客户端应用程序接受 PREAUTH,则它无法强制执行 STARTTLS。 中间人攻击者可以使用它来阻止 STARTTLS 升级连接并强制客户端使用未加密的连接。该漏洞最初于2014年在Trojitá中被发现。我们发现,其他多个电子邮件客户端应用程序也容易受到同一漏洞的攻击。 此漏洞与 IMAP 功能登录引用和邮箱引用结合使用时尤其严重,这些命令允许服务器指示客户端登录到另一个 IMAP 服务器。通过使用 PREAUTH 来防止加密连接,攻击者可以使用引用来强制客户端将凭据发送到攻击者控制的服务器。幸运的是,许多客户端不支持推荐功能。我们发现只有一个客户—— Alpine,容易受到这种 PREAUTH 和推荐组合的影响。 总结 本文描述的所有漏洞都依赖于不安全连接到安全连接的转换,隐性 TLS 没有这样的转换,因此不容易受到这些攻击。因此,我们认为隐性 TLS 比 STARTTLS 更安全。 我们还指出 STARTTLS 总是引入至少一个额外的连接,所以隐性 TLS 通常提供更好的性能。 安全影响 我们认为本文所讲的攻击难以大规模执行,主要用于有针对性的攻击。因此,你应该始终更新软件并重新配置电子邮件客户端以只使用隐性 TLS。 安全建议 对于电子邮件客户端用户 如果可能,我们建议用户检查并配置他们的电子邮件客户端,以在专用端口上使用带有隐性 TLS 的 SMTP、POP3 和 IMAP,即SMTP/Submission端口465,POP3端口995,IMAP端口993。某些邮件服务提供商,尤其是 Microsoft 和 Apple,不支持SMTP/Submission的隐式TLS。我们建议用户让他们的邮件服务提供商提供更安全的隐性 TLS 选项。 对于应用程序开发人员 默认情况下,电子邮件服务器和客户端应用程序都应提供隐性 TLS。从长远来看,软件开发人员可能会决定根本不支持 STARTTLS,从而简化他们的代码和配置对话框和文件。 我们建议在服务器端和客户端审核所有支持 STARTTLS 的应用程序,因为应用程序需要确保没有未加密的内容作为加密连接的一部分被处理。 IMAP 应用程序必须确保它们不允许将 PREAUTH 与 STARTTLS 结合使用,可以使用EAST 工具包,它允许测试应用程序。 对于邮件服务器管理员 确保你使用的服务器支持所有支持的协议的隐性 TLS,如果可能,请考虑为 IMAP、POP3 和 SMTP 提交禁用 STARTTLS。 如果你确实需要支持 STARTTLS,建议使用建议的工具针对所有支持的协议的命令注入漏洞测试服务器。如果服务器软件易受攻击,立马应该进行安全更新。 常见问题 STARTTLS不安全吗? STARTTLS有两种“模式”,“机会主义模式”和“强制模式”。电子邮件客户端在提交新邮件或访问现有邮件之前必须使用用户名和密码进行身份验证。对于这些连接,必须严格执行通过STARTTLS传输到TLS的转换,因为降级将暴露用户名和密码,并给予攻击者对电子邮件帐户的完全访问权。 如何测试使用的软件是否易受攻击? 我们了提供允许测试电子邮件客户端和服务器的 EAST 工具包。 使用我们的命令注入测试器测试电子邮件服务器的命令注入相对容易。 testssl.sh(开发版)和 TLS-Attacker/TLS-Scanner也会检查命令注入。 其他支持 STARTTLS 或类似机制的协议是否受到影响? 我们希望在其他使用 STARTTLS 的协议中看到类似的漏洞,例如 XMPP、FTP、IRC 或 LDAP。因此,我们建议避免 STARTTLS 并尽可能使用隐性 TLS。 邮件服务器之间的通信(MTA到MTA)如何处理? 传统上,电子邮件服务器之间的 STARTTLS 只能防止被动攻击,容易受到主动攻击,例如 STARTTLS 攻击。 【责任编辑:未丽燕 TEL:(010)68476606】

优秀的个人博客,低调大师

k8s生产环境应用部署(无坑版本)

2 --> 一.Docker harbor搭建 二.构建提交镜像 三.k8s部署 一.Docker harbor搭建 1.1 .docker harbor部署(https://www.cnblogs.com/sanduzxcvbnm/p/13724770.html) 1.2 创建docker harbor认证secret kubectl create secret docker-registry registry-pull-secret --docker-server=10.206.16.4 --docker-username=admin --docker-password=Rolinabc123 --docker-email=xxxx@qq.com 1.3 进入harbor界面,创建项目fronted 二.构建提交镜像 2.1 进入网站目录编写dockerfile From nginx WORKDIR /var/www/html add h5game.xxx.com.tar.gz /var/www/html 2.2 修改客户端docker配置文件支持http vim /etc/docker/daemon.json "insecure-registries" : ["10.206.16.4"] 2.3 构建镜像推送到harbor docker login 10.206.16.4 docker build 10.206.16.4/fronted/h5game.xxx.com:v1 . docker push 10.206.16.4/fronted/h5game.xxx.com:v1 三.k8s部署 3.1 namespace创建 namespace.yaml apiVersion: v1 kind: Namespace metadata: name: fronted 3.2 configmap配置创建 configmap.yaml kind: ConfigMap # 对象类型 apiVersion: v1 # api 版本 metadata: # 元数据 name: h5sdk # 对象名称 namespace: fronted data: # key-value 数据集合 nginx.conf: | # 将 nginx config 配置写入 ConfigMap 中,经典的 php-fpm 代理设置,这里就不再多说了 events { } http { include mime.types; default_type application/octet-stream; log_format main '$remote_addr - $remote_user [$time_local] "$request" ' '$status $body_bytes_sent "$http_referer" ' '"$http_user_agent" "$http_x_forwarded_for"'; sendfile on; gzip on; tcp_nopush on; tcp_nodelay on; server_tokens off; keepalive_timeout 0; client_body_timeout 10; client_header_timeout 10; client_header_buffer_size 1k; large_client_header_buffers 4 4k; output_buffers 1 32k; client_max_body_size 64m; client_body_buffer_size 256k; server { listen 80 default_server; listen [::]:80 default_server; root /var/www/html/h5game.sentsss.com; #index index.php; server_name _; location ~ .*\.(gif|jpg|jpeg|png|bmp|swf)$ { expires 30d; } location ~ .*\.(js|css)?$ { expires 12h; } location / { index index.html index.htm index.php; if (!-e $request_filename) { rewrite ^(.*)$ /index.php?s=$1 last; break; } } access_log /var/log/nginx/access.log; error_log /var/log/nginx/error.log error; #location ~ \.php$ { # include fastcgi_params; # fastcgi_param REQUEST_METHOD $request_method; # fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name; # fastcgi_pass 127.0.0.1:9000; } } 3.3 部署文件 deployment.yaml kind: Deployment apiVersion: apps/v1 metadata: name: h5sdk namespace: fronted spec: selector: kind: Deployment apiVersion: apps/v1 metadata: name: h5sdk namespace: fronted spec: selector: matchLabels: app: h5sdk replicas: 2 template: metadata: labels: app: h5sdk spec: #nodeName: k8s-node-01 imagePullSecrets: - name: registry-pull-secret containers: - name: nginx image: 10.206.16.4/fronted/www.h5sdk.xxx.com:v1 ports: - containerPort: 80 volumeMounts: #- mountPath: /var/www/html #name: nginx-www - mountPath: /etc/nginx/nginx.conf subPath: nginx.conf name: nginx-config - mountPath: /var/log/nginx name: nginx-log - mountPath: /etc/localtime name: timezone #探针查看服务是否可用是否加入service livenessProbe: httpGet: path: /user.html port: 80 initialDelaySeconds: 30 periodSeconds: 10 successThreshold: 1 failureThreshold: 3 timeoutSeconds: 1 readinessProbe: httpGet: path: /user.html port: 80 initialDelaySeconds: 30 periodSeconds: 10 successThreshold: 1 failureThreshold: 3 timeoutSeconds: 1 lifecycle: preStop: exec: command: ["/bin/bash","-c","sleep 20"] resources: limits: cpu: 40m memory: 40Mi requests: cpu: 20m memory: 20Mi affinity: podAntiAffinity: requiredDuringSchedulingIgnoredDuringExecution: - labelSelector: matchExpressions: - {key: app, operator: In, values: ["h5sdk"]} topologyKey: fronted volumes: - name: nginx-log hostPath: path: /opt/log/nginx/h5sdk - name: nginx-config configMap: name: h5sdk - name: timezone hostPath: path: /usr/share/zoneinfo/Asia/Shanghai #- name: nginx-www # emptyDir: {} 3.4 svc的创建 svc.yaml apiVersion: v1 kind: Service metadata: name: h5sdk namespace: fronted spec: selector: #project: h5sdk app: h5sdk ports: - port: 80 targetPort: 80 3.5 ingress创建 ingress.yaml kind: Ingress # 对象类型 apiVersion: networking.k8s.io/v1beta1 metadata: name: h5sdk namespace: fronted spec: rules: - host: h6game.xxx.com http: paths: - path: / backend: serviceName: h5sdk # 需要与servicename一致 servicePort: 80 # 与 Service 的 port 一致 3.6 hpa创建 hpa.yaml(记得提前安装metric) kind: HorizontalPodAutoscaler # 对象类型,简称 hpa,水平自动伸缩 apiVersion: autoscaling/v2beta2 # autoscaling/v2beta2 与 autoscaling/v1 的 API 有很大的不同,注意识别两者的差异 metadata: name: h5sdk namespace: fronted spec: scaleTargetRef: # 伸缩的目标对象 apiVersion: apps/v1 # 对象版本 kind: Deployment # 目标对象的类型 name: h5sdk # 目标对象的名称 minReplicas: 2 # 最小副本数 maxReplicas: 4 # 最大副本数 metrics: # 指标 - type: Resource # 类型:资源 resource: name: memory # 内存 target: type: Utilization averageUtilization: 70 # 1% 这个值是为了实验,具体值请参考业务方实际情况而定 - type: Resource resource: name: cpu target: type: Utilization averageUtilization: 70 3.7 腾讯云申请一个负载均衡,然后将所有node节点加入到负载均衡 3.8 域名解析到负载均衡的ip上

优秀的个人博客,低调大师

生产环境使用HBase,你必须知道的最佳实践

云栖号资讯:【点击查看更多行业资讯】在这里您可以找到不同行业的第一手的上云资讯,还在等什么,快来! 前面,我们已经打下了很多关于HBase的理论基础,今天,我们主要聊聊在实际开发使用HBase中,需要关注的一些最佳实践经验。 Schema设计七大原则 1)每个region的大小应该控制在10G到50G之间; 2)一个表最好保持在 50到100个 region的规模; 3)每个cell最大不应该超过10MB,如果超过,应该有些考虑业务拆分,如果实在无法拆分,那就只能使用mob; 4)跟传统的关系型数据库不同,一个HBase的表中列族最多不超过3个,列族中的列可以动态添加的,不要设计过多列族; 5)列族名必须尽量短,因为我们知道在存储的时候,每个keyvalue都会包含列族名; 6)如果一个表存在一个以上的列族,那么必须要注意,不同列族之间行数相差不要太大。例如列族A有10万行,而列族B有1亿行,那么rowkey就有1亿行,而region是按照行键进行切分的,因此列族A可能会被打散为很多很多小region,这会导致在扫描列族A时会引发较多IO,效率低下。 7)列族可以设置TTL时间,HBase在超过设定时间后,会自动删除数据。 设置方法有两种: 建表时设置,TTL单位为秒,此例中列簇'f1'的数据保留1天(86400秒) hbase(main):002:0>create 'table', {NAME => 'f1', TTL => 86400} 通过修改表设置 hbase(main):002:0>alter 'table', {NAME => 'f1', TTL => 86400} 这里需要注意,一旦超过设定时间后,该数据就无法读取了,但是,真正的过期数据删除,是发生在major compaction时。 . RowKey设计三大策略 HBase作为一个分布式存储数据库,虽然扩容非常容易,但是,对于“热点”问题,还是非常头疼的。 所谓“热点”问题(HotSpotting),就是请求(读或者写)短时间内落在了集中的个别region上,导致了该region所在机器的负载急剧上升,超过了单点实例的承受能力,从而引起性能下降或者不可用。 要解决这个问题,就需要设计RowKey时,使得数据尽量往多个region上去写。 举个例子: 假如region按照26个字母分成26个,那么同时写入m开头的rowkey的记录都会同时写入同一个region 比如m001,m002,m003,m004,m005。 因此,RowKey的设计非常关键。常见的设计策略有这么几种。 1)salting salting策略就是将生成随机数放在行键的开头作为前缀,使得每个行键有随机的字典序。 对上面的案例进行优化,我们采用了salting策略,插入前给每个rowkey生成一个随机的字母,变成了 am001,zm002,nm003,qm004,lm005 这样就能同时往5个region里面写入了,成功打散。 副作用:由于前缀生成是随机的,因此如果想要按照字典序查询这些行,则需要做更多的事情。从这个角度上看,salting增加了写操作的吞吐量,却也增大了读操作的开销。 2)Hashing Hashing策略也是一种特殊的salting,是用一个单向的 hash 来取代随机指派前缀。 这样能使一个给定rowkey的行在“salted”时有相同的前缀,因此,这样既可以分散RegionServer间的负载的,同时也允许在读操作时能够预测这个前缀值是什么。确定性hash( deterministic hash )可以让客户端重建完整的行键,然后就可以像正常一样用Get方法查询确定的行。 3)reverse key 第三种预防hotspotting的方法是反转一段固定长度或者可数的键,让变化最多的某个位置放在rowkey的第一位, 副作用:对于Get操作没有影响,但是不利于Scan操作进行范围查询,因为数据在原RowKey上的顺序已经被打乱。 预分区 在 HBase核心特性—region split 中,我们知道已经提到过关于预分区。 主要原因是当一张表被首次创建时,只会分配一个region给这个表。因此,在刚刚开始时,所有读写请求都会落在这个region所在的region server上,而不管你整个集群有多少个region server。不能充分地利用集群的分布式特性。 因此,预分区主要也是解决“热点”问题。 最为常见的建表语句为: create ‘tb’,{NAME => ‘f1’,COMPRESSION => ‘snappy’ }, { NUMREGIONS => 50, SPLITALGO => ‘HexStringSplit’ } NUMREGIONS 为 region的个数,一般按照每个region 8-10GB左右来计算region数量,如果集群规模非常大,那么region数量可以适当取大一些 SPLITALGO 为 rowkey分割的算法,Hbase自带了三种pre-split的算法,分别是 HexStringSplit、DecimalStringSplit 和 UniformSplit。 各种Split算法适用场景: HexStringSplit: rowkey是十六进制的字符串作为前缀的 DecimalStringSplit: rowkey是10进制数字字符串作为前缀的 UniformSplit: rowkey前缀完全随机 读性能优化 前面主要讲一些设计方面的优化点。那如果在HBase的使用过程中,发现查询较慢,那么就需要根据具体情况,分析查询慢的原因,并采取相应的策略。 【云栖号在线课堂】每天都有产品技术专家分享!课程地址:https://yqh.aliyun.com/zhibo 立即加入社群,与专家面对面,及时了解课程最新动态!【云栖号在线课堂 社群】https://c.tb.cn/F3.Z8gvnK 原文发布时间:2020-03-24本文作者: 阿丸笔记 本文来自:“CSDN云计算”,了解相关信息可以关注“CSDN云计算”

资源下载

更多资源
Mario

Mario

马里奥是站在游戏界顶峰的超人气多面角色。马里奥靠吃蘑菇成长,特征是大鼻子、头戴帽子、身穿背带裤,还留着胡子。与他的双胞胎兄弟路易基一起,长年担任任天堂的招牌角色。

腾讯云软件源

腾讯云软件源

为解决软件依赖安装时官方源访问速度慢的问题,腾讯云为一些软件搭建了缓存服务。您可以通过使用腾讯云软件源站来提升依赖包的安装速度。为了方便用户自由搭建服务架构,目前腾讯云软件源站支持公网访问和内网访问。

Rocky Linux

Rocky Linux

Rocky Linux(中文名:洛基)是由Gregory Kurtzer于2020年12月发起的企业级Linux发行版,作为CentOS稳定版停止维护后与RHEL(Red Hat Enterprise Linux)完全兼容的开源替代方案,由社区拥有并管理,支持x86_64、aarch64等架构。其通过重新编译RHEL源代码提供长期稳定性,采用模块化包装和SELinux安全架构,默认包含GNOME桌面环境及XFS文件系统,支持十年生命周期更新。

WebStorm

WebStorm

WebStorm 是jetbrains公司旗下一款JavaScript 开发工具。目前已经被广大中国JS开发者誉为“Web前端开发神器”、“最强大的HTML5编辑器”、“最智能的JavaScript IDE”等。与IntelliJ IDEA同源,继承了IntelliJ IDEA强大的JS部分的功能。

用户登录
用户注册