percona-XtraDB-cluster(galera);mysql5.7主从(并行复制)

http://galeracluster.com/documentation-webpages/mysqlwsrepoptions.html

 

http://serverfault.com/questions/426021/how-to-install-percona-xtradb-cluster-on-x86-server

Don't know why the Percona-XtraDB-Cluster-galera is missing from the Percona repo. But you cancompile from source code.

First, download and install Galera wsrep provider:

Name        : galera                       Relocations: (not relocatable)
Version     : 23.2.1                            Vendor: Codership Oy
Release     : 1.rhel5                       Build Date: Sat 19 May 2012 04:16:24 AM ICT
Install Date: Mon 10 Sep 2012 05:22:01 PM ICT      Build Host: centos5_32builder.localdomain
Group       : System Environment/Libraries   Source RPM: galera-23.2.1-1.rhel5.src.rpm
Size        : 22430313                         License: GPLv3
Signature   : (none)
Packager    : Codership Oy
URL         : http://www.codership.com/
Summary     : Galera: a synchronous multi-master wsrep provider (replication engine)
Description :
Galera is a fast synchronous multimaster wsrep provider (replication engine)
for transactional databases and similar applications. For more information
about wsrep API see http://launchpad.net/wsrep. For a description of Galera
replication engine see http://www.codership.com.

Second, download the Percona-XtraDB-Cluster's source code and install follow this guide. Notice that, since you're running x86, build binaries by running the following commands:

# cd Percona-XtraDB-Cluster-5.5.27
# BUILD/compile-pentium-wsrep
# make install

Third, change the /etc/my.cnf to something like this:

[mysqld]
# Percona XtraDB Cluster
binlog_format=ROW

wsrep_provider=/usr/lib/galera/libgalera_smm.so

wsrep_slave_threads=2
wsrep_cluster_name=trimethylxanthine
wsrep_sst_method=rsync
wsrep_node_name=node2

innodb_locks_unsafe_for_binlog=1
innodb_autoinc_lock_mode=2


[mysqld_safe]
wsrep_urls=gcomm://192.168.1.100:4567, \
           gcomm://192.168.1.200:4567, \
           gcomm://192.168.1.300:4567, \
           gcomm://

Don't forget to adjust the init script /etc/init.d/mysql to point to the corresponding MySQL binary:

if test -z "$basedir"
then
  basedir=/usr
  #bindir=/usr/bin
  bindir=/usr/local/mysql/bin
  if test -z "$datadir"
  then
    datadir=/var/lib/mysql
  fi
  sbindir=/usr/sbin
  libexecdir=/usr/sbin
else
...

 

 

http://www.gpfeng.com/?p=603

Galera replication for MySQL

By gpfeng | 2014 年 4 月 13 日

这篇文章总结了之前对Galera replication的调研,内容包括Galera特性,原理,Galera cluster配置,参数及性能等

Galera replication是什么

MySQL DBA及开发应该都知道MySQL源生复制及semi-sync半同步复制,它们都基于MySQL binlog,原生复制是完全异步的,master不需要保证slave接收并执行了binlog,能够保证master最大性能,但是slave可能存在延迟,主备数据无法保证一致性,在不停服务的前提下如果master宕机让slave顶上,就会丢失数据,semi-sync在异步复制基础上增加了数据保护的考虑,master必须确认slave收到binlog后(但不保证slave执行了事务)才能最终提交事务,在没有退化(延迟较大时可能发生)成异步复制之前可以保证数据安全,此时master挂掉之后,slave可以在apply完所有relay log后切换成master提供读写服务

Galera replication是codership提供的MySQL数据同步方案,具有高可用,易于扩展等特点,它将多个MySQL节点组织成一个cluster

Galera replication特性

1. 同步复制,主备无延迟
2. 支持多主同时读写,保证数据一致性
3. 集群中各节点保存全量数据
4. 节点添加/删除,自动检测和配置
5. 行级别并行复制
6. 不需要写binlog

相对于MySQL源生复制和semi-sync,Galera replication比较有吸引力的特性:
1. 同步复制,主备无延迟,master宕机后slave可以立即顶上并提供服务(semi-sync需要apply完所有relay log)
2. 事务冲突检测保证数据一致性,多个节点可以同时读写数据,可以极大简化数据访问
3. 行级别并行复制,MySQL 5.6之前slave sql线程只有一个,这个长期饱受诟病,是导致slave落后master的主要原因

Galera replicateion限制

1. 集群至少3个节点(2个节点也可以运行)
2. 存储引擎:Innodb / XtraDB / Maria
3. 不支持的SQL:LOCK / UNLOCK TABLES / GET_LOCK(), RELEASE_LOCK()…
4. 不支持XA Transaction

目前可用的产品:MariaDB Galera Cluster 和 Percona XtraDB Cluster

Galera replication原理

Galera replication是一种Certification based replication,保证one-copy serializability,理论基于这两篇论文:Don’t be lazy, be consistent 和 Database State Machine Approach

算法示意图

Galera_certification
图片来自上面两篇论文

算法伪代码(Certification包含了后续流程,来自上面两篇论文)

Galera_algorithm

事务执行协议

遵守deferred update replication,事务在commit时才复制到其他节点,执行过程分为4个阶段:

1.Local read phase
  a) 本地(client连接到的节点)执行事务Ti,但不真正提交,真正提交之前进入Send phase
2.Send phase
  a) 若事务只读,直接提交,结束(多版本,只读事务不加锁)
  b) 将事务的写操作封装成WS(Write Set,基于行),广播到所有节点(包括自身)
3.Lock / Certificaion phase
  a) 对收到的WS中的每个WSi(X)
    i. 若X没有被加锁,对X加锁
    ii. 若X已被Tj加锁且Tj处于Local read phase/Send phase,回滚Tj,对X加锁
    iii. Certification based conflict detect
4.Write phase
  a) 若检测出冲突,回滚Ti
  b) 否则,执行WS,提交事务后释放锁资源
  c) 对于源节点,提交事务并向client返回结果

客户端/Galera节点信息交互图

Galera_Certification_1
图片来自mysqlperformanceblog

Galera replication采取的是乐观策略,即事务在一个节点提交时,被认为与其他节点上的事务没有冲突,首先在本地“执行”(之所以带引号,是因为事务没有执行完)后再发送到所有节点做冲突检测,存在两种情况下需要回滚事务:
1. WS复制到其它节点,被加到每个节点的slave trx queue中,与queue中前面的trxs在做certification test时发现冲突
2. WS通过了certification test后被保证一定会执行,在它执行过程中,如果该节点上有与其冲突的local trxs(Local phase),回滚local trxs

Galera提供了两个状态参数记录冲突:
wsrep_local_cert_failures:certification test中未通过的trx数目
wsrep_local_bf_aborts:apply trxs(已经通过certification test)时,回滚的local trxs(open but not commit)数目

因此事务在commit节点广播后,节点之间不交换“是否冲突”的信息,各个节点独立异步的处理该事务,certification based replication协议保证:
1. 事务在所有节点上要么都commit,要么都rollback/abort
2. 事务在所有节点的执行顺序一致

Certification based replication所依赖的基础技术:
Group Communication System
1) Atomic delivery (事务传输要么成功传给了所有节点,要么都失败)
2) Total order (事务在所有节点中的顺序一致)
3) Group maintenance (每个节点知道所有节点的状态)

传统的2PC(两阶段提交)做法

1. 2PC 事务结束时,所有节点数据达到一致
2. 协调者与参与者之间通信,参与者之间无连接
3. 受网络状态影响较大
4. 两次通信,需要得到每个参与者的反馈后才能决定是否提交事务

因此Galera replicateion相对于2PC减少了网络传输次数,消除了等待节点返回“决定是否冲突”的时间,从而可以提高了性能

Galera replication原理总结

1. 事务在本地节点执行时采取乐观策略,成功广播到所有节点后再做冲突检测
2. 检测出冲突时,本地事务优先被回滚
3. 每个节点独立、异步执行队列中的WS
4. 事务T在A节点执行成功返回客户端后,其他节点保证T一定会被执行,因此有可能存在延迟,即虚拟同步
Galera_latency

Galera flow control

galera是同步复制(虚拟同步)方案,事务在本地节点(客户端提交事务的节点)上提交成功时,其它节点保证执行该事务。在提交事务时,本地节点把事务复制到所有节点后,之后各个节点独立异步地进行certification test、事务插入待执行队列、执行事务。然而由于不同节点之间执行事务的速度不一样,长时间运行后,慢节点的待执行队列可能会越积越长,最终可能导致事务丢失。

galera内部实现了flow control,作用就是协调各个节点,保证所有节点执行事务的速度大于队列增长速度,从而避免丢失事务。实现原理和简单:整个galera cluster中,同时只有一个节点可以广播消息(数据),每个节点都会获得广播消息的机会(获得机会后也可以不广播),当慢节点的待执行队列超过一定长度后,它会广播一个FC_PAUSE消息,所以节点收到消息后都会暂缓广播消息,直到该慢节点的待执行队列长度减小到一定长度后,galera cluster数据同步又开始恢复

flow control相关参数:

gcs.fc_limit:待执行队列长度超过该值时,flow control被触发,对于Master-Slave模式(只在一个节点写)的galera cluster,可以配置一个较大的值,对启动多写的galera cluster,较小的值比较合适,因为较大待执行队列长度意味着更大的冲突,默认值16
gcs.fc_factor:当待执行队列长度开始小于(gcs.fc_factor*gcs.fc_limit)时,数据同步恢复,默认0.5
gcs.fc_master_slave:galera cluster是否为Master-Slave模式,默认

安装MariaDB Galera Cluster

安装准备:

1. MariaDB Galera Cluster 5.5.28a RC
1) https://downloads.mariadb.org/mariadb-galera/5.5.28a/
2) patched MariaDB 5.5.28,代码中增加了Galera Library API(wsrep API),并在事务、锁、handler等模块添加/修改了调用逻辑

2. Galera wsrep provider
1) https://launchpad.net/galera/+download
2) Galera Library的实现,其中实现了group communication system, certification

编译安装

1. MariaDB Galera Cluster 5.5.28a RC
1) 与MariaDB基本相同,cmake时增加两项:-DWITH_WSREP=ON , -DWITH_INNODB_DISALLOW_WRITES=1.
2. Galera wsrep provider: 源码编译后得到libgalera_smm.so(需要用到scons)

参数配置(每个节点)

wsrep_provider = /path/to/libgalera_smm.so
wsrep_cluster_address = cluster connection URL(后面详细介绍)
binlog_format = ROW
default_storage_engine = INNODB
innodb_autoinc_lock_mode = 2
innodb_locks_unsafe_for_binlog = 1

选配:(可以提高性能,galera保证不丢数据)
innodb_flush_log_at_trx_commit = 2

构建集群(三个节点)

3-node-cluster
节点名称IP地址
galera_node1 10.0.0.11
galera_node2 10.0.0.22
galera_node3 10.0.0.33

新建Galera Cluster

以galera_node1作为第一个节点新建集群,在my.cnf中配置参数:

wsrep_cluster_address = gcomm://
wsrep_cluster_name = galera_cluster
wsrep_node_address = 10.0.0.11
wsrep_node_name = galera_node1
wsrep_sst_method = rsync

添加galera_node2节点

在my.cnf中配置wsrep_cluster_address为node1的ip或者hostname

wsrep_cluster_address = gcomm://10.0.0.11
wsrep_cluster_name = galera_cluster
wsrep_node_address = 10.0.0.22
wsrep_node_name = galera_node2
wsrep_sst_method = rsync

添加galera_node3节点

在my.cnf中配置wsrep_cluster_address为node1的ip或者hostname

wsrep_cluster_address = gcomm://10.0.0.11
wsrep_cluster_name = galera_cluster
wsrep_node_address = 10.0.0.33
wsrep_node_name = galera_node3
wsrep_sst_method = rsync

多实例配置

因为测试机器资源有限,需要在同一台机器上启动多个mysqld实例,为每个mysqld配置两个端口号(一个是mysql server端口号,默认3306;另外一个是wsrep端口号,默认4567),并修改部分wsrep配置参数,例如:

galera-cluster
节点名称IP地址SERVER PORTWSREP PORTWSREP配置
galera_node1 127.0.0.1 3306 4405 wsrep_cluster_address=gcomm:// wsrep_node_address=127.0.0.1:4405 port=3306
galera_node2 127.0.0.1 3307 4407 wsrep_cluster_address=gcomm://127.0.0.1:4405 wsrep_node_address=127.0.0.1:4407 port=3307
galera_node3 127.0.0.1 308 4409 wsrep_cluster_addres=gcomm:// 127.0.0.1:4405 wsrep_node_address=127.0.0.1:4409 port=3308

 

启动后在每个节点执行:

mysql> show status like ‘wsrep%’;

当看到下述状态时:

wsrep_connected=ON
wsrep_ready=ON
wsrep_cluster_status =Primary
wsrep_cluster_size=3(节点个数)

则galera集群建立成功,如下图所示:

Galera_status

说明:
1. MariaDB Galera Cluster 5.5.28a RC源码安装,在编译时若没有打开-DWITH_WSREP=ON, -DWITH_INNODB_DISALLOW_WRITES=1,或者没有配置任何wsrep相关参数,它运行时就是一个普通的mysqld实例
2. Galera cluster复制不依赖于binlog文件,因此mysql-binlog和log-slave-updates都可以不配置,当然如果需要记录binlog,也可以打开
3. 需要以wsrep_cluster_address = gcomm://启动第一个节点后,才能相继添加其他节点

Galera相关参数配置

InnoDB 相关参数

galera补丁版的mysql在cmake时需要指定:
-DWITH_WSREP=ON , -DWITH_INNODB_DISALLOW_WRITES=1

galera 目前只支持Innodb/xtradb/mariad存储引擎
default_storage_engine = INNODB

为了降低冲突,下列两项需要设置
innodb_autoinc_lock_mode = 2
innodb_locks_unsafe_for_binlog = 1(gap不加锁)

选配:(可以提高性能,galera保证不丢数据)
innodb_flush_log_at_trx_commit = 2

选配:galera可以不写binlog,注释binlog路径理论上可以提高性能
#log-bin
#log-slave-updates=1

wsrep 相关参数

wsrep参数都是以wsrep_开头的(30+个),其中有一个字符串参数(wsrep_provider_options)可以配置50+个更底层的参数。
可以通过“show variables like wsrep%”查看,wsrep_开头参数,点击查看详情

列举几个重要的参数:

wsrep_auto_increment_control:控制auto_increment_increment=#nodes和auto_increment_offset=#node_id,默认ON
wsrep_causal_reads:默认是在本地节点读,读到的可能不是最新数据,开启后将读到最新数据,但会增加响应时间,默认OFF
wsrep_certify_nonPK:为没有显示申明主键的表生成一个用于certification test的主键,默认ON
wsrep_cluster_address: 启动节点时需要指定galera cluster的地址,作为cluster中第一个启动的节点,wsrep_cluster_address=gcomm://,对于后续启动的节点,wsrep_cluster_address=gcomm://node1,node2,node3	
wsrep_cluster_name: 所有node必须一样, 默认my_test_cluster
wsrep_convert_LOCK_to_trx:将LOCK/UNLOCK TABLES转换成BEGIN/COMMIT,默认OFF
wsrep_data_home_dir:galera会生成一些文件,默认使用mysql_data_dir,默认mysql_data_dir
wsrep_node_name:节点名称
wsrep_on:session/global,设置为OFF时,事务将不会复制到其他节点,默认ON
wsrep_OSU_method:Online Schema Update设置,TOI/RSU(MySQL >= 5.5.17),默认TOI
wsrep_provider:libgalera_smm.so的路径,若没有配置,galera复制不会启动,默认none
wsrep_provider_options:很长的字符串变量,可以配置很多group communication system相关参数,很长很长...
wsrep_retry_autocommit:事务在冲突时重新尝试的次数,默认1
wsrep_slave_threads:并行复制的slave线程数,默认4
wsrep_sst_method:Snapshot State Transter方法:mysqldump/rsync/xt,默认mysqldump

wsrep_provider_options
该参数是一个字符串,包含了group communication system中很多参数设置,配置时使用分号隔开:
wsrep_provider_options=”key_a=value_a;key_b=value_b;key_c=value_c”,点击查看详情

列举其中部分重要参数:

evs.send_window:节点一次可以发送的消息数目,默认4
evs.user_send_window:其与evs.send_window之间的差别类似于max_connections与max_user_connection,默认2
gcs.fc_factor:flow control参数,默认0.5
gcs.fc_limit:flow control参数,默认16
gcs.fc_master_slave:flow control参数,默认NO
gcs.recv_q_hard_limit:接收队列的占用的最大内存,默认LLONG_MAX
gcs.recv_q_soft_limit:当接收队列占用内存超过(gcs.recv_q_hard_limit*gcs.recv_q_soft_limit),复制被延迟,默认0.25
gmcast.listen_addr:节点用于接收其它节点消息的地址,默认tcp://0.0.0.0:4567
pc.checksum:是否对发送的消息做checksum,默认true
pc.ignore_sb:是否忽略split brain,默认false

一个例子

binlog_format=row 
default-storage-engine = INNODB 
innodb_autoinc_lock_mode = 2 
innodb_locks_unsafe_for_binlog = 1
wsrep_provider = /u01/mariadb-galera/lib/libgalera_smm.so 
wsrep_cluster_address = "gcomm://192.168.xxx.01" 
wsrep_cluster_name = galera 
wsrep_node_address = 192.168.xxx.xxx 
wsrep_node_name = slave 
wsrep_sst_method = rsync 
wsrep_slave_threads = 16 
wsrep_provider_options="gcache.page_size=128M;gcache.size=2G;gcs.fc_limit=512;gcs.fc_factor=0.9;evs.send_window=256;evs.user_send_window=128"

Galera status variables

Galera提供了很多以wsrep_开头状态参数监控mysql状态,通过show status like ‘wsrep%’可以查看:

