Galera Cluster 的局限以及它所不适应的场合

Galera Cluster 是主流的MySQL 多活多主高可用方案之一,即使在 InnoDB Cluster (Group Replication)发布以后。

Galera Cluster 是主流的MySQL 多活多主高可用方案之一,即使在 InnoDB Cluster (Group Replication)发布以后。

Galera Cluster 是主流的MySQL 多活多主高可用方案之一,即使在 InnoDB Cluster (Group Replication)发布以后。

重要的话说三遍:)

然而 Galera Cluster 所采用的技术方案,以及它所依赖的一些技术,使得它在标准的MySQL基础上有一些限制。

首先,它只支持 InnoDB系列的引擎。这对于很多应用而言不是大的问题。InnoDB是最广泛使用的MySQL 引擎, Group Replication 也是要求InnoDB。

第二,它不支持XA分布式事务协议。XA分布式事务协议,在传统的企业应用中很常用 …

Continue Reading

使用mysqldump 时,备份文件的压缩与恢复

mysqldump备份出来的文件是文本格式的,可压缩比很高,压缩后不到原来的十分之一。因此备份后应该压缩,这样传输快,存放省空间。本文介绍的方法是结合gzip,使得备份和恢复都直接使用压缩文件。

备份过程

$ mysqldump <dump options> | gzip > mydump.sql.gz

恢复过程

$ gzip -cd mydump.sql.gz | mysql <mysql options>

注意:习惯使用tar来打包和压缩文件的人,在上述的备份过程会发现tar没有合适的选项来直接打包管道输入内容,但从tar的打包压缩文件中直接解压解包恢复是可以的。

$ tar -zxf mysql.sql.tgz -O | mysql <mysql options>

注意: MySQL的备份工具和备份方法都有多种。mysqldump适合数据量较小的全量备份。如果数据量大,或者需要在备份过程中控制对服务器的IO压力等更多的控制,或需要做增量备份等,应该使用 MySQL Enterprise Backup 或 Percona …

Continue Reading

为什么 MySQL Galera Cluster 要求至少三个节点

节点数量的重要性是在发生网络故障的情况下体现出来的。在发生网络故障时,节点可能被分隔为多个互不连通的子集合,Galera Cluster 采用多数票 Quorum 的机制来选择一个票数多的子集合为其活集群,把其他的子集合作为故障节点排除在外,从而避免了数据不一致的问题。如果只有两个节点或者偶数个节点,如果发生了网络故障,那么可能分割出来的子集合节点数相同,无法通过多数票机制选出活集群。如果有三个或奇数个节点,如果发生了一次网络故障,那么割裂出来的子集合节点数肯定是一边多,一边少,从而能顺利地选出多的子集合为活集群。

上面基于节点数的多数票机制是一种简化的描述。Galera Cluster采用的多数票机制是可以给每个节点配置投票权数的。默认情况下是一个节点一票,可以设置为0到255的数字,而且这个数字是可以动态配置的。当集群发生了故障导致新的活集群内节点数量变为偶数时,可以通过动态调整投票权数,使得总票数为奇数。如果将节点的权重设置为0,则该节点作为slave存在。这是在Galera Cluster中实现类似传统的Master Slave 模式的方法。

此外, Galera Cluster 还支持一种只投票但不实际存放数据的节点类型 Arbitrator,它也有助于形成奇数票来帮助处理网络故障下的活集群选择。

