mysql双主配置的1主2从架构。

2701人阅读
mysql/redis/mongo(16)
MySQL主主复制,在线修改表结构
一直以为双主架构能解决mysql的表在线DDL的需求,但没有实际测试经验。后来发现一直的想法还是有问题的。这里做一个测试。
双主架构,在线DDL的实现步骤是:
1,首先搭建主主复制架构,只有一台提供服务,这里设为A库,另一台B库空闲
2,A库停止复制stop slave
3,在B库上修改表结构,如加字段
B库完成表修改后,因为A库暂停了复制,所以DDL语句不会复制到A库。对A库没影响
4,切换读写到B库。B库提供读写服务,A库空闲
5,开启A库复制。
首先A库会复制刚才的DDL语句,实现表结构修改,然后复制数据
大致一看,上面的步骤没有问题。A/B库修改表结构,都没有影响对外服务。其实隐藏着一个问题。假设修改的表为X,在步骤3 B库修改X表时,A库上X表数据有更新,这些更新复制到B库,会等待锁,因为X表在进行DDL操作。B库修改完成以后,这些更新语句可能会执行失败,因为表结构改变可能导致更新语句出错。现实际测试如下:
A库上建表,插入数据,停止复制
& create table tbl_testonlineddl(id int);sss
mysql& insert into tbl_testonlineddl values(1);
mysql& select * from tbl_
+------+
+------+
+------+
B库上增加字段id2
mysql& alter table tbl_testonlineddl add id2
mysql& select * from tbl_
+------+------+
| id & | id2 &|
+------+------+
| & &1 | NULL |
+------+------+
A库上再插入一条数据,这里不指定字段列表
mysql& insert into tbl_testonlineddl values(2);
mysql& select * from tbl_
+------+
+------+
+------+
B库复制报错Last_Errno: 1136,字段数目不匹配。这个错误很好理解,但如果A库指定字段列表insert会怎样呢?
mysql& show slave status\G
Last_Errno: 1136
Last_Error: Error 'Column count doesn't match value count at row 1' on query.&
Default database: 'test'. Query: 'insert into tbl_testonlineddl values(2)'
测试2:dml语句指定字段名
A库上,指定字段名插入数据
mysql& insert into tbl_testonlineddl(id) values(3);
mysql& select * from tbl_
+------+
+------+
+------+
B库上,新插入数据同步成功
mysql& select * from tbl_
+------+------+
| id & | id2 &|
+------+------+
| & &1 | NULL |
+------+------+
mysql& select * from tbl_
+------+------+
| id & | id2 &|
+------+------+
| & &1 | NULL |
| & &3 | NULL |
+------+------+
结论:只要业务中的sql语句,感知不到新增字段存在,并且显示指定需要的字段名进行数据更新,那么双主架构互切轮流加字段的方法,是可行。对于修改字段或者删除字段,猜测也是一样的道理。
mysql 5.1版本增加了对主从表异构的复制支持,简要规则如下
异构复制出现版本5.1.21
主从表异构分两种情况:
1,主从表字段数目不同
满足以下条件时,主从复制可以进行:
主从表相同的字段部分,字段顺序要一样
主从表相同的字段部分,所有字段必须位于其他字段之前
主从表相同的字段部分之外,每个字段必须有default值
前两条可以简单理解为,主从表,字段少的表,它的字段是字段多的表的前缀,是一种包含被包含的关系。
2,主从表字段类型不同
简单来说,只要从库表的字段定义能够容纳主库表的字段定义,就可以在不同数据类型之间复制。另外主从表字段类型不同的复制,与binlog格式有关。
SBR:基于语句的复制,简单的规则是,只要在主库执行的语句,在从库也能成功执行,则支持主从表字段类型不同
RBR:基于行的复制,规则相对复杂,因为binlog中的数据类型与服务器的数据类型映射可能有差异
支持的数据类型转换为:
From (Master) &To (Slave)
BINARY &CHAR
BLOB &TEXT
CHAR &BINARY
DECIMAL &NUMERIC
NUMERIC &DECIMAL
TEXT &BLOB
VARBINARY &VARCHAR
VARCHAR &VARBINARY 如果字段类型转换后,精度不够,会发生数据截断。转换结果与转换模式有关:slave_type_convertions。具体规则这里就不列出了。
5.1版本中,主从表字段数目不一样的测试
mysql& create table tbl_testmsdiff(id1 int,id2 int);
mysql& insert into tbl_testmsdiff (id1,id2)values(1,1);
mysql& select * from tbl_
+------+------+
| id1 &| id2 &|
+------+------+
| & &1 | & &1 |
+------+------+
mysql& alter table tbl_testmsdiff drop column id2;
mysql& select * from tbl_
+------+
+------+
+------+
mysql& set binlog_format=
mysql& insert into tbl_testmsdiff (id1,id2)values(2,2);
mysql& select * from tbl_
+------+------+
| id1 &| id2 &|
+------+------+
| & &1 | & &1 |
| & &2 | & &2 |
+------+------+ssss
B库复制报错
Last_Errno: 1054
Last_Error: Error 'Unknown column 'id2' in 'field list'' on q
uery. Default database: 'test'. Query: 'insert into tbl_testmsdiff (id1,id2)valu
测试row模式复制
mysql& set binlog_format=
mysql& insert into tbl_testmsdiff (id1,id2)values(3,3);
mysql& select * from tbl_
+------+------+
| id1 &| id2 &|
+------+------+
| & &1 | & &1 |
| & &2 | & &2 |
| & &3 | & &3 |
+------+------+
B库复制成功
mysql& select * from tbl_
+------+
+------+
| & &3 | &&
+------+
参考知识库
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
访问:848582次
积分:7780
积分:7780
排名:第1702名
原创:121篇
转载:86篇
评论:93条
(1)(1)(3)(2)(3)(3)(6)(3)(6)(8)(15)(3)(11)(6)(8)(25)(10)(7)(11)(6)(3)(27)(15)(19)(6)?é?? Search &
°??à±????? Browse by Category
..... ?? 3/4 ???
.......... Access
.......... Microsoft SQL Server
.......... Oracle
..... ???? 1/4
.......... ?·??AE÷
.......... VPN
..........
1/2 >>>>>>>>ú
..... JAVA????·???AE÷
.......... WebLogic
.......... Websphere
..... ?? 1/4 ?/?? 1/4 ?
.......... Lotus Domino
.......... Lotus Notes
.......... Microsoft Exchange
.......... Microsoft Outlook
..... ?? 1/4 ?
.......... ?¨? 1/2 >>ú
.......... ±? 1/4 ?± 3/4
.......... ?ò??>>ú
.......... ?ae???è±,
.......... ·???AE÷
............... ??Windows Server 2003 ????·??????í?? 1/4 ? 1/4 ??????í?ó
..... AE???
..... °ì?<<?í 1/4 ?
.......... Excel
.......... Powerpoint
.......... Project
.......... Visio
.......... Word
..... ??×÷?u??
.......... AIX
.......... Microsoft Windows 98/ME/2K/XP
.......... Microsoft Windows Server
.......... Solaris
.......... Unix/Linux
..... ??? 3/4 °??<<
..... ·??????í
..... ?¤ 3/4 ss?í 1/4 ?
.......... ×??ae?í 1/4 ?
..... ?¤×÷??u?
..... ?u?¨ 1/4
.: [MySQL 1/4 ??? 1/4 ???] ?à?÷?>>??u??>>?? 1/4 òu?· 1/2 °,
[MySQL 1/4 ??? 1/4 ???] ?à?÷?>>??u??>>?? 1/4 òu?· 1/2 °,
???u 1/4 ??é??????????>>á?¨??·????? 1/2 ? 3/4 ?u??¨·???AE÷??????????u<>á,??? 1/4 AE???????óu??é·????????? 1/4 AE?u????×???u? 3/4 ???°??ù???? 3/4 ? 1/4 ???u 1/2 ?>>?é???>>?ó×??? 1/4 AE?????????ùu??????????????? 3/4 ??è???à?¨?÷?????>>?¨slave????????mysqlu????u???????>>?§???à?÷?>>?????¨???????é????·?????· 1/2 ·¨,???,? 3/4 ???,? 1/2 ? 3/4 ?· 1/2 °,>>????>>?í?? 3/4 ???????????·?>>°?>>?u????mysqld_multiu???????????????u???????????[mysqld2]datadir=/usr/local/mysql/data2/basedir=/usr/local/mysqlport& && && && &= 3307socket& && && & = /tmp/mysql1.sockpid-file=/usr/local/mysql/data2/mysql2.piddefault-storage-engine=myisamskip-innodbrelay-log=relay-bin-myisam1relay-log-index=relay-bin-myisam1.indexrelay-log-info-file=relay-log_error=log-myisam1.errlog_bin=bin-myisam1server-id=20master-host=10.50.21.16master-user=yangtingmaster-password=yangtingmaster-port=3306master-connect-retry=60[mysqld3]datadir=/usr/local/mysql/data2/basedir=/usr/local/mysqlport& && && && &= 3308socket& && && & = /tmp/mysql3.sockpid-file=/usr/local/mysql/data2/mysql3.piddefault-storage-engine=myisamskip-innodbrelay-log=relay-bin-myisam2relay-log-index=relay-bin-myisam2.indexrelay-log-info-file=relay-log_error=log-myisam2.errlog_bin=bin-myisam2server-id=23master-host=10.50.21.17master-user=yangtingmaster-password=yangtingmaster-port=3306master-connect-retry=60AE???·???AE÷??mysqld_multi start 2,3?????????????? 3/4 ??>>?ù????? 1/2 ?è?? 1/4 òu?1????16 17??·?±??? 1/2 ¨?>>??u?????±í???>>?ó????u??? 3/4 ?2??·?±????>>??u???>>§??u?? 1/4 ?é??mysql -u root -S /tmp/mysql1.sock& & mysql -u root -S /tmp/mysql3.sock& &???ù 3/4 ?>>áu?u 1/2 ??????u? 1/2 á?? ??? 1/4 >>???????slave?????>>????·?±í?? 1/4 ?u?innodb?????ó???>>??????°,?????¨?>>?????????á???????ù?>> 3/4 ?>>°You cannot freely move .ibd files between database directories as you can with MyISAM table files. This is because the table definition that is stored in the myisam shared tablespace includes the database name, and because myisam must preserve the consistency of transaction IDs and log sequence numbers. ?ó 3/4 -??????·????????>>show tables ????u 1/2 ±í????u<>??????,?±íu???±¨??,??í?ómysql--root@localhost:yangting_mult 11:07:03&&select * from dsn_ERROR ): Table 'yangting_mult.dsn_db' doesn't exist???? 3/4 ????à?÷?>>??u??>>???u?(C)· 1/2 °,????????>>????>>?? 1/2 ? 3/4 ?· 1/2 °,?? 1/2 ? 3/4 ??à?÷?>>??u???????tungsten replicator????,???>>??>>???????? 3/4 ss??· 1/2 ·¨???????????ó 1/4 ?>>???????±?u?· 1/2 °,????
??AE??????????à??????
5 - ·??????? Very Helpful
3 - ???(C)???? Somewhat Helpful
1 - ?>>???? Not Helpful
(No rating)&
Views: 184
?????<<? 3/4 ?u????????u?u÷?????(R)?°??Mysql??u????à±í...
(No rating)&
Views: 332
1.u 1/4 ????,??? 3/4 ???&????mysqldump -u ??>>§??...
(No rating)&
11-28-2011
Views: 526
??>>§AE???
.: .: .: .: .:
±± 3/4 (C)>>¤? 1/2 ?AE 1/4
1/4 ?????<<? 3/4
Novots Technologies Limited博客访问: 198121
博文数量: 61
博客积分: 1136
博客等级: 少尉
技术积分: 945
注册时间:
彪悍人生无需过多解释!
IT168企业级官微
微信号:IT168qiye
系统架构师大会
微信号:SACC2013
分类: Mysql/postgreSQL
Mysql复制概述MySQL支持单向、异步复制,复制过程中一个服务器充当主服务器,而一个或多个其它服务器充当从服务器。MySQL复制基于主服务器在二进制日志中跟踪所有对数据库的更改(更新、删除等等)。因此,要进行复制,必须在主服务器上启用二进制日志。每个从服务器从主服务器接收主服务器已经记录到其二进制日志的保存的更新。当一个从服务器连接主服务器时,它通知主服务器从服务器在日志中读取的最后一次成功更新的位置。从服务器接收从那时起发生的任何更新,并在本机上执行相同的更新。然后封锁并等待主服务器通知新的更新。从服务器执行备份不会干扰主服务器,在备份过程中主服务器可以继续处理更新。&复制实现细节&&& MySQL使用3个线程来执行复制功能(其中1个在主服务器上,另两个在从服务器上)。当发出START SLAVE时,从服务器创建一个I/O线程,以连接主服务器并让它发送记录在其二进制日志中的语句。主服务器创建一个线程将二进制日志中的内容发送到从服务器。该线程可以即为主服务器上SHOW PROCESSLIST的输出中的Binlog Dump线程。从服务器I/O线程读取主服务器Binlog Dump线程发送的内容并将该数据拷贝到从服务器数据目录中的本地文件中,即中继日志。第3个线程是SQL线程,由从服务器创建,用于读取中继日志并执行日志中包含的更新。在从服务器上,读取和执行更新语句被分成两个独立的任务。当从服务器启动时,其I/O线程可以很快地从主服务器索取所有二进制日志内容,即使SQL线程执行更新的远远滞后。& 复制线程状态通过show slave status\G和show master status可以查看复制线程状态。常见的线程状态有:(1)主服务器Binlog Dump线程·&&&&&&&& Has sent waiting for binlog to be updated线程已经从二进制日志读取所有主要的更新并已经发送到了从服务器。线程现在正空闲,等待由主服务器上新的更新导致的出现在二进制日志中的新事件。&(2)从服务器I/O线程状态·&&&&&&&& Waiting for master to send event线程已经连接上主服务器,正等待二进制日志事件到达。如果主服务器正空闲,会持续较长的时间。如果等待持续slave_read_timeout秒,则发生超时。此时,线程认为连接被中断并企图重新连接。(3)从服务器SQL线程状态·&&&&&&&& Reading event from the relay log线程已经从中继日志读取一个事件,可以对事件进行处理了。·&&&&&&&& Ha waiting for the slave I/O thread to update it线程已经处理了中继日志文件中的所有事件,现在正等待I/O线程将新事件写入中继日志。&2.复制过程中使用的传递和状态文件默认情况,中继日志使用host_name-relay-bin.nnnnnn形式的文件名,其中host_name是从服务器主机名,nnnnnn是序列号。中继日志与二进制日志的格式相同,并且可以用mysqlbinlog读取。从服务器在data目录中另外创建两个小文件。这些状态文件默认名为主和。状态文件保存在硬盘上,从服务器关闭时不会丢失。下次从服务器启动时,读取这些文件以确定它已经从主服务器读取了多少二进制日志,以及处理自己的中继日志的程度。&如果要备份从服务器的数据,还应备份这两个小文件以及中继日志文件。它们用来在恢复从服务器的数据后继续进行复制。如果丢失了中继日志但仍然有文件,可以通过检查该文件来确定SQL线程已经执行的主服务器中二进制日志的程度。然后可以用Master_Log_File和Master_LOG_POS选项执行CHANGE MASTER TO来告诉从服务器重新从该点读取二进制日志。Mysql建立主从服务器配置方法1.确保主从服务器的版本兼容。从服务器至少与主服务器版本相同或更高。2.确保主服务器上my.cnf文件的[mysqld]部分包括一个log-bin选项。该部分还应有一个server-id=Master_id选项,其中master_id必须为1到232–1之间的一个正整数值。如:[mysqld]log-bin=mysql-binserver-id=13.启动主服务器注意:主服务器需要指定对哪些数据库记录二进制日志,这通过在启动主服务器时,加上--binlog-do-db= db_name选项来实现。如果要记录多个数据库,要分别为每个数据库指定该选项。目前主服务器上的启动脚本请使用/data/mysql/bin/startmysql。另外,主机开机后自动启动mysqld的脚本也已经修改。4.在主服务器上为从服务器建立一个连接帐户,该帐户必须授予REPLICAITON SLAVE权限。mysql> GRANT REPLICATION SLAVE ON *.*&&& -> TO '帐号'@'从服务器IP' IDENTIFIED BY '密码';5.备份数据库。shell> mysqldump --master-data& --opt database_name > backup-file.sql6.查看主服务器的状态mysql> show master status\G;记录File 和 Position 项的值注:由于没有锁定主服务器,这里记录的主服务器二进制日志position值可能会大于做mysqldump时的值,这将导致从服务器丢失在此期间的更新。如果可以保证在此期间主服务器不会出现创建新表的更新,那么丢失的影响不大;否则,将导致从服务器复制线程失败,这时必须在做mysqldump时锁定主服务器。7.在从服务器的my.cnf文件中添加下面的行:&&&&&&& [mysqld]&&&&&&& server-id=slave_idslave_id值必须为2到232–1之间的一个正整数值。ID值唯一的标识了复制群集中的主从服务器,因此它们必须各不相同。8.使用--skip-slave-start选项启动从服务器启动从服务器,并导入备份数据库文件。shell> mysqladmin create target_db_nameshell> mysql target_db_name < backup-file.sql9.在从服务器上执行下面的语句,以系统的实际值替换选项值:&&&&&&& mysql> CHANGE MASTER TO&&&&&&&&&&& ->&&&& MASTER_HOST='master_host_name',&&&&&&&&&&& ->&&&& MASTER_USER='replication_user_name',&&&&&&&&&&& ->&&&& MASTER_PASSWORD='replication_password',&&&&&&&&&&& ->&&&& MASTER_LOG_FILE='recorded_log_file_name',&&&&&&&&&&& ->&&&& MASTER_LOG_POS=recorded_log_其中recorded_log_file_name和recorded_log_position分别为步骤6所记录的File和Position值。10.启动从服务器线程mysql> START SLAVE;11.执行上述程序后,从服务器应连接主服务器,并补充自从快照以来发生的任何更新。如果没有正确更新,请检查复制线程状态以及data目录下的.err文件获取信息。&主从复制目前采用的主从单向复制,从服务器只是实时的保存了主服务器的一个副本。当主服务器发生故障时,可以切换到从服务器继续做查询,但不能更新。如果采用双向复制,即两台mysql服务器即作为主服务器,又作为从服务器。那么两者都可以执行更新操作并能实现负载均衡,当一方出现故障时,另一方不受影响。但是,除非能保证任何更新操作顺序都是安全的,否则双向复制会导致失败。为了更好的提高可靠性和可用性,需要当主服务器不可用时,能够在从服务器上更新,当主服务器恢复后,能够将从服务器上的更新同步到主服务器上。目前设想的方法是当主服务器不可用时,令从服务器成为Master。原来的主服务器重新启动后,设定为Slave,并从新的Master上同步更新。待同步一致后,再重新各自切换为原来的角色。具体的操作方法有待实验验证。&PS:主服务器产生的二进制日志会占据大量的磁盘空间,应定期删除过期的bin-log.目前通过crontab每天运行/data/mysql/data/log_auto_del.sh来删除3天前的二进制日志文件。&如果主服务器运行时没有启用--logs-bin,SHOW MASTER STATUS显示的日志名和位置值为空。在这种情况下,当以后指定从服务器的日志文件和位置时需要使用的值为空字符串('')和为什么使用主从复制?1、主服务器/从服务器设置增加了健壮性。主服务器出现问题时,你可以切换到从服务器作为备份。2、通过在主服务器和从服务器之间切分处理客户查询的负荷,可以得到更好的客户响应时间。但是不要同时在主从服务器上进行更新,这样可能引起冲突。3、使用复制的另一个好处是可以使用一个从服务器执行备份,而不会干扰主服务器。在备份过程中主服务器可以继续处理更新。MySQL使用3个线程来执行复制功能(其中1个在主服务器上,另两个在从服务器上。当发出START SLAVE时,从服务器创建一个I/O线程,以连接主服务器并让主服务器发送二进制日志。主服务器创建一个线程将二进制日志中的内容发送到从服务器。从服务器I/O线程读取主服务器Binlog Dump线程发送的内容并将该数据拷贝到从服务器数据目录中的本地文件中,即中继日志。第3个线程是SQL线程,从服务器使用此线程读取中继日志并执行日志中包含的更新。SHOW PROCESSLIST语句可以查询在主服务器上和从服务器上发生的关于复制的信息。默认中继日志使用host_name-relay-bin.nnnnnn形式的文件名,其中host_name是从服务器主机名,nnnnnn是序列号。用连续序列号来创建连续中继日志文件,从000001开始。从服务器跟踪中继日志索引文件来识别目前正使用的中继日志。默认中继日志索引文件名为 host_name-relay-bin.index。在默认情况,这些文件在从服务器的数据目录中被创建。中继日志与二进制日志的格式相同,并且可以用 MySQLbinlog读取。当SQL线程执行完中继日志中的所有事件后,中继日志将会被自动删除。从服务器在数据目录中另外创建两个状态文件--和。状态文件保存在硬盘上,从服务器关闭时不会丢失。下次从服务器启动时,读取这些文件以确定它已经从主服务器读取了多少二进制日志,以及处理自己的中继日志的程度。设置主从复制:1、确保在主服务器和从服务器上安装的MySQL版本相同,并且最好是MySQL的最新稳定版本。2、在主服务器上为复制设置一个连接账户。该账户必须授予REPLICATION SLAVE权限。如果账户仅用于复制(推荐这样做),则不需要再授予任何其它权限。MySQL> GRANT REPLICATION SLAVE ON *.*-> TO 'replication'@'%.' IDENTIFIED BY 'slavepass';3、执行FLUSH TABLES WITH READ LOCK语句清空所有表和块写入语句:MySQL> FLUSH TABLES WITH READ LOCK;保持MySQL客户端程序不要退出。开启另一个终端对主服务器数据目录做快照。shell> cd /usr/local/MySQL/shell> tar -cvf /tmp/MySQL-snapshot.tar ./data如果从服务器的用户账户与主服务器的不同,你可能不想复制MySQL数据库。在这种情况下,应从归档中排除该数据库。你也不需要在归档中包括任何日志文件或者或文件。当FLUSH TABLES WITH READ LOCK所置读锁定有效时(即MySQL客户端程序不退出),读取主服务器上当前的二进制日志名和偏移量值:MySQL > SHOW MASTER STATUS;--------------- ---------- -------------- ------------------| File | Position | Binlog_Do_DB | Binlog_Ignore_DB |--------------- ---------- -------------- ------------------| MySQL-bin.003 | 73 | test | manual,MySQL |--------------- ---------- -------------- ------------------File列显示日志名,而Position显示偏移量。在该例子中,二进制日志值为MySQL-bin.003,偏移量为73。记录该值。以后设置从服务器时需要使用这些值。它们表示复制坐标,从服务器应从该点开始从主服务器上进行新的更新。CREATE USER 'bkdb6mem'@'192.168.2.234' IDENTIFIED BY '---------------------------+---------------+-------------------------------------------------------------------------------------------+----------------+----------------+1 row in set (0.00 sec)';GRANT REPLICATION SLAVE ON *.* TO bkdb6mem'@'192.168.2.234' IDENTIFIED BY 'bkdb6mem'WITH MAX_QUERIES_PER_HOUR 0 MAX_CONNECTIONS_PER_HOUR 0 MAX_UPDATES_PER_HOUR 0 MAX_USER_CONNECTIONS 0 ;mysql同步中断后的处理文章分类:数据库mysql从服务器因硬件故障停止复制,无法从中断点开始继续复制。&在从库执行reset slave清除二进制日志,并重新生成,最好将从库重启一下,slave stop在主库reset master清除二进制日志&主库使用--skip-networking选项重启mysql服务,禁止网络连接,保证主库数据暂时无更新&删除从库的数据后,使用mysqldump将主库上的数据全部复制到从库mysqldump --opt db_name | mysql --host=remote_host -C db_name&同步完成后,去掉--skip-networking选项重启主库mysql服务 ,&从库slave startshow processlistshow slave status&&&& * LOAD TABLE tblname FROM MASTER #从机运行,从主机端重读指定的表的数据,每次只能读取一个,受timeout时间限制,需要调整timeout时间。执行这个命令需要同步账号有 reload和super权限。以及对相应的库有select权限。如果表比较大,要增加net_read_timeout 和 net_write_timeout 的值&&& * LOAD DATA FROM MASTER #从机执行,从主机端重新读入所有的数据。执行这个命令需要同步账号有reload和super权限。以及对相应的库有select权限。如果表比较大,要增加net_read_timeout 和 net_write_timeout的值这两个命令只适用于MyISAM引擎&在从库设置连接MASTER MASTER_LOG_FILE为主库的File,MASTER_LOG_POS为主库的Position,即从库的文件CHANGE MASTER TO MASTER_HOST='192.168.1.1',MASTER_USER='slave',MASTER_PASSWORD='password',MASTER_LOG_FILE='mysql-bin.030',MASTER_LOG_POS=870279;
阅读(2164) | 评论(0) | 转发(0) |
相关热门文章
给主人留下些什么吧!~~
请登录后评论。文章数:85
评论数:42
访问量:33640
注册日期:
阅读量:5863
阅读量:12276
阅读量:301867
阅读量:1020990
51CTO推荐博文
一.MMM概述MMM(Master-Master replication manager for Mysql)是一套灵活的脚本程序,用来监控和故障切换,管理mysql Master-Master复制的配置 (同一时间只有一个节点是可写的)。附带的工具套件可以实现多个slaves的read负载均衡,因此你可以使用这个工具移除一组服务器中复制延迟较高的服务器的虚拟IP,它还可以备份数据,两节点之间再同步等等。MMM主要的功能通过下面三个脚本来实现:mmm_mond监控进程,负责所有的监控工作,决定和处理所有节点角色活动mmm_agentd运行在每个mysql服务器上的代理进程,完成监控的探针工作和执行简单的远端服务设置mmm_control一个简单的脚本,提供管理mmm_mond进程的命令二.实验环境介绍最基本的MMM安装必须至少需要2个数据库服务器和一个监控服务器,下面要配置的MySQL Cluster环境包含三台数据库服务器和一台监控服务器。实验架构如下:主机规划表虚拟VIP规划表:高可用性实现的前提:1.时间同步,尽量使用NTP服务器;
2.hosts文件解析;
[root@node3&~]#&cat&/etc/hosts
127.0.0.1&&&localhost&localhost.localdomain&localhost4&localhost4.localdomain4
::1&&&&&&&&&localhost&localhost.localdomain&localhost6&localhost6.localdomain6
172.16.0.1&&&server
172.16.31.20&&node3
172.16.31.21&&node4
172.16.31.22&&node5
172.16.31.23&&node6
3.ssh无密钥通信;
node3,node4和node6节点之间需要实现ssh无密钥通信
#&ssh-keygen&-t&rsa&-P&""
#&ssh-copy-id&-i&.ssh/id_rsa.pub&root@node3
[root@node6&~]#&date&;ssh&node4&date&;&ssh&node3&
Sun&Jan&25&16:40:51&CST&2015
Sun&Jan&25&16:40:52&CST&2015
Sun&Jan&25&16:40:52&CST&2015三.编译安装mariadb数据库过程略。提供的my.cnf如下:[root@node3&~]#&grep&-v&'^#'&/f&
port&&&&&&&&&&&&=&3306
socket&&&&&&&&&&=&/tmp/mysql.sock
port&&&&&&&&&&&&=&3306
socket&&&&&&&&&&=&/tmp/mysql.sock
skip-external-locking
key_buffer_size&=&256M
max_allowed_packet&=&1M
table_open_cache&=&256
sort_buffer_size&=&1M
read_buffer_size&=&1M
read_rnd_buffer_size&=&4M
myisam_sort_buffer_size&=&64M
thread_cache_size&=&8
query_cache_size=&16M
thread_concurrency&=&4
datadir&=&/mydata/data
innodb_file_per_table&=&on
skip_name_resolve&=&on
[mysqldump]
max_allowed_packet&=&16M
no-auto-rehash
[myisamchk]
key_buffer_size&=&128M
sort_buffer_size&=&128M
read_buffer&=&2M
write_buffer&=&2M
[mysqlhotcopy]
interactive-timeout我这里提供一个脚本,基本上可以实现mariadb编译安装自动化:[root@node3&~]#&cat&installmysql.sh&
#!/bin/bash
#install&mysql
mysql_dir="/usr/local/mysql"
mysql_datadir="/mydata/data"
mysql_logdir="/mydata/data/"
mysql_passwd="oracle"
function&install_mysql()&&{
yum&groupinstall&-y&Development&Tools
yum&install&-y&cmake&ncurses-devel&openssl-devel&openssl
useradd&-M&-s&/sbin/nologin&mysql
mkdir&-p&$mysql_datadir
chown&mysql.mysql&-R&$mysql_datadir
tar&zxf&mariadb-10.0.12.tar.gz&
cd&mariadb-10.0.12
cmake&.&-DCMAKE_INSTALL_PREFIX=$mysql_dir/&\
-DMYSQL_DATADIR=$mysql_datadir&\
-DWITH_INNOBASE_STORAGE_ENGINE=1&\
-DWITH_ARCHIVE_STORAGE_ENGINE=1&\
-DWITH_BLACKHOLE_STORAGE_ENGINE=1&\
-DENABLED_LOCAL_INFILE=1&\
-DMYSQL_TCP_PORT=3306&\
-DWITH_SSL=system&\
-DWITH_ZLIB=system&\
-DWITH_LIBWRAP=0&\
-DCMAKE_THREAD_PREFER_PTHREAD=1&\
-DEXTRA_CHARSETS=all&\
-DDEFAULT_CHARSET=utf8&\
-DDEFAULT_COLLATION=utf8_general_ci&\
-DMYSQL_UNIX_ADDR=/tmp/mysql.sock&\
-DWITH_DEBUG=0
make&&&&make&install
rm&-rf&/etc/init.d/mysqld
mkdir&$mysql_logdir/relaylog
mkdir&$mysql_logdir/binlog
cp&support-files/mysql.server&/etc/init.d/mysqld
chmod&755&/etc/init.d/mysqld
chkconfig&--add&mysqld
chkconfig&mysqld&on
chown&mysql.mysql&-R&$mysql_logdir
chown&mysql.mysql&-R&$mysql_datadir
$mysql_dir/scripts/mysql_install_db&--user=mysql&--basedir=$mysql_dir&--datadir=$mysql_datadir
/sbin/service&mysqld&start
echo&'export&PATH=$PATH:'$mysql_dir'/bin'&&&&/etc/profile
source&/etc/profile
$mysql_dir/bin/mysql&-e&"grant&all&privileges&on&*.*&to&root@'%'&identified&by&'$mysql_passwd'&with&grant&"
$mysql_dir/bin/mysql&-e&"flush&"
$mysql_dir/bin/mysql&-e&"delete&from&mysql.user&where&password='';"
/sbin/service&mysqld&restart
echo&"mysql&install&success!"
install_mysql将数据库源码包和配置好的my.cnf文件放置在/root目录下后即可进行编译安装;在node3,node4和node6编译安装完成后即可进行双主单从复制架构实现;四.构建双主单从复制架构1.双主复制的数据库主配置文件配置node3节点的配置:[root@node3&~]#&vim&/f&
[mysqld]&&&&&&&&&&&&&&&&&&&&&#在此配置段中增加如下内容;
log-bin=mysql-bin
binlog_format=mixed
server-id&&&&&&&=&1
relay-log=relay-bin
auto_increment_offset=1
auto_increment_increment=2
log_slave_updates&&&&&&&=&1node4节点的配置:[root@node4&~]#&vim&/f&
log-bin=mysql-bin
binlog_format=mixed
server-id&&&&&&&=&10
relay-log&&&&&&&=&relay-bin
auto_increment_offset=2
auto_increment_offset=2
log_slave_updates&&&&&&&=&1从节点node6:node6节点的配置:[root@node6&~]#&vim&/f&
log-bin=mysql-bin
binlog_format=mixed
server-id&&&&&&&=&20
relay-log&&&&&&&=&relay-bin
log_slave_updates&&&&&&&=&1
read_only&&&&&&&=&on修改过刚才的配置文件以后,在各节点重新启动mysqld服务器;#&service&mysqld&restart
Shutting&down&MySQL..&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&[&&OK&&]
Starting&MySQL.&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&[&&OK&&]2.创建复制使用的mysql用户为了方便,我们就授权一个repluser账户在172.16.0.0这个网段内都能实现复制;在node3和node4节点上执行如下指令:MariaDB&[(none)]&&grant&replication&slave,replication&client&on&*.*&to&repluser@'172.16.%.%'&identified&by&'replpass';
MariaDB&[(none)]&&flush&3.同步数据由于我们都是新装的库,数据是同步的,但是我们也简单操作以下步骤,开始配置同步数据到复制结尾,都不要让任何的mysql服务器写入数据,避免导致数据不同步。查看两个节点的时间点;node3节点的时间点;
MariaDB&[(none)]&&show&master&
+------------------+----------+--------------+------------------+
|&File&&&&&&&&&&&&&|&Position&|&Binlog_Do_DB&|&Binlog_Ignore_DB&|
+------------------+----------+--------------+------------------+
|&mysql-bin.000006&|&&&&&&653&|&&&&&&&&&&&&&&|&&&&&&&&&&&&&&&&&&|
+------------------+----------+--------------+------------------+
1&row&in&set&(0.00&sec)
node4节点的时间点:
MariaDB&[(none)]&&show&master&
+------------------+----------+--------------+------------------+
|&File&&&&&&&&&&&&&|&Position&|&Binlog_Do_DB&|&Binlog_Ignore_DB&|
+------------------+----------+--------------+------------------+
|&mysql-bin.000006&|&&&&&&653&|&&&&&&&&&&&&&&|&&&&&&&&&&&&&&&&&&|
+------------------+----------+--------------+------------------+
1&row&in&set&(0.00&sec)两个节点的时间点都是一致的,数据是一致的,那就方便设置了;4.双主复制模型开启设置node3节点启动:
#开启复制;
MariaDB&[(none)]&&change&master&to&master_host='172.16.31.21',master_user='repluser',master_password='replpass',master_log_file='mysql-bin.000006',master_log_pos=653;
#开启复制进程;
MariaDB&[(none)]&&start&node4节点启动:
MariaDB&[(none)]&&change&master&to&master_host='172.16.31.20',master_user='repluser',master_password='replpass',master_log_file='mysql-bin.000006',master_log_pos=653;
MariaDB&[(none)]&&start&5.查看节点的复制状态信息;node3的节点的主从复制状态:MariaDB&[(none)]&&show&slave&status\G
***************************&1.&row&***************************
&&&&&&&&&&&&&&&Slave_IO_State:&Waiting&for&master&to&send&event
&&&&&&&&&&&&&&&&&&Master_Host:&172.16.31.21
&&&&&&&&&&&&&&&&&&Master_User:&repluser
&&&&&&&&&&&&&&&&&&Master_Port:&3306
&&&&&&&&&&&&&&&&Connect_Retry:&60
&&&&&&&&&&&&&&Master_Log_File:&mysql-bin.000006
&&&&&&&&&&Read_Master_Log_Pos:&653
&&&&&&&&&&&&&&&Relay_Log_File:&relay-bin.000002
&&&&&&&&&&&&&&&&Relay_Log_Pos:&535
&&&&&&&&Relay_Master_Log_File:&mysql-bin.000006
&&&&&&&&&&&&&Slave_IO_Running:&Yes
&&&&&&&&&&&&Slave_SQL_Running:&Yes
&&&&&&&&Seconds_Behind_Master:&0&
1&row&in&set&(0.00&sec)node4节点的主从复制状态信息;MariaDB&[(none)]&&show&slave&status\G
***************************&1.&row&***************************
&&&&&&&&&&&&&&&Slave_IO_State:&Waiting&for&master&to&send&event
&&&&&&&&&&&&&&&&&&Master_Host:&172.16.31.20
&&&&&&&&&&&&&&&&&&Master_User:&repluser
&&&&&&&&&&&&&&&&&&Master_Port:&3306
&&&&&&&&&&&&&&&&Connect_Retry:&5
&&&&&&&&&&&&&&Master_Log_File:&mysql-bin.000006
&&&&&&&&&&Read_Master_Log_Pos:&653
&&&&&&&&&&&&&&&Relay_Log_File:&relay-bin.000002
&&&&&&&&&&&&&&&&Relay_Log_Pos:&535
&&&&&&&&Relay_Master_Log_File:&mysql-bin.000006
&&&&&&&&&&&&&Slave_IO_Running:&Yes
&&&&&&&&&&&&Slave_SQL_Running:&Yes
&&&&&&&&Seconds_Behind_Master:&0
1&row&in&set&(0.00&sec)6.简单的双主复制测试;我们在node3节点插入测试数据库;在hellodb中的teachers表中插入数据:[root@node3&~]#&mysql&-uroot&-poracle&&&hellodb.sql
登录数据库:
[root@node3&~]#&mysql&-uroot&-poracle
#切换到hellodb数据库;
MariaDB&[(none)]&&use&
Database&changed
#先查看teachers表;
MariaDB&[hellodb]&&select&*&from&
+-----+---------------+-----+--------+
|&TID&|&Name&&&&&&&&&&|&Age&|&Gender&|
+-----+---------------+-----+--------+
|&&&1&|&Song&Jiang&&&&|&&45&|&M&&&&&&|
|&&&2&|&Zhang&Sanfeng&|&&94&|&M&&&&&&|
|&&&3&|&Miejue&Shitai&|&&77&|&F&&&&&&|
|&&&4&|&Lin&Chaoying&&|&&93&|&F&&&&&&|
+-----+---------------+-----+--------+
4&rows&in&set&(0.00&sec)
#插入两条新数据;
MariaDB&[hellodb]&&insert&into&teachers(name,age,gender)&values('Huang&Yaoshi',56,'M'),('Feng&Qingyang',100,'M');
Query&OK,&2&rows&affected&(0.04&sec)
Records:&2&&Duplicates:&0&&Warnings:&0
#再次查看teachers表,观察ID的变化;
MariaDB&[hellodb]&&select&*&from&
+-----+---------------+-----+--------+
|&TID&|&Name&&&&&&&&&&|&Age&|&Gender&|
+-----+---------------+-----+--------+
|&&&1&|&Song&Jiang&&&&|&&45&|&M&&&&&&|
|&&&2&|&Zhang&Sanfeng&|&&94&|&M&&&&&&|
|&&&3&|&Miejue&Shitai&|&&77&|&F&&&&&&|
|&&&4&|&Lin&Chaoying&&|&&93&|&F&&&&&&|
|&&&5&|&Huang&Yaoshi&&|&&56&|&M&&&&&&|
|&&&7&|&Feng&Qingyang&|&100&|&M&&&&&&|
+-----+---------------+-----+--------+
6&rows&in&set&(0.00&sec)node3节点的ID自增是以奇数为顺序的,说明我们的双主复制架构完成了。7.配置从服务器节点node6:拷贝数据(假如是你完全新安装mysql主从服务器,这个一步就不需要。因为新安装的master和slave有相同的数据)关停Master服务器,将Master中的数据拷贝到从服务器节点中,使得Master和slave中的数据同步,并且确保在全部设置操作结束前,禁止在Master和slave服务器中进行写操作,使得两数据库中的数据一定要相同!停止node3节点和node6节点的数据库:
#&service&mysqld&stop
删除node6节点的数据库文件:
[root@node6&~]#&mkdir&/backup
[root@node6&~]#&mv&/mydata/data/*&/backup/
[root@node6&~]#&ls&/mydata/data/
将node3节点的数据库数据全部复制到节点node6:
[root@node3&mydata]#&scp&-p&-r&data/*&node6:/mydata/data/
记得更改数据库数据目录里的所有权限为mysql:
[root@node6&~]#&chown&-R&mysql:mysql&/mydata/data/
将其中原有的中继日志删除:
[root@node6&~]#&rm&-rf&/mydata/data/relay*&
配置完成后启动服务器:
#&service&mysqld&start
启动从节点的中继日志:
MariaDB&[(none)]&&change&master&to&master_host='172.16.31.20',master_user='repluser',master_password='replpass',master_log_file='mysql-bin.000009',master_log_pos=326;
启动中继日志进程;
MariaDB&[(none)]&&start&
查看从节点的状态:
MariaDB&[(none)]&&show&slave&status&\G
***************************&1.&row&***************************
&&&&&&&&&&&&&&&Slave_IO_State:&Waiting&for&master&to&send&event
&&&&&&&&&&&&&&&&&&Master_Host:&172.16.31.20
&&&&&&&&&&&&&&&&&&Master_User:&repluser
&&&&&&&&&&&&&&&&&&Master_Port:&3306
&&&&&&&&&&&&&&&&Connect_Retry:&60
&&&&&&&&&&&&&&Master_Log_File:&mysql-bin.000009
&&&&&&&&&&Read_Master_Log_Pos:&326
&&&&&&&&&&&&&&&Relay_Log_File:&relay-bin.000002
&&&&&&&&&&&&&&&&Relay_Log_Pos:&535
&&&&&&&&Relay_Master_Log_File:&mysql-bin.000009
&&&&&&&&&&&&&Slave_IO_Running:&Yes
&&&&&&&&&&&&Slave_SQL_Running:&Yes
信息略。。。
查看从节点的数据跟主节点是否一致:
MariaDB&[(none)]&&use&
Database&changed
MariaDB&[hellodb]&&select&*&from&
+-----+---------------+-----+--------+
|&TID&|&Name&&&&&&&&&&|&Age&|&Gender&|
+-----+---------------+-----+--------+
|&&&1&|&Song&Jiang&&&&|&&45&|&M&&&&&&|
|&&&2&|&Zhang&Sanfeng&|&&94&|&M&&&&&&|
|&&&3&|&Miejue&Shitai&|&&77&|&F&&&&&&|
|&&&4&|&Lin&Chaoying&&|&&93&|&F&&&&&&|
|&&&5&|&Huang&Yaoshi&&|&&56&|&M&&&&&&|
|&&&7&|&Feng&Qingyang&|&100&|&M&&&&&&|
+-----+---------------+-----+--------+
6&rows&in&set&(0.00&sec)OK,从节点配置完毕;五.MMM高可用服务器构建1.如果你是编译安装的mysql-mmm,那么你就需要安装依赖的perl库了由于我这里是EPEL源提供的mysql-mmm,所以自动解决了依赖问题;建议你也配置好EPEL源后进行安装,非常方便;mysql-mmm需要依赖的所有文件如下:dejavu-lgc-sans-mono-fonts.noarch&0:2.30-2.el6&&&&&&&&&
perl-Date-Manip.noarch&0:6.24-1.el6&&&&&&&&&&&
perl-Email-Date-Format.noarch&0:1.002-5.el6&&&&&&&&&&&&
perl-Log-Dispatch.noarch&0:2.27-1.el6&&&&&&&&&
perl-Log-Dispatch-FileRotate.noarch&0:1.19-4.el6&&&&&&&
perl-Log-Log4perl.noarch&0:1.30-1.el6&&&&&&&&&
perl-MIME-Lite.noarch&0:3.027-2.el6&&&&&&&&&&&&&&&&&&&&
perl-MIME-Types.noarch&0:1.28-2.el6&&&&&&&&&&&
perl-Mail-Sender.noarch&0:0.8.16-3.el6&&&&&&&&&&&&&&&&&
perl-Mail-Sendmail.noarch&0:0.79-12.el6&&&&&&&
perl-MailTools.noarch&0:2.04-4.el6&&&&&&&&&&&&&&&&&&&&&
perl-Params-Validate.x86_64&0:0.92-3.el6&&&&&&
perl-TimeDate.noarch&1:1.16-13.el6&&&&&&&&&&&&&&&&&&&&&
perl-XML-DOM.noarch&0:1.44-7.el6&&&&&&&&&&&&&&
perl-XML-RegExp.noarch&0:0.03-7.el6&&&&&&&&&&&&&&&&&&&&
perl-YAML-Syck.x86_64&0:1.07-4.el6&&&&&&&&&&&&
rrdtool.x86_64&0:1.3.8-7.el6&&&&&&&&&&&&&&&&&&&&&&&&&&&
rrdtool-perl.x86_64&0:1.3.8-7.el6&&
perl-Algorithm-Diff.noarch&0:1.1902-9.el6&&&&&&&&&&&&&&
perl-Class-Singleton.noarch&0:1.4-6.el6&&&&&&&&&
perl-DBD-MySQL.x86_64&0:4.013-3.el6&&&&&&&&&&&&&&&&&&&&
perl-Net-ARP.x86_64&0:1.0.6-2.1.el6&&&&&&&&&&&&&
perl-Path-Class.noarch&0:0.25-1.el6&&&&&&&&&&&&&&&&&&&&
perl-Proc-Daemon.noarch&0:0.14-9.el6&&&&&&&&&&&&
perl-Proc-ProcessTable.x86_64&0:0.48-1.el6& &&2.mysql-mmm软件包介绍mysql-mmm软件包包含四个软件:主软件包:
mysql-mmm.noarch&0:2.2.1-2.el6&
客户端软件包:
mysql-mmm-agent.noarch&0:2.2.1-2.el6
监控软件包:
mysql-mmm-monitor.noarch&0:2.2.1-2.el6
mysql-mmm-tools.noarch&0:2.2.1-2.el63.在所有节点安装mysql-mmm的软件包组;#&yum&install&-y&mysql-mmm*查看安装的后生成的文件:[root@node3&~]#&rpm&-ql&mysql-mmm
/etc/logrotate.d/mysql-mmm
/etc/mysql-mmm
/etc/mysql-mmm/mmm_common.conf
/usr/share/doc/mysql-mmm-2.2.1
/usr/share/doc/mysql-mmm-2.2.1/COPYING
/usr/share/doc/mysql-mmm-2.2.1/INSTALL
/usr/share/doc/mysql-mmm-2.2.1/README
/usr/share/doc/mysql-mmm-2.2.1/VERSION
/usr/share/doc/mysql-mmm-2.2.1/mysql-mmm-2.2.1.pdf
/usr/share/perl5/vendor_perl/MMM/Common
/usr/share/perl5/vendor_perl/MMM/Common/Angel.pm
/usr/share/perl5/vendor_perl/MMM/Common/Config.pm
/usr/share/perl5/vendor_perl/MMM/Common/Log.pm
/usr/share/perl5/vendor_perl/MMM/Common/PidFile.pm
/usr/share/perl5/vendor_perl/MMM/Common/Role.pm
/usr/share/perl5/vendor_perl/MMM/Common/Socket.pm
/usr/share/perl5/vendor_perl/MMM/Common/Uptime.pm
/var/lib/mysql-mmm
/var/log/mysql-mmm
/var/run/mysql-mmm4.在node3和node4两个主服务器节点配置mmm代理和监控账号的权限#前面已经执行过了,就不用执行了,让复制,monitor使用同一个用户,注意权限就可以行了。
MariaDB&[(none)]&&grant&replication&client,replication&slave&on&*.*&to&'repluser'@'172.16.%.%'&identified&by&'replpass';
MariaDB&[(none)]&&grant&super,replication&client,replication&slave,process&on&*.*&to&'mmm_agent'@'172.16.%.%'&identified&by&'agent_password';
MariaDB&[(none)]&&flush&
在node3和node4节点都执行一遍;5.配置mysql-mmm的配置文件;所有的配置选项都集合在了一个叫/etc/mysql-mmm/mmm_common.conf的单独文件中,系统中所有主机的该文件内容都是一样的, 配置完后不要忘记了拷贝这个文件到所有的主机(包括监控主机)!,内容如下:[root@node3&~]#&cat&/etc/mysql-mmm/mmm_common.conf&
active_master_role&&&&&&writer
&host&default&
&&&&cluster_interface&&&&&&&eth0
&&&&pid_path&&&&&&&&&&&&&&&&/var/run/mysql-mmm/mmm_agentd.pid
&&&&bin_path&&&&&&&&&&&&&&&&/usr/libexec/mysql-mmm/
&&&&replication_user&&&&&&&&repluser&&&&&&&&&&&&&&&&&&&&&&&&&&&&#复制授权帐号
&&&&replication_password&&&&replpass&&&&&&&&&&&&&&&&&&&&&&&&&&&&#复制授权密码
&&&&agent_user&&&&&&&&&&&&&&mmm_agent&&&&&&&&&&&&&&&&&&&&&&&&&&&#mmm-agent的帐号
&&&&agent_password&&&&&&&&&&agent_password&&&&&&&&&&&&&&&&&&&&&&#mmm-agent的密码
#定义数据库节点
&host&db1&
&&&&ip&&&&&&172.16.31.20
&&&&mode&&&&master
&&&&peer&&&&db2
&host&db2&
&&&&ip&&&&&&172.16.31.21
&&&&mode&&&&master
&&&&peer&&&&db1
&host&db3&
&&&&ip&&&&&&172.16.31.23
&&&&mode&&&&slave
#可写角色主机节点
&role&writer&
&&&&hosts&&&db1,&db2
&&&&ips&&&&&172.16.31.100
&&&&#互斥角色只有一个ip,并且同一时间只能分配给一个主机,你可以指定一个优先(preferred)主机,如果这个主机是ONLINE状态,那么角色就会被切换到这个主机。
&&&&mode&&&&exclusive
#可读角色主机节点
&role&reader&
&&&&hosts&&&db1,&db2,&db3
&&&&ips&&&&&172.16.31.101,172.16.31.102,172.16.31.103
&&&&#负载均衡角色可以有多个IP,这些IP被均衡的分配给多个主机,所以没有一个主机可以比其他主机多出两个角色。
&&&&mode&&&&balanced
&/role&配置完成后复制到所有节点,包括监控节点node5;在数据库主机上我们需要编辑/etc/mysql-mmm/mmm_agent.conf文件,根据其他主机的不同更改db1的值(db2就将db1更改成db2,db3就将db1改为db3):[root@node3&~]#&vim&/etc/mysql-mmm/mmm_agent.conf&
include&mmm_common.conf
#&The&'this'&variable&refers&to&this&server.&&Proper&operation&requires&
#&that&'this'&server&(db1&by&default),&as&well&as&all&other&servers,&have&the&
#&proper&IP&addresses&set&in&mmm_common.conf.
this&db1在监控主机上我们需要编辑/etc/mysql-mmm/mmm_mon.conf文件:[root@node5&~]#&cat&/etc/mysql-mmm/mmm_mon.conf&
include&mmm_common.conf
&&&&ip&&&&&&&&&&&&&&&&&&127.0.0.1
&&&&pid_path&&&&&&&&&&&&/var/run/mysql-mmm/mmm_mond.pid
&&&&bin_path&&&&&&&&&&&&/usr/libexec/mysql-mmm
&&&&status_path&&&&&&&&&/var/lib/mysql-mmm/mmm_mond.status
&&&&#监控的数据库服务器的IP
&&&&ping_ips&&&&&&&&&&&&172.16.31.20,172.16.31.21,172.16.31.23
&&&&auto_set_online&&&&&60
&&&&#&The&kill_host_bin&does&not&exist&by&default,&though&the&monitor&will
&&&&#&throw&a&warning&about&it&missing.&&See&the&section&5.10&"Kill&Host&
&&&&#&Functionality"&in&the&PDF&documentation.
&&&&#&kill_host_bin&&&&&/usr/libexec/mysql-mmm/monitor/kill_host
&/monitor&
&host&default&
&&&&#数据库服务器授权监控的用户名和密码;
&&&&monitor_user&&&&&&&&repluser
&&&&monitor_password&&&&replpass
debug&06.配置完成后,启动监控服务,在监控主机上启动:[root@node5&~]#&/etc/init.d/mysql-mmm-monitor&start
Starting&MMM&Monitor&Daemon:&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&[&&OK&&]
查看进程启动情况:
[root@node5&~]#&ps&aux&|grep&mmm
root&&&&&&&&1.3&08&?&&&&&&&&S&&&&19:29&&&0:00&mmm_mond
root&&&&&&&&6.6&80&?&&&&&&&&Sl&&&19:29&&&0:00&mmm_mond
root&&&&&&&&0.9&44&?&&&&&&&&S&&&&19:29&&&0:00&perl&/usr/libexec/mysql-mmm/monitor/checker&ping_ip
root&&&&&&&&1.1&20&?&&&&&&&&S&&&&19:29&&&0:00&perl&/usr/libexec/mysql-mmm/monitor/checker&mysql
root&&&&&&&&0.9&44&?&&&&&&&&S&&&&19:29&&&0:00&perl&/usr/libexec/mysql-mmm/monitor/checker&ping
root&&&&&&&&1.1&60&?&&&&&&&&S&&&&19:29&&&0:00&perl&/usr/libexec/mysql-mmm/monitor/checker&rep_backlog
root&&&&&&&&1.1&76&?&&&&&&&&S&&&&19:29&&&0:00&perl&/usr/libexec/mysql-mmm/monitor/checker&rep_threads
root&&&&&&&&0.0&103256&&&832&pts/0&&&&S+&&&19:29&&&0:00&grep&mmm7.在数据库服务器节点上启动agent服务;node3,node4,node6节点都需要执行:[root@node3&~]#&/etc/init.d/mysql-mmm-agent&start
Starting&MMM&Agent&Daemon:&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&[&&OK&&]
[root@node4&~]#&/etc/init.d/mysql-mmm-agent&start
Starting&MMM&Agent&Daemon:&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&[&&OK&&]
[root@node6&~]#&/etc/init.d/mysql-mmm-agent&start
Starting&MMM&Agent&Daemon:&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&[&&OK&&]在节点上查看进程及监听端口状态:就拿node6举例了:[root@node6&~]#&ps&aux&|grep&mmm
root&&&&&1&&0.9&44&?&&&&&&&&S&&&&19:32&&&0:00&mmm_agentd
root&&&&&1&&1.0&56&?&&&&&&&&S&&&&19:32&&&0:00&mmm_agentd
root&&&&&1&&0.0&103252&&&828&pts/0&&&&S+&&&19:33&&&0:00&grep&mmm查看监听端口:[root@node6&~]#&netstat&-tunlp&|grep&mmm
tcp&&&&&&&&0&&&&&&0&172.16.31.23:9989&&&&&&&&&&&0.0.0.0:*&&&&&&&&&&&&&&&&&&&LISTEN&&&&&&12823/mmm_agentd注意:如果不能启动,可以查看/var/log/mysql-mmm/mmm_agentd.log 文件的提示,或者启动时候的报错,最大的可能是perl对应模块没有安装成功,成功安装对应的模块就可以解决问题了.8.在监控主机上查看集群节点状态:[root@node5&~]#&mmm_control&mode
[root@node5&~]#&mmm_control&show
&&db1(172.16.31.20)&master/ONLINE.&Roles:&reader(172.16.31.101),&writer(172.16.31.100)
&&db2(172.16.31.21)&master/ONLINE.&Roles:&reader(172.16.31.102)
&&db3(172.16.31.23)&slave/ONLINE.&Roles:&reader(172.16.31.103)所有节点都处于ONLINE在线状态;我们的MMM集群搭建就完毕了,我们进行一次健康检查:[root@node5&~]#&mmm_control&checks&all
db2&&ping&&&&&&&&&[last&change:&&19:29:41]&&OK
db2&&mysql&&&&&&&&[last&change:&&19:29:41]&&OK
db2&&rep_threads&&[last&change:&&19:29:41]&&OK
db2&&rep_backlog&&[last&change:&&19:29:41]&&OK:&Backlog&is&null
db3&&ping&&&&&&&&&[last&change:&&19:29:41]&&OK
db3&&mysql&&&&&&&&[last&change:&&19:29:41]&&OK
db3&&rep_threads&&[last&change:&&19:29:41]&&OK
db3&&rep_backlog&&[last&change:&&19:29:41]&&OK:&Backlog&is&null
db1&&ping&&&&&&&&&[last&change:&&19:29:41]&&OK
db1&&mysql&&&&&&&&[last&change:&&19:29:41]&&OK
db1&&rep_threads&&[last&change:&&19:29:41]&&OK
db1&&rep_backlog&&[last&change:&&19:29:41]&&OK:&Backlog&is&null监控节点的集群节点健康检查都是成功的,我们的MMM集群是成功的。9.集群的故障切换测试:测试看两个mysql服务器能否实现故障自动切换停掉作为写的db1上的mysql,查看写的服务器会不会自动转移到db2上去[root@node3&~]#&service&mysqld&stop
Shutting&down&MySQL..&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&[&&OK&&]
停掉几秒钟后用mmm_control&show查看:
[root@node5&~]#&mmm_control&show
&&db1(172.16.31.20)&master/HARD_OFFLINE.&Roles:&
&&db2(172.16.31.21)&master/ONLINE.&Roles:&reader(172.16.31.102),&writer(172.16.31.100)
&&db3(172.16.31.23)&slave/ONLINE.&Roles:&reader(172.16.31.101),&reader(172.16.31.103)我们可以看到已经把db2当作主写服务器;再来看看db1恢复后会是什么情况:[root@node3&~]#&service&mysqld&start
Starting&MySQL.&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&[&&OK&&]
[root@node5&~]#&mmm_control&show
&&db1(172.16.31.20)&master/ONLINE.&Roles:&reader(172.16.31.103)
&&db2(172.16.31.21)&master/ONLINE.&Roles:&reader(172.16.31.102),&writer(172.16.31.100)
&&db3(172.16.31.23)&slave/ONLINE.&Roles:&reader(172.16.31.101)我们可以看到当db1恢复后就充当slave的角色了!只有当db2挂了以后db1又会担当起主服务器的写入功能10.测试写入数据是否同步在mmm-monitor上连接172.16.31.21,尝试写入数据,然后查看三个服务器是否同步数据。[root@node5&~]#&mysql&-uroot&-poracle&-h172.16.31.21
Welcome&to&the&MySQL&monitor.&&Commands&end&with&;&or&\g.
Your&MySQL&connection&id&is&613
Server&version:&5.5.5-10.0.12-MariaDB-log&Source&distribution
Copyright&(c)&,&Oracle&and/or&its&affiliates.&All&rights&reserved.
Oracle&is&a&registered&trademark&of&Oracle&Corporation&and/or&its
affiliates.&Other&names&may&be&trademarks&of&their&respective
Type&''&or&'\h'&for&help.&Type&'\c'&to&clear&the&current&input&statement.
#查看数据库;
mysql&&show&
+--------------------+
|&Database&&&&&&&&&&&|
+--------------------+
|&binlog&&&&&&&&&&&&&|
|&hellodb&&&&&&&&&&&&|
|&information_schema&|
|&mysql&&&&&&&&&&&&&&|
|&performance_schema&|
|&relaylog&&&&&&&&&&&|
|&test&&&&&&&&&&&&&&&|
+--------------------+
7&rows&in&set&(0.00&sec)
#使用hellodb数据库;
mysql&&use&
Reading&table&information&for&completion&of&table&and&column&names
You&can&turn&off&this&feature&to&get&a&quicker&startup&with&-A
Database&changed
#查看teachers表;
mysql&&select&*&from&
+-----+---------------+-----+--------+
|&TID&|&Name&&&&&&&&&&|&Age&|&Gender&|
+-----+---------------+-----+--------+
|&&&1&|&Song&Jiang&&&&|&&45&|&M&&&&&&|
|&&&2&|&Zhang&Sanfeng&|&&94&|&M&&&&&&|
|&&&3&|&Miejue&Shitai&|&&77&|&F&&&&&&|
|&&&4&|&Lin&Chaoying&&|&&93&|&F&&&&&&|
|&&&5&|&Huang&Yaoshi&&|&&56&|&M&&&&&&|
|&&&7&|&Feng&Qingyang&|&100&|&M&&&&&&|
+-----+---------------+-----+--------+
6&rows&in&set&(0.00&sec)
#插入一些数据;
mysql&&insert&into&teachers(name,age,gender)&values('Wang&Chongyang',95,'m');
Query&OK,&1&row&affected&(0.04&sec)
#查看数据修改情况;
mysql&&select&*&from&
+-----+----------------+-----+--------+
|&TID&|&Name&&&&&&&&&&&|&Age&|&Gender&|
+-----+----------------+-----+--------+
|&&&1&|&Song&Jiang&&&&&|&&45&|&M&&&&&&|
|&&&2&|&Zhang&Sanfeng&&|&&94&|&M&&&&&&|
|&&&3&|&Miejue&Shitai&&|&&77&|&F&&&&&&|
|&&&4&|&Lin&Chaoying&&&|&&93&|&F&&&&&&|
|&&&5&|&Huang&Yaoshi&&&|&&56&|&M&&&&&&|
|&&&7&|&Feng&Qingyang&&|&100&|&M&&&&&&|
|&&&8&|&Wang&Chongyang&|&&95&|&M&&&&&&|
+-----+----------------+-----+--------+
7&rows&in&set&(0.00&sec)
#退出数据库;
Bye我们在节点node3上查看数据是否同步:[root@node3&~]#&mysql&-uroot&-poracle
Welcome&to&the&MariaDB&monitor.&&Commands&end&with&;&or&\g.
Your&MariaDB&connection&id&is&229
Server&version:&10.0.12-MariaDB-log&Source&distribution
Copyright&(c)&,&Oracle,&SkySQL&Ab&and&others.
Type&''&or&'\h'&for&help.&Type&'\c'&to&clear&the&current&input&statement.
MariaDB&[(none)]&&use&
Database&changed
MariaDB&[hellodb]&&select&*&from&
+-----+----------------+-----+--------+
|&TID&|&Name&&&&&&&&&&&|&Age&|&Gender&|
+-----+----------------+-----+--------+
|&&&1&|&Song&Jiang&&&&&|&&45&|&M&&&&&&|
|&&&2&|&Zhang&Sanfeng&&|&&94&|&M&&&&&&|
|&&&3&|&Miejue&Shitai&&|&&77&|&F&&&&&&|
|&&&4&|&Lin&Chaoying&&&|&&93&|&F&&&&&&|
|&&&5&|&Huang&Yaoshi&&&|&&56&|&M&&&&&&|
|&&&7&|&Feng&Qingyang&&|&100&|&M&&&&&&|
|&&&8&|&Wang&Chongyang&|&&95&|&M&&&&&&|
+-----+----------------+-----+--------+
7&rows&in&set&(0.00&sec)
MariaDB&[hellodb]&&\q
Bye在从服务器节点node6查看数据是否同步:[root@node6&~]#&mysql&-uroot&-p
Enter&password:&
Welcome&to&the&MariaDB&monitor.&&Commands&end&with&;&or&\g.
Your&MariaDB&connection&id&is&645
Server&version:&10.0.12-MariaDB-log&Source&distribution
Copyright&(c)&,&Oracle,&SkySQL&Ab&and&others.
Type&''&or&'\h'&for&help.&Type&'\c'&to&clear&the&current&input&statement.
MariaDB&[(none)]&&use&
Database&changed
MariaDB&[hellodb]&&select&*&from&
+-----+----------------+-----+--------+
|&TID&|&Name&&&&&&&&&&&|&Age&|&Gender&|
+-----+----------------+-----+--------+
|&&&1&|&Song&Jiang&&&&&|&&45&|&M&&&&&&|
|&&&2&|&Zhang&Sanfeng&&|&&94&|&M&&&&&&|
|&&&3&|&Miejue&Shitai&&|&&77&|&F&&&&&&|
|&&&4&|&Lin&Chaoying&&&|&&93&|&F&&&&&&|
|&&&5&|&Huang&Yaoshi&&&|&&56&|&M&&&&&&|
|&&&7&|&Feng&Qingyang&&|&100&|&M&&&&&&|
|&&&8&|&Wang&Chongyang&|&&95&|&M&&&&&&|
+-----+----------------+-----+--------+
7&rows&in&set&(0.00&sec)
MariaDB&[hellodb]&&\q
Bye数据全部同步了,我们的MMM集群是完美成功了的。至此,基于Master-Master replication manager for Mysql的高可用双主复制集群搭建完毕。有关MMM的文档,可以查看/此网站的大神翻译的文档,很不错,关于配置方面的选项这个翻译中都介绍的很详细了,我就不在这里叙述了。我也把文档放在附件里了,如果需要可以去下载。本文出自 “” 博客,请务必保留此出处
了这篇文章
附件下载:  
类别:┆阅读(0)┆评论(0)
10:38:14 10:52:08
请输入验证码:

我要回帖

更多关于 mysql双主配置 的文章

 

随机推荐