wsrep_local_state_uuid:应该与wsrep_cluster_state_uuid一致,如363acc29-9160-11e2-0800-4316271a76e4
wsrep_last_committed:已经提交事务数目,所有节点之间相差不大,可以用来计算延迟
wsrep_replicated:从本地节点复制出去的write set数目
wsrep_replicated_bytes:从本地节点复制出去的write set的总共字节数
wsrep_received:本地节点接收来自其他节点的write set数目
wsrep_received_bytes:本地节点接收来自其他节点的write set的总共字节数
wsrep_local_commits:从本地节点发出的write set被提交的数目,不超过wsrep_replicated
wsrep_local_cert_failures:certification test失败的数目
wsrep_local_bf_aborts:certification test通过的write set执行过程中回滚的与其冲突的本地事务
wsrep_local_replays:事务被回滚(bf abort)重做的数目
wsrep_local_send_queue:发送队列的长度
wsrep_local_send_queue_avg:从上次查询状态到目前发送队列的平均长度,>0.0意味着复制过程被节流了
wsrep_local_recv_queue:接收队列的长度
wsrep_local_recv_queue_avg:从上次查询状态到目前接收队列的平均长度,>0.0意味着执行速度小于接收速度
wsrep_flow_control_paused:从上次查询状态到目前处于flow control的时间占比,如0.388129
wsrep_flow_control_sent:从上次查询状态到目前节点发送出的FC_PAUSE消息数目,如1
wsrep_flow_control_recv:从上次查询状态到目前及节点接收的FC_PAUSE消息数目,如1
wsrep_cert_deps_distance:可以并行执行的write set的最大seqno与最小seqno之间的平均差值,如1851.825751
wsrep_apply_oooe:队列中事务并发执行占比,值越高意味着效率越高
wsrep_commit_window:平均并发提交窗口大小
wsrep_local_state:节点的状态,取值1-6
wsrep_local_state_comment:节点的状态描述,比如Synced
wsrep_incoming_addresses:集群中其它节点的地址,多个地址之间用逗号分隔
wsrep_cluster_conf_id:集群节点关系改变的次数(每次增加/删除都会+1)
wsrep_cluster_size:集群节点个数
wsrep_cluster_state_uuid:集群uuid,所有节点应该一样,如:363acc29-9160-11e2-0800-4316271a76e4
wsrep_cluster_status:集群的目前状态,取值:PRIMARY(正常)/NON_PRIMARY(不一致)
wsrep_connected:节点是否连接到集群,取值:ON/OFF
wsrep_local_index:节点id
wsrep_provider_name:默认Galera
wsrep_provider_vendor:默认Codership Oy <info@codership.com>
wsrep_provider_version:wsrep版本,如:2.2(rXXXX)
wsrep_ready:节点是否可以接受查询了,取值:ON/OFF

一个截图:

Galera_status_1

如何检查节点是否加入到集群

1. wsrep_cluster_state_uuid应该与其它所有节点相同
2. wsrep_cluster_conf_id应该与其它所有节点相同
3. wsrep_cluster_size应该是所有节点的数目
4. wsrep_cluster_status取值应该是:Primary
5. wsrep_ready取值应该是ON
6. wsrep_connected取值应该是ON

判断复制过程是否出现问题

wsrep_flow_control_paused,正常情况下,其取值应该接近于0.0,大于0.0意味着有‘慢节点’影响了集群的速度,可以尝试通过增大wsrep_slave_threads来解决

找出最慢的节点

wsrep_flow_control_sent,wsrep_local_recv_queue_avg两个值最大的节点

参考:galera statusgalera monitoring

性能测试

由于galera同步复制在每个写事务提交时都增加了replicate trx和certification test的开销,因此性能远远低于异步MySQL实例

测试场景

使用TPCC进行测试,包含3组数据:
1、normal mysql: baseline,单个mysql server
2、galera (RTT: 0.5ms): 2-nodes galera cluster,单节点读写
3、galera (RTT: 15.2ms): 2-nodes galera cluster,单节点读写

tpmC结果:
Galera_performance
TPS结果:
Galera_performance_tps

测试结论:

1. 相对于异步MySQL实例,Galera replication性能下降约50% ~ 60%左右
2. Galera最大性能不受RTT影响,RTT 较小时(0.5ms),在达到最大性能之前(32并发),性能下降并不明显 (32并发下降25%,16并发性能下降更低),RTT较大时(15.2ms),在达到最大性能之前(64并发),相对于norml mysq性能下降一直到很明显,当压力逐渐增大,由于group io的原因,galera性能在达到最大时还会提高

Galera replication for MySQL学习资料

1. codership官网
2. mysqlperformanceblog搜索中PXC(Percona XtraDB Cluster)

Category: MySQL-InnoDB

 

http://www.cnblogs.com/firemeteorx/p/3410166.html

实战MySQL集群,试用CentOS 6下的MariaDB-Galera集成版

 

  说起mysql的集群估计很多人会首先想起mysql自带的replication或者mysql-mmm。mysql-mmm其实也是基于mysql自带的replication的,不过封装的更好用一些,但是配置起来还是比较麻烦,而且对于动态增减master节点可以说是无能为力的。

  偶然的情况下了解到有一个基于mysql的集群galera,除了只支持InnoDB以外,基本就没什么缺点了。大家看看官方是怎么说的:

复制代码
Features

MySQL/Galera is synchronous multi-master cluster for MySQL/InnoDB database, having features like:

    Synchronous replication
    Active-active multi-master topology
    Read and write to any cluster node
    Automatic membership control, failed nodes drop from the cluster
    Automatic node joining
    True parallel replication, on row level
    Direct client connections, native MySQL look & feel

Benefits

These features yield un-seen benefits for a DBMS clustering solution:

    No slave lag
    No lost transactions
    Both read and write scalability
    Smaller client latencies
复制代码

  废话少说,马上开始动手测试,测试用的OS是64位的CentOS 6。首先,添加MariaDB的软件仓库,创建文件“/etc/yum.repos.d/MariaDB.repo”,内容

复制代码
# MariaDB 5.5 CentOS repository list - created 2013-11-05 06:30 UTC
# http://mariadb.org/mariadb/repositories/
[mariadb]
name = MariaDB
baseurl = http://yum.mariadb.org/5.5/centos6-amd64
gpgkey=https://yum.mariadb.org/RPM-GPG-KEY-MariaDB
gpgcheck=1
复制代码

  然后,安装MariaDB-Galera集成版

# yum -y install MariaDB-Galera-server.x86_64 MariaDB-client.x86_64 galera.x86_64

 # cp /usr/share/mysql/wsrep.cnf /etc/my.cnf.d/

  Galera默认试用4567端口同步数据,需要修改防火墙,这里为了方便直接把防火墙给关闭了

# /etc/init.d/iptables stop

  MariaDB-Galera貌似没有给你提供配套的selinux配置,为了方便,直接把selinux给禁止了

# setenforce 0

  既然是集群,当然不能只有一台机器

机器a 192.168.56.103
机器b 192.168.56.104
机器c 192.168.56.105

  修改机器a的“/etc/my.cnf.d/wsrep.cnf”,改动内容

复制代码
# Full path to wsrep provider library or 'none'
wsrep_provider=/usr/lib64/galera/libgalera_smm.so
# Group communication system handle
wsrep_cluster_address="gcomm://"
# Address which donor should send State Snapshot to.
# Should be the address of THIS node. DON'T SET IT TO DONOR ADDRESS!!!
# (SST method dependent. Defaults to the first IP of the first interface)
wsrep_sst_receive_address=192.168.56.103
复制代码

  因为机器a是第一个节点,wsrep_cluster_address直接填"gcomm://"就可以了。如果是要加入到某个集群,那就填集群里面随便一个节点的ip就可以,例如"gcomm://192.168.56.103:4567"。wsrep_sst_receive_address是本机用来接收同步数据的ip,默认是机器网络配置里面找到的第一个ip,如果机器有多个ip的话最好指定一下,例如“192.168.56.103”。启动mysql数据库服务

# /etc/init.d/mysql start

  现在要把机器b加入到集群,同样修改配置文件“/etc/my.cnf.d/wsrep.cnf”,改动内容

复制代码
# Full path to wsrep provider library or 'none'
wsrep_provider=/usr/lib64/galera/libgalera_smm.so
# Group communication system handle
wsrep_cluster_address="gcomm://192.168.56.103:4567"
# Address which donor should send State Snapshot to.
# Should be the address of THIS node. DON'T SET IT TO DONOR ADDRESS!!!
# (SST method dependent. Defaults to the first IP of the first interface)
wsrep_sst_receive_address=192.168.56.104
复制代码

  启动机器b的mysql服务。

  到这里集群就搭建完毕了,现在开始正式测试集群。首先,链接机器a的mysql服务,创建一个数据库和一张表,表里面有一个让mysql-mmm比较麻烦和头疼的AUTO_INCREMENT字段,顺便添加乐一个用来访问这个数据库的用户

复制代码
[root@centos6 ~]# mysql -u root
Welcome to the MariaDB monitor.  Commands end with ; or \g.
Your MariaDB connection id is 3
Server version: 5.5.33a-MariaDB MariaDB Server, wsrep_23.7.6.rXXXX

Copyright (c) 2000, 2013, Oracle, Monty Program Ab and others.

Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.

MariaDB [(none)]> create database asdf;
Query OK, 1 row affected (0.03 sec)

MariaDB [(none)]> grant all on asdf.* to 'aauu'@'localhost' identified by '123456';
Query OK, 0 rows affected (0.00 sec)

MariaDB [(none)]> use asdf;
Database changed
MariaDB [asdf]> create table aatt (aa int primary key auto_increment);
Query OK, 0 rows affected (0.14 sec)

MariaDB [asdf]> insert into aatt values (null);
Query OK, 1 row affected (0.01 sec)

MariaDB [asdf]> insert into aatt values (null);
Query OK, 1 row affected (0.00 sec)

MariaDB [asdf]> select * from aatt;
+----+
| aa |
+----+
|  2 |
|  4 |
+----+
2 rows in set (0.00 sec)
复制代码

  auto_increment的步进自动变成2了,是不是很智能?现在我们去到机器b,用新建的用户名登录mysql服务,执行类似的操作

复制代码
[root@centos6 ~]# mysql -u aauu -p
Enter password: 
Welcome to the MariaDB monitor.  Commands end with ; or \g.
Your MariaDB connection id is 4
Server version: 5.5.33a-MariaDB MariaDB Server, wsrep_23.7.6.rXXXX

Copyright (c) 2000, 2013, Oracle, Monty Program Ab and others.

Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.

MariaDB [(none)]> use asdf;
Database changed
MariaDB [asdf]> insert into aatt values (null);
Query OK, 1 row affected (0.01 sec)

MariaDB [asdf]> insert into aatt values (null);
Query OK, 1 row affected (0.04 sec)

MariaDB [asdf]> select * from aatt;
+----+
| aa |
+----+
|  2 |
|  4 |
|  5 |
|  7 |
+----+
4 rows in set (0.00 sec)
复制代码

  看到没有?刚才插入的数据都在这个就没什么值得说的,厉害的是机器a上新建的用户在这里可以用!现在我们来动态把机器c加入到集群里面去

复制代码
# Full path to wsrep provider library or 'none'
wsrep_provider=/usr/lib64/galera/libgalera_smm.so
# # Group communication system handle
wsrep_cluster_address="gcomm://192.168.56.104:4567"
# # Address which donor should send State Snapshot to.
# # Should be the address of THIS node. DON'T SET IT TO DONOR ADDRESS!!!
# # (SST method dependent. Defaults to the first IP of the first interface)
wsrep_sst_receive_address=192.168.56.105
复制代码

  之前说过的,加入到集群里面随便一个节点的ip都可以。启动机器c的mysql服务,然后执行类似操作

复制代码
[root@centos6 ~]# mysql -u root
Welcome to the MariaDB monitor.  Commands end with ; or \g.
Your MariaDB connection id is 3
Server version: 5.5.33a-MariaDB MariaDB Server, wsrep_23.7.6.rXXXX

Copyright (c) 2000, 2013, Oracle, Monty Program Ab and others.

Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.

MariaDB [(none)]> use asdf;
Reading table information for completion of table and column names
You can turn off this feature to get a quicker startup with -A

Database changed
MariaDB [asdf]> insert into aatt values (null);
Query OK, 1 row affected (0.00 sec)

MariaDB [asdf]> insert into aatt values (null);
Query OK, 1 row affected (0.00 sec)

MariaDB [asdf]> select * from aatt;
+----+
| aa |
+----+
|  2 |
|  4 |
|  5 |
|  7 |
|  9 |
| 12 |
+----+
6 rows in set (0.00 sec)
复制代码

  auto_increment的步进自动变成3了,看到没有?

  这里我只是简单的列举了Galera的一个使用场景,还有很多它先进的地方这里没有提到,它大家可以上它的官方网站看看。

  参考网址:

  1. http://www.codership.com/
  2. https://launchpad.net/wsrep
  3. http://blog.sina.com.cn/s/blog_704836f40101lixp.html

 

http://634871.blog.51cto.com/624871/1350082

一、MariaDB Galera Cluster概要:

1.简述:
     MariaDB Galera Cluster 是一套在mysql innodb存储引擎上面实现multi-master及数据实时同步的系统架构,业务层面无需做读写分离工作,数据库读写压力都能按照既定的规则分发到各个节点上去。在数据方面完全兼容 MariaDB 和 MySQL。
2.特性:
     (1).同步复制 Synchronous replication
     (2).Active-active multi-master 拓扑逻辑
     (3).可对集群中任一节点进行数据读写
     (4).自动成员控制,故障节点自动从集群中移除
     (5).自动节点加入
     (6).真正并行的复制,基于行级
     (7).直接客户端连接,原生的 MySQL 接口
     (8).每个节点都包含完整的数据副本
     (9).多台数据库中数据同步由 wsrep 接口实现
3.局限性
     (1).目前的复制仅仅支持InnoDB存储引擎,任何写入其他引擎的表,包括mysql.*表将不会复制,但是DDL语句会被复制的,因此创建用户将会被复制,但是insert into mysql.user…将不会被复制的.
     (2).DELETE操作不支持没有主键的表,没有主键的表在不同的节点顺序将不同,如果执行SELECT…LIMIT… 将出现不同的结果集.
     (3).在多主环境下LOCK/UNLOCK TABLES不支持,以及锁函数GET_LOCK(), RELEASE_LOCK()…
     (4).查询日志不能保存在表中。如果开启查询日志,只能保存到文件中。
     (5).允许最大的事务大小由wsrep_max_ws_rows和wsrep_max_ws_size定义。任何大型操作将被拒绝。如大型的LOAD DATA操作。
     (6).由于集群是乐观的并发控制,事务commit可能在该阶段中止。如果有两个事务向在集群中不同的节点向同一行写入并提交,失败的节点将中止。对 于集群级别的中止,集群返回死锁错误代码(Error: 1213 SQLSTATE: 40001 (ER_LOCK_DEADLOCK)).
     (7).XA事务不支持,由于在提交上可能回滚。
     (8).整个集群的写入吞吐量是由最弱的节点限制,如果有一个节点变得缓慢,那么整个集群将是缓慢的。为了稳定的高性能要求,所有的节点应使用统一的硬件。
     (9).集群节点建议最少3个。
     (10).如果DDL语句有问题将破坏集群。
二、MariaDB Galera Cluster搭建演示
1.环境描述

OS: red hat linux 6.0 64bit

MariaDB server1: 192.168.1.137
MariaDB server2: 192.168.1.138
MariaDB server3: 192.168.1.139
Galera SST user: sst
Galera SST password: sstpass123
MySQL root password: kongzhong
2. 配置mariadb的yum源
1
2
3
4
5
6
7
8
9
10
11
12
13
[root@client137 ~]#  vim /etc/yum.repos.d/mariadb.repo
[root@client138 ~]#  vim /etc/yum.repos.d/mariadb.repo
[root@client139 ~]#  vim /etc/yum.repos.d/mariadb.repo
# yum源的内容如下:
[mariadb]
name = MariaDB
baseurl = http://yum.mariadb.org/5.5/rhel6-amd64
enabled = 1
gpgkey=https://yum.mariadb.org/RPM-GPG-KEY-MariaDB
gpgcheck=1
[root@client137 ~]#  yum makecache
[root@client138 ~]#  yum makecache
[root@client139 ~]#  yum makecache
3.安装 MariaDB-Galera-server galera MariaDB-client
1
2
3
[root@client137 ~]# yum -y install MariaDB-Galera-server galera MariaDB-client
[root@client138 ~]# yum -y install MariaDB-Galera-server galera MariaDB-client
[root@client139 ~]# yum -y install MariaDB-Galera-server galera MariaDB-client
4.编辑每台机器的hosts文件,添加如下内容
1
2
3
4
5
6
7
8
[root@client137 ~]# vim /etc/hosts
192.168.1.137 client137.kongzhong.com  client137
 192.168.1.138 client138.kongzhong.com  client138
 192.168.1.139 client139.kongzhong.com  client139
# 启动测试一下
[root@client137 ~]# /etc/init.d/mysql start
 Starting MySQL.... SUCCESS!
 [root@client137 ~]# chkconfig mysql on
5.设置MariaDB的root密码,并做安全加固
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
[root@client137 ~]#  /usr/bin/mysql_secure_installation
[root@client137 ~]#  /usr/bin/mysql_secure_installation
# 登陆数据库,授权用于集群同步的用户和密码
[root@client137 ~]# mysql -uroot -pkongzhong
mysql> GRANT USAGE ON *.* to sst@'%' IDENTIFIED BY 'sstpass123';
mysql> GRANT ALL PRIVILEGES on *.* to sst@'%';
mysql> FLUSH PRIVILEGES;
mysql> quit
# 创建并配置wsrep.cnf文件
[root@client137 ~]# cp /usr/share/mysql/wsrep.cnf  /etc/my.cnf.d/
 [root@client137 ~]# vim /etc/my.cnf.d/wsrep.cnf
# 只需要修改如下4行:
wsrep_provider=/usr/lib64/galera/libgalera_smm.so
wsrep_cluster_address="gcomm://"
wsrep_sst_auth=sst:sstpass123
wsrep_sst_method=rsync
# 注意:
#    "gcomm://" 是特殊的地址,仅仅是Galera cluster初始化启动时候使用。
#    如果集群启动以后,我们关闭了第一个节点,那么再次启动的时候必须先修改,"gcomm://"为其他节点的集群地址,例如wsrep_cluster_address="gcomm://192.168.1.138:4567"
6.确认本机防火墙上开放了所需TCP 3306和TCP 4567的端口[也可以关闭防火墙]
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
[root@client137 ~]# iptables -A INPUT -i eth0 -p tcp --dport 3306 -j ACCEPT
 [root@client137 ~]# iptables -A INPUT -i eth0 -p tcp --dport 4567 -j ACCEPT
# 启动mariadb,查看3306和4567端口是否被监听
[root@client137 ~]# /etc/init.d/mysql restart
[root@client137 ~]# netstat -tulpn |grep -e 4567 -e 3306
 tcp        0      0 0.0.0.0:3306                0.0.0.0:*                   LISTEN      32363/mysqld
 tcp        0      0 0.0.0.0:4567                0.0.0.0:*                   LISTEN      32363/mysqld
