主要特点:



- 真正的multi-master,即所有节点可以同时读写数据库

- 自动的节点成员控制,失效节点自动被清除
- 新节点加入数据自动复制
- 真正的并行复制,行级
- 用户可以直接连接集群,使用感受上与MySQL完全一致
优势:
因为是多主,所以不存在Slave lag
不存在丢失交易的情况
同时具有读和写的扩展能力
更小的客户端延迟
节点间数据是同步的,而Master/Slave模式是异步的,不同slave上的binlog可能是不同的
技术:
Galera集群的复制功能基于Galera
library实现,为了让MySQL与Galera library通讯,特别针对MySQL开发了wsrep
API。



[2017.03.15 修订]
MySQL官方自5.7版本后推出了Group
Replication,同样支持多主写入,功能和Galera类似,'官方控'可以去看看。
Galera集群中,后加入的节点叫“joiner”,joiner会向之前的节点请求同步数据,接受同步请求的节点叫“donor”,同步可以通过IST:
incremental state transfer 和SST: full state
transfer两种方式,支持的wsrep_sst_method有mysqldump,rsync,xtrabackup三种。其中xtrabackup锁表的时间最短,同步速度最快,所以一般选择xtrabackup。
无论采用哪种方法,都会短暂锁表,如果对这个比较敏感,那么可以采用专用的“参考节点”,即该节点不对用户开放,也不执行任何SQL操作。
二、Galera安装流水账
2.1 Galera与SElinux
2.1.1 将SElinux置为”permissive“状态
2.1.2 安装好Galera集群,然后做如下各种操作,获取SELinux的events log
启动节点
停止节点服务,在其他节点做插入,删除,更新操作,重启服务
停止节点服务,删除grastate.dat文件,重启服务
直接重启节点
尽量将日常操作都做过一遍。
2.1.3 据SElinux日志来生成policy文件,编译为module后打包,加载
]# fgrep 'mysqld' /var/log/audit/audit.log | audit2allow -m
MySQL_galera -o galera.te
]# checkmodule -M -m galera.te -o galera.mod
]# semodule_package -m galera.mod -o galera.pp.
]# semodule -I galera.pp
2.1.4 将SElinux恢复为“enforcing”状态
2.2 安装MariaDB
[在每个节点上]
2.2.1 加入MariaDB官方源
]# vim /etc/yum/repos.d/MariaDB.repo
[mariadb]
name = MariaDB
baseurl = http://yum.mariadb.org/10.1/centos6-amd64
gpgkey=https://yum.mariadb.org/RPM-GPG-KEY-MariaDB
gpgcheck=1
2.2.2 安装MariaDB,Galera,xtrabackup
]# yum install MariaDB-client MariaDB-Galera-server galera
xtrabackup
2.2.3 启动MariaDB,并作安全加固
]# service mysql start
]# /usr/bin/mysql_secure_installation
2.2.4 增加SST用户,用于同步数据
]# mysql -u root -p
mysql> GRANT ALL PRIVILEGES on *.* to sst_user@'%' IDENTIFIED BY
'dbpass';
mysql> FLUSH PRIVILEGES;
mysql> quit
注意:为了安全,尽量不要用‘%’,而是指定的集群节点IP。
2.2.5 停止MariaDB,编辑Galera配置文件
]# service mysql stop
]# vi /etc/my.cnf.d/server.cnf
binlog_format=ROW
default-storage-engine=innodb
innodb_autoinc_lock_mode=2
innodb_locks_unsafe_for_binlog=1
query_cache_size=0
query_cache_type=0
bind-address=0.0.0.0
datadir=/var/lib/mysql
innodb_log_file_size=100M
innodb_file_per_table
innodb_flush_log_at_trx_commit=2
# Galera Provider Configuration
wsrep_provider=/usr/lib64/galera/libgalera_smm.so
# Galera Cluster Configuration
wsrep_cluster_address='gcomm://1.1.1.1,1.1.1.2,1.1.1.3'
wsrep_cluster_name='galera_cluster'
# Galera Node Configuration
wsrep_node_address='1.1.1.1'
wsrep_node_name='db1'
# Galera Synchronization Configuration
wsrep_sst_method=xtrabackup
wsrep_sst_auth=sst_user:dbpass
对于第二、三个节点,不要忘了修改地址:
wsrep_node_address=1.1.1.2
wsrep_node_name='db2'
2.2.6 初始化第一个节点
]# /etc/init.d/mysql start --wsrep-new-cluster
检查集群状态
]# mysql-uroot-p-e'show status like 'wsrep%''
|wsrep_local_state_comment | Synced <-- cluster is synced
|wsrep_incoming_addresses
| 1.1.1.1:3306 <-- node db1 is
a provider
|wsrep_cluster_size
| 1 <--
cluster consists of 1 node
|wsrep_ready
| ON <-- good :)
2.2.7 启动第二个节点
]# service mysql start
]# mysql -u root -p -e 'show status like 'wsrep%''
| wsrep_local_state_comment | Synced
|
| wsrep_incoming_addre sses | 1.1.1.1:3306,1.1.1.2:3306 |
| wsrep_cluster_size
| 2
|
| wsrep_connected
| ON
|
| wsrep_ready
| ON
|
2.2.8 启动第三个节点
| wsrep_local_state_comment | Synced
|
| wsrep_incoming_addresses
|
1.1.1.3:3306,1.1.1.1:3306,1.1.1.2:3306 |
| wsrep_cluster_size
| 3
|
| wsrep_connected
| ON
|
| wsrep_ready
| ON
|
2.2.9 检验集群同步是否成功,在第一个节点执行