上文中使用了“子集合”、“活集群”的说法,只是形象的描述。在 Galera Cluster的文档中,由网络故障 (network …

Continue Reading

Orchestrator 管理 MySQL 数据库复制环境

Orchestrator 提供了Web界面、命令行和API三种方式来管理MySQL的复制(Replication)集群。它不仅能够显示复制关系,还能改变复制关系,自动切换master到具有最新数据的slave上。如果MySQL的数据目录是单独的LVM分区,则可以与orchestrator-agent搭配,还能很方便地创建加入新的slave节点,修复故障slave节点。

Orchestrator及Orchestrator-agent是 Shlomi Noach 在booking.com, outbrain,及github.com(目前在职)期间开发的MySQL DBA工具。Orchestrator应用于管理这几家企业中上千台的MySQL实例。 目前作者的主要精力放在Orchestrator上,其相应的文档也更齐全,也提供了编译好了的二进制包、以及deb、rpm包供下载。而Orchestrator-agent则相对欠缺得多,需要自己打包。

基于Orchestrator的命令行或API,我们可以进一步集成到监控系统中,从而及时发现节点故障。也可以在Orchestrator的一些地方集成进其他的MySQL高可用重要的功能,比如如何告诉应用程序最新的master节点,或者移动vip,或者更新dns记录等。

知名的MySQL咨询公司Percona的博客上有两篇介绍它们的文章。第一篇是 Orchestrator: MySQL Replication Topology Manager ,第二篇是 Orchestrator-agent: How to recover …

Continue Reading

MySQL Replication 相关的数据库用户权限

为了建立replication,我们需要创建哪几个账号,分别赋予什么样的权限?

假设,服务器A为master,服务器B为slave。在master上需要创建一个账号 'replica_slave_user'@'slave host', 具有replication slave的权限,允许slave服务器连接到master服务器,并获得更新log。在slave上需要创建一个账号'replica_admin_user'@'admin host',具有super权限,能建立replication,启动或停止replication等;此外,还应该赋予该用户Replication Client的权限,能查看slave status等信息。

上述内容的语句如下

# on master server A
mysql> grant replication slave on *.* to 'replica_slave_user'@'slave host'
     > identified by 'complex password';

# on slave server B
mysql> grant …

Continue Reading

mysql kill a connection

从mysql端强制断开一个数据库连接的办法是使用kill命令结束该连接。 首先,使用 show processlist 列出所有的连接,然后找到匹配的连接后,执行 kill命令即可。

mysql> show processlist;
...
mysql> kill <process id>

对于一个繁忙的系统,连接数可能很大,show processlist的输出会很长,难以寻找到目标连接。 可以把输出存放到文件中,再使用shell脚本来协助处理。

Continue Reading

mysqldump 备份账户的最小权限

root虽好,但是所有任务、尤其是脚本自动化任务里面使用root,账号暴露的风险无谓增加。因此,从安全的角度出发,对于不同的管理任务,我们应该使用相应的账号,并赋予最小权限。

mysqldump备份所需要的最小权限:

SELECT
SHOW DATABASES
SHOW VIEW
EVENT
LOCK TABLES
  1. Select 是查询表、程序、数据等所需要的权限。
  2. Show databases 是查询数据库列表所需要的权限。
  3. Show view 是查询视图定义所需要的权限。
  4. event是查询事件所需权限。
  5. lock tables是为了一致性而锁表所需要的权限。
grant SELECT, SHOW DATABASES, SHOW VIEW, EVENT, LOCK TABLES on *.* to
'backup'@'backuphost'identified by 'backup password';

Continue Reading

重置MySQL的root密码

介绍

MySQL 提供了可以用来重置root密码的启动选项。可以在mysql 启动的初始化阶段重新设置root密码, 也可以禁用权限管理系统后修改系统用户数据中的root密码。前一种方法的安全隐患较小,也是本文 会举例介绍的。

MySQL 5.5 ( 以及 5.6)提供了启动选项 init-file。在启动的初始化阶段,会读取并执行该文件中的 SQL语句。利用这一机制,执行设置密码的语句,就能解决我们的问题。

步骤

首先,准备init-file reset_root.sql, 内容如下。注意: 新的密码请记得使用你自己的密码,而不要直接使用下面 代码中的这个。

set password for 'mysql'@'localhost' = password('MySecretSince2017');

然后,将该文件放到mysql进程能读取的, 安全的目录

sudo mkdir /var/dbops
sudo mv reset_root …

Continue Reading

MySQL临时目录相关问题处理

MySQL临时目录空间不足会导致很多操作问题。比如主从复制出现错误而停止,查询排序无法完成等。一般来说,我们可以通过扩大临时目录所在文件系统的大小来避免问题。

MySQL的临时目录在哪里

默认情况下,MySQL根据环境变量的设置作为其临时目录。Linux中为TMPDIR,Windows中为TMPDIR, TEMP, TMP。如果未能找到,则使用系统的常见临时目录。Linux中为/tmp, /var/tmp, /usr/tmp等;在Windows中c:\Windows\Temp等。

此外,还可以在mysqld启动参数中指定临时目录。

在Linux中,

[mysqld]
tmpdir=/tmp:/var/tmp:/var/mysql/tmp

在Windows中,

[mysqld]
tmpdir=c:\\Windows\\Temp;c:\\MySQL\\Temp

请注意上面的例子中,tmpdir所设置的临时目录是可以有多个的,以路径分隔符区分。此外,该变量不能动态设置,改动以后需要重启才能生效。

在主从复制架构中 …

Continue Reading

MySQL 复制 (Replication) 中如何加入新节点

在 MySQL 的复制集群 (Replication Cluster)中,我们会需要加入新节点,或者修复损坏了的节点。这一过程也叫做 provisioning a node 或 seeding a node。如果 master 上的binlog保留了全部的操作,在数据量不大,或者对master slave的数据复制时间要求不高的情况下,可以直接让新节点从master复制。否则,我们需要先从master或某个已有的slave上备份出数据,并导入到新节点中,然后再建立复制关系。这一过程对于新的 Group Replication 依然适用,只是它的master slave角色是集群自己管理的,而不是手工设置的。

针对不同的情况,对于已有数据的导出导入可以采用物理文件的方式,也可以采用逻辑语句的方式。采用物理文件的方式效率更高,适合已有数据量特别大的情况,需要使用企业版本的工具比如 MySQL Enterprise Backup,或者 Percona 的免费的备份工具 XtraBackup,或者LVM的磁盘快照(可以参考 MySQL …

Continue Reading