高可用性、负载均衡的mysql集群解决方案

2019独角兽企业重金招聘Python工程师标准>>> hot3.png

一、为什么需要mysql集群?

一个庞大的分布式系统的性能瓶颈中,最脆弱的就是连接。连接有两个,一个是客户端与后端的连接,另一个是后端与数据库的连接。简单如图下两个蓝色框框

在客户端与后端中可以利用类似nginx的负载均衡解决(本专题是mysql优化,后面出高并发专题再详细讲解连接1的负载均衡),而数据库层是最脆弱的一层,一般在应用设计时在上游就需要把请求拦截掉,数据库层只承担“能力范围内”的访问请求,所以,我们通过在服务层引入队列和缓存,让最底层的数据库高枕无忧。

但是,如果请求激增,还是有大量的查询压力到MySQL怎么办呢?

无所不能的程序员还是要想办法解决MySQL的瓶颈。这时候,集群出现了。在后端与数据库中我们可以利用类似mycat的负载均衡实现mysql集群,提高mysql的总体性能。(可用组合很多,如LVS+keepalived组合、haproxy+keepalived组合)

二、基本软件版本

操作系统:CentOS-6.6-x86_64

JDK版本:jdk1.7.0_72

HAProxy版本:haproxy-1.5.16.tar.gz

MyCat版本:Mycat-server-1.4-release-20151019230038-linux.tar.gz

MySQL版本:mysql-5.6.26.tar.gz

三、部署环境规划:

四、集群部署架构图如下:

图解说明:

HAProxy负责将请求分发到MyCat上,起到负载均衡的作用,同时HAProxy也能检测到MyCat是否存活,HAProxy只会将请求转发到存活的MyCat上。如果一台MyCat服务器宕机,HAPorxy转发请求时不会转发到宕机的MyCat上,所以MyCat依然可用。

五、MyCat节点2的部署

MyCat主机2(edu-mycat-02,192.168.1.204)

注意:edu-mycat-01(192.168.1.203)和 edu-mycat-02(192.168.1.204) 中都要加上(或更新)主机名映射配置。

# vi /etc/hosts
192.168.1.203 edu-mycat-01
192.168.1.204 edu-mycat-02
192.168.1.205 edu-mysql-01
192.168.1.206 edu-mysql-02

六、配置MyCat状态检查服务(在MyCat节点主机上配置)

MyCat服务主机(edu-mycat-01、edu-mycat-02)上需要增加mycat服务的状态检测脚本,并开放相应的检测端口,以提供给HAProxy对MyCat的服务状态进行检测判断。可以使用xinetd来实现,通过xinetd,HAProxy可以用httpchk来检测MyCat的存活状态。(xinetd即extended internet daemon,xinetd是新一代的网络守护进程服务程序,又叫超级Internet服务器。经常用来管理多种轻量级Internet服务。xinetd提供类似于inetd+tcp_wrapper的功能,但是更加强大和安全。xinetd为linux系统的基础服务)

1、如果xinetd还没有安装,可使用如下命令安装:

# yum install xinetd

2、检查/etc/xinetd.conf的末尾是否有 includedir /etc/xinetd.d ,没有就加上

# vi /etc/xinetd.conf

3、检查 /etc/xinetd.d 目录是否存在,不存在刚创建

# mkdir /etc/xinetd.d/

4、增加MyCat存活状态检测服务配置

# touch /etc/xinetd.d/mycat_status
# vi /etc/xinetd.d/mycat_status

增加以下内容:

service mycat_status
{flags = REUSE## 使用该标记的socket_type为stream,需要设置wait为nosocket_type = stream ## 封包处理方式,Stream为TCP数据包port = 48700 ## 服务监听端口wait = no ## 表示不需等待,即服务将以多线程的方式运行user = root ## 执行此服务进程的用户server =/usr/local/bin/mycat_status ## 需要启动的服务脚本log_on_failure += USERID ## 登录失败记录的内容disable = no ## 要启动服务,将此参数设置为no
}

5、添加 /usr/local/bin/mycat_status 服务脚本

# touch /usr/local/bin/mycat_status
# vi /usr/local/bin/mycat_status

增加以下内容:

#!/bin/bash
#/usr/local/bin/mycat_status.sh
# This script checks if a mycat server is healthy running on localhost.
# It will return:
# "HTTP/1.x 200 OK " (if mycat is running smoothly)
# "HTTP/1.x 503 Internal Server Error " (else)
mycat=`/usr/local/mycat/bin/mycat status | grep 'not running' | wc -l`
if [ "$mycat" = "0" ]; then
/bin/echo -e "HTTP/1.1 200 OK "
else
/bin/echo -e "HTTP/1.1 503 Service Unavailable "
fi