# 这样一个节点就已经配置完成,其他节点的配置先给个思路,如下注释部分:
# ********************* #
构造新节点的操作步骤如下:
1.按照上述1-6的步骤安装MariaDB和Galera library
2.除了第5步wsrep_cluster_address的配置稍有不同:
wsrep_cluster_address="gcomm://Node-A-IP:4567"  # 这里指向是指上一层的集群地址
3.重起MariaDB
# ********************* #
7.新添加节点的配置如下:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
# 构建192.168.1.138节点
[root@client138 ~]# /etc/init.d/mysql start
 Starting MySQL.... SUCCESS!
 [root@client138 ~]#   /usr/bin/mysql_secure_installation
[root@client138 ~]# mysql -uroot -pkongzhong
mysql> GRANT USAGE ON *.* to sst@'%' IDENTIFIED BY 'sstpass123';
mysql> GRANT ALL PRIVILEGES on *.* to sst@'%';
mysql> FLUSH PRIVILEGES;
mysql> quit
[root@client138 ~]# cp /usr/share/mysql/wsrep.cnf  /etc/my.cnf.d/
 [root@client138 ~]# vim /etc/my.cnf.d/wsrep.cnf
# 只需要修改如下4行:
wsrep_provider=/usr/lib64/galera/libgalera_smm.so
# 这里指定上一个集群节点的IP地址
wsrep_cluster_address="gcomm://192.168.1.137:4567"
# 指定用于同步的账号和密码
wsrep_sst_auth=sst:sstpass123
wsrep_sst_method=rsync
# 确认本机防火墙上开放了所需TCP 3306和TCP 4567的端口
[root@client138 ~]# iptables -A INPUT -i eth0 -p tcp --dport 3306 -j ACCEPT
 [root@client138 ~]# iptables -A INPUT -i eth0 -p tcp --dport 4567 -j ACCEPT
# 启动,监听
[root@client138 ~]# /etc/init.d/mysql restart
[root@client138 ~]# netstat -tulpn |grep -e 4567 -e 3306
 tcp        0      0 0.0.0.0:3306                0.0.0.0:*                   LISTEN      32363/mysqld
 tcp        0      0 0.0.0.0:4567                0.0.0.0:*                   LISTEN      32363/mysqld
# 构建192.168.1.139节点
[root@client139 ~]# /etc/init.d/mysql start
 Starting MySQL.... SUCCESS!
 [root@client139 ~]#   /usr/bin/mysql_secure_installation
[root@client139 ~]# mysql -uroot -pkongzhong
mysql> GRANT USAGE ON *.* to sst@'%' IDENTIFIED BY 'sstpass123';
mysql> GRANT ALL PRIVILEGES on *.* to sst@'%';
mysql> FLUSH PRIVILEGES;
mysql> quit
[root@client139 ~]# cp /usr/share/mysql/wsrep.cnf  /etc/my.cnf.d/
 [root@client139 ~]# vim /etc/my.cnf.d/wsrep.cnf
# 只需要修改如下4行:
wsrep_provider=/usr/lib64/galera/libgalera_smm.so
# 这里指定上一个集群节点的IP地址
wsrep_cluster_address="gcomm://192.168.1.138:4567"
# 指定用于同步的账号和密码
wsrep_sst_method=rsync
# 确认本机防火墙上开放了所需TCP 3306和TCP 4567的端口
[root@client139 ~]# iptables -A INPUT -i eth0 -p tcp --dport 3306 -j ACCEPT
 [root@client139 ~]# iptables -A INPUT -i eth0 -p tcp --dport 4567 -j ACCEPT
# 启动,并查看监听
[root@client139 ~]# /etc/init.d/mysql restart
[root@client139 ~]# netstat -tulpn |grep -e 4567 -e 3306
 tcp        0      0 0.0.0.0:3306                0.0.0.0:*                   LISTEN      32363/mysqld
 tcp        0      0 0.0.0.0:4567                0.0.0.0:*                   LISTEN      32363/mysqld
8.以上配置完成后,

对于只有2个节点的Galera Cluster和其他集群软件一样,需要面对极端情况下的"脑裂"状态。

为了避免这种问题,Galera引入了"arbitrator(仲裁人)"。

"仲裁人"节点上没有数据,它在集群中的作用就是在集群发生分裂时进行仲裁,集群中可以有多个"仲裁人"节点。

"仲裁人"节点加入集群的方法如下:

 

1
[root@client137 ~]# garbd -a gcomm://192.168.1.137:4567 -g my_wsrep_cluster -d
# 注释:参数说明:
  -d:以daemon模式运行
  -a:集群地址
  -g: 集群名称
9.测试集群是否配置好参数:
登陆数据库:
查看如下几个参数:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
# 下面这个参数的显示是初始化数据库显示的情况
MariaDB [(none)]> SHOW VARIABLES LIKE 'wsrep_cluster_address';
 +-----------------------+----------+
 | Variable_name         | Value    |
 +-----------------------+----------+
 | wsrep_cluster_address | gcomm:// |
 +-----------------------+----------+
 1 row in set (0.00 sec)
# 如果配置了指向集群地址,上面那个参数值,应该是你指定集群的IP地址
 MariaDB [kz]> SHOW VARIABLES LIKE 'wsrep_cluster_address';
 +-----------------------+----------------------------+
 | Variable_name         | Value                      |
 +-----------------------+----------------------------+
 | wsrep_cluster_address | gcomm://192.168.1.139:4567 |
 +-----------------------+----------------------------+
 1 row in set (0.00 sec)
 # 此参数查看是否开启
 MariaDB [kz]> show status like 'wsrep_ready';
 +---------------+-------+
 | Variable_name | Value |
 +---------------+-------+
 | wsrep_ready   | ON    |
 +---------------+-------+
 1 row in set (0.00 sec)
# 这个查看wsrep的相关参数
MariaDB [terry]> show status like 'wsrep%';
+----------------------------+--------------------------------------+
| Variable_name              | Value                                |
+----------------------------+--------------------------------------+
| wsrep_local_state_uuid     | bb5b9e17-66c8-11e3-86ba-96854521d205 | uuid 集群唯一标记
| wsrep_protocol_version     | 4                                    |
| wsrep_last_committed       | 16                                   | sql 提交记录
| wsrep_replicated               | 4                                     | 随着复制发出的次数
| wsrep_replicated_bytes      | 692                                  | 数据复制发出的字节数
| wsrep_received                 | 18                                    | 数据复制接收次数
| wsrep_received_bytes        | 3070                                 | 数据复制接收的字节数
| wsrep_local_commits         | 4                                      | 本地执行的 sql
| wsrep_local_cert_failures    | 0                                      | 本地失败事务
| wsrep_local_bf_aborts        | 0                                      |从执行事务过程被本地中断
| wsrep_local_replays           | 0                                      |
| wsrep_local_send_queue     | 0                                     | 本地发出的队列
| wsrep_local_send_queue_avg | 0.142857                       | 队列平均时间间隔
| wsrep_local_recv_queue     | 0                                      | 本地接收队列
| wsrep_local_recv_queue_avg | 0.000000                        | 本地接收时间间隔
| wsrep_flow_control_paused  | 0.000000                         |
| wsrep_flow_control_sent    | 0                                      |
| wsrep_flow_control_recv    | 0                                    |
| wsrep_cert_deps_distance   | 0.000000                          | 并发数量
| wsrep_apply_oooe           | 0.000000                             |
| wsrep_apply_oool           | 0.000000                             |
| wsrep_apply_window         | 1.000000                             |
| wsrep_commit_oooe          | 0.000000                             |
| wsrep_commit_oool          | 0.000000                             |
| wsrep_commit_window        | 1.000000                             |
| wsrep_local_state          | 4                                    |
| wsrep_local_state_comment  | Synced                               |
| wsrep_cert_index_size      | 0                                    |
| wsrep_causal_reads         | 0                                    |
| wsrep_incoming_addresses   | 192.168.1.137:3306    | 连接中的数据库
| wsrep_cluster_conf_id      | 18                                   |
| wsrep_cluster_size         | 2                                    | 集群成员个数
| wsrep_cluster_state_uuid   | bb5b9e17-66c8-11e3-86ba-96854521d205 | 集群 ID
| wsrep_cluster_status       | Primary                              | 主服务器
| wsrep_connected            | ON                                   | 当前是否连接中
| wsrep_local_index          | 1                                    |
| wsrep_provider_name        | Galera                               |
| wsrep_provider_vendor      | Codership Oy <info@codership.com>    |
| wsrep_provider_version     | 2.7(rXXXX)                           |
| wsrep_ready                | ON                                   | 插件是否应用中
+----------------------------+--------------------------------------+
40 rows in set (0.05 sec)
#以上详细参数注释:

监控状态参数说明:

(1).集群完整性检查:

wsrep_cluster_state_uuid:在集群所有节点的值应该是相同的,有不同值的节点,说明其没有连接入集群.

wsrep_cluster_conf_id:正常情况下所有节点上该值是一样的.如果值不同,说明该节点被临时"分区"了.当节点之间网络连接恢复的时候应该会恢复一样的值.

wsrep_cluster_size:如果这个值跟预期的节点数一致,则所有的集群节点已经连接.

wsrep_cluster_status:集群组成的状态.如果不为"Primary",说明出现"分区"或是"split-brain"状况.

(2).节点状态检查:

wsrep_ready: 该值为ON,则说明可以接受SQL负载.如果为Off,则需要检查wsrep_connected.

wsrep_connected: 如果该值为Off,且wsrep_ready的值也为Off,则说明该节点没有连接到集群.

wsrep_local_state_comment:如果wsrep_connected为On,但wsrep_ready为OFF,则可以从该项查看原因.

(3).复制健康检查:

      wsrep_flow_control_paused:表示复制停止了多长时间.即表明集群因为Slave延迟而慢的程度.值为0~1,越靠近0越好,值为1表示复制完全停止.可优化wsrep_slave_threads的值来改善.

wsrep_cert_deps_distance:有多少事务可以并行应用处理.wsrep_slave_threads设置的值不应该高出该值太多.

wsrep_flow_control_sent:表示该节点已经停止复制了多少次.

wsrep_local_recv_queue_avg:表示slave事务队列的平均长度.slave瓶颈的预兆.

最慢的节点的wsrep_flow_control_sent和wsrep_local_recv_queue_avg这两个值最高.这两个值较低的话,相对更好.

(4).检测慢网络问题:

wsrep_local_send_queue_avg:网络瓶颈的预兆.如果这个值比较高的话,可能存在网络瓶

(5).冲突或死锁的数目:

wsrep_last_committed:最后提交的事务数目

     wsrep_local_cert_failures和wsrep_local_bf_aborts:回滚,检测到的冲突数目
10.测试数据同步,一致等问题,这个测试不演示,概述一下大概思路:
    (1).创建一个数据库,看是否同步
    (2).数据库里分别创建一个innodb和myisam引擎的表,看是否同步
    (3).分别往这两张表里插入数据,看是否同步,除innodb引擎数据可以同步,其余引擎是不同步
    (4).在任意一节点插入,删除数据,看是否同步
11.在上面galera集群搭建完成后,我们可以借助于haproxy和lvs来实现mysql数据库集群之间的负载
这里就不演示,可以自己配置试试!

 

本文出自 “没有伞的孩子必须努力奔跑” 博客,请务必保留此出处http://634871.blog.51cto.com/624871/1350082

 

http://blog.csdn.net/verrion/article/details/40296811

MySQL Galera集群搭建

一 搭建

1、配置的方法:mysql集群的主主同步方式,搭建建的是两个节点的集群,可以在线自增和剔除,一般来说节点配置过程中要求的做法和参数等大致相同,所以在搭建时有两种方法:一是配置好一个节点,然后复制这个节点成为另一个节点,修改某些不同的参数,比如IP地址,主机名,galera配置过程中要求的连接方式等等;二是一个节点一个节点的配置,这样便于在过程中完成测试,比如两节点是否通信,握手等等,如遇到问题可以方便的知道问题的所在。

2、配置的环境:redhat6.4 64位

               galera-25.3.2-1.rhel6.x86_64.rpm

              MySQL-server-5.6.14_wsrep_25.1-1.rhel6.x86_64.rpm

               MySQL-client-5.6.15-1.el6.x86_64.rpm

               MySQL-shared-5.6.15-1.el6.x86_64.rpm

3、检查系统是否自带mysql已安装

[root@jianwei1 ~]# rpm -qa |grep mysql

如有全部卸载[root@jianwei1 ~]# rpm -e --nodeps包名

4、安装集群软件并检查是否安装成功

[root@jianwei1 ~]# rpm -Uhv galera-25.3.2-1.rhel6.x86_64.rpm

[root@jianwei1 ~]# rpm -Uhv MySQL-client-5.6.15-1.el6.x86_64.rpm

[root@jianwei1 ~]# rpm -Uhv mysql/MySQL-shared-5.6.15-1.el6.x86_64.rpm

[root@jianwei1 ~]# rpm -Uhv MySQL-server-5.6.14_wsrep_25.1-1.rhel6.x86_64.rpm

在安装最后一个软件时会出现welcome mysql的字样时就表示成功,如若不放心可以在检查

[root@jianwei1 ~]# rpm -qa |grep MySQL

MySQL-shared-5.6.15-1.el6.x86_64

MySQL-client-5.6.15-1.el6.x86_64

MySQL-server-5.6.14_wsrep_25.1-1.rhel6.x86_64

5、第一次登陆MYSQL,修改mysql root密码

[root@jianwei1 ~]# mysqladmin -u root password 'rootpass'

mysqladmin: connect to server at 'localhost' failed

error: 'Can't connect to local MySQL server through socket '/var/lib/mysql/mysql.sock' (2)'

Check that mysqld is running and that the socket: '/var/lib/mysql/mysql.sock' exists!

1)想到mysql服务是否启动

[root@jianwei ~]# /etc/init.d/mysql status

MySQL is not running                                       [失败]

[root@jianwei ~]# /etc/init.d/mysql restart

MySQL server PID file could not be found!                  [失败]

Starting MySQL.....                                        [确定]

2)在运行修改密码的命令,还是报错

mysqladmin: connect to server at 'localhost' failed

error: 'Access denied for user 'root'@'localhost' (using password: NO)'

是因为没有安装mysql-server软件,它要走认证权限协议,如有问题以及以后安装维护过程出现错误,可以直接查看err日志,找到病根,先找到这个日志放在哪个目录下

[root@jianwei1 ~]# find / -name *.err

/var/lib/mysql/jianwei1.test.com.err

3)那就直接跳过这一步

[root@jianwei ~]# mysqld_safe --skip-grant-tables &

等到光标在原处闪动不前进时输入

mysql -uroot -p

这样会到达mysql命令行界面

mysql> use mysql

Reading table information for completion of table and column names

You can turn off this feature to get a quicker startup with -A

 

Database changed

mysql> update user set password=PASSWORD("rootpass")where user="root";

Query OK, 4 rows affected (0.00 sec)

Rows matched: 4  Changed: 4  Warnings: 0

 

mysql> flush privileges;

Query OK, 0 rows affected (0.00 sec)

 

mysql> quit

Bye

这样就行啦,再次重启mysql服务就可以了。

6、这一步是为了实现wsrep架构而进行的用户(root,SST)创建、删除工作

[root@jianwei1 ~]# mysql -uroot -p

进入mysql主页面,进行操作

1)删除空用户

mysql> delete from mysql.user where user='';

ERROR 1820 (HY000): You must SET PASSWORD before executing this statement

这个错误提醒要设置root密码,因为你第一次修改了登陆root账号的密码,但是mysql还没有知道,所以要重新告诉它一下

mysql> set password=password("rootpass");

Query OK, 0 rows affected (0.00 sec)

再次运行删除空用户命令就会成功

2)创建root@% user

mysql> grant usage on *.* to root@'%' identified by 'rootpass';

3)通知所有的节点更新了root密码

mysql> UPDATE mysql.user SET Password=PASSWORD('rootpass') WHERE User='root';

4)创建SST账号是为了节点通信之间的连接,SST账号是galera集群的一个必须的用户

mysql> GRANT USAGE ON *.* to sst@'%' IDENTIFIED BY 'sstpass123';

5)给两个账号权限

mysql> GRANT ALL PRIVILEGES on *.* to sst@'%';

mysql> GRANT ALL PRIVILEGES on *.* to root@'%';

至此完成wsrep架构准备工作。

7、确认galera库文件是否存在

[root@jianwei1 ~]# updatedb

[root@jianwei1 ~]# locate libgalera /usr/lib64/galera/libgalera_smm.so

8、配置wsrep.cnf文件,很重要的一步,这个文件用来完成另一个节点通信于它的凭证

1)首先将文件放置/etc配置目录下,这个是默认路径,创建新的文件夹

[root@jianwei1 ~]# mkdir -p /etc/mysql/conf.d/

2)拷贝wsrep.cnf文件至此目录下

[root@jianwei1 ~]#cp /usr/share/doc/MySQL-server-5.6.14_wsrep_25.1/wsrep /etc/mysql/conf.d/

3)修改wsrep配置文件中一些参数

bind-address=172.26.1.81

wsrep_provider=/usr/lib/galera/libgalera_smm.so

wsrep_cluster_name="controller_cluster" #这个参数可改可不改

wsrep_cluster_address="gcomm://"

wsrep_sst_auth=sst:sstpass123

9、修改防火墙添加3306(mysql)和4567(wsrep)两个端口

[root@jianwei1 ~]# iptables -A INPUT -i eth0 -p tcp -m tcp --source 172.26.1.81 --dport 3306 -j ACCEPT

[root@jianwei1 ~]# iptables -A INPUT -i eth0 -p tcp -m tcp --source 172.26.1.81 --dport 4567 -j ACCEPT

10、修改mysql配置文件使其包含wsrep.cnf文件

可以在安装目录下直接修改,也可以再重新在/etc下创建此文件my.cnf

在文件中添加:!includedir /etc/mysql/conf.d/

11、为了保证修改的配置等生效,重启mysql服务

[root@jianwei1 ~]# /etc/init.d/mysql restart

12、此时可以查看3306和4567端口是否开启

[root@jianwei1 ~]# netstat -tulpn | grep -e 4567 -e 3306

至此,第一个节点已经完成。

 

配置第二个节点,不管你用哪种方法,我们只需要修改某些配置就行

