新浪博客

MySQL的Galera Cluster配置说明

2013-05-17 15:58阅读:
[2017.03.15 修订] 本来作为一篇读书笔记性质写的文章,重新再读,发现疏漏不少,貌似还被不少地方转载了,误人子弟了,修改一下,希望错漏少些,看官们见谅,呵呵。
部分图片引用自《Galera Cluster Best Practices》
--------------------------
一、Galera Cluster介绍
Galera是一个MySQL(也支持MariaDB,Percona)的同步多主集群软件。
从用户视角看,一组Galera集群可以看作一个具有多入口的MySQL库,用户可以同时从多个IP读写这个库。
目前Galera已经得到广泛应用,例如Openstack中,在集群规模不大的情况下,稳定性已经得到了实践考验。


MySQL的Galera <wbr>Cluster配置说明


主要特点:

  • 同步复制

MySQL的Galera <wbr>Cluster配置说明


MySQL的Galera <wbr>Cluster配置说明


MySQL的Galera <wbr>Cluster配置说明



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

MySQL的Galera <wbr>Cluster配置说明



  • 自动的节点成员控制,失效节点自动被清除
  • 新节点加入数据自动复制
  • 真正的并行复制,行级
  • 用户可以直接连接集群,使用感受上与MySQL完全一致


优势:
因为是多主,所以不存在Slave lag
不存在丢失交易的情况
同时具有读和写的扩展能力
更小的客户端延迟
节点间数据是同步的,而Master/Slave模式是异步的,不同slave上的binlog可能是不同的

技术:
Galera集群的复制功能基于Galera library实现,为了让MySQL与Galera library通讯,特别针对MySQL开发了wsrep API。
MySQL的Galera <wbr>Cluster配置说明


MySQL的Galera <wbr>Cluster配置说明


MySQL的Galera <wbr>Cluster配置说明


[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操作。
MySQL的Galera <wbr>Cluster配置说明

二、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 检验集群同步是否成功,在第一个节点执行

我的更多文章

下载客户端阅读体验更佳

APP专享