通过 SSL 对 mysql 副本进行校验

通过 SSL 对 mysql 副本进行校验

经过几个小时的努力才理解 percona toolkits (2.1) pt-table-checksum 的工作方式,我尝试了一下。

情况

  • 运行 MySQL 复制(主主动:主:被动)
  • 从属用户需要通过 SSL 连接
  • pt-table-checksum 无法连接到从站

问题

  • 对于需要 SSL 的 mysql “checksum” 用户,pt-table-checksum 对我来说不起作用

解决方案的想法

  • 是在活动主机上使用 pt-table-checksum,
  • 检查通过 ssh 隧道本地连接的 MySQL-Slave,
  • 使用“校验和”的用户无需使用 SSL

问题

  1. pt-table-checksum (2.1) 真的无法通过 SSL 连接吗?
  2. 如何配置 pt-table-checksum 以(仅)连接到未内部配置的从站
  3. DSN 选项能解决这一问题吗?
  4. 如果是的话:我不明白它是如何工作的。你能帮我解答一下吗?
  5. 我应该使用旧版本还是 maatkit ?(因为我可以在命令行上配置主/从)
  6. 完全:当 pt-table-checksum 无法通过 SSL 工作时,在不安全的网络上对副本进行校验的最佳做法是什么?

满怀希望:)

答案1

我从未尝试过主主复制,但我已经使用 pt-table-checksum 设置了 SSL 连接。希望下面的注释可以帮助解答您的一些与 SSL 相关的问题。

在我的例子中,我使用 SSL 连接设置了主从复制,并且使用的是 Percona Toolkit 2.1.2。由于设置方法并不明显,我认为我的笔记可能会帮助您节省一些时间和精力。下面是一个示例,说明如何使 pt-table-checksum 连接与主数据库服务器和从数据库服务器建立 SSL 连接。

关键是通过使用“--recursion-method dsn”设置将默认文件(例如 -F=/etc/my.cnf.percona)明确传递给从服务器,从而将 DSN 信息(包含 SSL 设置)传递给从服务器。根据我在 Percona 网站上阅读的内容以及通过查看 pt-table-checksum 代码,在 Percona Toolkit 的后续版本中(我相信从 2.0 开始),DSN 信息不会从一个连接复制到下一个连接。因此,您必须单独设置从服务器连接,而不必与主服务器连接。

使用以下方法传递从属连接的 DSN 信息:
--recursion-method dsn="D=percona,t=dsns,F=/etc/my.cnf.percona"

假设:
a. “percona”数据库帐户具有 Percona 的 pt-table-checksum 的适当权限。我建议使用“REQUIRE SSL”来确保该帐户需要使用 SSL 连接。b
. 从属服务器和主服务器设置为使用 SSL 连接

注意:以下所有步骤均在主机上完成。

(1)为了传递 DBI 连接的 SSL 设置(即 DSN 配置),请为 percona 软件专门创建一个单独的 my.cnf 文件。

    /etc/my.cnf.percona
    [客户]
    SSL=1
    用户=percona
    密码=xxxxxxxxx
    ssl-capath=/etc/mysql/ca/crt

    /etc/my.cnf.percona 文件将用于设置与主服务器和从服务器的 SSL 连接。

    由于文件包含密码,请确保设置所有权和权限:
    chown root:root /etc/my.cnf.percona(如果它还不属于 root 或系统帐户)
    chmod 0600 /etc/my.cnf.percona