1、修改wsrep配置文件

bind-address=172.26.1.82

wsrep_provider=/usr/lib/galera/libgalera_smm.so

wsrep_cluster_name="controller_cluster" #这个参数可改可不改

wsrep_cluster_address="gcomm://172.26.1.81"

wsrep_sst_auth=sst:sstpass123

2、修改3306和4567端口

[root@jianwei ~]# iptables -A INPUT -i eth0 -p tcp -m tcp --source 172.26.1.82 --dport 3306 -j ACCEPT

[root@jianwei ~]# iptables -A INPUT -i eth0 -p tcp -m tcp --source 172.26.1.82 --dport 4567 -j ACCEPT

3、重启mysql服务

这时服务启动不了,我感到很奇怪,配置过程都是一样的,于是查看err日志文件,看看报什么错误,

1)是时间戳超时,连接不上;

2)InnoDB: The log sequence numbers 1626705 and 1626705 in ibdata files do not match the log sequence number 1626869 in the ib_logfiles!就是说与另一个节点匹配不上,sst账号没有作用

解决思想:

第一步:想到的是端口是否成功开始,查看是显示3306端口启动了,而4567端口不能连接,并且状态是连接超时;

第二步:竟然这样我就怀疑自己是否哪一步没有配置好,将wsrep配置文件中的

wsrep_cluster_address="gcomm://172.26.1.81"

修改为

wsrep_cluster_address="gcomm://"

重启mysql服务查看一切正常,这样我就确认不是我的配置错误

第三步:所有配置都正常,想了很久,连接超时,SST用户不能相互握手,我就想到是否跟网络有关,好像也只有这一点了

查看iptables参数,果不其然,防火墙都已经开启,于是关闭防火墙和seLinux

终于可以看到4567端口开通了

[root@jianwei1 ~]# netstat -an| grep :4567

tcp        0      0 0.0.0.0:4567                0.0.0.0:*                   LISTEN     

tcp        0      0 172.26.1.82:51906           172.26.1.81:4567            ESTABLISHED

至此配置过程全部完成。

 

二 测试

第一个节点

1)mysql> show status like "wsrep%";(查看wsrep信息)

+------------------------------+--------------------------------------+

| Variable_name                | Value                                |

+------------------------------+--------------------------------------+

| wsrep_local_state_uuid       | b3c5837c-c5bc-11e3-9551-c7294651e52c |

| wsrep_protocol_version       | 5                                    |

| wsrep_last_committed         | 0                                    |

| wsrep_replicated             | 0                                    |

| wsrep_replicated_bytes       | 0                                    |

| wsrep_repl_keys              | 0                                    |

| wsrep_repl_keys_bytes        | 0                                    |

| wsrep_repl_data_bytes        | 0                                    |

| wsrep_repl_other_bytes       | 0                                    |

| wsrep_received               | 16                                   |

| wsrep_received_bytes         | 1295                                 |

| wsrep_local_commits          | 0                                    |

| wsrep_local_cert_failures    | 0                                    |

| wsrep_local_replays          | 0                                    |

| wsrep_local_send_queue       | 0                                    |

| wsrep_local_send_queue_avg   | 0.500000                             |

| wsrep_local_recv_queue       | 0                                    |

| wsrep_local_recv_queue_avg   | 0.000000                             |

| wsrep_local_cached_downto    | 18446744073709551615                 |

| wsrep_flow_control_paused_ns | 0                                    |

| wsrep_flow_control_paused    | 0.000000                             |

| wsrep_flow_control_sent      | 0                                    |

| wsrep_flow_control_recv      | 0                                    |

| wsrep_cert_deps_distance     | 0.000000                             |

| wsrep_apply_oooe             | 0.000000                             |

| wsrep_apply_oool             | 0.000000                             |

| wsrep_apply_window           | 0.000000                             |

| wsrep_commit_oooe            | 0.000000                             |

| wsrep_commit_oool            | 0.000000                             |

| wsrep_commit_window          | 0.000000                             |

| wsrep_local_state            | 4                                    |

| wsrep_local_state_comment    | Synced                               |

| wsrep_cert_index_size        | 0                                    |

| wsrep_causal_reads           | 0                                    |

| wsrep_incoming_addresses     | 172.26.1.81:3306,172.26.1.82:3306    |

| wsrep_cluster_conf_id        | 6                                    |

| wsrep_cluster_size           | 2                                    |

| wsrep_cluster_state_uuid     | b3c5837c-c5bc-11e3-9551-c7294651e52c |

| wsrep_cluster_status         | Primary                              |

| wsrep_connected              | ON                                   |

| wsrep_local_bf_aborts        | 0                                    |

| wsrep_local_index            | 0                                    |

| wsrep_provider_name          | Galera                               |

| wsrep_provider_vendor        | Codership Oy <info@codership.com>    |

| wsrep_provider_version       | 25.3.2(r170)                         |

| wsrep_ready                  | ON                                   |

+------------------------------+--------------------------------------+

46 rows in set (0.01 sec)

2)mysql> show databases;(看是否有数据库)

+--------------------+

| Database           |

+--------------------+

| information_schema |

| mysql              |

| performance_schema |

| test               |

+--------------------+

4 rows in set (0.00 sec)

3)mysql> use test;

4)mysql> show tables;

Empty set (0.00 sec)

5)mysql> create table test (name varchar(5));

Query OK, 0 rows affected (0.52 sec)

6)在第二个节点查看是否有该表

mysql> use test

Reading table information for completion of table and column names

You can turn off this feature to get a quicker startup with -A

 

Database changed

mysql> show tables;

+----------------+

| Tables_in_test |

+----------------+

| test           |

+----------------+

1 row in set (0.00 sec)

mysql> select * from test;

Empty set (0.00 sec)

7)在第一个节点上

mysql> insert into test values ('jianw');

Query OK, 1 row affected (0.03 sec)

8)第二个节点查看

mysql> select * from test;

+-------+

| name  |

+-------+

| jianw |

+-------+

1 row in set (0.00 sec)

mysql> insert into test values ('cninf');

Query OK, 1 row affected (0.06 sec)

9)第一个节点

mysql> select * from test;

+-------+

| name  |

+-------+

| jianw |

| cninf |

+-------+

2 rows in set (0.00 sec)

此时两个节点都有数据,测试成功。

 

==============================================================

 

http://www.loveweir.com/posts/view/38

mysql-5.7.7-rc 在centos6.6上面源码编译安装记录

首先要准备编译的依赖安装:

 

yum -y install make gcc-c++ cmake bison-devel ncurses-devel

除了这些还有一个重要的Boost库。这个是mysql5.7必须要的,而且还必须是boost_1_57_0.tar.gz这个版本,是不是很变态。

 

下载这个文件随便解压一个位置就行了。

新建mysql用户、组及目录:

 

# groupadd mysql       ---新建一个msyql组

# useradd -r -g mysql mysql      ---新建msyql用户禁止登录shell

# mkdir /usr/local/mysql        ---创建目录

# mkdir /usr/local/mysql/data    ---数据仓库目录

这些命令就不解释了,你自己随意都可以。

 

 

mysql-5.7.7-rc/mysql-test/lib/My/CoreDump.pm
mysql-5.7.7-rc/mysql-test/lib/mtr_io.pl
mysql-5.7.7-rc/mysql-test/lib/mtr_misc.pl
mysql-5.7.7-rc/mysql-test/lib/mtr_gcov.pl
[root@w1 w1]# groupadd mysql
[root@w1 w1]# useradd -r g mysql mysql
Usage: useradd [options] LOGIN

Options:
  -b, --base-dir BASE_DIR       base directory for the home directory of the
                                new account
  -c, --comment COMMENT         GECOS field of the new account
  -d, --home-dir HOME_DIR       home directory of the new account
  -D, --defaults                print or change default useradd configuration
  -e, --expiredate EXPIRE_DATE  expiration date of the new account
  -f, --inactive INACTIVE       password inactivity period of the new account
  -g, --gid GROUP               name or ID of the primary group of the new
                                account
  -G, --groups GROUPS           list of supplementary groups of the new
                                account
  -h, --help                    display this help message and exit
  -k, --skel SKEL_DIR           use this alternative skeleton directory
  -K, --key KEY=VALUE           override /etc/login.defs defaults
  -l, --no-log-init             do not add the user to the lastlog and
                                faillog databases
  -m, --create-home             create the user's home directory
  -M, --no-create-home          do not create the user's home directory
  -N, --no-user-group           do not create a group with the same name as
                                the user
  -o, --non-unique              allow to create users with duplicate
                                (non-unique) UID
  -p, --password PASSWORD       encrypted password of the new account
  -r, --system                  create a system account
  -s, --shell SHELL             login shell of the new account
  -u, --uid UID                 user ID of the new account
  -U, --user-group              create a group with the same name as the user
  -Z, --selinux-user SEUSER     use a specific SEUSER for the SELinux user mapping

[root@w1 w1]# useradd -r -g mysql mysql
[root@w1 w1]# mkdir /root/w1/mysql
[root@w1 w1]# mkdir /root/w1/mysql/data
[root@w1 w1]# 

 

 

编译安装mysql:

解压下载好的源码并进入目录:

执行命令:

 

 cmake -DCMAKE_INSTALL_PREFIX=/usr/local/mysql -DMYSQL_DATADIR=/usr/local/mysql/data/ -DDEFAULT_CHARSET=utf8 -DDEFAULT_COLLATION=utf8_general_ci -DWITH_INNOBASE_STORAGE_ENGINE=1 -DWITH_ARCHIVE_STORAGE_ENGINE=1 -DWITH_BLACKHOLE_STORAGE_ENGINE=1 -DWITH_PERFSCHEMA_STORAGE_ENGINE=1 -DWITH_BOOST=/root/w1/boost_1_57_0


 

不出什么问题就可以 make && make install 了,漫长的等待。。。。。。

 

完了之后就是设置权限和初始化授权:

 

请尝试执行"chown --help"来获取更多信息。
[root@w1 local]# chown -R mysql:mysql mysql/
[root@w1 local]# chown -R 777 mysql/
[root@w1 local]# cd mysql/
[root@w1 mysql]# ll
总用量 164
drwxr-xr-x.  2 777 mysql   4096 5月  25 18:17 bin
-rw-r--r--.  1 777 mysql  17987 3月  30 20:16 COPYING
drwxr-xr-x.  2 777 mysql   4096 5月  25 18:14 docs
drwxr-xr-x.  3 777 mysql   4096 5月  25 18:14 include
-rw-r--r--.  1 777 mysql 104452 3月  30 20:16 INSTALL-BINARY
drwxr-xr-x.  3 777 mysql   4096 5月  25 18:15 lib
drwxr-xr-x.  4 777 mysql   4096 5月  25 18:15 man
drwxr-xr-x. 10 777 mysql   4096 5月  25 18:19 mysql-test
-rw-r--r--.  1 777 mysql   2478 3月  30 20:16 README
drwxr-xr-x. 28 777 mysql   4096 5月  25 18:19 share
drwxr-xr-x.  4 777 mysql   4096 5月  25 18:19 sql-bench
drwxr-xr-x.  2 777 mysql   4096 5月  25 18:19 support-files
[root@w1 mysql]# bin/mysqld --initialize --user=mysql --basedir=/usr/local/mysql --datadir=/usr/local/mysql/data 
2015-05-25T10:29:20.306539Z 0 [Warning] TIMESTAMP with implicit DEFAULT value is deprecated. Please use --explicit_defaults_for_timestamp server option (see documentation for more details).
2015-05-25T10:29:21.123860Z 0 [Warning] InnoDB: New log files created, LSN=45790
2015-05-25T10:29:21.391832Z 0 [Warning] InnoDB: Creating foreign key constraint system tables.
2015-05-25T10:29:21.670313Z 0 [Warning] Failed to setup SSL
2015-05-25T10:29:21.670361Z 0 [Warning] SSL error: SSL context is not usable without certificate and private key
2015-05-25T10:29:21.677484Z 1 [Warning] A temporary password is generated for root@localhost: !n;h89/4S)=i
记住最后这个密码:!n;h89/4S)=i

 

配置自动启动mysql“

 

[root@w1 mysql]# mv /etc/my.cnf my.cnf.bak
[root@w1 mysql]# cd support-files/
[root@w1 support-files]# ll
总用量 28
-rw-r--r--. 1 777 mysql   773 3月  30 20:16 magic
-rw-r--r--. 1 777 mysql  1126 5月  25 17:01 my-default.cnf
-rwxr-xr-x. 1 777 mysql  1061 5月  25 17:01 mysqld_multi.server
-rwxr-xr-x. 1 777 mysql   894 5月  25 17:01 mysql-log-rotate
-rwxr-xr-x. 1 777 mysql 10975 5月  25 17:01 mysql.server
[root@w1 support-files]# cp my-default.cnf /etc/my.cnf
[root@w1 support-files]# cd .
[root@w1 support-files]# cd ..
[root@w1 mysql]# ll
总用量 172
drwxr-xr-x.  2   777 mysql   4096 5月  25 18:17 bin
-rw-r--r--.  1   777 mysql  17987 3月  30 20:16 COPYING
drwxr-x---.  5 mysql mysql   4096 5月  25 18:29 data
drwxr-xr-x.  2   777 mysql   4096 5月  25 18:14 docs
drwxr-xr-x.  3   777 mysql   4096 5月  25 18:14 include
-rw-r--r--.  1   777 mysql 104452 3月  30 20:16 INSTALL-BINARY
drwxr-xr-x.  3   777 mysql   4096 5月  25 18:15 lib
drwxr-xr-x.  4   777 mysql   4096 5月  25 18:15 man
-rw-r--r--.  1 root  root     251 2月  13 2014 my.cnf.bak
drwxr-xr-x. 10   777 mysql   4096 5月  25 18:19 mysql-test
-rw-r--r--.  1   777 mysql   2478 3月  30 20:16 README
drwxr-xr-x. 28   777 mysql   4096 5月  25 18:19 share
drwxr-xr-x.  4   777 mysql   4096 5月  25 18:19 sql-bench
drwxr-xr-x.  2   777 mysql   4096 5月  25 18:19 support-files
[root@w1 mysql]# bin
bin/  bind  
[root@w1 mysql]# bin/mysqld
mysqld         mysqld_multi   mysqld_safe    mysqldump      mysqldumpslow  
[root@w1 mysql]# bin/mysqld
mysqld         mysqld_multi   mysqld_safe    mysqldump      mysqldumpslow  
[root@w1 mysql]# bin/mysqld_safe --user=mysql&
[1] 20568
[root@w1 mysql]# 150525 18:34:40 mysqld_safe Logging to '/usr/local/mysql/data/w1.err'.
150525 18:34:40 mysqld_safe Starting mysqld daemon with databases from /usr/local/mysql/data

[root@w1 mysql]# cp support-files/mysql.server /etc/in
init/    init.d/  inittab  inputrc  
[root@w1 mysql]# cp support-files/mysql.server /etc/init.d/mysql
[root@w1 mysql]# chmod 755 /etc/init.d/mysql 
[root@w1 mysql]# chkconfig --add mysql
[root@w1 mysql]# chkconfig --level 345 mysql on
[root@w1 mysql]# source /etc/profile
[root@w1 mysql]# service mysql start

 

 

# mv /etc/my.cnf my.cnf.bak    ---将默认生成my.cnf改名或删除否则启动服务会报错

# cd /usr/local/mysql/support-files     ---进入MySQL安装目录支持文件目录

# cp my-default.cnf /etc/my.cnf    ---复制模板为新的配置文件,根据需要修改文件中配置选项如不修改配置MySQL则按默认配置参数运行。

# /usr/local/mysql/bin/mysqld_safe --user=mysql &    ---后台启动mysql


 

 

 

# cp /usr/local/mysql/support-files/mysql.server /etc/init.d/mysql   ---复制启动文件

# chmod 755 /etc/init.d/mysql   ---增加执行权限

# chkconfig --add mysql        ---加入自动启动项

# chkconfig --level 345 mysql on   ---设置MySQL在345等级自动启动


 

 

 

# vi /etc/profile    ---编辑/etc/profile文件在最后添加如下两行

PATH=/usr/local/mysql/bin:$PATH

export PATH       

# source /etc/profile   ---使环境变量及时生效


 

 

 

# mysql -u root -h 127.0.0.1 -p     ---连接mysql,输入初始化时生成的随机密码

mysql> alter user 'root'@'localhost' identified by '123456';    ---修改root新密码

mysql>quit;    ---退出也可用exit;

# myslq -u root -p     ---重新登录时输入新的密码回车

mysql>use mysql;     ---访问数据库mysql


 

 

 

# cd /usr/local/mysql/bin    ---切换目录

# mysql_ssl_rsa_setup --user=mysql --basedir=/usr/local/mysql --datadir=/usr/local/mysql/data     ---创建新的SSL文件


 

 

最难的还是编译mysql 会出现很多错误。

 

下面是所有命令操作:

略!!
 
====
 http://blog.csdn.net/yumushui/article/details/45534199

 介绍:MySQL的安装方法有多种,如yum安装,rpm包安装,rpm源码编译安装,源码编译安装,通用预编译包安装。其中yum安装和rpm包安装比较简单,软件安装时会自动

默认设置,但可定制性弱版也较旧。源码包编译安装可定制性强版本也新。下面是通用预编译包安装和源码编译安装的方法,MySQL的版本为最新的5.7.7版。在MySQL5.7.7中有一些新的特性如: 
1、初始化数据库时不再使用“--mysql_install_db”而是使用了“--initialize”或是”--initialize-insecure”,区别在于“--initialize”会生成一个随机密码而”--initialize-insecure”不会生成密码。 
2、不在生成 .mysql_secret 文件; 
3、不再创建匿名用户MySQL账户; 
4、不再创建测试数据库。

    环境:
CentOS 6.5
mysql 5.7.7

    编译源码方式安装MySQL数据库 
    0.准备安装文件
1).下载cmake-3.2.1.tar.gz      ---新版的MySQL用CMAKE编译安装 http://www.cmake.org/download/ 
2).下载ncurses-5.9.tar.gz      ---安装MySQL时需要 ftp://ftp.gnu.org/gnu/ncurses/ 
3).下载bison-3.0.4.tar.gz      ---安装MySQL时需要 http://ftp.gnu.org/gnu/bison/ 
4).下载mysql-5.7.7-rc.tar.gz    ---MySQL的源码编译包不要下载错ftp://ftp.mirrorservice.org/sites/ftp.mysql.com/Downloads/MySQL-5.7/

