负载均衡知识汇总

一、DNS轮询
1.实现
DNS配置多个IP域名解析(A记录)

2.优点
部署简单

3.缺点
非高可用(健康监测需人工干预)
会话状态需要共享(session共享)
扩容非实时(DNS解析缓存和TTL)
暴漏较多的外网IP

备注:DNS轮询是从域名层面做负载均衡

Continue reading

GO获取表单元素

1.如果使用Form[“username”]获取表单元素需调用ParseForm(),获取到的是数组
2.如果使用FormValue会自动调用ParseForm(),所以可以直接使用FormValue(“username”),获取到的是元素。等同于Form.Get

3.PostForm是获取POST表单当中的元素获取到的是数组,同样需要调用ParseForm(),PostFormValue获取的是元素

参考:https://github.com/astaxie/build-web-application-with-golang/blob/master/zh/04.1.md

Go操作MySQL示例【转】

package main

import (
	_ "github.com/go-sql-driver/mysql"
	"database/sql"
	"fmt"
)

func main() {
	db, err := sql.Open("mysql", "test:test@/test_demo?charset=utf8")
	//检查数据库链接
	checkErr(err)
	//插入数据
	stmt, err := db.Prepare("INSERT userinfo SET username=?,departname=?,created=?")
	checkErr(err)
	res, err := stmt.Exec("test", "研发部门", "2012-12-09")
	checkErr(err)
	//获取插入的ID
	id, err := res.LastInsertId()
	checkErr(err)
	fmt.Println(id)
	//更新数据
	stmt, err = db.Prepare("update userinfo set username=? where uid=?")
	checkErr(err)
	res, err = stmt.Exec("test1", id)
	checkErr(err)
	//获取更新的影响行数
	affect, err := res.RowsAffected()
	checkErr(err)
	fmt.Println(affect)
	//查询数据
	rows, err := db.Query("SELECT * FROM userinfo")
	checkErr(err)
	for rows.Next() {
		var uid int
		var username string
		var department string
		var created string
		err = rows.Scan(&uid, &username, &department, &created)
		checkErr(err)
		fmt.Println(uid)
		fmt.Println(username)
		fmt.Println(department)
		fmt.Println(created)
	}
	//删除数据
	stmt, err = db.Prepare("delete from userinfo where uid=?")
	checkErr(err)
	res, err = stmt.Exec(id)
	checkErr(err)
	affect, err = res.RowsAffected()
	checkErr(err)
	fmt.Println(affect)

	db.Close()

}

func checkErr(err error) {
	if err != nil {
		panic(err)
	}
}
GO连接数据库的一些格式
user@unix(/path/to/socket)/dbname?charset=utf8
user:password@tcp(localhost:5555)/dbname?charset=utf8
user:password@/dbname
user:password@tcp([de:ad:be:ef::ca:fe]:80)/dbname

Go命令介绍

1.go build	用于编译代码
2.go clean	用来移除当前源码包和关联源码包里面编译生成的文件
_obj/            旧的object目录,由Makefiles遗留
_test/           旧的test目录,由Makefiles遗留
_testmain.go     旧的gotest文件,由Makefiles遗留
test.out         旧的test记录,由Makefiles遗留
build.out        旧的test记录,由Makefiles遗留
*.[568ao]        object文件,由Makefiles遗留

DIR(.exe)        由go build产生
DIR.test(.exe)   由go test -c产生
MAINFILE(.exe)   由go build MAINFILE.go产生
*.so             由 SWIG 产生
3.go fmt 	格式化代码
4.go get	获取远程包
5.go install 生成结果文件并移动到pkg和bin目录下
6.go test	自动读取源码目录*_test.go文件,生成并运行测试用的可执行文件
7.go tool	命令集
8.go generate	便以前自动化生成某类嗲吗
9.godoc		文档工具
10.go version 查看go版本
11.go env 查看当前go的环境变量
12.go run 编译并运行go程序
Tagged

ES中的分布式搜索

一.查询阶段
查询会广播到索引的每个分片(主分片或者副本分片),每个分片搜索并构建一个匹配结果的优先队列(存储top-n文档有序列表)
步骤:
1.发送请求到协调节点,协调节点创建一个from+size的空优先队列
2.协调节点广播到索引每个分片中,每个分片查询并存储from+size的优先队列
3.每个分片返回优先队列当中的ID和排序值给协调节点,协调节点合并到自己的优先队列产生结果列表
Continue reading

ES中的查询

一、查询语句形式
1.叶子语句
2.复合语句(一条复合语句可以是多条叶子语句和多个复合语句组成)

二、查询和过滤的区别
1.过滤是将查询设置为是否匹配(只有是和否两种情况),查询会缓存
2.查询是判断文档是否匹配同时判断文档的匹配程度(_score字段),查询不缓存
Continue reading

ES的映射和分析

精确值和全文
1.ES的数据可以分为精确值和全文
2.精确值比如date类型或者long类型,全文指string类型(匹配)

分析过程:
1.文本分成适合倒排索引的独立的词条
2.将词条标准格式化为可搜索
2.1 字符过滤:去掉html或者&转换为and
2.2 分词器:其次字符串被分词器分成单个词条
2.3 过滤器:词条按照顺序通过token过滤器(小写化、删除无用词、增加同义词)
Continue reading

Elasticsearch的索引、分片、文档、副本

我们往 Elasticsearch 添加数据时需要用到 索引 —— 保存相关数据的地方。 索引实际上是指向一个或者多个物理 分片 的 逻辑命名空间 。

一个 分片 是一个底层的 工作单元 ,它仅保存了 全部数据中的一部分。 在分片内部机制中,我们将详细介绍分片是如何工作的,而现在我们只需知道一个分片是一个 Lucene 的实例,以及它本身就是一个完整的搜索引擎。 我们的文档被存储和索引到分片内,但是应用程序是直接与索引而不是与分片进行交互。

Elasticsearch 是利用分片将数据分发到集群内各处的。分片是数据的容器,文档保存在分片内,分片又被分配到集群内的各个节点里。 当你的集群规模扩大或者缩小时, Elasticsearch 会自动的在各节点中迁移分片,使得数据仍然均匀分布在集群里。

一个分片可以是 主 分片或者 副本 分片。 索引内任意一个文档都归属于一个主分片,所以主分片的数目决定着索引能够保存的最大数据量。

一个副本分片只是一个主分片的拷贝。 副本分片作为硬件故障时保护数据不丢失的冗余备份,并为搜索和返回文档等读操作提供服务。

在索引建立的时候就已经确定了主分片数,但是副本分片数可以随时修改。

被混淆的概念是,一个 Lucene 索引 我们在 Elasticsearch 称作 分片 。 一个 Elasticsearch 索引是分片的集合。 当 Elasticsearch 在索引中搜索的时候, 他发送查询到每一个属于索引的分片(Lucene 索引),然后像 执行分布式检索 提到的那样,合并每个分片的结果到一个全局的结果集。