Percona XtraDB Cluster 简介




错误的MySQL配置


只要定义了wsrep_cluster_address,即使没有定义wsrep_provider参数,MySQL也可以正常启动,但某些希望执行的功能却无法正常工作,而且很难找到问题所在。MySQL错误日志会有如下输出结果:
$ bin/mysqld_safe --defaults-file=etc/my.cnf --wsrep_cluster_address=gcomm:// &
$ tail -20 data/`hostname`.err

状态快照传输

虽然上面的初始配置可以确保最少配置单一MySQL实例和Galera正常工作,但这并不是我们的真正目的,而且这个单一MySQL实例也不足以添加其他Galera节点到集群中。变量wsrep_sst_method用来保证当有新的节点要加入集群时,新节点会被初始化并和集群中其他已知节点同步(其中一个节点成为参照节点)。

codership通过示意图很好地说明了执行初始化快照,然后和集群同步这一过程的大致复杂性,可以通过如下地址查看该示意图:http://www.codership.com/wiki/doku.php?id=state_transfer_protocol。

wsrep_sst_method变量有5个可选的值,分别是rsync、rsync_wan、xtrabackup、mysqldump以及skip。当前的默认值是mysqldump,这个默认值在以后的版本中可能会有变化。

在加入节点和参照节点上获取数据的过程中,mysqldump、rsync和rsync_wan是阻塞性操作。rsync_wan选项对广域网传输环境做了进一步优化。xtrabackup选项提供了最大的灵活性,并且要求安装额外的软件并进一步配置。

默认情况下,Galera使用eth0来执行SST操作。在虚拟环境的例子中可以看到,正确的IP地址是在eth1上。IP地址可以通过wsrep_sst_receive_address变量在所有Galera节点上配置。请见下面的示例:
#$HOME/mysql/etc/my.cnf (on alpha)
[mysqld]
wsrep_sst_receive_address=192.168.1.51

rsync 和 rsync_wan

rsync是在SST中最早出现的选项。当设置了rsync同时又定义了恰当的SSH键时,就可以很容易地将新加入节点与集群同步:
#$HOME/mysql/etc/my.cnf
[mysqld]
wsrep_sst_method=rsync

mysqldump

当使用mysqldump方法(当前默认)时,还需要在新加入节点和参考节点上添加wsrep_sst_auth选项。wsrep_sst_auth指定了一个在所有节点上都必须存在的MySQL用户账户。请看下面的例子:
#$HOME/mysql/etc/my.cnf
[mysqld]
wsrep_sst_method=mysqldump
wsrep_sst_auth=galera:passwd

但这样又引入了额外的安全问题。推荐使用新的MySQL用户,因为对于执行wsrep_sst_mysqldump命令的连接来说,可能需要进行网络层访问(例如会访问除了localhost之外的其他地址):
mysql> GRANT ALL ON *.* TO galera@'192.168.1.%' IDENTIFIED BY PASSWORD '*59C7......';

这个用户要求有权限在新加入节点上创建和删除mysql模式。出于安全考虑,可以在使用后禁用或删除这个用户:然而当有新节点加入集群,或者某个层级上发生崩溃故障并需要重新同步时,SST可能会需要使用这个用户,因此删除或禁用该用户会带来一些麻烦。理论上这个变量在不同节点上可以取不同值,但这样也会带来不必要的复杂性。

注意
看起来似乎rsync是SST更常用的方法。rsync工作在物理层,而mysqldump工作在逻辑层。如果不同节点上的MySQL实例有不同的布局和选项,例如datadir或innodb_log_file_size的值不同,就必须使用mysqldump。

提示
在所有Galera Cluster节点上使用相同的MySQL配置(又称KISS原则)可以减少不必要的复杂性,尤其是在诊断故障时。

KISS是Keep It Simple,Stupid的缩写,指尽可能使外部环境一致,保持简单,便于发现和解决问题。

添加Galera节点

在Galera Cluster中添加另一台服务器的安装和配置方法与之前介绍的一样。也就是先安装Galera,安装带有wsrep补丁的MySQL,安装MySQL起始数据库,配置MySQL,然后加入适当的SST方法定义。

唯一不同的地方是mysqld进程的初始化过程,添加节点时需要有指向集群中已知节点的连接,该已知节点上需要有wsrep_cluster_address选项。在下面的示例中,初始化服务器alpha:
$ ./bin/mysqld_safe --defaults-file=etc/my.cnf \
--wsrep_cluster_address=gcomm://alpha &

初始化阶段的握手过程和SST传输过程可以在新加入节点(beta服务器)和参考节点(alpha服务器)的错误日志中查看。

通过rsync进行SST转移

在参考节点(alpha服务器上),如果日志记录中包含下面的信息,就说明SST请求是成功的:

在新加入节点上,可以在错误日志中看到下面的步骤:
. 发现状态不同。
. 首先尝试增量状态转移,但是由于基础状态的差异而没有成功。
. 选中一个即诶但作为参考节点,在这个节点上初始化SST操作。
. 在获取到的状态上执行InnoDB崩溃恢复操作。
. 新加入的节点被认为已经与集群同步。

操作确认

Galera提供了一系列状态变量来查看在集群上执行的操作。在初始化集群建立和添加了另一台服务器之后,可以在下面的示例中查看变量的值:
alpha Status
alpha> SHOW GLOBAL STATUS LIKE 'wsrep%';
beta Status
beta> SHOW GLOBAL STATUS LIKE 'wsrep%';

http://www.codership.com/wiki/doku.php?id=monitoring 上的Galera Wiki提供了这些状态变量的详细信息,例如怎样通过变量的值检查集群完整性、节点状态、数据复制的健康状况以及性能瓶颈。

