安装依赖与注意事项:
1. rpm -ivh http://dl.fedoraproject.org/pub/epel/6/x86_64/epel-release-6-8.noarch.rpm
1.yum install socat
2.yum install -y perl-DBI perl-DBD-MySQL perl-Time-HiRes perl-IO-Socket-SSL perl-Time-HiRes.x86_64 socat
3.安装xtrabackup 下载地址:http://www.percona.com/downloads/XtraBackup/
4.注意iptables 4567是wsrep使用的默认端口
5.如果是对现有环境做galera集群,需要对mysql现有表做检查,包括表,表引擎,是否无主键,是否有全文索引,是否有空间索引:
SELECT DISTINCT
CONCAT(t.table_schema,'.',t.table_name) AS tbl,
t.engine,
IF(ISNULL(c.constraint_name),'NOPK','') AS nopk,
IF(s.index_type = 'FULLTEXT','FULLTEXT','') AS ftidx,
IF(s.index_type = 'SPATIAL','SPATIAL','') AS gisidx
FROM information_schema.tables AS t
LEFT JOIN information_schema.key_column_usage AS c
ON (t.table_schema = c.constraint_schema AND t.table_name = c.table_name
AND c.constraint_name = 'PRIMARY')
LEFT JOIN information_schema.statistics AS s
ON (t.table_schema = s.table_schema AND t.table_name = s.table_name
AND s.index_type IN ('FULLTEXT','SPATIAL'))
WHERE t.table_schema NOT IN ('information_schema','performance_schema','mysql')
AND t.table_type = 'BASE TABLE'
AND (t.engine <> 'InnoDB' OR c.constraint_name IS NULL OR s.index_type IN ('FULLTEXT','SPATIAL'))
ORDER BY t.table_schema,t.table_name;
6.pxc 下载地址
https://www.percona.com/downloads/Percona-XtraDB-Cluster-56/Percona-XtraDB-Cluster-5.6.21-25.8/binary/tarball/Percona-XtraDB-Cluster-5.6.21-rel70.1-25.8.938.Linux.x86_64.tar.gz
安装步骤:
1. 和普通mysql安装步骤一样安装并初始化
2. 安装innobackupex并且添加到环境变量
3. 添加sst账号
DELETE FROM mysql.user WHERE user='';
GRANT RELOAD, LOCK TABLES, REPLICATION CLIENT ON *.* TO 'sstuser'@'localhost' IDENTIFIED BY 'sstuser';;
FLUSH PRIVILEGES;
4.修改my.cnf配置文件(添加如下参数)
###pxc
##Path to Galera library
#指定Galera库文件,PXC自带该库文件,mariadb galera需要安装galera
wsrep_provider = /usr/local/Percona-XtraDB-Cluster-5.6.24-rel72.2-25.11..Linux.x86_64/lib/libgalera_smm.so
# Cluster connection URL contains the IPs of node#1, node#2 and node#3
#指定集群每个节点的连接地址
wsrep_cluster_address = gcomm://10.1.1.121:4567,10. 1.1.122:4567,10. 1.1.123:4567
#本机ip
wsrep_provider_options = gmcast.listen_addr=tcp://10.1.1.121:4567;gcache.size=8G;gcs.fc_limit=512;gcs.fc_factor=0.9;
# This changes how InnoDB autoincrement locks are managed and is a requirement for Galera
innodb_autoinc_lock_mode = 2
# Node #1 address
#本机ip
wsrep_node_address = 10. 1.1.122
#指定SST方式,支持rsync(最快,需要锁表),mysqldump和xtrabackup,从5.5.33-23.7.6起支持xtrabackup-v2
# SST method
wsrep_sst_method = xtrabackup-v2
#wsrep_sst_method = rsync
# Cluster name
wsrep_cluster_name = my_centos_cluster
wsrep_slave_threads = 16
# Authentication for SST method
#SST的认证方式(账号密码)
wsrep_sst_auth = "sstuser:sstuser"
5.先启动主节点
/usr/local/Percona-XtraDB-Cluster-5.6.24-rel72.2-25.11..Linux.x86_64/bin/mysqld_safe --defaults-file=/etc/my.cnf --wsrep-cluster-address="gcomm://" &
或者
service mysqld_3306 bootstrap-pxc
其他节点正常启动
service mysqld_3306 start
或者
/etc/init.d/mysqld_3306 start --wsrep_sst_donor=指定主ip
6.查看pxc状态
show status like 'wsrep%';
ps aux | grep mysql | grep wsrep_start_position
绕开SST通过IST方式添加节点需要创建的文件
在源mysql 用innobackupex 加 --galera-info 参数做完整备份
在目标mysql还原并且创建grastate.dat文件
sudo cat xtrabackup_galera_info
b0b66f5c-6254-11e3-b7c8-d2d41d32ec17: 433411
sudo vim grastate.dat
# GALERA saved state
version: 2.1
uuid: b0b66f5c-6254-11e3-b7c8-d2d41d32ec17
seqno: 433411
cert_index:
sudo chown mysql:mysql -R *
/etc/init.d/mysqld_3306 start --wsrep_sst_donor=源mysql
名词:
WS:write set 写数据集
IST: Incremental State
Transfer 增量同步
SST:State Snapshot Transfer 全量同步
UUID:节点状态改变及顺序的唯一标识。
GTID:Global Transaction ID ,由UUID和偏移量组成。wsrep api 中定义的集群内全局事务id。
状态机变化阶段:
1.OPEN: 节点启动成功,尝试连接到集群,如果失败则根据配置退出或创建新的集群
2.PRIMARY: 节点处于集群PC中,尝试从集群中选取donor进行数据同步
3.JOINER: 节点处于等待接收/接收数据文件状态,数据传输完成后在本地加载数据
4.JOINED: 节点完成数据同步工作,尝试保持和集群进度一致
5.SYNCED:节点正常提供服务:数据的读写,集群数据的同步,新加入节点的sst请求
6.DONOR:节点处于为新节点准备或传输集群全量数据状态,对客户端不可用。
原生的Mysql也可使用galera
https://launchpad.net/codership-mysql/+download
局限性
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个。2个也可以运行,但是官方不推荐这么做,因为3个节点是为了预防脑裂。
10.如果DDL语句有问题将破坏集群。建议使用pt-online-schema-change操作DDL。
Galera监控
1、常用查询指令
查看wsrep版本: mysql> SHOW GLOBAL STATUS LIKE 'wsrep_provider_version';
查看wsrep有关的所有变量: mysql> SHOW VARIABLES LIKE 'wsrep%' G
查看Galera集群状态: mysql> show status like 'wsrep%';
2、参数说明
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_cluster_address或wsrep_cluster_name等配置错造成的.具体错误需要查看错误日志)
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:回滚,检测到的冲突数目
--设置节点不参与流量控制
set global wsrep_desync=ON;
--需注意的参数修改gcs.fc_limit=1024 触发流控大小设置
wsrep_provider_options = "evs.keepalive_period=PT1S; evs.inactive_check_period=PT0.5S; evs.suspect_timeout=PT5S; evs.inactive_timeout=PT15S; gcs.fc_factor=1.0; gcs.fc_limit=1024; gcs.fc_master_slave=yes; gcache.size=8G; "
--在线调整方法
SET GLOBAL wsrep_provider_options="gcs.fc_limit=512;gcs.fc_factor=1.0;evs.send_window=256;evs.user_send_window=128; ";
--如果脑裂导致所有节点不可用
SET GLOBAL wsrep_provider_options='pc.bootstrap=true';
当网络状况不好时考虑调整的参数设置:
1 wsrep_provider_options = "evs.keepalive_period = PT3S; evs.inactive_check_period = PT10S; evs.suspect_timeout = PT30S; evs.inactive_timeout = PT1M; evs.consensus_timeout = PT1M"
2 evs.keepalive_period 参数控制多久发送一次keepalive请求信号
3 evs.inactive_check_period 参数控制多久检测一次节点活动/静止状态
4 evs.suspect_timeout 参数控制某个节点是否被标识为suspected状态的时 间间隔
5 evs.inactive_timeout 参数控制节点不活动时检测周期
6 evs.consensus_timeout 参数控制多久检测一次节点一致性 通过上面的设 置,可以使节点超时时间为30秒
7 evs.inactive_timeout参数必须不小于evs.suspect_timeout, evs.consensus_timeout必须不小于evs.inactive_timeout