http://dev.mysql.com/downloads/mirrors.html 
5).下载:http://sourceforge.net/projects/boost/files/boost/
注:上面的cmake等文件,可以单独下载安装,也可以通过yum安装

    1.创建mysql用户及需要的目录
    创建Mysql用户组和用户,及数据库存放目录:
# mkdir -p /usr/local/mysql/
# mkdir -p /data/mysqldata/3306/{data,binlog,tmp}
# groupadd mysql
# useradd mysql -g mysql 
# chown -R mysql:mysql /data/mysqldata
# chown -R mysql:mysql /usr/local/mysql

    2.安装CMAKE及必要的软件 

    使用yum安装需要的软件包:
# yum install –y autoconf automake imake libxml2-devel expat-devel cmake gcc gcc-c++ libaio libaio-devel bzr bison libtool ncurses5-devel ncurses-devle

    从MySQL 5.7.5开始Boost库是必需的,下载Boost库并上传到/usr/local/src下,在解压后复制到/usr/local/boost目录下,然后重新cmake并在后面的选项中加上选项-

DWITH_BOOST=/usr/local/boost(下载:http://sourceforge.net/projects/boost/files/boost/) 
# cd /usr/local/src 
# tar –zxvf boost_1_57_0.tar.gz 
# cp –a /usr/local/src/boost_1_57_0 /usr/local/boost

    注:mysql编译安装需要的各种软件包,有些包可以用yum安装,但有些软件包只能下载并单独安装。

    3.编译安装mysql软件
    将mysql二进制安装包 mysql-5.7.7-rc.tar.gz 上传到/usr/local/src/目录下准备编译安装:
# cd /usr/local/src/ 
# sz mysql-5.7.7-rc.tar.gz 
# tar -zxvf mysql-5.7.7-rc.tar.gz 
# cd mysql-5.7.7-rc

    执行cmake命令:
# cmake . -DCMAKE_INSTALL_PREFIX=/usr/local/mysql \
-DDEFAULT_CHARSET=utf8 \
-DDEFAULT_COLLATION=utf8_general_ci \
-DENABLED_LOCAL_INFILE=ON \
-DWITH_INNOBASE_STORAGE_ENGINE=1 \
-DWITH_ARCHIVE_STORAGE_ENGINE=1 \
-DWITH_FEDERATED_STORAGE_ENGINE=1 \
-DWITH_BLACKHOLE_STORAGE_ENGINE=1 \
-DWITHOUT_EXAMPLE_STORAGE_ENGINE=1 \
-DWITH_PARTITION_STORAGE_ENGINE=1 \
-DWITH_PERFSCHEMA_STORAGE_ENGINE=1 \
-DCOMPILATION_COMMENT='Zhaofx for mysqltest' \
-DWITH_READLINE=ON \
-DSYSCONFDIR=/data/mysqldata/3306 \
-DWITH_BOOST=/usr/local/boost \
-DMYSQL_UNIX_ADDR=/data/mysqldata/3306/mysql.sock

    在cmake完成后,执行下面的命令进行编译与安装:
# make     ---开始编译 
# make install     ----编译安装

    编译安装后,可以确认mysql软件目录:
# chown -R mysql:mysql /usr/local/mysql/
# ls -la /usr/local/mysql/

    注:cmake和编译安装的时间都比较长,在编译过程如果提示错误,可以根据提示完善相关安装条件,然后执行下面的命令后,再重新编译安装:
# make clean 
# rm -f CMakeCache.txt    

    4.创建数据库服务
    在5.5和5.6版本中,mysql数据库是使用mysqld_db_install命令进行初始化的;在5.7之后,数据库初始化发生了改变,需要mysqld命令进行初始化:
# /usr/local/mysql/bin/mysqld --initialize --user=mysql --basedir=/usr/local/mysql --datadir=/data/mysqldata/3306/data  
---以root初始化操作时要加--user=mysql参数,生成一个随机密码(注意保存登录时用) 
    数据库初始化后,再次修改权限:
# chown -R mysql:mysql /data/mysqldata/

    注意:mysql 5.7之后,默认只会创建一个 root@localhost用户,也没有test表空间,root用户的初始密码随机生成,在命令行或者error.log中可以看到。

    5.准备配置文件并启动mysql服务
    修改默认my.cnf,并根据需要和实际情况修改my.cnf文件:
# mv /etc/my.cnf /etc/my.cnf.bak
# vim /data/mysqldata/3306/my.cnf
    根据实际情况设置my.cnf

    启动mysql服务:
# /usr/local/mysql/bin/mysqld_safe --user --defaults-file/data/mysqldata/3306/my.cnf &    ---后台启动mysql 
# tail -f /data/mysqldata/3306/error.log
# ps -ef|grep mysql

    使用初始密码进行登录:
# mysql -uroot -p -S /data/mysqldata/3306/mysql.sock
使用初始化时自动生成的root密码进行登录,然后修改成为一个自己习惯的密码;

    注:初始化的root密码,可能是expired过期状态,可以先以非验证模式登录数据库,修改其状态,然后再进行其他操作;
另外由于mysql 5.7的密码验证策略发生了该表,所有修改用户密码时,也有所不同。

    6.配置mysql管理方式
    确定已经将mysql软件的bin目录加入到环境变量文件 /etc/profile.d/path.sh 中了:
# vim /etc/profile.d/path.sh

    对于mysql数据库的启动和停止方式,有两种方法:
    方法一:可以加入到 /etc/init.d/目录中,以service mysqld start/stop的方式启动停止,并可以使用chkconfig命令加入开机自动启动中;
    方法二:自己编写脚本实现mysql数据库的各种管理:
# mkdir -p /data/mysqldata/scripts/
# vim  mysql_env.ini    --配置脚本环境变量
# vim  mysqlplus.sh    --配置mysql登陆脚本
# vim  mysql_db_startup.sh   --配置mysql启动脚本
# vim  mysql_db_shutdown.sh   --配置mysql停止脚本

 

*******************************************

实际执行过程如下:

略!!!

http://blog.chinaunix.net/uid-20764167-id-4276805.html

 MySQL 5.7 源码安装 2014-05-28 14:11:00

分类: Mysql/postgreSQL

 

1. Download mysql
wget http://dev.mysql.com/get/Downloads/MySQL-5.7/mysql-5.7.4-m14.tar.gz

2. 解压 tar zxvf mysql-5.7.4-m14.tar.gz
3. (最新的mysql 需要版本较高的cmake)
  下载官方最新的cmake 2.8 编译安装 http://www.cmake.org/

4. 按照文档的要求做如下的操作:
# Preconfiguration setup
创建mysql专属的用户名和组名 而不是直接用root
shell> groupadd mysql
shell> useradd -r -g mysql mysql

# Beginning of source-build specific instructions
shell> tar zxvf mysql-VERSION.tar.gz
shell> cd mysql-VERSION
shell> cmake . (构建当前系统的Makefile文件)
shell> make
shell> make install (安装后默认在 /usr/local/mysql 下,与yum install的/usr/相区别) 

# End of source-build specific instructions
# Postinstallation setup
shell> cd /usr/local/mysql
shell> chown -R mysql .
shell> chgrp -R mysql .

shell> scripts/mysql_install_db --user=mysql  (按照mysql启动必须的user表和权限表等)

shell> chown -R root .
shell> chown -R mysql data
(在启动之前需要修改配置文件 /etc/my.cnf 以前如果有的,需要备份。这个需要设置basedir/datadir等路径)
shell> bin/mysqld_safe --user=mysql &
如果启动有错误,查看日志文件 .err 等

此时如果运行mysql 客户端连接,基本会连接不上,因为默认是用的 /usr/bin/mysql  
ERROR 2002 (HY000): Can't connect to local MySQL server through socket '/var/lib/mysql/mysql.sock' (2)

而我们的服务器其实是在 /tmp/mysql.sock 。 所以要么加入环境变量 PATH(非root用户这样使用),root用户
使用 /usr/local/mysql/bin/mysql -uroot -p 来建立连接。

新版的服务器会建立一个第一次使用的临时密码 在 ~/.mysql_secret 文件,tail一下就可以看到
 通过客户端连接成功后, 必须立即执行 SET PASSWORD=PASSWORD('new password') ; 来改变root的密码,不然其他的操作都被禁止。
我执行 
SET PASSWORD FOR root = PASSWORD('some password') ; 执行失败,估计是后续为其它用户可以这么设置

然后就是为mysql用户grant适当的权限,最偷懒的就是:
grant all privileges on *.* to 'mysql'@'localhost' identified by 'mysql';  (grant 本地连接的权限)
grant all privileges on *.* to 'mysql'@'%' identified by 'mysql'; (grant网络连接的权限)
http://dev.mysql.com/doc/refman/5.7/en/set-password.html

# Next command is optional
如果需要覆盖系统默认的mysql 低版本的服务,可以讲如下脚本拷入系统启动目录。
shell> cp support-files/mysql.server /etc/init.d/mysql.server

mysql 5.7 官方文档链接:
http://dev.mysql.com/doc/refman/5.7/en/index.html
 
 
========

 

http://www.hustdba.com/?p=141

源码安装Percona XtraDB Cluster && Galera

 


 

Percona XtraDB Cluster需要配合Galera进行使用,PXC由percona提供,Galera由codership提供。当然MariaDB也有相应的Cluster,是MariaDB + Galera。Codership本身也有基于MySQL的版本,MySQL + Galera。

源码下载

bzr branch bzr+ssh://bazaar.launchpad.net/+branch/percona-xtradb-cluster/5.6/
bzr branch bzr+ssh://bazaar.launchpad.net/+branch/galera/

编译PXC

PXC的编译方法和MySQL类似,下面是我的编译命令,编译城DEBUG模式的,方便调试。

cmake -DWITH_DEBUG=1 -DCMAKE_INSTALL_PREFIX=./mysql  -DMYSQL_DATADIR=./mysql/data \
    -DWITH_SSL=yes -DENABLED_LOCAL_INFILE=1 -DWITH_READLINE=1 \
    -DMY_MAINTAINER_CXX_WARNINGS="-Wall -Wextra -Wunused -Wwrite-strings -Wno-strict-aliasing  -Wno-unused-parameter -Woverloaded-virtual" \
    -DMY_MAINTAINER_C_WARNINGS="-Wall -Wextra -Wunused -Wwrite-strings -Wno-strict-aliasing -Wdeclaration-after-statement" \
    ..

编译Galera

也编译城Debug

./scripts/build.sh -d

会在目录下看到libgalera_smm.so

创建my.cnf

重点是要设置好wsrep相关参数

[mysqld]
 
gdb
 
basedir=/home/louis/src/percona-xtradb-cluster/percona-xtradb-cluster-5.6/debug/mysql
 
datadir=/home/louis/src/percona-xtradb-cluster/percona-xtradb-cluster-5.6/debug/mysql/data
 
socket=/home/louis/src/percona-xtradb-cluster/percona-xtradb-cluster-5.6/debug/mysql/data/my.sock
 
 
 
# WSREP #
 
wsrep_provider=/home/louis/src/percona-xtradb-cluster/galera/libgalera_smm.so
 
wsrep_cluster_address=gcomm://
 
wsrep_cluster_name=pxc_cluster_test
 
wsrep_slave_threads=8
 
wsrep_sst_method=rsync
 
wsrep_node_address=127.0.0.1
 
innodb_autoinc_lock_mode=2
 
binlog_format=ROW
 
innodb_locks_unsafe_for_binlog=1

创建数据库

使用mysql_install_db进行创建,注意需要使用刚刚写的my.cnf

./mysql_install_db --defaults-file=./my.cnf --datadir=../data --basedir=../

启动

像启动MySQL一样,启动PXC,可以看到如下信息:

2014-07-24 16:29:46 10936 [Note] WSREP: inited wsrep sidno 1
2014-07-24 16:29:46 10936 [Note] WSREP: wsrep_notify_cmd is not defined, skipping notification.
2014-07-24 16:29:46 10936 [Note] WSREP: REPL Protocols: 5 (3, 1)
2014-07-24 16:29:46 10936 [Note] WSREP: Service thread queue flushed.
2014-07-24 16:29:46 10936 [Note] WSREP: Assign initial position for certification: 0, protocol version: 3
2014-07-24 16:29:46 10936 [Note] WSREP: Service thread queue flushed.

最后我们登录上去看下状态:

mysql> show status like '%wsrep%';
+------------------------------+--------------------------------------+
| Variable_name                | Value                                |
+------------------------------+--------------------------------------+
| wsrep_local_state_uuid       | 592dcf11-13cb-11e4-8d4c-7f58a2b94329 |
| wsrep_protocol_version       | 5                                    |
| wsrep_last_committed         | 0                                    |
| wsrep_replicated             | 0                                    |
| wsrep_replicated_bytes       | 0                                    |
| wsrep_repl_keys              | 0                                    |
| wsrep_repl_keys_bytes        | 0                                    |
| wsrep_repl_data_bytes        | 0                                    |
| wsrep_repl_other_bytes       | 0                                    |
| wsrep_received               | 2                                    |
| wsrep_received_bytes         | 145                                  |
| wsrep_local_commits          | 0                                    |
| wsrep_local_cert_failures    | 0                                    |
| wsrep_local_replays          | 0                                    |
| wsrep_local_send_queue       | 0                                    |
| wsrep_local_send_queue_avg   | 0.500000                             |
| wsrep_local_recv_queue       | 0                                    |
| wsrep_local_recv_queue_avg   | 0.000000                             |
| wsrep_local_cached_downto    | 18446744073709551615                 |
| wsrep_flow_control_paused_ns | 0                                    |
| wsrep_flow_control_paused    | 0.000000                             |
| wsrep_flow_control_sent      | 0                                    |
| wsrep_flow_control_recv      | 0                                    |
| wsrep_cert_deps_distance     | 0.000000                             |
| wsrep_apply_oooe             | 0.000000                             |
| wsrep_apply_oool             | 0.000000                             |
| wsrep_apply_window           | 0.000000                             |
| wsrep_commit_oooe            | 0.000000                             |
| wsrep_commit_oool            | 0.000000                             |
| wsrep_commit_window          | 0.000000                             |
| wsrep_local_state            | 4                                    |
| wsrep_local_state_comment    | Synced                               |
| wsrep_cert_index_size        | 0                                    |
| wsrep_causal_reads           | 0                                    |
| wsrep_cert_interval          | 0.000000                             |
| wsrep_incoming_addresses     | 127.0.0.1:3306                       |
| wsrep_cluster_conf_id        | 1                                    |
| wsrep_cluster_size           | 1                                    |
| wsrep_cluster_state_uuid     | 592dcf11-13cb-11e4-8d4c-7f58a2b94329 |
| wsrep_cluster_status         | Primary                              |
| wsrep_connected              | ON                                   |
| wsrep_local_bf_aborts        | 0                                    |
| wsrep_local_index            | 0                                    |
| wsrep_provider_name          | Galera                               |
| wsrep_provider_vendor        | Codership Oy <info@codership.com>    |
| wsrep_provider_version       | 3.6dev(r184)                         |
| wsrep_ready                  | ON                                   |
+------------------------------+--------------------------------------+
47 rows in set (0.01 sec)

至此,我们创建了一个节点的PXC,当然后面你可以类似创建同样的节点,然后加入第一个节点,就形成集群了。

 

 

 

 http://www.zzinu.com/perconaxtradbclusterinstall/

Percona-XtraDB-Cluster安装

与内置的MySQL存储引擎相比,XtraDB提供了一些极大的改进,但它不是一款独立产品,也无法轻松放入现有MySQL安装。因此,如果您想使用这款新引擎,则必须使用提供它的产品。

Percona Server就是这样一款产品,由领先的MySQL咨询公司Percona发布。Percona Server是一款独立的数据库产品,为用户提供了换出其MySQL安装并换入Percona Server产品的能力。通过这样做,就可以利用XtraDB存储引擎。Percona Server声称可以完全与MySQL兼容,因此从理论上讲,您无需更改软件中的任何代码。这确实是一个很大的优势,适合在您寻找快速性能改进时控制质量。因此,采用Percona Server的一个很好的理由是,利用XtraDB引擎来尽可能地减少代码更改。

安装明细:

ip1:
10.210.6.111
ip2:
10.210.108.72
ip3:
10.210.84.31

安装依赖包
yum -y install gcc gcc-c++ ncurses ncurses-devel

yum install Percona-XtraDB-Cluster-galera-3-3.9-1.3494.rhel6.x86_64

–yum -y install perl-Time-HiRes
–yum install http://www.percona.com/downloads/percona-release/redhat/0.1-3/percona-release-0.1-3.noarch.rpm
以上2步需要用到的sst模式为为xtrabackup模式安装,我这里安装这个模式的时候有问题,一直没有解决。

下载相应源码包
wget http://www.cmake.org/files/v2.8/cmake-2.8.11.2.tar.gz
wget wget http://www.percona.com/downloads/Percona-XtraDB-Cluster-56/release-5.6.15-25.5/source/Percona-XtraDB-Cluster-5.6.15.tar.gz

cmake安装
tar xzf cmake-2.8.11.2.tar.gz
cd cmake-2.8.11.2
./configure
make && make install
cd ..
Percona 5.5预编译
tar xvf Percona-XtraDB-Cluster-5.6.15.tar.gz
cd Percona-XtraDB-Cluster-5.6.15
useradd -M -s /sbin/nologin mysql
mkdir -p /data/percona
chown mysql.mysql -R /data/percona
yum install bison.x86_64 bison-devel.x86_64
cmake . -DCMAKE_INSTALL_PREFIX=/usr/local/percona \
-DMYSQL_UNIX_ADDR=/tmp/mysql.sock \
-DMYSQL_DATADIR=/data/percona \
-DSYSCONFDIR=/etc \
-DMYSQL_TCP_PORT=3306 \
-DWITH_INNOBASE_STORAGE_ENGINE=1 \
-DWITH_PARTITION_STORAGE_ENGINE=1 \
-DWITH_BLACKHOLE_STORAGE_ENGINE=1 \
-DWITH_MYISAM_STORAGE_ENGINE=1 \
-DWITH_READLINE=1 \
-DENABLED_LOCAL_INFILE=1 \
-DDEFAULT_CHARSET=utf8 \
-DDEFAULT_COLLATION=utf8_general_ci \
-DWITH_EXTRA_CHARSETS=all

编译安装
make && make install

启动脚本,设置开机自启动
cp support-files/mysql.server /etc/init.d/mysqld
chmod +x /etc/init.d/mysqld
chkconfig –add mysqld
chkconfig mysqld on
初始化数据库,设置环境变量
/usr/local/percona/scripts/mysql_install_db –user=mysql –basedir=/usr/local/percona –datadir=/data/percona

chown mysql.mysql -R /data/percona
export PATH=$PATH:/usr/local/percona/bin
echo “export PATH=\$PATH:/usr/local/percona/bin” >> /etc/profile
. /etc/profile

节点1配置:
##Configuration file /etc/my.cnf for the first node should look like:
[mysqld]
datadir=/data/percona
user=mysql

# Path to Galera library
wsrep_provider=/usr/lib64/libgalera_smm.so

# Cluster connection URL contains the IPs of node#1, node#2 and node#3
wsrep_cluster_address=gcomm://10.210.6.111,10.210.108.72,10.210.84.31

# In order for Galera to work correctly binlog format should be ROW
binlog_format=ROW

# MyISAM storage engine has only experimental support
default_storage_engine=InnoDB

# This changes how InnoDB autoincrement locks are managed and is a requirement for Galera
innodb_autoinc_lock_mode=2

# Node #1 address
wsrep_node_address=10.210.6.111

# SST method
wsrep_sst_method=rsync
# Cluster name
wsrep_cluster_name=my_centos_cluster

# Authentication for SST method
wsrep_sst_auth=”sstuser:s3cret”
初始化:
cd /usr/local/percona/scripts
./mysql_install_db –basedir=/usr/local/percona –datadir=/data/percona –user=mysql
mkdir -p /var/run/mysqld
chmod -R 766 /var/run/mysqld

启动mysql:
./bin/mysqld_safe –defaults-file=/etc/my.cnf –wsrep-cluster-address=”gcomm://” &
创建SST用户和进行相应的授权:
mysql -u root

DELETE FROM mysql.user WHERE user=”;
GRANT RELOAD, LOCK TABLES, REPLICATION CLIENT ON *.* TO ‘sstuser’@’localhost’ IDENTIFIED BY ‘s3cret';
FLUSH PRIVILEGES;
节点2配置:
#Configuration file /etc/my.cnf on the second node (percona2) should look like this:
[mysqld]

datadir=/data/percona
user=mysql

# Path to Galera library
wsrep_provider=/usr/lib64/libgalera_smm.so

# Cluster connection URL contains IPs of node#1, node#2 and node#3
wsrep_cluster_address=gcomm://10.210.6.111,10.210.108.72,10.210.84.31

# In order for Galera to work correctly binlog format should be ROW
binlog_format=ROW

# MyISAM storage engine has only experimental support
default_storage_engine=InnoDB

# This changes how InnoDB autoincrement locks are managed and is a requirement for Galera
innodb_autoinc_lock_mode=2

# Node #2 address
wsrep_node_address=10.210.108.72

# Cluster name
wsrep_cluster_name=my_centos_cluster

# SST method
wsrep_sst_method=rsync

#Authentication for SST method
wsrep_sst_auth=”sstuser:s3cret”
初始化:
cd /usr/local/percona/scripts
./mysql_install_db –basedir=/usr/local/percona –datadir=/data/percona –user=mysql
mkdir -p /var/run/mysqld
chmod -R 766 /var/run/mysqld
启动mysql:
./bin/mysqld_safe –defaults-file=/etc/my.cnf &

节点3配置:
[mysqld]
datadir=/data/percona
user=mysql

# Path to Galera library
wsrep_provider=/usr/lib64/libgalera_smm.so

# Cluster connection URL contains IPs of node#1, node#2 and node#3
wsrep_cluster_address=gcomm://10.210.6.111,10.210.108.72,10.210.84.31

# In order for Galera to work correctly binlog format should be ROW
binlog_format=ROW

# MyISAM storage engine has only experimental support
default_storage_engine=InnoDB

# This changes how InnoDB autoincrement locks are managed and is a requirement for Galera
innodb_autoinc_lock_mode=2

# Node #2 address
wsrep_node_address=10.210.84.31

# Cluster name
wsrep_cluster_name=my_centos_cluster

# SST method
wsrep_sst_method=rsync

#Authentication for SST method
wsrep_sst_auth=”sstuser:s3cret”
初始化:
cd /usr/local/percona/scripts
./mysql_install_db –basedir=/usr/local/percona –datadir=/data/percona –user=mysql
mkdir -p /var/run/mysqld
chmod -R 766 /var/run/mysqld
启动mysql
./bin/mysqld_safe –defaults-file=/etc/my.cnf &

CREATE USER ‘sstuser’@’localhost’ IDENTIFIED BY ‘s3cret';
GRANT RELOAD, LOCK TABLES, REPLICATION CLIENT ON *.* TO ‘sstuser’@’localhost';
FLUSH PRIVILEGES;

–查看集群状态
show status like ‘wsrep%';

同步数据命令:
./bin/mysqld –tc-heuristic-recover commit

 

 ================================================================================

http://xwebos.blog.51cto.com/3398850/629729

Percona Server是一个MySQL的衍生版本,在性能、稳定性和可管理性上都进行了改进。网上介绍很多,相关有点摘抄如下

  1. Percona 为MySQL数据库服务器进行了改进,在功能和性能上较MySQL有着很显著的提升。

  2. 该版本提升了在高负载情况下的InnoDB的性能、为DBA提供一些非常有用的性能诊断工具;

  3. 另外有更多的参数和命令来控制服务器行为。

 

  1. XtraDB存储引擎是percona公司对于innodb存储引擎进行改进加强后的产品,第一个版本为

    1.0.2-1,发布于2008年底。XtraDB兼容innodb的所有特性,并且在IO性能,锁性能
    内存管理等多个方面进行了增强。

先来安装一个玩玩

准备工作,升级一下cmake,安装必要的依赖包,在ubuntu下安装非常简单,通过一下几条命令即可完成

  1. yum install cmake make -y

  2. apt-get install libncurses-dev  -y

  3. apt-get install bison -y

接着下载Percona Server源码

  1. axel -n 5 http://www.percona.com/downloads/Percona-Ser
    ver-5.5/Percona-Server-5.5.13-20.4/
    source/Percona-Server-5.5.13-rel20.4.tar.gz

  2. tar -xf Percona-Server-5.5.13-rel20.4.tar.gz

编译和安装

  1. INSTALL_PATH=/media/extern/work/mysql  

  2. mkdir -p $INSTALL_PATH/conf  

  3. mkdir -p $INSTALL_PATH/data  

  4. #创建mysql组和用户  

  5. groupadd mysql 2>/dev/null

  6. useradd -r -g mysql mysql 2>/dev/null

  7. cmake . -DCMAKE_BUILD_TYPE:STRING=Release -DSYSCONFDIR:PATH=$HOME/mysql -DCMAKE_INSTALL_PREFIX:PATH=$HOME/mysql -DENABLED_PROFILING:BOOL=ON -DENABLE_DEBUG_SYNC:BOOL=OFF -DMYSQL_DATADIR:PATH=$HOME/data -DMYSQL_MAINTAINER_MODE:BOOL=OFF -DWITH_EXTRA_CHARSETS:STRING=utf8,gbk,gb2312 -DWITH_BIG_TABLES:BOOL=ON -DWITH_FAST_MUTEXES:BOOL=ON -DENABLE-PROFILING:BOOL=ON -DWITH_SSL:STRING=bundled -DWITH_UNIT_TESTS:BOOL=OFF -DWITH_ZLIB:STRING=bundled -DWITH_PARTITION_STORAGE_ENGINE:BOOL=ON -DWITH_SERVER_SUFFIX=xxx -DWITH_PLUGINS=heap,csv,partition,innodb_plugin,myisam -DEFAULT_COLLATION=utf8_general_ci -DEFAULT_CHARSET=utf8 -DENABLED_ASSEMBLER:BOOL=ON -DENABLED_LOCAL_INFILE:BOOL=ON -DENABLED_THREAD_SAFE_CLIENT:BOOL=ON -DENABLED_EMBEDDED_SERVER:BOOL=OFF -DWITH_CLIENT_LDFLAGS:STRING=all-static -DINSTALL_LAYOUT:STRING=STANDALONE -DCOMMUNITY_BUILD:BOOL=ON

 

启动前的准备

  1. cd /media/extern/work/mysql/sbin  

  2. sh scripts/mysql_install_db --user=mysql

启动mysql服务器

  1. ./bin/mysqld_safe &

 

本文出自 “厚土常丰” 博客,请务必保留此出处http://xwebos.blog.51cto.com/3398850/629729

 

 ==============================================================================

http://kaifly.blog.51cto.com/3209616/1574640

Percona XtraDB Cluster 初探
2014-11-09 18:40:31

    Percona XtraDB Cluster(下文简称PXC集群)提供了MySQL高可用的一种实现方法。PXC集群以节点组成(推荐至少3节点,后面会讨论两节点的情况),每个节点都是基于常规的 MySQL/Percona Server,意味着你可以从集群中分离出某节点单独使用。集群中每个节点都包含完整的数据。

    PXC集群主要由两部分组成:Percona Server with XtraDB和Write Set Replication patches(使用了Galera library,一个通用的用于事务型应用的同步、多主复制插件)。

PXC的特性和优点:

    1、同步复制

    2、支持多主复制
    3、支持并行复制
    4、作为高可用方案,相比其他方案其结构和实施相对简单明了
PXC的局限和劣势:
    1、 当前版本(5.6.20)的复制只支持InnoDB引擎,其他存储引擎的更改不复制。然而,DDL(Data Definition Language) 语句在statement级别被复制,并且,对mysql.*表的更改会基于此被复制。例如CREATE USER...语句会被复制,但是 INSERT INTO mysql.user...语句则不会。(也可以通过wsrep_replicate_myisam参数开启myisam引擎的 复制,但这是一个实验性的参数)。
    2、 由于PXC集群内部一致性控制的机制,事务有可能被终止,原因如下:集群允许在两个节点上通知执行操作同一行的两个事务,但是只有一个能执行成功,另一个 会被终止,同时集群会给被终止的客户端返回死锁错误(Error: 1213 SQLSTATE: 40001 (ER_LOCK_DEADLOCK)).
    3、写入效率取决于节点中最弱的一台,因为PXC集群采用的是强一致性原则,一个更改操作在所有节点都成功才算执行成功。

下面从安装部署和功能和性能测试三个方面开始PXC之旅。

安装部署
实验环境:三台server(硬件配置相同),信息如下:
node #1
    hostname: percona1
    IP: 192.168.1.35
node #2
    hostname: percona2
    IP: 192.168.1.36
node #3
    hostname: percona3
    IP: 192.168.1.37

注意:

Firewall has been set up to allow connecting to ports 3306, 4444,4567 and 4568

SELinux isdisabled如果不关闭SELinux,启动其他(node1之外)节点时,错误日志里会记录“[ERROR] WSREP:Permission denied”

 

一.在三台server安装Percona-XtraDB-Cluster-56

   1.安装epel源 yum install http://dl.fedoraproject.org/pub/epel/6/i386/epel-release-6-8.noarch.rpm

(包含比较全比较新的软件源。最关键的是包含PreconaXtraDB Cluster所依赖的socat软件)

vi  /etc/yum.repos.d/epel.repo  (修改epel原配置以可用epel源)

wKioL1RfQ0DDQXrqAABaqQF-20c197.jpg

将其中baseurl行的注释去掉,同时将mirror行注释
   2、安装Precona XtraDB Cluster所需要的扩展包,以防在后期配置时候报错
shell> yuminstall -y cmake gcc gcc-c++ libaio libaio-devel automake autoconf bzr bisonlibtool ncurses5-devel boost
   3.安装配置Precona 官方yum源
yum install http://www.percona.com/downloads/percona-release/percona-release-0.0-1.x86_64.rpm

   4.安装socat

socat is a relay for bidirectional data transfer between two independentdata channels.     (Socat是一个在两个独立数据的双向传输之间起到中继作用的软件)

配置好epel源之后,可直接执行 yum install socat*
若无法yum安装socat,则按照以下步骤编译安装
   wget  http://www.dest-unreach.org/socat/download/socat-1.7.2.4.tar.gz
   tar zxvf  socat-1.7.2.4.tar.gz
   ./configure
   Make && make install
   5.安装perl组件(xtrabackup需要的组件)
   yum install perl-DBD-MySQL  perl-DBI  perl-Time-HiRes
   6.安装Percona-XtraDB-Cluster及其相关组件

   yum install Percona-XtraDB-Cluster-56  (如下图)

wKiom1RfQ8LyxtcyAACH4835SDM508.jpg

二.初始化Percona-XtraDB-Cluster集群
在任意节点(一般为node1)上执行集群的初始化操作
创建/etc/my.cnf,内容如下
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
[mysqld]
datadir=/var/lib/mysql
user=mysql
# Path to Galeralibrary
wsrep_provider=/usr/lib64/libgalera_smm.so
# Cluster connectionURL contains the IPs of node#1, node#2 and node#3----所有节点的ip
#第一次启动node1节点时,此处不写各节点IP,需写成下面一行配置
wsrep_cluster_address=gcomm://
#第一次启动node1(初始化集群)完成后,此处需要改成下面一行配置
#wsrep_cluster_address=gcomm://192.168.1.35,192.168.1.36,192.168.1.37
# In order for Galerato work correctly binlog format should be ROW
binlog_format=ROW
# MyISAM storageengine has only experimental support
default_storage_engine=InnoDB
# This changes howInnoDB autoincrement locks are managed and is a requirement for Galera
innodb_autoinc_lock_mode=2
# Node #1 address----本机ip
wsrep_node_address=192.168.1.35
# SST method----节点间同步的方式
wsrep_sst_method=xtrabackup-v2
# Cluster name
wsrep_cluster_name=my_centos_cluster
# Authentication forSST method----来做节点间数据同步的账号密码
wsrep_sst_auth="sstuser:s3cret"

(其他mysql相关参数绝大多数也可以直接在配置文件里添加)

注意:第一次启动node1(初始化集群)时,配置文件里wsrep_cluster_address=gcomm://  不需加上各节点IP,否则其他节点会无法启动;当初始化完成后,需将此处修改为加上各节点IP

在node1执行/etc/init.d/mysql  bootstrap-pxc 来初始化集群,如图

wKioL1RfRBajfcPlAABtlOxAWnk016.jpg

然后再修改配置文件my.cnf将wsrep_cluster_address=gcomm:// 行改为 wsrep_cluster_address=gcomm://192.168.1.35,192.168.1.36,192.168.1.37
然后,执行service mysqlrestart  至此,集群初始化完成,并且node1启动

设置mysql root密码

mysql@percona1>UPDATE mysql.user SET password=PASSWORD("Passw0rd") whereuser=’root’;
mysql@percona1>FLUSH PRIVILEGES;
设置用于复制的账户密码
mysql@percona1>GRANT RELOAD, LOCK TABLES, REPLICATION CLIENT ON *.* TO ’sstuser’@’localhost’identified by ‘s3cret’;
三.配置node2、node3并启动
    将node1的/etc/my.cnf内容拷贝至node2和node3,并修改其中wsrep_node_address=192.168.1.35
改为本机ip。
    然后启动node2、node3 。执行servicemysql start
注意:node2、node3会从node1同步账号设置的更改
    配置成功以后如果集群内所有节点实例均关闭(crash)后,再启动时都需要选择一个存有最新正  确数据的节点作为主节点,执 行 /etc/init.d/mysql bootstrap-pxc 启动; 然后再启动他节点。

写入效率初测

测试方法为
1.将三个节点分别作为单独的server导入一个sql文件,执行三次取时间平均值
  time mysql -uroot -pxxx system < /system.sql
  平均时间约为6m20s
2.开启完整集群,在三个节点分别执行一遍导入操作,取三次执行时间平均值
  平均时间约为7m50s

经过初步测试写性能PXC集群相比单server下降约12%。

参考官方文档一些可以调优的参数:

 

 

1. Variable  wsrep_slave_threads :复制线程的数量,galera支持真正的并行复制,适当增大此值可以在复制时获得更好的吞吐量,如果更改此值后遇到复制的某些问题,尝试将此值改回1,查看是否解决。(默认1)

2. wsrep_provider_options="gcache.size=512M",调节galera的缓存大小,或许对减少IO有帮助

3. variable gcache.mem_size

4. variable gcache.size  此参数定义作为‘IST增量同步’的内容源的galera.cache文件的大小。此文件设置的大些以便节点重新加入集群式更有可能采用IST而非SST。(默认128M)

5. variable gcs.fc_master_slave  此变量指定集群中是否只有一个master节点

6. variable pc.weight   This variable specifies thenode weight that’sgoing to be used for Weighted Quorumcalculations. Default Value 1

7. innodb_flush_log_at_trx_commit

   为0时:log buffer 每秒向logfile 刷新一次,同时log file 每秒执行一次所记录语句,以使数据持久化。

   为1时:默认值。每次事务提交后,log buffer向log file 刷新一次,同时log file 执行一次数据持久化操作。

   为2时:每次事务提交后,log buffer向log file 刷新一次,但是从log file 向磁盘做数据持久化的操作是每秒执行一次

   将此值改为0后,插入全量测试数据的时间有了质的飞越

Hapeoxy代理

上文主要介绍了PXC集群本身的内容,PXC作为一个集群,需要前端配以代理服务器,做负载均衡,才能真正实现其高可用的价值。Percona官方推荐用haproxy作为前端代理,下面介绍一下haproxy的简要配置:

    个人感觉haproxy配置上比lvs相对简单,但功能并不逊色,我试验环境的haproxy配置文件如下

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
#---------------------------------------------------------------------
# Example configuration for a possibleweb application.  See the
# full configuration options online.
#  http://haproxy.1wt.eu/download/1.4/doc/configuration.txt
#---------------------------------------------------------------------
# Global settings
#---------------------------------------------------------------------
global
   # to have these messages end up in /var/log/haproxy.log you will
   # need to:
   # 1) configure syslog to accept network log events.  This is done
   #    by adding the '-r' option tothe SYSLOGD_OPTIONS in
   #    /etc/sysconfig/syslog
   # 2) configure local2 events to go to the /var/log/haproxy.log
   #   file. A line like thefollowing can be added to
   #   /etc/sysconfig/syslog
   #
   #    local2.*                       /var/log/haproxy.log
   #
   log         127.0.0.1      local0
   log         127.0.0.1      local1 notice
   chroot      /var/lib/haproxy
   pidfile     /var/run/haproxy.pid
   maxconn     4000
   user        haproxy
   group       haproxy
   daemon
   # turn on stats unix socket
   stats socket /var/lib/haproxy/stats
#---------------------------------------------------------------------
# common defaults that all the'listen' and 'backend' sections will
# use if not designated in their block
#---------------------------------------------------------------------
defaults
   mode                    http
   log                     global
   option                  tcplog
   option                 dontlognull
#  option http-server-close
#  option forwardfor       except127.0.0.0/8
   option                  redispatch
   retries                 3
   maxconn                 2000
   timeout connect         5s
   timeout client          50s
   timeout server          50s
#  timeout http-keep-alive 10s
   timeout check           10s
listen mysql-cluster 0.0.0.0:3306
    mode tcp
    balance roundrobin
    server node1 192.168.1.35:3306 check
    server node2 192.168.1.36:3306 check
    server node3 192.168.1.37:3306 check
# 建议首先设置haproxy的监控界面,便于直观的观察后端节点是否在线
listen status 192.168.1.34:8080
     stats enable 
     stats uri /status
     stats auth admin:xxxx
     stats realm (haproxy\ statistic)

 

 

 

 ================================================================================

http://www.oschina.net/translate/from-mysql-mmm-to-mariadb-galera-cluster-a-high-availability-makeover

从 MySQL+MMM 到 MariaDB+Galera Cluster : 一个高可用性系统改造

英文原文:From MySQL+MMM to MariaDB+Galera Cluster: A High Availability Makeover

14人收藏此文章, 我要收藏oschina 推荐于 2年前 (共 9 段, 翻译完成于 10-22) (3评
 

很少有事情比推出高可用性(HA)系统之后便经常看到的系统崩溃更糟糕。对于我们这个Rails运行机的团队来说,这个失效的HA系统是MySQL多主复制管理器(MMM)

我们已经找寻MMM的替代品有一段时间了,几个月之前,我们转换到了MariaDB + Galera Cluster以寻求高可用的Mysql。

MMM怎么了,Galera Cluster又有什么特别之处呢?继续阅读!

Garfielt
Garfielt
翻译于 2年前

0人顶

 

 翻译的不错哦!

MySQL多主机复制 (MMM)基本被打破

MySQL MMM 是如何工作的:一台安装了MySQL MMM的服务器每十秒种(默认间隔)轮询一次MySQL节点, 来检查其状态。仅其中的一台服务器接收到写入器角色 - 其他的可以拥有阅读器角色。 MMM 维护了一个虚拟IP,这个IP指向拥有写入器角色的节点。

问题在于轮询:如果MySQL每十分钟轮询,那么如果写入器节点在检查的间歇出现故障怎么办?如果你设置了HA你可能正处理着许多事务 - 在MMM检测到写入器节点不正常之前,可能已经有成千上万的事务失败了。更糟糕的是,如果存在一种内部问题:复制失败在先,事务失败在后,那么你要把写入器角色转到其他节点上吗?但是其他节点不一定符合原始的写入器节点。

媛媛_
媛媛_
翻译于 2年前

1人顶

 

 翻译的不错哦!

减少轮询间隔到1秒也不能修正这个问题-大型数据库可能在每秒内运行许多事务。

因此轮询是根本问题,而且超出了根本问题范围。无法控制的MySQL MMM经常产生难以恢复的问题。Baron Swartz在Percona的MySQL大神上对MMM的缺陷有如下描述:

简要地来说,MMM产生的宕机时间比它要防止的宕机时间更长。因此它是一个低可靠性的工具,不是高可靠性的工具。它可以让你连续几天以7X24小时的工作方式从宕机的机器里提取数据,并放回到服务器上,这只会导致系统真正的非常严重的一塌糊涂。因此,MMM赋予词语"cluset-f__k"新的意义。
尽管MMM存在缺陷,然而它至少是对MySQL进行高可靠性的一次突破。然而时间改变了一切。甚至MySQL MMM的创建者也说到了要更改的时候了。Baron有关MMM的博客日志有Alexey's的如下评论:
我是MMM的最初的作者,我完全同意你的意见。每次我试图给集群添加HA的时候,我都会想起MMM,而且需要亲自去尝试,因为我只是不确定这个工具的我所做的配置。而且市场上没有其他软件可以可靠地做这项工作。
几点人
几点人
翻译于 2年前

0人顶

 

 翻译的不错哦!

那么,为什么Galera是最好的MySQL HA解决方案呢?

我们的Galera Cluster设置仍然使用轮询来做健康检测——这比MMM好在哪里呢?

答案在于主从复制怎样是运作的。对于标准版的MySQL,对master的写操作被记录于一个二进制的日志。Slave会在之后复制二进制日志中的查询。查询在写服务器上运行与在其它节点上运行时刻之间,总是会有一个延迟。它是异步的

MySQL异步复制有下面的问题:

  • slave服务器的数据集总是落后于master服务器。
  • MySQL复制很慢——它从二进制日志回访事务。

对于Galera,事务是在它们被提交之前被所有节点确认。如果一个事务在一个节点失败了,那个节点将立刻从群集中移除。换句话说,Galera主从复制是同步的。你 永远也不会丢失事务——没有延迟 (而且Galera的 基于行的复制大约要快5倍速)。

super0555
super0555
翻译于 2年前

0人顶

 

 翻译的不错哦!

Galera集群是局内人

MySQL MMM 是一个局外者—— 对于服务器上实际在发生的事情它是“哑的”。它只做一种检测,而且那就是它所知道的全部该如何反应的事情。

Galera集群是一个“局内人”,因此对每个节点的内部状态要更机灵,并且不需要人工干预就可以做正确的事情(例如,一个节点同步或未同步,成为一个donor(节点处于为新节点准备或传输集群全量数据状态,对客户端不可用),等等——全部都是自动的)。

super0555
super0555
翻译于 2年前

0人顶

 

 翻译的不错哦!

当写入节点失败的时候会发生什么呢?

由于用一个Galera集群可以写进任意节点,我们还是选择尽量减少潜在的死锁和只在一个节点写入。为此,我们使用HAProxy:我们拥有一个前端供“写入者”节点,另一个前端供读出以供所有节点实现余额查询。“写入者”通过单个节点发送请求,而其他的节点作为备份。

如果HAProxy检测到“写入者”节点不正常,它立即提拔备份节点中的一个作为“写入者”。MySQL的MMM在这种情况下通常会关掉所有节点之间的通话——HAProxy不会如此。当“写入者”后台更新的时候,我们可能会丢失一部分请求,但它不会导致不一致的数据集通过服务器,这比瘫痪更糟糕。

我们不会自动修复失败的节点,不过这没有关系。我主要关注点是确保一个正常的节点在执行写入,HAProxy是做这个的。

solen_w
solen_w
翻译于 2年前

0人顶

 

 翻译的不错哦!

修复失效的节点(并让它作为一个新的节点处于在线状态)

当一个节点在标准的MySQL复制的时候失效,你将在再次进行复制的时候把大量的负载集中在一台服务器上(这台服务器不仅仅要进行读和写,而且还要承接来自innodbbackupex的负载)。

使用Galera,你可以让其中一个节点离线(因此你至少需要三个节点)。这时这个节点就成为供给者节点-对它的写操作将被阻塞。这个节点就通过rsync传输自身的数据给失效的节点(或者新的节点)。然后,供给者节点和失效节点通过辅助队列运行查询而与其他节点保持同步。

一旦这两个节点回归到同步状态,HAProxy将自动的标记它们为启动状态,然后把它们添回道前端。
几点人
几点人
翻译于 2年前

0人顶

 

 翻译的不错哦!

Galera集群也支持普通的MySQL,因此我们为什么不切换到MariaDB?

切换到MariaDB的理由既有技术原因也有政治原因:

  • 易于移植:首先,MariaDB是MySQL的随手可得的替代品。从MySQL 5.1移植到MariaDB,只有Galera服务器5.6可以运行。
  • 性能:我们有几个包含索引的在性能方面存在问题的查询,后面通过令人惊讶的移植来”修补“这方面的问题。MariaDB似乎更适合于复杂查询和连接,而Rails上的Ruby也因处理复杂的查询和连接而扬名。MariaDB更适合做查找索引的整个工作,而且正如我前面所说,许多令人烦恼的查询现在已经提速了。我们似乎看不到二者在内存使用上有任何令人吃惊的区别。我期望Galera能更多的使用内存,不过如果这么做了,那么Galera就没有任何值得关注的地方了。
  • 社团:MariaDB有很大的驱动力,而且与MySQL相比增加了更多的功能。Oracle对MySQL未来倾注了大量的心血,而MariaDB看起来也存活了好长时间-甚至谷歌正在切换到MariaDB
几点人
几点人
翻译于 2年前

0人顶

 

 翻译的不错哦!

我们会再做一次?

绝对地。我们没有看到有什么原因不切换到 MariaDB 和 Galera Cluster。

监控 Galera Cluster

监控 Galera 的一件伟大的事情是它是分层的 - 我们可以很容易地监视栈的每一部分。我们使用 Scout 来监视,那意味着我们仅仅需要去使用下列插件:

  • MariaDB Galera Cluster - 安装在每一个 Galera Cluster 结点上去获取关键指标(本地状态,连通性,等)。
  • HAProxy - 为每一个代理安装(写入器一次,读取器一次)。
  • URL Monitoring - 检测和 HAProxy 检测的相同的状态URL来决定结点的健康。

TL;DR

直到最近, MySQL MMM 是添加高可用性到 MySQL 的最好的(但坏了的)途径。Galera Cluster 最终为 MySQL 增加了真实的高可用性,主要多亏同步复制。

纳兰融雪
纳兰融雪
翻译于 2年前

0人顶

 

 翻译的不错哦!

 

回页面顶部发表评论网友评论共3条

  • ayesd
    ayesd 发表于 2014-05-13 17:43
     
     
    好文章!
     
     
  • HuangChuantong
    HuangChuantong 发表于 2014-08-22 11:06
     
     
    翻译得真不敢直视,第二句“对于我们这个Rails运行机的团队来说,这个失效的HA系统是MySQL多主复制管理器(MMM)。”

    完全不懂
     
     
  • 大象悟语
    大象悟语 发表于 2015-03-22 11:48
     
     
    翻译的确实一般。。。
 
 
 
http://zx1986.github.io/blog/setup-percona-xtradb-cluster.html
張旭
 

安裝 Percona XtraDB Cluster

很簡單地說,Percona XtraDB Cluster 就是 MySQL 打上了一些特殊的 patch,
讓 MySQL 可以將某一節點上的寫入動作,重製到其他節點上。

背景知識

Codership

Codership 是一家成立於 2007 年的公司,公司的 Founder 都是 Database 專家。
Codership 致力於研究及實做高擴展性且快速的資料庫同步機制(Replication),
並帶頭制定了名爲 WSREP 的 API 標準,且根據這套 API 實做了 Galera 同步器(Replicator)。

WSREP(Write Set REPlication)

WSREP 是一個爲 DBMS(DataBase Management System)設計的 API 標準,
它爲 DBMS 類型的應用程式建立了一個 Replication 介面(Interface),
這個介面位於 DBMS 軟體與 Replication Servcie Provider(即 Replicator)之間。
WSREP Group 是討論與建立這個標準的開放性羣組。

WSREP API defines a set of application callbacks and replication library calls necessary to implement synchronous writeset replication of transactional databases and similar applications. It aims to abstract and isolate replication implementation from application details.

Galera Replicator

Galera 是一套根據 WSREP 標準實做出來的 Replication 函式庫。
Galera 的運作架構可以參考它們的說明。大致的原則是:
當對 Cluster 中其中一個節點做寫入(Write)時,
Galera 會自動將寫入動作 Replicate 到 Cluster 其他的節點上。

Galera implements WSREP pluggable interface, and can provide several replication modes and topologies, including the ultimate Synchronous Multi-Master replication.

MySQL Galera Cluster

傳統的 MySQL Server 只要打上 WSREP 的 Patch,支援了 WSREP 介面,
再搭配使用 Galera 函式庫,調整好設定檔,就可以組出一個 Cluster。

MySQL/Galera cluster uses Galera library for the replication implementation. To interface with Galera replication, we have enhanced MySQL server to support replication API definition in the wsrep API project.

MariaDB Galera Cluster

相較於 MySQL 要額外打 Patch,MariaDB 直接推出包好的 MariaDB Galera Cluster
MariaDB 還針對不同的 Linux 發佈版提供了套件庫
它是 Percona XtraDB Cluster 之外的另一個選擇。

Percona XtraDB Cluster(PXC)

Percona 是一家專業的 MySQL 顧問與技術公司,
他們有一個很知名的 MySQL Blog:MySQL Performance
Percona 也開發了許多知名的資料庫工具與軟體

XtraDB 是 Percona 基於 InnoDB 改良出來的一個資料庫引擎。
在 XtraDB 引擎的基礎上,Percona 發佈了一個修改過的 MySQL:Percona Server,
而 Percona XtraDB Cluster 則是 Percona Server + Galera Library 的整合產品。
Percona XtraDB Cluster 的資料庫同步機制是靠 Galera 完成的(即 Write Replication)。

安裝 Percona XtraDB Cluster

最新的 XtraDB 安裝檔: 
Percona XtraDB Cluster 
XtraBackup

以 Red Hat 環境(RHEL,Cent OS)爲例。

rpm -Uhv http://www.percona.com/downloads/percona-release/percona-release-0.0-1.x86_64.rpm
yum install Percona-XtraDB-Cluster-server Percona-XtraDB-Cluster-client percona-xtrabackup
vim /etc/my.cnf

    [mysqld]
    wsrep_provider=/usr/lib64/libgalera_smm.so
    wsrep_cluster_name=叢集的名稱
    wsrep_cluster_address=gcomm://節點一的位址,節點二的位址,節點三的位址
    wsrep_slave_threads=4
    wsrep_sst_method=rsync
    binlog_format=ROW
    default_storage_engine=InnoDB
    innodb_autoinc_lock_mode=2
    innodb_locks_unsafe_for_binlog=1

service mysql start --wsrep-cluster-address="gcomm://"
mysql -e "CREATE FUNCTION fnv1a_64 RETURNS INTEGER SONAME 'libfnv1a_udf.so'"
mysql -e "CREATE FUNCTION fnv_64 RETURNS INTEGER SONAME 'libfnv_udf.so'"
mysql -e "CREATE FUNCTION murmur_hash RETURNS INTEGER SONAME 'libmurmur_udf.so'"
mysqladmin -u root password '12345678'
service mysql stop
service mysql start
mysql -u root -p
mysql> show status like 'wsrep_%';

以上是第一個節點的設定,其他節點只要重複到啓動 MySQL 那個步驟,
並將啓動的指令改爲:service mysql start

  • --wsrep-cluster-address="gcomm://" 參數代表初始化一個全新的叢集!

SST

State Snapshot Transfer is the full copy of data from one node to another.

SST 是 State Snapshot Transfer 的縮寫,指的是 PXC 各節點間同步資料的方式。
可以在 /etc/my.cnf 中透過 wsrep_sst_method 參數來設定。
PXC 有三種同步方式,分別是:

  • wsrep_sst_method=mysqldump

If you use mysqldump SST it should be the same as this mysql client connection address plus you need to set wsrep_sst_auth variable to hold user:password pair. The user should be privileged enough to read system tables from donor and create system tables on this node. For simplicity that could be just the root user. Note that it also means that you need to properly set up the privileges on the new node before attempting to join the cluster.

  • wsrep_sst_method=rsync

If you use rsync SST, wsrep_sst_auth is not necessary unless your SST script makes use of it.

  • wsrep_sst_method=xtrabackup

If you use xtrabackup as SST method, it will use /usr/bin/wsrep_sst_xtrabackup provided in Percona-XtraDB-Cluster-server package. And this script also needs user password if you have a password for root@localhost.

要使用 xtrabackup 當作 SST method 時,
需要設定 Database 的 root password 到 /etc/my.cnf 內,
例如:wsrep_sst_auth=root:12345678

PXC 官方手冊:
http://www.percona.com/doc/percona-xtradb-cluster/installation.html
http://www.percona.com/doc/percona-xtradb-cluster/manual/bootstrap.html

PXC 專有名詞:
http://www.percona.com/doc/percona-xtradb-cluster/glossary.html

Reference:
http://www.mysqlperformanceblog.com/2013/01/29/how-to-start-a-percona-xtradb-cluster/
http://www.percona.com/files/presentations/WEBINAR-percona-xtradb-cluster-installation-and-setup.pdf

 
 
 ##########################################################################
 
http://www.penglixun.com/tech/database/icc_static_compile_percona.html

ICC静态编译Percona

一 6th, 2011 | Posted by P.Linux | Filed under 数据库
 

本文内容遵从CC版权协议, 可以随意转载, 但必须以超链接形式标明文章原始出处和作者信息及版权声明
网址: http://www.penglixun.com/tech/database/icc_static_compile_percona.html

经过我的测试ICC在浮点运算,线程库和数学函数上的优势非常明显,原生SSE2指令集支持、Intel自己编写的线程库和数学函数库,性能没得说。
我用同一份运算PI值的代码在ICC和GCC下编译,提升比例达20%,实际在数据库中比较同一条超级复杂的聚合SQL,ICC提升达34%

第一步:编译安装libunwind
wget http://download.savannah.gnu.org/releases/libunwind/libunwind-0.99.tar.gz
tar zxvf libunwind-0.99.tar.gz

CC=icc \
CXX=icpc \
LD=xild \
AR=xiar \
CFLAGS=”-O3 -no-prec-div -ip -xSSE2 -axSSE2″ \
CXXFLAGS=”${CFLAGS}” \
./configure && make && make install

第二布:编译安装tcmalloc
wget http://google-perftools.googlecode.com/files/google-perftools-1.6.tar.gz
tar zxvf google-perftools-1.6.tar.gz

CC=icc \
CXX=icpc \
LD=xild \
AR=xiar \
CFLAGS=”-O3 -no-prec-div -ip -xSSE2 -axSSE2″ \
CXXFLAGS=”${CFLAGS}” \
./configure –disable-debugalloc –enable-frame-pointers && make && make install

echo “/usr/local/lib” > /etc/ld.so.conf.d/usr_local_lib.conf
/sbin/ldconfig

第三部:编译安装Percona
CC=icc \
CXX=icpc \
LD=xild \
AR=xiar \
CFLAGS=”-O3 -unroll2 -ip -mp -restrict -fno-exceptions -fno-rtti -no-prec-div -fno-implicit-templates -static-intel -static-libgcc -xSSE2 -axSSE2″ \
CXXFLAGS=”${CFLAGS}” \
CPPFLAGS=” -I/usr/alibaba/icc/include ” \
LDFLAGS=” -L/usr/alibaba/icc/lib -lrt ” \
./configure –prefix=/usr/alibaba/install/percona-custom-5.1.53-12.4 \
–with-server-suffix=-alibaba-edition \
–with-mysqld-user=mysql \
–with-plugins=heap,innodb_plugin,myisam,partition \
–with-charset=utf8 \
–with-collation=utf8_general_ci \
–with-extra-charsets=gbk,utf8,ascii \
–with-big-tables \
–with-fast-mutexes \
–with-zlib-dir=bundled \
–with-readline \
–with-pthread \
–with-mysqld-ldflags=’-all-static -ltcmalloc’ \
–enable-assembler \
–enable-profiling \
–enable-local-infile \
–enable-thread-safe-client \
–without-embedded-server \
–with-client-ldflags=-all-static \
–with-mysqld-ldflags=-all-static \
–with-mysqld-ldflags=-ltcmalloc \
–without-query-cache \
–without-geometry \
–without-debug \
–without-ndb-binlog \
–without-ndb-debug
编译完成后make && make install

 
标签: ICCMySQLPerconaXtraDB
 
 
http://nginx.com/blog/mysql-high-availability-with-nginx-plus-and-galera-cluster/
http://www.ttlsa.com/mysql/mysql-high-availability-with-nginx-and-galera/

MySQL百分之百高可用性架构 使用nginx plus和galera cluster实现

2014年12月7日默北
 

在本文中,我们将使用MySQL Galera Cluster和nginx plus r5的TCP负载均衡来创建和测试数据库高可用集群。同时将展示适当的nginx的负载平衡配置,处理相互冲突的写操作和访问数据库集群失败的技术

Galera Cluster

Galera Cluster介绍

Galera Cluster在之前的文章中有介绍,可以去看看《MySQL/Galera集群-多主高可用性负载均衡》。

Galera Cluster是集群MySQL数据库服务器的同步复制解决方案。数据库写操作立即复制到其他Galera cluster节点上,且所有的服务器充当主节点。

负载均衡的Galera集群可以用在一个需要非常高的可用性的关键业务上。

Galera集群也支持MariaDB 和 Percona XtrDB Cluster。

首先,我们来创建一个测试表:

CREATE TABLE data (
    id INTEGER NOT NULL AUTO_INCREMENT,
    value CHAR(30),
    count INTEGER,
    PRIMARY KEY (value),
    KEY (id)
);

Galera Cluster的搭建就不在此处累述了,大家可以看看之前的文档或看看官方文档。

Nginx Plus的TCP负载均衡配置

轮询连接三台数据库。

stream {
    upstream db {
        server db1:3306;
        server db2:3306;
        server db3:3306;
    }
 
    server {
        listen 3306;
        proxy_pass db;
        proxy_connect_timeout 1s; # detect failure quickly
    }
}

然后通过Nginx Plus连接到数据库,并检查连接到后台哪个实例上:

# mysql -u galera -p --protocol=tcp
Enter password: ********
 
mysql> SHOW VARIABLES WHERE Variable_name = 'hostname';
+---------------+-------+
| Variable_name | Value |
+---------------+-------+
hostname      | db2   |
+---------------+-------+

当前连接到db2服务器上。如果我们重新连接,可能轮询到其他台服务器上的。

测试数据库集群

为了测试数据库集群,我们需要向刚才建立的表中插入数据并进行有意义的数据冲突碰撞。如果发生冲突,计数值加1。

mysql> INSERT INTO data (value, countVALUES '$value', 1 )
           ON DUPLICATE KEY UPDATE count=count+1;

下面的脚本query1.pl是插入100条数据,并打印出每条数据发送到哪台服务器上。

#!/usr/bin/perl -w
=pod
 
USE test;
CREATE TABLE data (
    id INTEGER NOT NULL AUTO_INCREMENT,
    value CHAR(30),
    count INTEGER,
    PRIMARY KEY (value),
    KEY (id)
);
 
=cut
 
use DBI;
  
my $host   "dev";
my $dbname "test";
my $table  "data";
my $user   "galera";
my $pass   "password";
 
foreach $i ( 0..99 ) {
 
    my $dbh = DBI->connect("DBI:mysql:$dbname:$host"$user$pass );
 
    # Which database have we connected to?
    my $sql "SHOW VARIABLES WHERE Variable_name = 'hostname';";
    my $q $dbh->prepare($sql);
    $q->execute;
 
    # Only expect one row, with key 'hostname', value thehostname
    @row $q->fetchrow_array();
    $upstream $row[1];
    $q->finish;
 
    # Add a row: value = "value-$i", count = 1; increment count on duplicate adds
    $value sprintf "value-%03d"$i;
    $sql "INSERT INTO $table (value, count) VALUES ( '$value', 1 ) ON DUPLICATE KEY UPDATE count=count+1";
 
    $q $dbh->prepare($sql);
    $q->execute;
    $q->finish;
 
    print "$upstream\n";
}
$ ./query1.pl
db3
db1
db2
db3
......
 
mysql> SELECT * FROM data;
+-----+-----------+-------+
id  | value     | count |
+-----+-----------+-------+
|   3 | value-000 |     1 |
|   4 | value-001 |     1 |
.....
| 101 | value-098 |     1 |
| 102 | value-099 |     1 |
+-----+-----------+-------+
100 rows in set (0.04 sec)

我们观察到,UPDATE操作轮询的访问数据库,并没有发生冲突。 当我们并行执行UPDATE操作时,计数值是这样的:

$ ./query1.pl ; ./query1.pl ; ./query1.pl
......
 
mysql> SELECT * FROM data;
+-----+-----------+-------+
id  | value     | count |
+-----+-----------+-------+
|   3 | value-000 |     4 |
|   4 | value-001 |     4 |
.....
| 101 | value-098 |     4 |
| 102 | value-099 |     4 |
+-----+-----------+-------+
100 rows in set (0.04 sec)

处理并行更新的问题

将表删除,重新创建。

mysql> DROP TABLE data;
mysql> CREATE TABLE data ( id INTEGER NOT NULL AUTO_INCREMENT, value CHAR(30),
           count INTEGER, PRIMARY KEY (value), KEY (id) );

并行执行20个更新操作:

for in {1..20} ; do ( ./query1.pl& ) ; done

会收到下面的报错信息:

DBD::mysql::st execute failed: Deadlock found when trying to get lock; try
restarting transaction at ./query1.pl line 42.

检查表数据显示很少的条目计数器已经增加到20了:

mysql> SELECT FROM data;
+------+-----------+-------+
| id   | value     | count |
+------+-----------+-------+
|    1 | value-000 |    14 |
|   31 | value-001 |    15 |
.....
| 2566 | value-098 |    18 |
| 2601 | value-099 |    20 |
+------+-----------+-------+
100 rows in set (0.03 sec)

这是Galera复制过程的后果,当在并行的情况下更新相同的记录,可能会发生死锁数据库会拒绝交易。

在某些情况下,这种行为是可以接受的。如果应用程序不太可能并行提交冲突的更新,应用程序代码可以优雅地处理这些非常罕见的拒绝交易(例如返回一个错误给用户),那么这可能不是一个严重的问题。

如果这是不可接受的,最简单的解决方案是指定上游服务器组的一个成员为主要的数据库实例,通过标记其他成员为backup和down状态,如下所示:

upstream db {
    server db1:3306;
    server db2:3306 backup;
    server db3:3306 down;
}

采用这样配置,所有的交易都路由到db1上。如果db1失败,当前建立的连接将丢弃,Nginx plus实现故障转移,将新连接到db2。请注意,DB3作为集群中的沉默的伙伴,仅接收来自db1和DB2的更新。

如果测试这个配置,你会发现在每个数据库实例,数据都会存在,并且有正确的计数值20。然而,如果在测试过程中db1发生失败,少数交易将会丢失。

更好的MySQL高可用性解决方案

交易可能因各种原因失败。如果需要一个非常高的程度的保护,需要确保我们的应用程序可以检测和重试失败的交易。

对于测试脚本,需要进行错误捕获,并短暂休息后重新提交交易。query2.pl脚本如下所示:

#!/usr/bin/perl -w
=pod
 
USE test;
CREATE TABLE data (
    id INTEGER NOT NULL AUTO_INCREMENT,
    value CHAR(30),
    count INTEGER,
    PRIMARY KEY (value),
    KEY (id)
);
 
=cut
 
use DBI;
  
my $host   "dev";
my $dbname "test";
my $table  "data";
my $user   "galera";
my $pass   "password";
 
foreach $i ( 0..99 ) {
 
    my $backoff = 0.1;# exponential backoff, in seconds
TRY:
    eval {
        my $dbh = DBI->connect("DBI:mysql:$dbname:$host"$user$pass, {PrintError => 0}) or die "Can't connect to DBI:mysql:$dbname:$host: ".$DBI::errstr;
     
        # Which database have we connected to?
        my $sql "SHOW VARIABLES WHERE Variable_name = 'hostname';";
        my $q $dbh->prepare($sql) or die "Can't prepare '$sql': ".$dbh->errstr;
        $q->execute or die "Can't execute '$sql': ".$q->errstr;
 
        # Only expect one row, with key 'hostname', value thehostname
        @row $q->fetchrow_array();
        $upstream $row[1];
        $q->finish;
 
        # Add a row: value = "value-$i", count = 1; increment count on duplicate adds
        $value sprintf "value-%03d"$i;
        $sql "INSERT INTO $table (value, count) VALUES ( '$value', 1 ) ON DUPLICATE KEY UPDATE count=count+1";
 
        $q $dbh->prepare($sql) or die "Can't prepare '$sql': ".$dbh->errstr;
        $q->execute or die "Can't execute '$sql': ".$q->errstr;
        $q->finish;
 
#       print "$upstream\n";
    } or do {
        print "Failed: $@";
        selectundefundefundef$backoff );
        $backoff *= 1.5;
        goto TRY;
    };
 
}

这一修改,我们可以回到原来的负载均衡方法(3活动数据库)和重新测试并行更新。常见的死锁错误检测和相应的事务重试。计数器正确的递增和该系统被证明是可靠的具有多个活动的主。

mysql> SELECT FROM data;
+------+-----------+-------+
| id   | value     | count |
+------+-----------+-------+
|    1 | value-000 |    20 |
|   33 | value-001 |    20 |
.....
| 2964 | value-098 |    20 |
| 2993 | value-099 |    20 |
+------+-----------+-------+
100 rows in set (0.04 sec)

抵御数据库失败

我们可以模拟故障,关闭一个或多个数据库服务器在向集群并行提交多个更新。

请注意,proxy_connect_timeout值降低到1秒,Nginx可以快速检测连接失败

正如预期的那样客户端代码得到的误差范围数据库被关闭和重新启动中的交易,信息如下所示:

Failed: Can't connect to DBI:mysql:test:dev: Lost connection to MySQL server at 'reading initial communication packet', system error: 0 at ./query2.pl line 28.
Failed: Can't execute 'SHOW VARIABLES WHERE Variable_name = 'hostname';': Lost connection to MySQL server during query at ./query2.pl line 33.
Failed: Can't execute 'INSERT INTO data (value, count) VALUES ( 'value-020', 1 ) ON DUPLICATE KEY UPDATE count=count+1': Unknown command at ./query2.pl line 45.

尽管有这些错误广泛的测试中,没有单一的交易被丢失,也没有执行多次,而且三台数据库的数据依然保持一致性的。

适当的应用逻辑相结合,Nginx plus负载均衡和Galera Cluster相结合,可以提供一个可靠的高性能的,100%可靠的MySQL数据库集群。

是不是如上所说的100%可靠的,大家在应用中拭目以待吧。

参考资料:http://nginx.com/blog/mysql-high-availability-with-nginx-plus-and-galera-cluster/

 

 http://www.oschina.net/translate/percona-xtradb-cluster-how-to-run-a-2-node-cluster-on-a-single-server

Percona XtraDB Cluster 如何在一台服务器上安装两个集群节点

英文原文:Percona XtraDB Cluster: How to run a 2-node cluster on a single server

35人收藏此文章, 我要收藏oschina 推荐于 8个月前 (共 5 段, 翻译完成于 10-23) (0评
 

我认为在单个物理服务器上运行2个或多个Percona XtraDB Cluster(PXC)节点这样没有什么意义,除了教育和测试目的,但在这种情况下这样做仍然是有用的。最受欢迎的实现方式似乎是服务器的虚拟化,比如利用流浪盒子。但是同样的方式你可以运行多个MySQL实例在并行操作系统级别上,还有并发的mysqld的形成过程,因此你也可以有多个Percona XtraDB Cluster节点。而且实现这一目标的方法是恰恰相同的:使用专用的datadirs和为每个节点设置不同的端口。

哪个端口?

Pecona XtraDB Cluster 使用 4 个 TCP 端口:

  • 常规的MySQL端口(默认3306)

  • (Galera)(默认4567)

  • 状态传输端口(默认4444)

  • 增量状态传输端口(默认是:组通信端口(4567)+ 1 = 4568)

当然,当你在同一台服务器上有多个实例的默认值,并不适用于所有人,所以我们需要为其他实例定义新的端口,确保本地防火墙对他们是开放的,如果有一个活动(iptables,selinux,…)。

warrior_by
warrior_by
翻译于 8个月前

0人顶

 

 翻译的不错哦!

安装Percona XtraDB 集群,配置并启动第一个节点

我的测试服务器用的是一个全新的CentOS(社区企业操作系统)6.5 版,系统安装了Percona yum 工具,通过工具我安装了最新的Percona XtraDB集群(5.6.20-25.7.888.el6版本);注意:你可能需要安装EPEL(企业版Linux额外包)和socat(Socket CAT)工具,这两个工具是独立的(见bug)。 为了避免冲突,我已经停止了mysql服务的自启动:

1
2
chkconfig --level 3 mysql off
chkconfig --del mysql

 

我原本计划从压缩包中安装PXC(Percona XtraDB Cluster),但是后来我决定通过yum工具进行安装,这样可以自动下载所有依赖包。 这是我最初的/etc/my.cnf 文件(注意默认值的使用):

1
2
3
4
5
6
7
8
9
10
11
12
[mysqld]
datadir = /var/lib/mysql
port=3306
socket=/var/lib/mysql/mysql-node1.sock
pid-file=/var/lib/mysql/mysql-node1.pid
log-error=/var/lib/mysql/mysql-node1.err
binlog_format=ROW
innodb_autoinc_lock_mode=2
wsrep_provider=/usr/lib64/libgalera_smm.so
wsrep_cluster_name = singlebox
wsrep_node_name = node1
wsrep_cluster_address=gcomm://

 

我使用下面的命令手动启动了一个节点上的集群引导程序:

1
$ mysqld_safe --defaults-file=/etc/my.cnf --wsrep-new-cluster

 

启动后,你应当可以通过本地接口访问该节点:

1
$ mysql -S /var/lib/mysql/mysql-node1.sock

 

daxiang
daxiang
翻译于 7个月前

0人顶

 

 翻译的不错哦!

配置和启动第二个节点

然后,我创建了一个类似的第二个实例配置文件的配置,我叫/etc/my2.cnf,有以下修改:

 

1
2
3
4
5
6
7
8
9
10
11
12
13
[mysqld]
datadir = /var/lib/mysql2
port=3307
socket=/var/lib/mysql2/mysql-node2.sock
pid-file=/var/lib/mysql2/mysql-node2.pid
log-error=/var/lib/mysql2/mysql-node2.err
binlog_format=ROW
innodb_autoinc_lock_mode=2
wsrep_provider=/usr/lib64/libgalera_smm.so
wsrep_cluster_name = singlebox
wsrep_node_name = node2
wsrep_cluster_address=gcomm://127.0.0.1:4567,127.0.0.1:5020
wsrep_provider_options = "base_port=5020;"

注意使用base_port:通过它定义的,5020端口是用于组通信和5020(上面)为IST保留着(一样简单的使用gmcast.listen_addr =tcp:/ / 127.0.0.1:5021)。

您需要在这第二个实例中为datadir创建和设置正确的权限,否则MySQL无法创建一些文件(像.pid和.err),虽然你不需要运行mysql_install_db脚本:

 

1
$ chown -R mysql:mysql /var/lib/mysql2

然后,您可以用以下命令启动第二个实例:

1
$ mysqld_safe --defaults-file=/etc/my2.cnf

当开始时,通过看日志来观察这第二个节点开始,与主节点间的通信和加入集群。从一开始的实例在不同的终端上执行:

1
$ tail -f /var/log/mysql2/mysql-node2.err

记住,任何时候都可以使用mysqladmin停止节点,您只需要提供正确的套接字作为参数,如:

 

1
$ mysqladmin -S /var/lib/mysql/mysql-node1.sock shutdown

最后,一旦你有整个集群,你应该编辑my.cnf中的第一节点与一个完整的wsrep_cluster_addres,在/etc/my2.cnf上面显示。

warrior_by
warrior_by
翻译于 7个月前

0人顶

 

 翻译的不错哦!

使用mysqld_multi

我最新的博客发表在使用myslqd_multi运行MySQL多实例.它也可以在这里使用,唯一的例外是,你需要确保,无论什么时候初始化运行集群,在第一个节点要使用“wsrep_cluster_address=gcomm://”,同时,注意在其它节点之前启动它.

在我看来,使用mysqld_multi的唯一优势,在于促进节点的管理(启动/停止),并集中所有的配置到单一的my.cnf文件中.除了教学目的,你完全不需要在单一服务器运行一个PXC集群.

gones945
gones945
翻译于 7个月前

0人顶

 

 翻译的不错哦!

为生产服务器增加第二个Percona XtraDB Cluster节点

如果你有一个生产集群,它们由多个物理服务器组成,同时,你想为其中之一增加第二个节点,这个情况会怎么样呢?它以同样的方式工作.配置的时候,你需要使用服务器的IP地址取代回路地址.这里有一个PXC集群的例子,初始情况下,它由三个节点组成: 192.168.70.1, 192.168.70.2和 192.168.70.3.我已经增加了第四个节点,它正运行并服务着第三个节点.在修改之后,wsrep_cluster_address 行看起来像下面这样:

1
wsrep_cluster_address = gcomm://192.168.70.1,192.168.70.2,192.168.70.3:4567,192.168.70.3:5020

其它资源

我有一个关于“如何在单一服务器配置三节点的集群”的参考资料页面,它采用了一些不同的方法,比我上面谈到的内容包含更多的细节.

posted @ 2015-06-08 15:49  陳聽溪  阅读(3123)  评论(0编辑  收藏  举报