可以通过运行一个简单测试来测试数据复制,使用附录中介绍的测试步骤。该测试会使用一个简单的存储过程创建一个表来模拟一些数据加载过程。可通过下面的简单测试来检查表中数据是否一致:
alpha> PAGER md5sum
alpha> SELECT * FROM numbers ORDER BY id;
alpha> NOPAGER
beta> PAGER md5sum
beta> SELECT * FROM numbers ORDER BY id;
beta> NOPAGER

此外还可以看到MySQL状态变量的值的变化:
beta> SHOW GLOBAL STATUS LIKE 'wsrep%';

如果值运行这些一般的测试存储过程的话,不会有额外的wsrep信息输出到MySQL错误日志中。通常在错误日志中,在初始化创建和SST相关的消息之后的任何wsrep消息都应该被认为是潜在的错误,需要进一步检查。

多主节点数据复制

Galera对真正意义的活跃的多主节点数据复制提供了默认支持,因此不需要其他额外配置。可以在另一不同的模式下重做这个测试来加以验证:
beta> CREATE SCHEMA IF NOT EXISTS test2;
beta> USE test2;
beta> SOURCE fill_numbers.sql

可以通过检查几个不同状态变量的值的变化,查看执行的本地操作。例如:
beta> SHOW GLOBAL STATUS LIKE 'wsrep%';

可以和之前的变量值做对比,之前的值为:

优化MySQL配置

除了上面讨论过的那些配置外,还有一些更推荐的优化配置,这些优化配置包括:
. wsrep_provider: 这个参数指定Galera库的路径和文件名。这是一个必需的参数。
. wsrep_cluster_address: 这个参数通过一种特殊的 gcomm:// 协议地址来访问集群中的节点。这是一个必需的参数。
. wsrep_cluster_name: 这个参数为使用中的集群指定名称。
. wsrep_sst_method: 这个参数定义了一种执行初始状态传输的方法。如果不指定的话,默认值是mysqldump,推荐设置为rsync或xtrabackup。
. wsrep_node_address: 这个参数指定节点的IP地址。如果不指定值,默认使用获取到的第一个IP地址。这对于那些多个网络连接的网络配置环境而言是不理想的选择。
. wsrep_node_name: 这个参数表示一个自燃语言下可读的节点名。如果不指定值,默认值是节点的主机名。
. wsrep_slave_threads: 这个参数指定可并行运行的从节点线程数量。推荐设置为4。
. wsrep_provider_options:这个参数用来指定不同的其他选项。推荐将gcache_size设置为接近最大吞吐量。

在默认安装情况下,wsrep_provider_options也可能有多种可能的值,包括下面这些:
mysql> SHOW GLOBAL VARIABLES LIKE 'wsrep_provider_options'\G

添加节点

想要体现出这项技术的真正价值,需要再添加第三个节点(gamma服务器),可以用与添加第二个节点相同的步骤来添加。在错误日志中确认新添加的节点已经和集群正确同步之后,可以通过下面的命令来确认数据和模式:
$ cd mysql
$ tail data/`hostname`.err
$ bin/mysql -uroot -e "SHOW SCHEMAS"
$ bin/mysql -uroot
gamma> PAGER md5sum
gamma> SELECT * FROM book3.numbers ORDER BY id;
gamma> NOPAGER

可以在新建的test3模式中运行之前的存储过程和数据,然后确认最前的两个节点接收了全部数据。

其他特性

除了已经讨论过的功能外,Galera还有其他一些在生产环境中重要的功能特性,包括下面这些:
. Galera提供了一个独立的仲裁线程(garbd守护线程),这个线程是个不存储数据的Galera节点。garbd节点可以帮助我们以一种更优的方式检测和处理网络分裂。将garbd节点放在合适的位置,可以有效防止主节点分裂的问题。
. Galera支持SSL通信,这对于添加安全机制是十分重要的,尤其是在云部署环境中。可以通过socket.ssl_cert 和 socket.ssl_key来定义。开启SST时,根据使用的不同的方法,会有一些额外的需要注意的地方。
. SST中可以使用自定义的方法在新节点上获取初始化数据集。
. 如果将执行方法由全部指定隔离(Total Order Isolation)更改为逐级模式升级,就可以执行在线逐级模式更新(Rolling Schema Upgrade, RSU)。虽然默认的TOI方法是可预见的,并且保证了数据一致性,但在执行长时间运行的ALTER语句时,却限制了集群的高可用性等其他指标。这个特性可以让那些在一般MySQL下阻塞的ALTER语句变得更高效,当然也会带来一些需要注意的事项。

Galera集群实现方案推荐

强烈推荐在生产环境中至少安装两个Galera节点,或者确保有一个单独的仲裁节点。garbd守护进程可以在最少两个节点的集群中避免主节点分裂的情况。可以在这里找到更多相关信息:http://www.codership.com/wiki/doku.php?id=galera_arbitrator。

在集群环境中,mysqld_safe封装守护进程并不是理想的处理自动MySQL重启的解决方案。想要支持多种灾难恢复方案,还需要在生产环境中做进一步的工作。例如,可用的软件发布流程和适当的服务启动与关闭步骤也是必要的。

Oli Sennhauser编写的用于MySQL的FromDual性能监视器(MPM)提供了监控功能,并且支持图表化重要的Galera集群触发器。这些监视器都可以和Zabbix(一款开源的监控工具)一起使用。可以从这里了解更多关于MPM的信息:http://fromdual.com/mpm-0-9-is-out。

目前还没有关于何时能有支持其他通用监控工具的MySQL监控插件可用的消息。所有生产环境都需要有足够的监控和告警机制。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值