关于集群的几个图解

2019年12月06日 阅读数:31
这篇文章主要向大家介绍关于集群的几个图解,主要内容包括基础应用、实用技巧、原理机制等方面,希望对大家有所帮助。

1.使用lvs+keepalive实现集群高可用,达到更健壮的LB

 咱们能够作前端使用lvs来作负载均衡,根据lvs的8种调度算法(可设置),分发请求到对应的web服务器集群上。lvs作双机热备,经过keepalived模块可以达到故障自动转移到备份服务器,不间断提供服务,结构如图:javascript


 
 说明:据查询了解,通常在WEB端使用的负载均衡比较多的是HAProxy+keepalived+nginx;数据库mysql集群使用Lvs+keepalived+mysql实现。由于HAProxy和nginx同样是工做在网络7层之上,而且前者弥补了nginx的一些缺点如session的保持,cookie的引导等,且它自己是个负责均衡软件,处理负载均衡上面必然优于nginx;lvs比较笨重,对于比较庞大的网络应用实施比较复杂,虽然它运行在网络4层之上,仅作分发没有流量产生,可是它不能作正则处理也不能也不能作动静分离,因此通常用lvs+keepalived或heatbeat作数据库层的负载均衡。php



2.使用terracotta或者memcached使session共享

 

2.一、terracotta是jvm级别的session共享css

 它基本原理是对于集群间共享的数据,当在一个节点发生变化的时候,Terracotta只把变化的部分发送给Terracotta服务器,而后由服务器把它转发给真正须要这个数据的节点,而且共享的数据对象不须要序列化。html

 

2.二、经过memcached实现内存级session共享前端

经过memcached-session-manager(msm)插件,经过tomcat上必定的配置,便可实现把session存储到memcached服务器上。注意:tomcat支持tomcat6+,而且memcached能够支持分布式内存,msm同时支持黏性session(sticky sessions)或者非黏性session(non-sticky sessions)两种模式,在memcached内存中共享的对象须要序列化。结构如图3:java




 

  经过必定的配置,能够实现故障转移(只支持对非粘性session)。如:node

Xml代码   收藏代码
  1. <Context>    
  2.       ...    
  3.       <Manager className="de.javakaffee.web.msm.MemcachedBackupSessionManager"    
  4.         memcachedNodes="n1:host1.yourdomain.com:11211,n2:host2.yourdomain.com:11211"    
  5.         failoverNodes="n1"    
  6.         requestUriIgnorePattern=".*\.(ico|png|gif|jpg|css|js)$"    
  7.         transcoderFactoryClass="de.javakaffee.web.msm.serializer.kryo.KryoTranscoderFactory"    
  8.         />    
  9. </Context>  

 说明:failoverNodes:故障转移节点,对非粘性session不可用。属性failoverNodes="n1"的做用是告诉msm最好是把session保存在memcached "n2"节点上,只有在n2节点不可用的状况下才把session保存在n1节点。这样即便host2上的tomcat宕机,仍然能够经过host1上的tomcat访问存放在memcached "n1" 节点中的session。mysql



Mysql集群的基本架构以下:

MySQL Cluster 是一种技术,该技术容许在无共享的系统中部署“内存中”数据库的 Cluster 。经过无共享体系结构,系统可以使用廉价的硬件,并且对软硬件无特殊要求。此外,因为每一个组件有本身的内存和磁盘,不存在单点故障。
MySQL Cluster 由一组计算机构成,每台计算机上均运行着多种进程,包括MySQL服务器,NDB Cluster 的数据节点,管理服务器,以及(可能)专门的数据访问程序。关于 Cluster 中这些组件的关系,请参见下图:

全部的这些节点构成一个完成的MySQL集群体系。数据保存在“NDB存储服务器”的存储引擎中,表(结构)则保存在“MySQL服务器”中。应用程序经过“MySQL服务器”访问这些数据表,集群管理服务器经过管理工具(ndb_mgmd)来管理“NDB存储服务器”。
经过将MySQL Cluster 引入开放源码世界,MySQL为全部须要它的人员提供了具备高可用性、高性能和可缩放性的 Cluster 数据管理。
2、MySQL Cluster 基本概念
“NDB” 是一种“内存中”的存储引擎,它具备可用性高和数据一致性好的特色。
MySQL Cluster 可以使用多种故障切换和负载平衡选项配置NDB存储引擎,但在 Cluster 级别上的存储引擎上作这个最简单。MySQL Cluster的NDB存储引擎包含完整的数据集,仅取决于 Cluster自己内的其余数据。
目前,MySQL Cluster的 Cluster部分可独立于MySQL服务器进行配置。在MySQL Cluster中, Cluster的每一个部分被视为1个节点。linux

  • 管理(MGM)节点:这类节点的做用是管理MySQL Cluster内的其余节点,如提供配置数据、启动并中止节点、运行备份等。因为这类节点负责管理其余节点的配置,应在启动其余节点以前首先启动这类节点。MGM节点是用命令“ndb_mgmd”启动的。
  • 数据节点:这类节点用于保存 Cluster的数据。数据节点的数目与副本的数目相关,是片断的倍数。例如,对于两个副本,每一个副本有两个片断,那么就有4个数据节点。不过没有必要设置多个副本。数据节点是用命令“ndbd”启动的。
  • SQL节点:这是用来访问 Cluster数据的节点。对于MySQL Cluster,客户端节点是使用NDB Cluster存储引擎的传统MySQL服务器。一般,SQL节点是使用命令“mysqld –ndbcluster”启动的,或将“ndbcluster”添加到“my.cnf”后使用“mysqld”启动。

    注释:在不少状况下,术语“节点”用于指计算机,但在讨论MySQL Cluster时,它表示的是进程。在单台计算机上能够有任意数目的节点,为此,咱们采用术语“ Cluster主机”。nginx

管理服务器(MGM节点)负责管理 Cluster配置文件和 Cluster日志。 Cluster中的每一个节点从管理服务器检索配置数据,并请求肯定管理服务器所在位置的方式。当数据节点内出现新的事件时,节点将关于这类事件的信息传输到管理服务器,而后,将这类信息写入 Cluster日志。
此外,能够有任意数目的 Cluster客户端进程或应用程序。它们分为两种类型:

  • 标准MySQL客户端:对于MySQL Cluster,它们与标准的(非 Cluster类)MySQL没有区别。换句话讲,可以从用PHP、Perl、C、C++、Java、Python、Ruby等编写的现有MySQL应用程序访问MySQL Cluster。
  • 管理客户端:这类客户端与管理服务器相连,并提供了启动和中止节点、启动和中止消息跟踪(仅调试版本)、显示节点版本和状态、启动和中止备份等的命令

