MySQL Master/Slave 集群
MySQL Master/Slave 集群
2010.05.25
陈 恒
一 安装
1. 下载mysql-5.1.40源码
2. 编译
#配制
Shell> ./configure --prefix=/vogins/lib/mysql --with-charset=utf8 --with-mysqld-user=mysql --with-plugins=max
--prefix : 主安装目录
--with-charset : 数据库默认编码
--with-mysqld-user : 指定运行mysqld 精灵进程的用户
--with-plugins : 支持的数据引擎插件
#编译
Shell> make
#安装
Shell> make install
3. 在其它服务器上执行步骤2
二 配制
1. 初始化数据库
#转到mysql主目录
Shell> cd /vorgins/lib/mysql
#初始化数据库
Shell> bin/mysql_install_db --user=mysql
2. 在其它服务器上执行步骤1
3. 编辑Master数据库的my.cnf文件
#拷贝my-large.cnf到/etc/my.cnf 。默认的配制已经主持Master/Slave复制。
cp share/mysql/my-large.cnf /etc/my.cnf
4. 启动Master
#使用mysql来运行mysqd daemon
bin/mysqld_safe –user=mysql &
5. 修改Master数据库root密码:
Shell> mysqladmin -uroot -p password 'lark@vogins'
6. 登陆Master数据库
Shell> mysql –uroot –plark@vogins
7. 设置复制帐户(该帐户必需授予REPLICATION SLAVE权限)
Mysql> GRANT REPLICATION SLAVE ON *.* TO 'repl'@'%.vogins.com' IDENTIFIED BY 'repl@vogins';
8. 为Master做快照(如果是新安装的数据库,这一步可以不做)
#语句清空所有表和块写入语句,对于InnoDB引擎,还回锁定COMMIT操作
Mysql> FLUSH TABLES WITH READ LOCK ;
# 用tar工具创建数据备份 (别开窗口,不要将mysql客户端窗口关闭,保持表全局读## 锁)
Shell> tar –cvf /tmp/master-snapshot.tar ./var/
# 将此文件传到Slave数据库服务器上的/tmp下,解压文件,并有需要的数据库目录文### 件拷贝到Slave 的数据库主目录下的/var/目录下。
Shell> tar –xvf /tmp/master-snapshot.tar
Shell> cp your-db $MYSQL/var/
# 回到Master数据库中,取消全局读锁
Mysql> UNLOCK TABLES ;
#对于InnoDB,最好是在锁定表后关闭Master后再做快照。方法基本一致,只是在锁定## 后关闭数据,快照后重新启动数据库。
Shell>bin/mysqladmin –uroot –plark@vogins shutdown
9. 设置Slave数据库的my.cnf文件
#拷贝my-large.cnf到/etc/my.cnf 。
cp share/mysql/my-large.cnf /etc/my.cnf
#调整Slave配制文件参数
#注释掉二进制日志,从服务器不需要
Vim > #log-bin=mysql-bin
Vim> #binlog_format=mixed
#修改server-id,且不能与Master及其它Slave相同
Vim> server-id = 2
Vim> master-host = lark.vogins.com
Vim> master-user = repl
Vim> master-password = repl@vogins
#排除不需要同步的数据库
Vim> replicate-ignore-db = mysql,test
#其它配制不做调整。
10. 启动 Slave
#使用mysql来运行mysqd daemon
# 请注意要确保Master允许 Slave来访问 3306端口。
bin/mysqld_safe –user=mysql &
11. 修改Master数据库root密码:
Shell> mysqladmin -uroot -p password 'loon@vogins'
12. 登陆Slave数据库
Shell> mysql –uroot –ploon@vogins
13. 查看Slave运行状态
Mysql> show slave status
三 管理
3.1 管理Master服务器
Ø PURGE MASTER LOGS
PURGE {MASTER | BINARY} LOGS TO 'log_name'
PURGE {MASTER | BINARY} LOGS BEFORE 'date'
用于删除列于在指定的日志或日期之前的日志索引中的所有二进制日志。这些日志也会从记录在日志索引文件中的清单中被删除,这样被给定的日志成为第一个。
例如:
PURGE MASTER LOGS TO 'mysql-bin.010';
PURGE MASTER LOGS BEFORE '2003-04-02 22:46:26';
BEFORE变量的date自变量可以为'YYYY-MM-DD hh:mm:ss'格式。MASTER和BINARY是同义词。
如果您有一个活性的从属服务器,该服务器当前正在读取您正在试图删除的日志之一,则本语句不会起作用,而是会失败,并伴随一个错误。不过,如果从属服务器是休止的,并且您碰巧清理了其想要读取的日志之一,则从属服务器启动后不能复制。当从属服务器正在复制时,本语句可以安全运行。您不需要停止它们。
要清理日志,需按照以下步骤:
1. 在每个从属服务器上,使用SHOW SLAVE STATUS来检查它正在读取哪个日志。
2. 使用SHOW MASTER LOGS获得主服务器上的一系列日志。
3. 在所有的从属服务器中判定最早的日志。这个是目标日志。如果所有的从属服务器是更新的,这是清单上的最后一个日志。
4. 制作您将要删除的所有日志的备份。(这个步骤是自选的,但是建议采用。)
5. 清理所有的日志,但是不包括目标日志。
Ø RESET MASTER
可以删除列于索引文件中的所有二进制日志,把二进制日志索引文件重新设置为空,并创建一个新的二进制日志文件。
Ø SET SQL_LOG_BIN
SET SQL_LOG_BIN = {0|1}
如果客户端使用一个有SUPER权限的账户连接,则可以禁用或启用当前连接的二进制日志记录。如果客户端没有此权限,则语句被拒绝,并伴随有错误。
Ø SHOW BINLOG EVENTS
SHOW BINLOG EVENTS
[IN 'log_name'] [FROM pos] [LIMIT [offset,] row_count]
用于在二进制日志中显示事件。如果您不指定'log_name',则显示第一个二进制日志。
Ø SHOW MASTER LOGS
SHOW MASTER LOGS
SHOW BINARY LOGS
用于列出服务器中的二进制日志文件。
Ø SHOW MASTER STATUS
SHOW MASTER STATUS
用于提供主服务器二进制日志文件的状态信息。
Ø SHOW SLAVE HOSTS
SHOW SLAVE HOSTS
用于显示当前使用主服务器注册的复制从属服务器的清单。不以--report-host=slave_name选项为开头的从属服务器不会显示在本清单中。
3.2 管理Slave服务器
Ø CHANGE MASTER TO
CHANGE MASTER TO master_def [, master_def] ...
master_def:
MASTER_HOST = 'host_name'
| MASTER_USER = 'user_name'
| MASTER_PASSWORD = 'password'
| MASTER_PORT = port_num
| MASTER_CONNECT_RETRY = count
| MASTER_LOG_FILE = 'master_log_name'
| MASTER_LOG_POS = master_log_pos
| RELAY_LOG_FILE = 'relay_log_name'
| RELAY_LOG_POS = relay_log_pos
| MASTER_SSL = {0|1}
| MASTER_SSL_CA = 'ca_file_name'
| MASTER_SSL_CAPATH = 'ca_directory_name'
| MASTER_SSL_CERT = 'cert_file_name'
| MASTER_SSL_KEY = 'key_file_name'
| MASTER_SSL_CIPHER = 'cipher_list'
可以更改从属服务器用于与主服务器进行连接和通讯的参数。
MASTER_USER, MASTER_PASSWORD, MASTER_SSL, MASTER_SSL_CA, MASTER_SSL_CAPATH,MASTER_SSL_CERT, MASTER_SSL_KEY和MASTER_SSL_CIPHER用于向从属服务器提供有关如何与主服务器连接的信息。
Ø LOAD DATA FROM MASTER
LOAD DATA FROM MASTER
本命令用于对主服务器进行快照,并拷贝到从属服务器上。它可以更新MASTER_LOG_FILE和MASTER_LOG_POS的值,这样,从属服务器就可以从正确的位置开始进行复制。使用--replicate-*-do-*和--replicate-*-ignore-*选项指定的表和数据库排除规则均被兑现。--replicate-rewrite-db没有被考虑。这是因为使用本选项,用户就可以设置一个例如--replicate-rewrite-db=db1->db3和--replicate-rewrite-db=db2->db3的非唯一映射。当从主服务器载入表时,该映射会使从属服务器发生混淆。
本语句的使用受以下条件的制约:
· 只对MyISAM表起作用。如果试图载入一个非MyISAM表,会导致以下错误:
· ERROR 1189 (08S01): Net error reading from master
· 当拍摄快照时,会获得对主服务器的全局读取锁定。在载入操作期间,该锁定会阻止对主服务器的更新。
如果您正在载入大表,您可能必须对主服务器和从属服务器均增加net_read_timeout和net_write_timeout值。
LOAD DATA FROM MASTER不从mysql数据库拷贝任何表。这可以更容易地让主服务器和从属服务器拥有不同的用户和权限。
LOAD DATA FROM MASTER语句要求用于连接主服务器的复制帐户,以便让主服务器拥有RELOAD和SUPER权限,并让所有您想要载入的主服务器表拥有SELECT权限。所有的用户不拥有SELECT权限的主服务器表均被LOAD DATA FROM MASTER忽略。这是因为主服务器会对用户隐藏它们:LOAD DATA FROM MASTER会调用SHOW DATABASES以了解要载入的主服务器数据库,但是SHOW DATABASES只会返回用户有部分权限的数据库。在从属服务器方面,发布LOAD DATA FROM MASTER的用户应拥有授权,以取消或创建被复制的数据库和表。
Ø LOAD TABLE tbl_name FROM MASTER
LOAD TABLE tbl_name FROM MASTER
用于把表的拷贝从主服务器转移到从属服务器。本语句的主要作用是调试LOAD DATA FROM MASTER。它要求用于连接主服务器的帐户拥有对主服务器的RELOAD和SUPER权限,并拥有对要载入的主服务器表的SELECT权限。在从属服务器方面,发布LOAD TABLE FROM MASTER的用户应拥有取消和创建表的权限。
用于LOAD DATA FROM MASTER的条件也适用于这里。举例说明,LOAD TABLE FROM MASTER仅对于MyISAM表起作用。对LOAD DATA FROM MASTER的暂停注意也适用。
Ø MASTER_POS_WAIT()
SELECT MASTER_POS_WAIT('master_log_file', master_log_pos)
这实际上是一个函数,而不是一个语句。它被用于确认,从属服务器已读取并执行了到达主服务器二进制日志的给定位置。
Ø RESET SLAVE
RESET SLAVE
用于让从属服务器忘记其在主服务器的二进制日志中的复制位置。本语句被用于进行一个明确的启动:它会删除master.info和relay-log.info文件,以及所有的中继日志,并启动一个新的中继日志。
注释:所有的中继日志被删除,即使它们没有被从属服务器SQL线程完全的执行。(如果您已经发布了一个SLAVE语句或如果从属服务器的载入量很大,则这对于一个复制从属服务器是一个很可能出现的情况。)
存储在master.info文件中的连接信息通过使用在对应的启动选项中指定的值,被立即重新设置了。此信息包括主服务器主机、主服务器接口、主服务器用户和主服务器 密码等值。当从属服务器SQL线程被中止时,它位于正在复制的临时表的中间,并且发布了RESET SLAVE,则已被复制的临时表在从属服务器中被删除。
Ø SET GLOBAL SQL_SLAVE_SKIP_COUNTER
SET GLOBAL SQL_SLAVE_SKIP_COUNTER = n
从主服务器中跳过后面的n个事件。要复原由语句导致的复制中止,这是有用的。
仅当从属线程没有正在运行时,本语句时有效的。否则,会产生一个错误。
Ø SHOW SLAVE STATUS
SHOW SLAVE STATUS
用于提供有关从属服务器线程的关键参数的信息。如果您使用mysql客户端发布此语句,则您可以使用一个\G语句终止符来获得更便于阅读的竖向版面,而不是使用分号:
Ø START SLAVE
START SLAVE [thread_type [, thread_type] ... ]
START SLAVE [SQL_THREAD] UNTIL
MASTER_LOG_FILE = 'log_name', MASTER_LOG_POS = log_pos
START SLAVE [SQL_THREAD] UNTIL
RELAY_LOG_FILE = 'log_name', RELAY_LOG_POS = log_pos
thread_type: IO_THREAD | SQL_THREAD
不含选项的START SLAVE会同时启动两个从属服务器线程。I/O线程从主服务器中读取查询,并把它们存储在中继日志中。SQL线程读取中继日志并执行查询。START SLAVE要求SUPER权限。
如果START SLAVE成功地启动了从属服务器线程,则会返回,不会出现错误。但是,即使在此情况下,也有可能出现这样的现象——服务器线程启动了,然后又停止了(例如,因为它们没有成功地连接到主服务器上,或者没有能读取二进制日志,或者出现了其它问题)。START SLAVE对此不会发出警告。您必须检查从属服务器的错误日志,查看是否有由从属服务器线程产生的错误消息,或者使用SHOW SLAVE STATUS检查它们是否运行正常。
您可以把IO_THREAD和SQL_THREAD选项添加到语句中,指明哪些线程将要启动。
可以添加一个UNTIL子句,指定从属服务器应启动并运行,直到SQL线程达到主服务器二进制日志中的一个给定点为止。当SQL线程达到此点时,它会停止。如果在该语句中指定了SQL_THREAD选项,则它只会启动SQL线程。否则,它会同时启动两个从属服务器线程。如果SQL线程正在运行,则UNTIL子句被忽略,并发布一个警告。
对于一个UNTIL子句,您必须同时指定一个日志文件名和位置。不要把主服务器和中继日志选项混合在一起。
UNTIL条件由一个后续的STOP SLAVE语句,或一个不包括UNTIL子句的START SLAVE语句,或一个服务器重启命令重新设置。
UNTIL子句对于调试复制操作是有用的,或者可用于促使复制操作继续,直到接近一个特定的点时为止,在此点,您想要避免让从属服务器复制一个语句。举例说明,如果在主服务上执行了一个不明智的DROP TABLE语句,您可以使用UNTIL来告知从属服务器,执行到此点就停止,不要再继续了。要查找该事件是什么,需对主服务器日志或从属中继日志使用mysqlbinlog,或通过使用SHOW BINLOG EVENTS语句。
如果您正在使用UNTIL,让从属服务器成段地处理已复制的查询,则建议您使用--skip-slave-start选项来启动从属服务器,以防止当从属服务器启动时,SQL线程运行。最好在一个选项文件中使用此选项,而不是在命令行中使用,这样,如果发生了意料外的服务器重新启动,它也不会被忘记。
SHOW SLAVE STATUS语句包括了输出字段。这些字段显示了UNTIL条件的当前值。
在以前版本的MySQL中,本语句被称为SLAVE START。在MySQL 5.1中仍然接受这种用法,以便与以前版本兼容。但现在不赞成使用。
Ø STOP SLAVE
TOP SLAVE [thread_type [, thread_type] ... ]
支持请点击这里
推荐阅读
-
MySQL中间件之ProxySQL(12):ProxySQL集群
-
Mysql基于Mysql Cluster+MysqlRouter的集群部署方案
-
MySQL集群架构01MySQL架构的关注点
-
MySQL集群读写分离的自定义实现
-
MYSQL5.6.33数据库主从(Master/Slave)同步安装与配置详解(Master-Linux Slave-windows7)
-
MySQL集群高可用
-
基于mysql+mycat搭建稳定高可用集群负载均衡主备复制读写分离操作
-
集群rpm安装MySQL步骤详解
-
使用Docker部署MySQL 5.7&8.0主从集群的方法步骤
-
MySQL主库binlog(master-log)与从库relay-log关系代码详解