完全屬於我自己的Blog,運行在我的路由器H218N上.記錄著我想記錄的文字.

标签 MySQL 下的文章

05月 10

基于复制的MySQL高可用技术

双Master

双Master是非常常用的高可用拓扑结构。两个Master互相复制数据以保持同步,因为是对称的,所以设置起来非常简单。而双主架构又可细分为Active-Passive模式和Active- Active模式。它们都常常搭配共享存储使用,或者低成本的DRBD技术,可以理解为“网络的RAID”实现。

双主Active-Passive架构

Active-Passive模式的拓扑架构示意图如下:

Active- Passive模式

两台Master彼此互为镜像,并且binlog二进制文件存储在共享磁盘之上。这意味着主Master到备Master的切换速度很快,而且Slave也不需要将binlog的文件和位置进行调整,唯一需要做的便这是CHANGE MASTER了。
在Active-Passive模式的双主架构中,最需要注意的便是脑裂(split-brain syndrome)问题了。造成脑裂很有可能是主Master发生故障进入修复期,此时备Master接管服务。不幸的是心跳线或监听服务也发生了故障,那么当主Master完成修复回来时,备Master无法洞悉这一情况,那么将出现两个Master同时运行,那么很有可能出现数据更新的冲突,导致Slave复制出现脏数据。因此,将竭尽全力避免脑裂的发生。值得庆幸的是DRBD内置已经以优雅的方式解决了脑裂split-brain syndrome问题,而共享存储则依赖于该产品自身的处理方式。

阅读全文 >>

05月 10

MySQL热备份

环境设定

假设有3台MySQL服务器,分别为Master,Standby,Slave.
其实Standby也是一个Slave,只是叫法不一样而已.

切换Master原理

切换Master的一个基本思路就是:Slave和Standby在完全相同的位置停止运行,然后把Slave重定向到Standby.

模拟真实场景

场景准备

当数据量大时,StandbySlave的数据可能不一样
(如其中一个快的把Master的完全同步好,另外一个同步进度稍微落后)
即Slave和Standby不在完全相同的位置停止运行.
现假定Slave稍微落后,连上Slave,执行

阅读全文 >>

04月 26

MySQL二进制日志使用技巧

一、MySQL主从的原理

1、Replication 线程

MySQL的 Replication 是一个异步的复制过程(mysql5.1.7以上版本分为异步复制和半同步两种模式),从一个 MySQL instace(我们称之为 Master)复制到另一个 MySQL instance(我们称之 Slave)。
在 Master 与 Slave 之间的实现整个复制过程主要由三个线程来完成,其中两个线程(Sql线程和IO线程)在 Slave 端,另外一个线程(IO线程)在 Master 端。
要实现 MySQL 的 Replication ,首先必须打开 Master 端的Binary Log(mysql-bin.xxxxxx)功能,否则无法实现。
因为整个复制过程实际上就是Slave从Master端获取该日志然后再在自己身上完全 顺序的执行日志中所记录的各种操作。打开 MySQL 的 Binary Log 可以通过在启动 MySQL Server 的过程中使用 “—log-bin” 参数选项,或者在 my.cnf 配置文件中的 mysqld 参数组([mysqld]标识后的参数部分)增加 “log-bin” 参数项。

2、MySQL 复制的基本过程如下:

2.1.Slave 上面的IO线程连接上 Master,并请求从指定日志文件的指定位置(或者从最开始的日志)之后的日志内容;

2.2. Master 接收到来自 Slave 的 IO 线程的请求后,通过负责复制的 IO 线程根据请求信息读取指定日志指定位置之后的日志信息,返回给 Slave 端的 IO 线程。返回信息中除了日志所包含的信息之外,还包括本次返回的信息在 Master 端的 Binary Log 文件的名称以及在 Binary Log 中的位置;

2.3. Slave 的 IO 线程接收到信息后,将接收到的日志内容依次写入到 Slave 端的Relay Log文件(mysql-relay-bin.xxxxxx)的最末端,并将读取到的Master端的bin-log的文件名和位置记录到master- info文件中,以便在下一次读取的时候能够清楚的高速Master“我需要从某个bin-log的哪个位置开始往后的日志内容,请发给我”

2.4. Slave 的 SQL 线程检测到 Relay Log 中新增加了内容后,会马上解析该 Log 文件中的内容成为在 Master 端真实执行时候的那些可执行的 Query 语句,并在自身执行这些 Query。这样,实际上就是在 Master 端和 Slave 端执行了同样的 Query,所以两端的数据是完全一样的。

阅读全文 >>

04月 24

数据库主从服务器搭建(克隆Master与克隆Slave)

环境设定

Master服务器资料

IP:192.168.1.100
PORT:3306
用户名:root
密码:root
Slave用户:repl_user
Slave密码:root

Slave服务器资料

参考数据库主从服务器搭建(一主一从)")

克隆Master

以下操作在Master服务器上进行

要克隆Master,先要把Master的数据备份出来,为避免备份时数据有所变化,先把还在缓冲区没写入表中的数据写到表中,并锁定服务器,不让再进行写操作.

FLUSH TABLES WITH READ LOCK;

备份服务器中所有数据库到sql文件,注意!!锁定表后,不能退出MySQL!!一旦退出MySQL,会自动解锁!

mysqldump -h192.168.1.100 --port=3306 -uroot -proot --all-databases > master_all.sql

备份单个数据库(如inti)时可用

 mysqldump -h192.168.1.100 --port=3306 -uroot -proot --databases init > init.sql

获取当前二进制日志的文件名和位置

SHOW MASTER STATUS;
+-------------------+----------+--------------+------------------+
| File              | Position | Binlog_Do_DB | Binlog_Ignore_DB |
+-------------------+----------+--------------+------------------+
| master-bin.000003 |     2670 |              |                  |
+-------------------+----------+--------------+------------------+

现在可以解除数据服务器的锁定

UNLOCK TABLES;

阅读全文 >>

04月 24

Ubuntu 下的MySQL多实例运行

创建配置文件

举例如下,多运行一个监听3309端口的MySQL实例,把原来的my.cnf复制一份到/etc/mysql/my3309.cnf
修改成以下配置

[client]
port        = 3309
socket        = /var/run/mysqld/mysqld3309.sock

[mysqld_safe]
socket        = /var/run/mysqld/mysqld3309.sock
nice        = 0

[mysqld]
user        = mysql
pid-file    = /var/run/mysqld/mysqld3309.pid
socket        = /var/run/mysqld/mysqld3309.sock
port        = 3309
datadir        = /var/lib/mysql3309

由于Ubuntu使用了一种安全软件叫做AppArmor,这个安全软件会在你的文件系统中创建一个允许应用程序访问的区域(专业术语:应 用程序访问控制)。如果不为MySQL修改AppArmor配置文件,永远也无法为新设置的存储位置启动服务。

阅读全文 >>