(2)测试/etc/my.cnf.percona 设置

  
    #mysql--defaults-file=/etc/my.cnf.percona--host slave.domain.com
    mysql> \s
    --------------
    mysql Ver 14.14 Distrib 5.5.23,适用于 Linux (x86_64),使用 readline 5.1

    连接 ID:162
    当前数据库:   
    当前用户:       [电子邮件保护]
    SSL:使用的密码是 DHE-RSA-AES256-SHA
    当前寻呼机:stdout
    使用输出文件:''
    使用分隔符:;
    服务器版本:5.5.23-log MySQL 社区服务器(GPL)
    协议版本:10
    连接:通过 TCP/IP 的 slave.domain.com
    服务器字符集:latin1
    数据库字符集:latin1
    客户端字符集:utf8
    连接字符集:utf8
    TCP 端口:3306
    正常运行时间:2 天 2 小时 8 分 7 秒


    #mysql--defaults-file=/etc/my.cnf.percona--host master.domain.com
    mysql> \s
    --------------
    mysql Ver 14.14 Distrib 5.5.23,适用于 Linux (x86_64),使用 readline 5.1

    连接 ID:581433
    当前数据库:   
    当前用户:       [电子邮件保护]
    SSL:使用的密码是 DHE-RSA-AES256-SHA
    当前寻呼机:stdout
    使用输出文件:''
    使用分隔符:;
    服务器版本:5.5.23-log MySQL 社区服务器(GPL)
    协议版本:10
    连接:通过 TCP/IP 的 master.domain.com
    服务器字符集:latin1
    数据库字符集:latin1
    客户端字符集:utf8
    连接字符集:utf8
    TCP 端口:3306
    正常运行时间:9 天 3 小时 5 分 49 秒

(3)在master上的percona数据库中设置DSN表

    在主服务器上:
    创建 percona 数据库(如果它尚不存在):

    mysql>创建数据库percona;

    如果 percona 数据库已经存在,并且您想要从头开始重做所有事情,请删除校验和和 dsns 表(如果它们已经存在):

    mysql> drop table percona.checksums; -- 仅当您确定要重新开始并重做所有事情时才执行此操作
mysql> drop table percona.dsns; -- 可以删除它,我们将在下一步重新创建它
在 percona 数据库中创建 dsns 表:
mysql>使用 percona; mysql> 创建表`dsns`( -> `id` int(11) 非空 AUTO_INCREMENT, -> `parent_id` int(11) DEFAULT NULL, -> `dsn` varchar(255) NOT NULL, -> 主键 (`id`) -> ); 将从属信息插入表中: mysql> 插入 dsns (dsn) 值 (“h=slave.domain.com”);

(4)运行 pt-table-checksum,并使用“--recursion-method dsn”设置将默认文件(-F=/etc/my.cnf.percona)明确传递给从属服务器

    /usr/bin/pt-table-checksum -F /etc/my.cnf.percona h=master.domain.com --recursion-method dsn="D=percona,t=dsns,F=/etc/my.cnf.percona"

    主连接使用“-F /etc/my.cnf.percona h=master.domain.com”
    从属连接使用 '--recursion-method dsn="D=percona,t=dsns,F=/etc/my.cnf.percona"'

这应该在 percona 数据库中创建校验和表,并使用 SSL 连接连接到从属服务器(和主服务器)。

答案2

我从未使用过 percona 工具包,但在我看来

(2)pt-表校验和并非设计用于“连接”从属设备;它旨在直接在某些机器上运行并在同一台机器上生成校验和(并可选择连接到主机)。

(6)对于一般文件,通过不安全的网络对副本进行校验的最佳做法是:通过 ssh 隧道进行 rsync。A b C d (这里所说的“rsync”是指 rsync 协议,许多实用程序(rsync 实用程序、duplicity、rsyncrypto、rdiff-backup、dirvish 等)内部都使用该协议。我偶尔会使用rsync --dryrun它来执行校验和,以告诉我备份/从属是否与主服务器相同。但我更经常运行不带 --dryrun 选项的 rsync。如果没有该选项,如果检测到任何差异,rsync 会自动继续将备份/从属服务器更新为最新状态。

遗憾的是,对于写入活动频繁的数据库,磁盘上的数据库映像(rsync 所能看到的所有内容)通常处于不一致的状态。为了允许 rsync 生成有用的备份/副本,我们通常需要短暂关闭链路两端的数据库软件,使其将 RAM 中的所有数据刷新到磁盘,执行 rsync 更新,然后重新启动数据库软件。这通常非常快,因为通常绝大多数数据都是不变的,而 rsync 仅传输实际已更改的少数数据部分。

(据我所知,“pt-table-sync”等数据库感知实用程序相对于 rsync 的唯一优势是,这些数据库感知实用程序显然以某种方式完成同步到一致状态而无需关闭数据库软件)。

相关内容