6、给新增脚本赋予可执行权限

# chmod a+x /usr/local/bin/mycat_status

7、在 /etc/services 中加入 mycat_status 服务

# vi /etc/services

在末尾加入:

mycat_status 48700/tcp # mycat_status

保存后,重启xinetd服务

# service xinetd restart

8、验证mycat_status服务是否成功启动

# netstat -antup|grep 48700

能看到上图这样的信息,说明服务配置成功。

9、MyCat服务主机的防火墙上打开 48700端口

# vi /etc/sysconfig/iptables

增加:

-A INPUT -m state --state NEW -m tcp -p tcp --dport 48700 -j ACCEPT

保存后重启防火墙

# service iptables restart

脚本测试:

# /usr/local/bin/mycat_status

七、HAProxy介绍(官网:http://www.haproxy.org/)

HAProxy 是一款提供高可用性、负载均衡以及基于TCP(第四层)和HTTP(第七层)应用的代理软件,支持虚拟主机,它是免费、快速并且可靠的一种解决方案。

HAProxy目前主要有三个版本:1.4、1.5、1.6,CentOS6.6自带的RPM包为1.5的。

HAProxy1.5版开始,支持SSL、DDoS防护等功能,可看官网说明:

version 1.5 : the most featureful version, supports SSL, IPv6, keep-alive, DDoS protection, etc...

MyCat官方推荐使用HAProxy做MyCat的高可用负载均衡代理。

八、HAProxy的安装(192.168.1.191)

1、下载(或上传) haproxy-1.5.16.tar.gz 到 /usr/local/src,解压安装

[root@edu-haproxy-01 src]# cd /usr/local/src/
#wget http://www.haproxy.org/download/1.5/src/haproxy-1.5.16.tar.gz
[root@edu-haproxy-01 src]# tar -zxvf haproxy-1.5.16.tar.gz
[root@edu-haproxy-01 src]# cd haproxy-1.5.16

2、如需了解安装注意点,可查看HAProxy的软件说明

[root@edu-haproxy-01 haproxy-1.5.16]# less README

3、安装编译所需的依赖包

# yum install gcc gcc-c++ pcre pcre-devel zlib zlib-devel openssl openssl-devel

4、编译

# make TARGET=linux2628 ARCH=x86_64 USE_PCRE=1 USE_OPENSSL=1 USE_ZLIB=1 PREFIX=/usr/local/haproxy

## TARGET是指定内核版本,高于2.6.28的建议设置为linux2628,Linux操作系统内核版本查看命令# uname -r, ARCH指定系统架构,openssl pcre zlib 这三个包需要安装不然不支持

5、创建安装目录 /usr/local/haproxy

# mkdir /usr/local/haproxy

6、执行安装

[root@edu-haproxy-01 haproxy-1.5.16]# make install PREFIX=/usr/local/haproxy
install -d "/usr/local/haproxy/sbin"
install haproxy "/usr/local/haproxy/sbin"
install -d "/usr/local/haproxy/share/man"/man1
install -m 644 doc/haproxy.1 "/usr/local/haproxy/share/man"/man1
install -d "/usr/local/haproxy/doc/haproxy"
for x in configuration architecture haproxy-en haproxy-fr; do
install -m 644 doc/$x.txt "/usr/local/haproxy/doc/haproxy" ;
done

7、创建配置文件目录

# mkdir -p /usr/local/haproxy/conf
# mkdir -p /etc/haproxy/

8、从配置文件模版复制配置文件,并添加配置文件软连接

# cp /usr/local/src/haproxy-1.5.16/examples/haproxy.cfg /usr/local/haproxy/conf/
# ln -s /usr/local/haproxy/conf/haproxy.cfg /etc/haproxy/haproxy.cfg

9、拷贝错误页面,并添加目录软连接(HTTP模式选配)

# cp -r /usr/local/src/haproxy-1.5.16/examples/errorfiles /usr/local/haproxy/
# ln -s /usr/local/haproxy/errorfiles /etc/haproxy/errorfiles

10、拷贝开机启动文件,并赋予可执行权限

# cp /usr/local/src/haproxy-1.5.16/examples/haproxy.init /etc/rc.d/init.d/haproxy
# chmod +x /etc/rc.d/init.d/haproxy

11、添加haproxy命令脚本软连接

# ln -s /usr/local/haproxy/sbin/haproxy /usr/sbin

12、设置HAProxy开机启动

# chkconfig --add haproxy
# chkconfig haproxy on

九、HAProxy配置MyCat负载均衡集群

HAProxy支持TCP(第四层)和HTTP(第七层)应用的代理,本节课程我们使用HAProxy来做MyCat的负载均衡代理使用的是TCP模式。在4层模式下HAProxy仅在客户端和服务器之间转发双向流量。HAProxy配置简单,拥有非常不错的服务器健康检查功能,当其代理的后端服务器出现故障,HAProxy会自动将该服务器摘除,故障恢复后会自动将该服务器加入进来。

1、修改haproxy.cfg 配置文件

具体参数说明可参考官方配置文档 /usr/local/haproxy/doc/haproxy/configuration.txt

或GitHub连接:http://cbonte.github.io/haproxy-dconv/configuration-1.5.html

# vi /usr/local/haproxy/conf/haproxy.cfg
## global配置中的参数为进程级别的参数,通常与其运行的操作系统有关globallog 127.0.0.1 local0 info ## 定义全局的syslog服务器,最多可以定义2个### local0是日志设备,对应于/etc/rsyslog.conf中的配置,默认回收info的日志级别#log 127.0.0.1 local1 infochroot /usr/share/haproxy ## 修改HAProxy的工作目录至指定的目录并在放弃权限之前执行### chroot() 操作,可以提升 haproxy 的安全级别group haproxy ## 同gid,不过这里为指定的用户组名user haproxy ## 同uid,但这里使用的为用户名daemon ## 设置haproxy后台守护进程形式运行nbproc 1 ## 指定启动的haproxy进程个数,### 只能用于守护进程模式的haproxy;默认为止启动1个进程,### 一般只在单进程仅能打开少数文件描述符的场中中才使用多进程模式maxconn 4096 ## 设定每个haproxy进程所接受的最大并发连接数,### 其等同于命令行选项"-n","ulimit-n"自动计算的结果正式参照从参数设定的# pidfile /var/run/haproxy.pid ## 进程文件(默认路径 /var/run/haproxy.pid)node edu-haproxy-01 ## 定义当前节点的名称,用于HA场景中多haproxy进程共享同一个IP地址时description edu-haproxy-01 ## 当前实例的描述信息## defaults:用于为所有其他配置段提供默认参数,这默认配置参数可由下一个"defaults"所重新设定defaultslog global ## 继承global中log的定义mode http ## mode:所处理的模式 (tcp:四层 , http:七层 , health:状态检查,只会返回OK)### tcp: 实例运行于纯tcp模式,在客户端和服务器端之间将建立一个全双工的连接,#### 且不会对7层报文做任何类型的检查,此为默认模式### http:实例运行于http模式,客户端请求在转发至后端服务器之前将被深度分析,#### 所有不与RFC模式兼容的请求都会被拒绝### health:实例运行于health模式,其对入站请求仅响应“OK”信息并关闭连接,#### 且不会记录任何日志信息 ,此模式将用于相应外部组件的监控状态检测请求option httplogretries 3option redispatch ## serverId对应的服务器挂掉后,强制定向到其他健康的服务器maxconn 2000 ## 前端的最大并发连接数(默认为2000)### 其不能用于backend区段,对于大型站点来说,可以尽可能提高此值以便让haproxy管理连接队列,### 从而避免无法应答用户请求。当然,此最大值不能超过“global”段中的定义。### 此外,需要留心的是,haproxy会为每个连接维持两个缓冲,每个缓存的大小为8KB,### 再加上其他的数据,每个连接将大约占用17KB的RAM空间,这意味着经过适当优化后 ,### 有着1GB的可用RAM空间时将维护40000-50000并发连接。### 如果指定了一个过大值,极端场景中,其最终所占据的空间可能会超过当前主机的可用内存,### 这可能会带来意想不到的结果,因此,将其设定一个可接受值放为明智绝对,其默认为2000timeout connect 5000ms ## 连接超时(默认是毫秒,单位可以设置us,ms,s,m,h,d)timeout client 50000ms ## 客户端超时timeout server 50000ms ## 服务器超时## HAProxy的状态信息统计页面listen admin_statsbind :48800 ## 绑定端口stats uri /admin-status ##统计页面stats auth admin:admin ## 设置统计页面认证的用户和密码,如果要设置多个,另起一行写入即可mode httpoption httplog ## 启用日志记录HTTP请求## listen: 用于定义通过关联“前端”和“后端”一个完整的代理,通常只对TCP流量有用listen mycat_serversbind :3306 ## 绑定端口mode tcpoption tcplog ## 记录TCP请求日志option tcpka ## 是否允许向server和client发送keepaliveoption httpchk OPTIONS * HTTP/1.1 Host: www ## 后端服务状态检测### 向后端服务器的48700端口(端口值在后端服务器上通过xinetd配置)发送 OPTIONS 请求### (原理请参考HTTP协议) ,HAProxy会根据返回内容来判断后端服务是否可用.### 2xx 和 3xx 的响应码表示健康状态,其他响应码或无响应表示服务器故障。balance roundrobin ## 定义负载均衡算法,可用于"defaults"、"listen"和"backend"中,默认为轮询方式server mycat_01 192.168.1.203:8066 check port 48700 inter 2000ms rise 2 fall 3 weight 10server mycat_02 192.168.1.204:8066 check port 48700 inter 2000ms rise 2 fall 3 weight 10## 格式:server <name> <address>[:[port]] [param*]### serser 在后端声明一个server,只能用于listen和backend区段。### <name>为此服务器指定的内部名称,其将会出现在日志及警告信息中### <address>此服务器的IPv4地址,也支持使用可解析的主机名,但要在启动时需要解析主机名至响应的IPV4地址### [:[port]]指定将客户端连接请求发往此服务器时的目标端口,此为可选项### [param*]为此server设定的一系列参数,均为可选项,参数比较多,下面仅说明几个常用的参数:#### weight:权重,默认为1,最大值为256,0表示不参与负载均衡#### backup:设定为备用服务器,仅在负载均衡场景中的其他server均不可以启用此server#### check:启动对此server执行监控状态检查,其可以借助于额外的其他参数完成更精细的设定#### inter:设定监控状态检查的时间间隔,单位为毫秒,默认为2000,##### 也可以使用fastinter和downinter来根据服务器端专题优化此事件延迟#### rise:设置server从离线状态转换至正常状态需要检查的次数(不设置的情况下,默认值为2)#### fall:设置server从正常状态转换至离线状态需要检查的次数(不设置的情况下,默认值为3)#### cookie:为指定server设定cookie值,此处指定的值将会在请求入站时被检查,##### 第一次为此值挑选的server将会被后续的请求所选中,其目的在于实现持久连接的功能#### maxconn:指定此服务器接受的最大并发连接数,如果发往此服务器的连接数目高于此处指定的值,#####其将被放置于请求队列,以等待其他连接被释放

注意:多节点部署时node 、 description的值要做相应调整。

2、根据以上HAProxy配置文件要求做以下配置

(1)添加haproxy用户组和用户

# groupadd haproxy
# useradd -g haproxy haproxy

(2)创建chroot运行的路径

# mkdir /usr/share/haproxy

(3)防火墙中打开3306端口和48800端口

# vi /etc/sysconfig/iptables
-A INPUT -m state --state NEW -m tcp -p tcp --dport 3306 -j ACCEPT
-A INPUT -m state --state NEW -m tcp -p tcp --dport 48800 -j ACCEPT

重启防火墙

# service iptables restart

3、开启rsyslog的haproxy日志记录功能

默认情况下 haproxy是不记录日志的,如果需要记录日志,还需要配置系统的syslog,在linux系统中是rsyslog服务。syslog服务器可以用作一个网络中的日志监控中心,rsyslog是一个开源工具,被广泛用于Linux系统以通过TCP/UDP协议转发或接收日志消息。安装配置rsyslog服务:

# yum install rsyslog ## 没安装的情况下执行安装
# vi /etc/rsyslog.conf

把 $ModLoad imudp 和 $UDPServerRun 514前面的 # 去掉

$ModLoad imudp ## 是模块名,支持UDP协议

$UDPServerRun 514

##允许514端口接收使用UDP和TCP协议转发过来的日志,

##而rsyslog在默认情况下,正是在514端口监听UDP

确认 #### GLOBAL DIRECTIVES #### 段中是否有 $IncludeConfig /etc/rsyslog.d/*.conf没有则增加上此配置,增加后的效果:

# cd /etc/rsyslog.d/ ## rsyslog服务会来此目录加载配置
# touch haproxy.conf ## 创建haproxy的日志配置文件
# vi /etc/rsyslog.d/haproxy.conf

增加以下内容:

local0.* /var/log/haproxy.log
&~

##如果不加上面的的"&~"配置则除了在/var/log/haproxy.log中写入日志外,也会写入/var/log/message文件中

配置保存后重启rsyslog服务

# service rsyslog restart

Shutting down system logger: [ OK ]

Starting system logger: [ OK ]

(等到HAProxy服务启动后,就能在/var/log/haproxy.log中看到日志了)

4、配置系统内核的IP包转发功能

# vi /etc/sysctl.conf

net.ipv4.ip_forward = 1

使配置生效

# sysctl -p

5、启动HAProxy

# service haproxy start
# ps -ef | grep haproxy

haproxy 23921 1 0 23:27 ? 00:00:00 /usr/sbin/haproxy -D -f /etc/haproxy/haproxy.cfg -p /var/run/haproxy.pid

root 23924 23179 0 23:27 pts/1 00:00:00 grep haproxy

6、使用MySQL客户端通过HAProxy连接MyCat

E:MySQL-5.6.17-winx64in>mysql -uuser2 -proncoo.2 -h192.168.1.191 -P3306
mysql> show databases;
mysql> use rc_schema2;
mysql> show tables;
mysql> select * from edu_user;

写数据测试

mysql> insert into edu_user (userName, pwd) values('吴水成', 'roncoo.com');

然后查看MySQL中的数据库插入及数据同步情况。

7、登录HAProxy的状态信息统计页面

http://192.168.1.191:48800/admin-status

用户名和密码都是admin,对应的haproxy.cfg配置片段

转载于:https://my.oschina.net/liuyuantao/blog/1860806

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/390082.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

剥开比原看代码09:通过dashboard创建密钥时,前端的数据是如何传到后端的?

2019独角兽企业重金招聘Python工程师标准>>> 作者&#xff1a;freewind 比原项目仓库&#xff1a; Github地址&#xff1a;https://github.com/Bytom/bytom Gitee地址&#xff1a;https://gitee.com/BytomBlockchain/bytom 在前面一篇文章&#xff0c;我们粗略的研究…

004. ES6之函数的扩展

2019独角兽企业重金招聘Python工程师标准>>> 1. 函数参数的默认值 ES6 允许为函数的参数设置默认值&#xff0c; function log(x, y World) {console.log(x, y); }log(Hello) // Hello World log(Hello, China) // Hello China log(Hello, ) // Hello// 1. 参数变量…

一名3年工作经验的程序员应该具备的技能

本文转自:https://m.imooc.com/article/details?article_id7557 前言 因为和同事有约定再加上LZ自己也喜欢做完一件事之后进行总结&#xff0c;因此有了这篇文章。这篇文章大部分内容都是面向整个程序员群体的&#xff0c;当然因为LZ本身是做Java开发的&#xff0c;因此有一部…

多语言版希尔排序

2019独角兽企业重金招聘Python工程师标准>>> 简介 希尔排序(Shells Sort)是插入排序的一种又称“缩小增量排序”&#xff08;Diminishing Increment Sort&#xff09;&#xff0c;是直接插入排序算法的一种更高效的改进版本。希尔排序是非稳定排序算法。该方法因D.L…

UML 中extend和include的区别

在UML用例图中有两种关系——包含和扩展&#xff0c;容易混淆&#xff0c;下面通过一张表来区别一下这两种关系。 转载于:https://www.cnblogs.com/yonyong/p/8555547.html

浏览器兼容CSS渐进增强 VS 优雅降级如何选择

由于低级浏览器不支持 CSS3&#xff0c;但是 CSS3 特效太优秀不忍放弃&#xff0c;所以在高级浏览器中使用CSS3&#xff0c;而在低级浏览器只保证最基本的功能。二者的目的都是关注不同浏览器下的不同体验&#xff0c;但是它们侧重点不同&#xff0c;所以导致了工作流程上的不同…

2018年,牛客网小白月赛5

第一次啊&#xff0c;补题&#xff0c;希望大佬批评。 题目按我补题顺序来的。 https://www.nowcoder.com/acm/contest/135#question H 题 最大公倍数 题意:给出两个数&#xff0c;求最大公倍数 欧几里德算法算出最大公约数k; 然后算出。最大公倍数即可 代码如下&#xff1a; …

爬虫笔记(十二)——浏览器伪装技术

为什么要进行浏览器伪装技术&#xff1f; 有一些网站为了避免爬虫的恶意访问&#xff0c;会设置一些反爬虫机制&#xff0c;对方服务器会对爬虫进行屏蔽。常见的饭爬虫机制主要有下面几个&#xff1a; 1. 通过分析用户请求的Headers信息进行反爬虫 2. 通过检测用户行为进行反…

《活出生命的意义》:人生有何意义?

在你一生的阅读体验中&#xff0c;如果能够有一本书&#xff0c;它的某个章节、某种思想、或者某句话能够触动你的内心&#xff0c;解决你的困惑&#xff0c;甚至能改变你的命运&#xff0c;那这样的一本书你一定要视如珍宝&#xff0c;经常翻阅&#xff0c;维克多弗兰克尔的《…

右键添加git-bash

主要&#xff1a; 右键如果没有git-bash&#xff0c;如何给右键手动添加 前面对右键存在git-bash但使用出现问题的解决&#xff0c;也想到如果右键都没有&#xff0c;该如何给右键添加了&#xff0c;于是接着记录下如何添加的过程&#xff1a; 情形&#xff1a; 手动给右键添加…

Weblogic的缓存

2019独角兽企业重金招聘Python工程师标准>>> 最近遇到一个关于weblogic缓存的问题。再把war包放入到weblogic指定目录启动以后&#xff0c;访问页面信息没有更新。最后发现是\weblogic\user_projects\domains\base_domain\servers\AdminServer下的文件没有清除&…

725. 分隔链表

725. 分隔链表 给你一个头结点为 head 的单链表和一个整数 k &#xff0c;请你设计一个算法将链表分隔为 k 个连续的部分。 每部分的长度应该尽可能的相等&#xff1a;任意两部分的长度差距不能超过 1 。这可能会导致有些部分为 null 。 这 k 个部分应该按照在链表中出现的顺…

LAMP介绍-MySQL安装

2019独角兽企业重金招聘Python工程师标准>>> LAMP: linux-apache-mysql-php &#xff08;安装方式有&#xff1a;rpm&#xff0c;源码&#xff0c;二进制免编译&#xff09; linux-操作系统 apache-web服务软件&#xff08;httpd&#xff09; mysql-存储数据库 php…

java1

不知道为啥粘贴的图片是一堆编码。。。。 如何插入图片 博客后后台MarkDown编辑器上只有一个按钮&#xff0c;就是用来上传图片并自动插入MarkDown标记的&#xff0c;超级好用 &#xff08;一&#xff09;学习总结 1.在java中通过Scanner类完成控制台的输入&#xff0c;查阅JDK…

430. 扁平化多级双向链表

430. 扁平化多级双向链表 多级双向链表中&#xff0c;除了指向下一个节点和前一个节点指针之外&#xff0c;它还有一个子链表指针&#xff0c;可能指向单独的双向链表。这些子列表也可能会有一个或多个自己的子项&#xff0c;依此类推&#xff0c;生成多级数据结构&#xff0c…

标记偏见_分析师的偏见

标记偏见“Beware of the HiPPO in the room” — The risks and dangers of top-down, intuition-based decision making are well known in the business world. Experimentation and data-based decision making become widely acknowledged as the right way to steer a bu…

用户体验数据分析 书单_如何使用数据改善用户体验设计

用户体验数据分析 书单In the current age of technology, if an entrepreneur comes up with a grand idea, chances are they’ll need a pretty sweet website to go along with it. And if they want their idea to really sell, they will also need a website that reall…

推荐11个实用的JavaScript库

2019独角兽企业重金招聘Python工程师标准>>> JavaScript 仍然是 2018 年最受欢迎和使用最为广泛的编程语言&#xff0c;因此 JavaScript 生态系统也会继续发展壮大。 然而&#xff0c;JavaScript 的标准库仍然继续保持“短小精悍”的身材。为了填补标准库功能方面的…

371. 两整数之和

371. 两整数之和 给你两个整数 a 和 b &#xff0c;不使用 运算符 和 - ​​​​​​​&#xff0c;计算并返回两整数之和。 示例 1&#xff1a; 输入&#xff1a;a 1, b 2 输出&#xff1a;3 示例 2&#xff1a; 输入&#xff1a;a 2, b 3 输出&#xff1a;5 提示&a…

【福利】微信小程序精选Demo合集

小编最近在开发小程序&#xff0c;也读到了不少优秀的小程序源码&#xff0c;项目中有些需求可以直接从源码里粘贴复制过来&#xff0c;虽然这样做不利于自己独立编写代码&#xff0c;但比较是给公司做项目啊&#xff0c;秉着效率第一的原则&#xff0c;简直没有什么比ctrlc,ct…