Windows下搭建Mysql集群


这里采用最小配置,用两台机器来分别部署一个management 节点,2个data node, 2个sql node.

Management Node:    192.168.0.102

Data Node A:            192.168.0.102

Data Node B:            192.168.0.104

Sql Node A:               192.168.0.102

Sql Node B:               192.168.0.104

1. 首先从Mysql官方网站上下载最新的Mysql Cluster免安装包 (http://downloads.mysql.com/archives/cluster/

注意咱们下载的是ZIP Archive

2.将免安装包分别解压到两台机器的C:\Mysql文件夹下

3. 在Management Node的C:\Mysql\Bin下新建Config文件夹,用来存放cluster的配置文件。

3.1首先须要为management node建立一个默认配置文件my.ini ,内容以下:

[mysql_cluster] 
# Options for management node process 
config-file=C:/mysql/bin/config/config.ini

3.2 建立整个cluster的配置文件config.ini

[ndbd default] 
# Options affecting ndbd processes on all data nodes: 
NoOfReplicas=2                      # Number of replicas 
DataDir=C:/mysql/bin/cluster-data   # Directory for each data node's data files 
                                    # Forward slashes used in directory path, 
                                    # rather than backslashes. This is correct; 
                                    # see Important note in text 
DataMemory=80M    # Memory allocated to data storage 
IndexMemory=18M   # Memory allocated to index storage 
                  # For DataMemory and IndexMemory, we have used the 
                  # default values. Since the "world" database takes up 
                  # only about 500KB, this should be more than enough for 
                  # this example Cluster setup.

[ndb_mgmd] 
# Management process options: 
HostName=192.168.0.102              # Hostname or IP address of management node 
DataDir=C:/mysql/bin/cluster-logs   # Directory for management node log files

[ndbd] 
# Options for data node "A": 
                             # (one [ndbd] section per data node) 
HostName=192.168.0.102           # Hostname or IP address

[ndbd] 
# Options for data node "B":

HostName=192.168.0.104           # Hostname or IP address

[mysqld] 
# SQL node A options:

HostName=192.168.0.102           # Hostname or IP address

[mysqld] 
# SQL node B options:

HostName=192.168.0.104           # Hostname or IP address

4. 启动Management Node,命令以下:

c:\mysql\bin\ndb_mgmd.exe --configdir=c:\mysql\bin\config --config-file=c:\mysql\bin\config\config.ini --ndb-nodeid=1 --reload –initial

5.启动Data Node A,命令以下:

c:\mysql\bin\ndbd.exe --ndb-connectstring=192.168.0.102

6.启动Data Node B,命令以下:

c:\mysql\bin\ndbd.exe --ndb-connectstring=192.168.0.102

7.能够打开management client来查看cluster当前的状态

image

 

8.Data Node均启动后,接下来分别启动两个Sql Node,命令以下:

c:\mysql\bin\mysqld.exe --ndbcluster --ndb-connectstring=192.168.0.102 --console 
9. 经过management client查看cluster的当前状态

image

10.至此,cluster已经成功启动。

11.在Sql Node A上建立数据库ClusterSample

image

注:默认root密码为空

12.在Sql Node A上建立数据表Person;

image

13. 经过Sql Node A插入数据;

image

14.在Sql Node B上去查询数据

image


Linux下搭建Mysql集群

开始准备
一、准备服务器
如今,咱们计划创建有5个节点的MySQL CLuster体系,所以须要用到5台机器,分别作以下用途:

		节点(用途)		IP地址(主机名)
管理节点(MGM)		192.168.0.1(db1)
SQL节点1(SQL1)		192.168.0.2(db2)
SQL节点2(SQL2)		192.168.0.3(db3)
数据节点1(NDBD1)	192.168.0.4(db4)
数据节点2(NDBD2)	192.168.0.5(db5)

二、注意事项及其余
每一个节点的操做系统都是Linux,下面的描述中将使用主机名,再也不使用IP地址来表示。因为MySQL Cluster采用TCP/IP方式链接,而且节点之间的数据传输没有加密,所以这个体系最好只在单独的子网中运行,而且考虑到传输的速率,强烈建议不要跨越公网使用这个体系。所需的MySQL软件请事先在 http://dev.mysql.com/downloads 下载。
实际上整个体系能够在一个单独的实体计算机上运行成功,固然了,必须设定不一样的目录以及端口等,只能做为测试时使用。
4、开始安装
一、假定条件
在每一个节点计算机上都采用 nobody 用户来运行Cluster,所以执行以下命令添加相关用户(若是已经存在则略过,且用root用户执行):

	root# /usr/sbin/groupadd nobody
root# /usr/sbin/useradd nobody -g nobody

假设已经下载了mysql可直接使用的二进制安装包,且放在 /tmp 下了。
二、SQL节点和存储节点(NDB节点)安装(即4个机器重复执行如下步骤)

	root# cd /tmp/
root# tar zxf mysql-max-5.0.24-linux-i686.tar.gz
root# mv mysql-max-5.0.24-linux-i686 /usr/local/mysql/
root# cd /usr/local/mysql/
root# ./configure --prefix=/usr/local/mysql
root# ./scripts/mysql_install_db
root# chown -R nobody:nobody /usr/local/mysql/

三、配置SQL节点

	root# vi /usr/local/mysql/my.cnf

而后输入以下内容:

[mysqld]
basedir         = /usr/local/mysql/
datadir         = /usr/local/mysql/data
user            = nobody
port            = 3306
socket          = /tmp/mysql.sock
ndbcluster
ndb-connectstring=db1
[MYSQL_CLUSTER]
ndb-connectstring=db1

四、配置存储节点(NDB节点)

	root# vi /usr/local/mysql/my.cnf

而后输入以下内容:

[mysqld]
ndbcluster
ndb-connectstring=db1
[MYSQL_CLUSTER]
ndb-connectstring=db1

五、安装管理节点

	root# cd /tmp/
root# tar zxf mysql-max-5.0.24-linux-i686.tar.gz
root# mkdir /usr/local/mysql/
root# mkdir /usr/local/mysql/data/
root# cd mysql-max-5.0.24-linux-i686/bin/
root# cp ndb_mgm* /usr/local/mysql/
root# chown -R nobody:nobody /usr/local/mysql

六、配置管理节点

		root# vi /usr/local/mysql/config.ini

而后输入以下内容:

[NDBD DEFAULT]
NoOfReplicas=1
[TCP DEFAULT]
portnumber=3306
#设置管理节点服务器
[NDB_MGMD]
hostname=db1
#MGM上保存日志的目录
datadir=/usr/local/mysql/data/
#设置存储节点服务器(NDB节点)
[NDBD]
hostname=db4
datadir=/usr/local/mysql/data/
#第二个NDB节点
[NDBD]
hostname=db5
datadir=/usr/local/mysql/data/
#设置SQL节点服务器
[MYSQLD]
hostname=db2
#第二个SQL节点
[MYSQLD]
hostname=db3

注释: Cluster管理节点的默认端口是1186,数据节点的默认端口2202。从MySQL 5.0.3开始,该限制已被放宽, Cluster可以根据空闲的端口自动地为数据节点分配端口。若是你的版本低于5.0.22,请注意这个细节。
5、启动MySQL Cluster
较为合理的启动顺序是,首先启动管理节点服务器,而后启动存储节点服务器,最后才启动SQL节点服务器:

  • 在管理节点服务器上,执行如下命令启动MGM节点进程:
    		root# /usr/local/mysql/ndb_mgmd -f /usr/local/mysql/config.ini
    	

    必须用参数“-f”或“--config-file”告诉 ndb_mgm 配置文件所在位置,默认是在ndb_mgmd相同目录下。

  • 在每台存储节点服务器上,若是是第一次启动ndbd进程的话,必须先执行如下命令:
    		root# /usr/local/mysql/bin/ndbd --initial
    	

    注意,仅应在首次启动ndbd时,或在备份/恢复数据或配置文件发生变化后重启ndbd时使用“--initial”参数。由于该参数会使节点删除由早期ndbd实例建立的、用于恢复的任何文件,包括用于恢复的日志文件。
    若是不是第一次启动,直接运行以下命令便可:

    		root# /usr/local/mysql/bin/ndbd
    	
  • 最后,运行如下命令启动SQL节点服务器:
    		root# /usr/local/mysql/bin/mysqld_safe --defaults-file=/usr/local/mysql/my.cnf &
    	

    若是一切顺利,也就是启动过程当中没有任何错误信息出现,那么就在管理节点服务器上运行以下命令:

    		root# /usr/local/mysql/ndb_mgm
    	-- NDB Cluster -- Management Client --
    	ndb_mgm> SHOW
    	Connected to Management Server at: localhost:1186
    	Cluster Configuration
    	---------------------
    	[ndbd(NDB)]     2 node(s)
    	id=2    @192.168.0.4  (Version: 5.0.22, Nodegroup: 0, Master)
    	id=3    @192.168.0.5  (Version: 5.0.22, Nodegroup: 0)
    	[ndb_mgmd(MGM)] 1 node(s)
    	id=1    @192.168.0.1  (Version: 5.0.22)
    	[mysqld(SQL)]   1 node(s)
    	id=2   (Version: 5.0.22)
    	id=3   (Version: 5.0.22)
    	

具体的输出内容可能会略有不一样,这取决于你所使用的MySQL版本。
注意:若是你正在使用较早的MySQL版本,你或许会看到引用为‘[mysqld(API)]’的SQL节点。这是一种早期的用法,现已放弃。
如今,应能在MySQL Cluster中处理数据库,表和数据。
6、建立数据库表
与没有使用 Cluster的MySQL相比,在MySQL Cluster内操做数据的方式没有太大的区别。执行这类操做时应记住两点:

  • 表必须用ENGINE=NDB或ENGINE=NDBCLUSTER选项建立,或用ALTER TABLE选项更改,以使用NDB Cluster存储引擎在 Cluster内复制它们。若是使用mysqldump的输出从已有数据库导入表,可在文本编辑器中打开SQL脚本,并将该选项添加到任何表建立语句,或用这类选项之一替换任何已有的ENGINE(或TYPE)选项。
  • 另外还请记住,每一个NDB表必须有一个主键。若是在建立表时用户未定义主键,NDB Cluster存储引擎将自动生成隐含的主键。(注释:该隐含 键也将占用空间,就像任何其余的表索引同样。因为没有足够的内存来容纳这些自动建立的键,出现问题并不罕见)。

下面是一个例子:
在db2上,建立数据表,插入数据:

[db2~]root# mysql -uroot test
[db2~]mysql> create table city(
[db2~]mysql> id mediumint unsigned not null auto_increment primary key,
[db2~]mysql> name varchar(20) not null default ''
[db2~]mysql> ) engine = ndbcluster default charset utf8;
[db2~]mysql> insert into city values(1, 'city1');
[db2~]mysql> insert into city values(2, 'city2');

在db3上,查询数据:

[db3~]root# mysql -uroot test
[db2~]mysql> select * from city;
+-----------+
|id | name  |
+-----------+
|1  | city1 |
+-----------+
|2  | city2 |
+-----------+

7、安全关闭
要想关闭 Cluster,可在MGM节点所在的机器上,在Shell中简单地输入下述命令:

	[db1~]root# /usr/local/mysql/ndb_mgm -e shutdown

运行如下命令关闭SQL节点的mysqld服务:

	[db2~]root# /usr/local/mysql/bin/mysqladmin -uroot shutdown

Linux下Mysql集群的搭建

第1章  环境说明
1.1 系统说明
采用三台linux服务器,均采用centos6.2版本,最小化安装系统。
1.2 软件说明
数据库管理节点,数据库节点均采用:
mysql-cluster-gpl-7.0.8a-linux-i686-glibc23.tar.gz
1.3 拓扑结构说明
mysql集群有以下三层:
应用程序层:负责与mysql服务器通讯的各类应用程序。
Mysql服务器层:处理SQL命令,并与NDB存储引擎通讯和Mysql服务器。

NDB集群组件层:NDB集群组件有时也称数据节点,负责处理查询,而后将结果返回给mysql服务器。拓扑结构图以下所示:


 
mysql-cluster:192.168.254.200
NDB节点:IP地址:192.168.254.221
NDB节点:IP地址:192.168.254.222
SQL节点:IP地址:192.168.254.221
SQL节点:IP地址:192.168.254.222
第2章  Mysql管理节点安装
2.1 依赖包安装
yum install wget gcc gcc-c++ make cmake ncurses-devel libtool zilib-devel –y
注:此处cmake是mysql 5.5以后版本所必需的,5.5以后的版本将cmake取代configure;
2.2 建立mysql用户
useradd -s /sbin/nologin -M mysql
2.3 编译安装mysql管理节点
tra xvf mysql-cluster-gpl-7.2.8.tar.gz
cd mysql-cluster-gpl-7.2.8
cmake -DCMAKE_INSTALL_PREFIX=/usr/local/mysql \
-DMYSQL_UNIX_ADDR=/data/mysql/mysql.sock \
-DDEFAULT_CHARSET=utf8 \
-DDEFAULT_COLLATION=utf8_general_ci \
-DWITH_EXTRA_CHARSETS:STRING=utf8,gbk \
-DWITH_INNOBASE_STORAGE_ENGINE=1 \
-DWITH_READLINE=1 \
-DENABLED_LOCAL_INFILE=1 \
-DMYSQL_DATADIR=/data/mysql/ \
-DMYSQL_USER=mysql \
-DMYSQL_TCP_PORT=3306


make && make install


2.4 修改配置文件
mkdir –p /data/mysql-cluster/ 
vi /data/mysql-cluster/config.ini
[ndbd default]
NoOfReplicas=2
DataMemory=80M
IndexMemory=18M      
[ndb_mgmd]
Id=1
Hostname=192.168.254.200           
datadir=/data/mysql/
[ndbd]
Id=2
Hostname=192.168.254.221     
datadir=/data/mysql/


[ndbd]
Id=3
Hostname=192.168.254.222
datadir=/data/mysql/
[MYSQLD]
[MYSQLD]
2.5 启动管理节点
/usr/local/mysql/bin/ndb_mgmd -f /data/mysql-cluster/config.ini
若是启动成功则会显示:
MySQL Cluster Management Server mysql-5.5.27 ndb-7.2.8
 
第3章  Mysql运行节点安装
3.1 安装说明
Mysql节点安装过程请参考管理节点安装;
3.2 配置文件修改
cp support-files/my-medium.cnf /etc/my.cnf
cp support-files/mysql.server /etc/init.d/mysqld
chmod 755 /etc/init.d/mysqld
3.3 初始化mysql
bash scripts/mysql_install_db --user=mysql --basedir=/usr/local/mysql --datadir=/data/mysql/
3.4 启动mysql节点服务
/usr/local/mysql/bin/ndbd –initial
/etc/init.d/mysqld start


第4章  管理、测试说明
4.1 管理节点状态
进入管理节点工做台
/usr/local/mysql/bin/ndb_mgmd
运行show 显示当前状态
 
即代表,集群运行正常。
4.2 Mysql节点状态
启动ndbd服务即会产生以下进程;
 
4.3 测试数据同步
221(master)上执行以下操做:
 
而后登陆222mysql,查看状态:
 
一样在222上执行如下操做:
 
而后在221上查看同步结果:
 
以上结果即代表:集群运行成功,能够保证数据库主-辅同步。


而后将222的网络服务断掉,查看管理节点;
 
启动222网络服务,运行/usr/local/mysql/bin/ndbd –initial;
 
而后查看管理节点服务;
 
在断掉一个服务的状况下仍可继续使用mysql服务。
4.4 节点管理
若是修改过config.ini文件,则执行下面的语句使得配置文件生效;/usr/local/mysql/bin/ndb_mgmd -f /data/mysql-cluster/config.ini  --reload
滚动重启旧的数据存储节点服务(滚动重启,不能全部节点同时重启,若是同时中止,数据库前端查询就会出现错误);
ndb_mgm> “id” (restart;stop;start)
重启,中止,启动,”id”的节点服务。


Windows下搭建Mysql主从复制 MySql Master-Master Replication

主从复制原理

1.首先下载最新版的MySql Server (http://dev.mysql.com/downloads/windows/installer/)

2.安装MySql Server到两台机器上

MySql 1: 192.168.0.104 (如下简称104)

MySql 2: 192.168.0.103  (如下简称103)

3. 配置Mysql Server启动Binary Logging. 
在104的my.ini文件(通常在C:\ProgramData\MySql\MySql Server 5.6\my.ini)中添加以下配置信息

[mysqld] 
log-bin=mysql-bin 
server-id=1

103的my.ini文件中添加以下配置信息

[mysqld] 
log-bin=mysql-bin 
server-id=2

4.重启MySql

5.为Replication建立User,并赋予权限 

mysql> CREATE USER 'repl' @'%' identified by 'repl';

mysql> GRANT REPLICATION SLAVE ON *.* TO 'repl'@'%';

6. 查看两台Mysql Server当前bin log的位置(由于咱们只须要同步两个server从当前状态以后的操做)

6.1 分别在两台机器上执行以下命令:

FLUSH TABLES WITH READ LOCK;

SHOW MASTER STATUS;

103会获得以下结果:

image

104会获得以下结果:

image

图中File表示当前的binary log文件名,Position是表示Binary log文件的当前位置,呆会replication应该是从这个位置开始。

7. 释放Lock

在两台机器上执行以下命令:Unlock Tables.让两台MySql能够正常进行数据库操做

8,设置Slave Replication.

8.1 启动104上的slave replication.

8.1.1 执行 Stop Slave

8.1.2 执行以下命令:

CHANGE MASTER TO  MASTER_HOST='192.168.0.103', MASTER_USER='repl', MASTER_PASSWORD='repl',MASTER_LOG_FILE='mysql-bin.000001', MASTER_LOG_POS=411;

8.1.3 执行Start Slave

8.1.4 查看slave的状态,执行Show Slave Status\G;

image

 

8.2 启动103上的slave replication.

8.2.1 执行 Stop Slave

8.2.2 执行以下命令:

CHANGE MASTER TO  MASTER_HOST='192.168.0.104', MASTER_USER='repl', MASTER_PASSWORD='repl',MASTER_LOG_FILE='mysql-bin.000001', MASTER_LOG_POS=411;

8.2.3 执行Start Slave

8.2.4 查看slave的状态,执行Show Slave Status\G;

image

 

9.测试replication效果

9.1 在104上执行:

mysql> create database repltest;

mysql> use repltest;

mysql> create table person(id int,name varchar(255));

mysql> insert into person values(1,’jensen’);

9.2在103上执行:

mysql> use repltest;

mysql> select * from person; 验证在104上插入的记录已经同步现103上

image

9.3 在103上插入记录

mysql> insert into person values(2,’jensen’);

9.4 在104上验证结果

mysql> select * from person;

image

10. 对于自增ID列,两台Server同步时会由于值同样而形成冲突。解决方案:利用mysql的auto_increment_increment和auto_increment_offset来限定每台server生成的ID限定在必定范围内(如:104生成奇数ID,103生成偶数ID)



Mysql5.6实现主从复制读写分离


1、前言:为何MySQL要作主从复制(读写分离)? 
通俗来说,若是对数据库的读和写都在同一个数据库服务器中操做,业务系统性能会下降。 
为了提高业务系统性能,优化用户体验,能够经过作主从复制(读写分离)来减轻主数据库的负载。 
并且若是主数据库宕机,可快速将业务系统切换到从数据库上,可避免数据丢失。 

2、MySQL主从复制(读写分离)和集群的区别: 
我对MySQL也是刚开始研究,不是很专业。个人理解是: 
一、主从复制(读写分离):通常须要两台及以上数据库服务器便可(一台用于写入数据,一台用于同步主的数据并用于数据查询操做)。 
局限性: 
(1)配置好主从复制以后,同一张表,只能对一个服务器写操做。若是在从上执行了写操做,而以后主也操做了这张表,或致使主从不一样步;听说能够配置成主主方式,但我尚未研究到。 
(2)主数据库服务器宕机,须要手动将业务系统切换到从数据库服务器。没法作到高可用性(除非再经过部署keepalive作成高可用方案)。 
二、集群是由N台数据库服务器组成,数据的写入和查询是随机到任意一台数据库服务器的,其余数据库服务器会自动同步数据库的操做。 
任何一台数据库宕机,不会对整个集群形成大的影响。 
局限性:我通过测试才知道目前mysql集群版本(MySQL Cluster)只能对NDB存储引擎的数据进行集群同步,若是是INNODB或其余的MySQL存储引擎是不行的。这个也致使了我放弃了在业务系统中应用这种方案。 

3、回归正题,接下来开始MySQL5.6.12的主从复制教程: 
一、MySQL5.6开始主从复制有两种方式:基于日志(binlog);基于GTID(全局事务标示符)。 
须要注意的是:GTID方式不支持临时表!因此若是你的业务系统要用到临时表的话就不要考虑这种方式了,至少目前最新版本MySQL5.6.12的GTID复制仍是不支持临时表的。 
因此此篇教程主要是告诉你们如何经过日志(binlog)方式作主从复制! 

二、MySQL官方提供的MySQL Replication教程: 
http://dev.mysql.com/doc/refman/5.6/en/replication.html 
这个官方教程强烈建议你们阅读(须要必定的英语阅读能力哦!不行就google翻译后再阅读吧~)。 

三、准备工做: 
(1)配置MySQL主从复制(读写分离)以前,须要在主从两台服务器先安装好MySQL5.6。 
(2)目前最新的MySQL5.6 GA版本是MySQL5.6.12(点此下载MySQL5.6.12源码包)。 
我的推荐Linux(RedHat/CentOS 6.4)源码编译安装,具体能够看本站这篇教程:RedHat/CentOS源码编译安装MySQL5.6.12 
(3)注意: 
(a)若是你须要用于生产环境,安教程安装MySQL时不要急着作mysql启动操做。建议把mysql初始化生成的/usr/local/mysql/mysql.cnf删除,而后把你优化好的mysql配置文件my.cnf放到/etc下。 
(b)建议主备两台服务器在同一局域网,主备两台数据库网络须要互通。 
(4)个人环境: 
主数据库IP:192.168.100.2 
从数据库IP:192.168.100.3 

四、修改主数据库的的配置文件: 
1     [mysqld] 
2     server-id=1 
3     log-bin=mysqlmaster-bin.log 
4     sync_binlog=1 
5     #注意:下面这个参数须要修改成服务器内存的70%左右 
6     innodb_buffer_pool_size = 512M 
7     innodb_flush_log_at_trx_commit=1 
8     sql_mode=STRICT_TRANS_TABLES,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION,NO_AUTO_VALUE_ON_ZERO 
9     lower_case_table_names=1 
10     log_bin_trust_function_creators=1 

修改以后要重启mysql: 
1     # /etc/init.d/mysql restart 

附一个我已优化过的主数据库配置文件:点此下载 

五、修改从数据库的的配置文件(server-id配置为大于1的数字便可): 
1     [mysqld] 
2     server-id=2 
3     log-bin=mysqlslave-bin.log 
4     sync_binlog=1 
5     #注意:下面这个参数须要修改成服务器内存的70%左右 
6     innodb_buffer_pool_size = 512M 
7     innodb_flush_log_at_trx_commit=1 
8     sql_mode=STRICT_TRANS_TABLES,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION,NO_AUTO_VALUE_ON_ZERO 
9     lower_case_table_names=1 
10     log_bin_trust_function_creators=1 

修改以后要重启mysql: 
1     # /etc/init.d/mysql restart 

附一个我已优化过的从数据库配置文件:点此下载 

六、SSH登陆到主数据库: 
(1)在主数据库上建立用于主从复制的帐户(192.168.100.3换成你的从数据库IP): 
1     # mysql -uroot -p 
2     mysql> GRANT REPLICATION SLAVE ON *.* TO 'repl'@'192.168.100.3' IDENTIFIED BY 'repl'; 

(2)主数据库锁表(禁止再插入数据以获取主数据库的的二进制日志坐标): 
1     mysql> FLUSH TABLES WITH READ LOCK; 

(3)而后克隆一个SSH会话窗口,在这个窗口打开MySQL命令行: 
1     # mysql -uroot -p 
2     mysql> SHOW MASTER STATUS; 
3     +------------------------+----------+--------------+------------------+-------------------+ 
4     | File                   | Position | Binlog_Do_DB | Binlog_Ignore_DB | Executed_Gtid_Set | 
5     +------------------------+----------+--------------+------------------+-------------------+ 
6     | mysqlmaster-bin.000001 |      332 |              |                  |                   | 
7     +------------------------+----------+--------------+------------------+-------------------+ 
8     1 row in set (0.00 sec) 
9     mysql> exit; 

在这个例子中,二进制日志文件是mysqlmaster-bin.000001,位置是332,记录下这两个值,稍后要用到。 
(4)在主数据库上使用mysqldump命令建立一个数据快照: 
1     #mysqldump -uroot -p -h127.0.0.1 -P3306 --all-databases  --triggers --routines --events >all.sql 
2     # 接下来会提示你输入mysql数据库的root密码,输入完成后,若是当前数据库不大,很快就能导出完成。 

(5)解锁第(2)步主数据的锁表操做: 
1     mysql> UNLOCK TABLES; 

七、SSH登陆到从数据库: 
(1)经过FTP、SFTP或其余方式,将上一步备份的主数据库快照all.sql上传到从数据库某个路径,例如我放在了/home/yimiju/目录下; 
(2)从导入主的快照: 
1     # cd /home/yimiju 
2     # mysql -uroot -p -h127.0.0.1 -P3306 < all.sql 
3     # 接下来会提示你输入mysql数据库的root密码,输入完成后,若是当前数据库不大,很快就能导入完成。 

(3)给从数据库设置复制的主数据库信息(注意修改MASTER_LOG_FILE和MASTER_LOG_POS的值): 
1     # mysql -uroot -p 
2     mysql> CHANGE MASTER TO MASTER_HOST='192.168.100.2',MASTER_USER='repl',MASTER_PASSWORD='repl',MASTER_LOG_FILE='mysqlmaster-bin.000001',MASTER_LOG_POS=332; 
3     # 而后启动从数据库的复制线程: 
4     mysql> START slave; 
5     # 接着查询数据库的slave状态: 
6     mysql>  SHOW slave STATUS \G 
7     # 若是下面两个参数都是Yes,则说明主从配置成功! 
8     Slave_IO_Running: Yes 
9     Slave_SQL_Running: Yes 

(4)接下来你能够在主数据库上建立数据库、表、插入数据,而后看从数据库是否同步了这些操做




Nginx配置详解

Nginx.conf代码   收藏代码
  1. #http://www.open-open.com/home/space-361-do-blog-id-5087.html  
  2. #user  nobody;  
  3.   
  4. #定义了nginx对外提供web服务时的worker进程数。最优值取决于许多因素,包括(但不限于)CPU核的数量、存储数据的硬盘数量  
  5. #及负载模式。不能肯定的时候,将其设置为可用的CPU内核数将是一个好的开始(设置为“auto”将尝试自动检测它)。  
  6. worker_processes  2;  
  7. #更改worker进程的最大打开文件数限制。若是没设置的话,这个值为操做系统的限制。  
  8. #设置后你的操做系统和Nginx能够处理比“ulimit -a”更多的文件,因此把这个值设高,这样nginx就不会有“too many open files”问题了。  
  9. worker_rlimit_nofile 10000;  
  10.   
  11.   
  12. #error_log  logs/error.log;  
  13. #error_log  logs/error.log  notice;  
  14. error_log  logs/error.log  info;  
  15.   
  16. #pid        logs/nginx.pid;  
  17.   
  18.   
  19. events {  
  20.     worker_connections  2048;  #容许最大链接数  
  21.     multi_accept on;  #告诉nginx收到一个新链接通知后接受尽量多的链接。  
  22.     #设置用于复用客户端线程的轮询方法。若是你使用Linux 2.6+,你应该使用epoll。若是你使用*BSD,你应该使用kqueue。  
  23.     #(值得注意的是若是你不知道Nginx该使用哪一种轮询方法的话,它会选择一个最适合你操做系统的)  
  24.     #use epoll;  
  25. }  
  26.   
  27.   
  28. http {  
  29.     #server_tokens  并不会让nginx执行的速度更快,但它能够关闭在错误页面中的nginx版本数字,这样对于安全性是有好处的。  
  30.     #server_tokens off;  
  31.       
  32.     include       mime.types;  
  33.     default_type  application/octet-stream;  
  34.   
  35.     #定义日志格式(格式名字为main)  
  36.         #$remote_addr与$http_x_forwarded_for用以记录客户端的ip地址;  
  37.         #$remote_user:用来记录客户端用户名称;  
  38.     #$time_local: 用来记录访问时间与时区;  
  39.     #$request: 用来记录请求的url与http协议  
  40.     #$status: 用来记录请求状态;成功是200,  
  41.     #$body_bytes_s ent :记录发送给客户端文件主体内容大小;  
  42.     #$http_referer:用来记录从那个页面连接访问过来的;  
  43.     #$http_user_agent:记录客户毒啊浏览器的相关信息;  
  44.   
  45.     log_format  main  '$remote_addr - $remote_user [$time_local] "$request" '  
  46.                       '$status $body_bytes_sent "$http_referer" '  
  47.                       '"$http_user_agent" "$http_x_forwarded_for"';  
  48.   
  49.     access_log  logs/access.log  main;  
  50.   
  51.     #sendfile()能够在磁盘和TCP socket之间互相拷贝数据(或任意两个文件描述符)。  
  52.     #Pre-sendfile是传送数据以前在用户空间申请数据缓冲区。以后用read()将数据从文件拷贝到这个缓冲区,  
  53.     #write()将缓冲区数据写入网络。sendfile()是当即将数据从磁盘读到OS缓存。由于这种拷贝是在内核完成的,  
  54.     #sendfile()要比组合read()和write()以及打开关闭丢弃缓冲更加有效(更多有关于sendfile)。  
  55.     sendfile on;  
  56.   
  57.     #告诉nginx在一个数据包里发送全部头文件,而不一个接一个的发送。  
  58.     tcp_nopush on;  
  59.   
  60.     #告诉nginx不要缓存数据,而是一段一段的发送--当须要及时发送数据时,就应该给应用设置这个属性,这样发送一小块数据信息时就不能当即获得返回值。  
  61.     tcp_nodelay on;  
  62.       
  63.     fastcgi_intercept_errors on;  
  64.       
  65.     #开启gzip压缩,对网页文件、css、js、xml等启动gzip压缩,减小数据传输量,提升访问速度。  
  66.     #include gzip.conf;  
  67.       
  68.     #给客户端分配keep-alive连接超时时间。服务器将在这个超时时间事后关闭连接。咱们将它设置低些可让ngnix持续工做的时间更长。  
  69.     #设置为0,即为持续长久链接  
  70.     keepalive_timeout  65;  
  71.     #设置请求头和请求体(各自)的超时时间。咱们也能够把这个设置低些。  
  72.     client_header_timeout 10;  
  73.     client_body_timeout 10;  
  74.     #告诉nginx关闭不响应的客户端链接。这将会释放那个客户端所占有的内存空间。  
  75.     reset_timedout_connection on;  
  76.     #指定客户端的响应超时时间。这个设置不会用于整个转发器,而是在两次客户端读取操做之间。  
  77.     #若是在这段时间内,客户端没有读取任何数据,nginx就会关闭链接。  
  78.     send_timeout 30;      
  79.       
  80.     #定义一个名为allips的limit_req_zone用来存储session,大小是10M内存,  
  81.     #以$binary_remote_addr为key,限制平均每秒的请求为20个,  
  82.     #1M能存储16000个状态,rate的值必须为整数,若是限制两秒钟一个请求,能够设置成30r/m  
  83.     #limit_req_zone $binary_remote_addr zone=allips:10m rate=20r/s;   
  84.             #限制每ip每秒不超过20个请求,漏桶数burst为5。(结合limit_req_zone使用)  
  85.             #brust的意思就是,若是第1秒、2,3,4秒请求为19个,  
  86.             #第5秒的请求为25个是被容许的。  
  87.             #可是若是你第1秒就25个请求,第2秒超过20的请求返回503错误。  
  88.             #nodelay,若是不设置该选项,严格使用平均速率限制请求数,  
  89.             #第125个请求时,5个请求放到第2秒执行,  
  90.             #设置nodelay,25个请求将在第1秒执行。  
  91.     #limit_req zone=allips burst=5 nodelay;  
  92.     #设置用于保存各类key(好比当前链接数)的共享内存的参数。5m就是5兆字节,这个值应该被设置的足够大以存储(32K*5)32byte状态或者(16K*5)64byte状态。  
  93.     #该属性只能定义在http区域。  
  94.     #limit_conn_zone $binary_remote_addr zone=perip:1m;  
  95.     #为给定的key设置最大链接数。这里key是addr,咱们设置的值是20,也就是说咱们容许每个IP地址最多同时打开有20个链接。  
  96.     #该属性可定义在http server location区域。  
  97.     #limit_conn perip 20;  
  98.   
  99.     #打开缓存的同时也指定了缓存最大数目,以及缓存的时间。咱们能够设置一个相对高的最大时间,这样咱们能够在它们不活动超过20秒后清除掉。  
  100.     open_file_cache max=10000 inactive=20s;  
  101.     #在open_file_cache中指定检测正确信息的间隔时间。  
  102.     open_file_cache_valid 30s;  
  103.     #定义了open_file_cache中指令参数不活动时间期间里最小的文件数。  
  104.     open_file_cache_min_uses 2;  
  105.     #指定了当搜索一个文件时是否缓存错误信息,也包括再次给配置中添加文件。  
  106.     #咱们也包括了服务器模块,这些是在不一样文件中定义的。若是你的服务器模块不在这些位置,你就得修改这一行来指定正确的位置。  
  107.     open_file_cache_errors on;  
  108.       
  109.     #关闭磁盘缓存,减小磁盘IO。  
  110.     proxy_max_temp_file_size 0;  
  111.     proxy_connect_timeout      2;  
  112.     proxy_send_timeout         10;  
  113.     proxy_read_timeout         10;  
  114.     proxy_buffer_size          16k;  
  115.     proxy_buffers              4 64k;  
  116.     #若是系统很忙的时候能够申请更大的proxy_buffers(官方推荐:proxy_buffers*2)  
  117.     #proxy_busy_buffers_size    128k;  
  118.     #proxy_temp_file_write_size 128k;  
  119.     #缓存proxy_temp_path和proxy_cache_path必须在同一个分区  
  120.     #proxy_temp_path docs/cache/temp;  
  121.     #该指令用于设置缓存文件的存放路径,设置缓存区名称为cache_one,  
  122.     #内存缓存空间大小为200M,自动清除超过1天没有被访问的缓存数据,硬盘缓存空间大小为30GB  
  123.     #proxy_cache_path docs/cache/path levels=1:2 keys_zone=cache_one:100m inactive=1d max_size=4g;  
  124.   
  125.     upstream localhost{  
  126.     server localhost:8080 weight=10;  
  127.     server localhost:8081 weight=10;  
  128.     #server localhost:10000 backup;  
  129.     #每一个设备的状态设置为:  
  130.     #1.down表示单前的server暂时不参与负载  
  131.     #2.weight默认为1.weight越大,负载的权重就越大。  
  132.     #3.max_fails:容许请求失败的次数默认为1.当超过最大次数时,返回proxy_next_upstream模块定义的错误  
  133.     #4.fail_timeout:max_fails次失败后,暂停的时间。  
  134.     #5.backup: 其它全部的非backup机器down或者忙的时候,请求backup机器。因此这台机器压力会最轻。  
  135.     }  
  136.     server {  
  137.         listen       80;  
  138.         server_name  localhost;  
  139.   
  140.         charset utf-8;  
  141.         access_log  logs/localhost.access.log  main;  
  142.       
  143.     error_page 404 /404.html;  
  144.     location = /404.html {  
  145.             root   html;  
  146.         }  
  147.         # redirect server error pages to the static page /50x.html  
  148.         error_page   500 502 503 504  /50x.html;  
  149.         location = /50x.html {  
  150.             root   html;  
  151.         }  
  152.   
  153.     #禁止访问WEB-INF目录文件  
  154.     location ~ ^/(WEB-INF)/{  
  155.         #不记录404错误日志  
  156.         #log_not_found off;  
  157.         deny all;  
  158.     }  
  159.       
  160.     #静态文件让nginx处理  
  161.     #location ~ .*.(gif|jpg|jpeg|png|bmp|swf|css|js|htm|html)$ {  
  162.     #   root html;  
  163.     #   access_log off;  
  164.     #   expires 30d;  
  165.     #}  
  166.       
  167.         location / {  
  168.         #限制下载速度256KB/秒  
  169.             #limit_rate 256k;  
  170.         #DNS解析服务器的IP地址,能够在IE 工具-Internet选项-链接-局域网设置-代理服务器 中设置代理服务器IP地址和端口  
  171.         resolver 8.8.8.8;  
  172.         # 默认主页目录在nginx安装目录的html子目录。  
  173.             root   html;  
  174.             index  index.jsp index.htm;  
  175.         proxy_pass  http://localhost;  
  176.         #3. 没有索引页时,罗列文件和子目录  
  177.         autoindex on;  
  178.         proxy_set_header Host $host;  
  179.         proxy_set_header X-Real-IP $remote_addr;  
  180.         proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;  
  181.         #使用http区域定义的cache名称。  
  182.         #proxy_cache cache_one;  
  183.         #访问出现错误,500502等错误,转向另外tomcat  
  184.         #proxy_next_upstream error timeout invalid_header http_500 http_502 http_503 http_504;  
  185.         #200 304状态缓存3小时  
  186.         proxy_cache_valid  200 304 3h;  
  187.         }  
  188.   
  189.         # proxy the PHP scripts to Apache listening on 127.0.0.1:80  
  190.         #  
  191.         #location ~ \.php$ {  
  192.         #    proxy_pass   http://127.0.0.1;  
  193.         #}  
  194.   
  195.         # pass the PHP scripts to FastCGI server listening on 127.0.0.1:9000  
  196.         #  
  197.         #location ~ \.php$ {         
  198.         #    root           html;  
  199.         #    fastcgi_pass   127.0.0.1:9000;  
  200.         #    fastcgi_index  index.php;  
  201.         #    fastcgi_param  SCRIPT_FILENAME  /scripts$fastcgi_script_name;  
  202.         #    include        fastcgi_params;  
  203.         #}  
  204.   
  205.         # deny access to .htaccess files, if Apache's document root  
  206.         # concurs with nginx's one  
  207.         #  
  208.         #location ~ /\.ht {  
  209.         #    deny  all;  
  210.         #}  
  211.     #location /nginxStatus{  
  212.     #    sub_status on;  
  213.     #    access_log logs/nginxLog.log;  
  214.     #    auth_basic "nginxStatus";  
  215.        #auth_basic_user_file conf/htpasswd;  
  216.        #allow all;   #例:allow 10.0.0.1/24  
  217.        #deny all;  
  218.     #}  
  219.     }  
  220.       
  221.     # another virtual host using mix of IP-, name-, and port-based configuration  
  222.     #  
  223.     #server {  
  224.     #    listen       8000;  
  225.     #    listen       somename:8080;  
  226.     #    server_name  somename  alias  another.alias;  
  227.   
  228.     #    location / {  
  229.     #        root   html;  
  230.     #        index  index.html index.htm;  
  231.     #    }  
  232.     #}  
  233.   
  234.   
  235.     # HTTPS server  
  236.     #  
  237.     #server {  
  238.     #    listen       443 ssl;  
  239.     #    server_name  localhost;  
  240.   
  241.     #    ssl_certificate      cert.pem;  
  242.     #    ssl_certificate_key  cert.key;  
  243.   
  244.     #    ssl_session_cache    shared:SSL:1m;  
  245.     #    ssl_session_timeout  5m;  
  246.   
  247.     #    ssl_ciphers  HIGH:!aNULL:!MD5;  
  248.     #    ssl_prefer_server_ciphers  on;  
  249.   
  250.     #    location / {  
  251.     #        root   html;  
  252.     #        index  index.html index.htm;  
  253.     #    }  
  254.     #}  
  255. }  

 

Gzip.conf代码   收藏代码
  1. #gzip模块设置  
  2.   
  3. gzip on; #告诉nginx采用gzip压缩的形式发送数据  
  4.   
  5. #指定的客户端禁用gzip功能。咱们设置成IE6或者更低版本以使咱们的方案可以普遍兼容。  
  6. gzip_disable 'msie6';  
  7.   
  8. #告诉nginx在压缩资源以前,先查找是否有预先gzip处理过的资源。这要求你预先压缩你的文件(在这个例子中被注释掉了),  
  9. #从而容许你使用最高压缩比,这样nginx就不用再压缩这些文件了  
  10. #gzip_static on;  
  11.   
  12. #容许或者禁止压缩基于请求和响应的响应流。咱们设置为any,意味着将会压缩全部的请求。  
  13. gzip_proxied any;  
  14.   
  15. #最小压缩文件大小。若是一个请求小于1000字节,咱们最好不要压缩它,由于压缩这些小的数据会下降处理此请求的全部进程的速度。  
  16. gzip_min_length 1k;  
  17.   
  18. #设置数据的压缩等级。这个等级能够是1-9之间的任意数值,9是最慢可是压缩比最大的。咱们设置为4,这是一个比较折中的设置。  
  19. gzip_comp_level 4;  
  20.   
  21. #设置须要压缩的数据格式  
  22. gzip_types text/plain text/css application/json application/x-javascript text/xml application/xml application/xml+rss text/javascript;  


参考:

1.Windows下搭建Mysql集群http://www.cnblogs.com/Code-life/p/3800823.html

2.Linux下搭建mysql集群  http://blog.csdn.net/yincg/article/details/877260六、http://blog.csdn.net/yang1982_0907/article/details/20716845

3.Windows下搭建MySql Master-Master Replicationwww.cnblogs.com/Code-life/p/3813896.html

4.windows Server下搭建主从复制http://www.cnblogs.com/Ihaveadream/p/4136373.html

5.MySQL主从复制原理以及架构http://www.open-open.com/lib/view/open1373874692544.html

使用Amoeba中间件实现mysql的主从复制与读写分离 http://blog.chinaunix.net/uid-20639775-id-154600.html