一、mysql异步同步
怎么安装mysql数据库,这里不说了,只说它的主从复制,步骤如下:
1、主从服务器分别作以下操作
-
版本一致
-
初始化表,并在后台启动mysql
-
修改root的密码
master:192.168.0.21
slave :192.168.0.211
slave数据库的版本不可以比master数据库的版本高
2、修改主服务器master
1
2
3
4
5
6
|
#vim /etc/my.cnf [mysqld] log-bin=master-bin #[必须]启用二进制日志
log-bin-index=master-bin.index #二进制日志索引
server- id =1 #[必须]服务器唯一ID,默认是1,一般取IP最后一段
innodb_file_per_table=1 #innodb分表
|
3、修改从服务器slave
1
2
3
4
5
6
7
|
#vim /etc/my.cnf [mysqld] relay-log=slave-bin #[必须]启用二进制日志
relay-log-index=salve-bin.index #中继日志索引
read -only=YES #数据库只读
server- id =2 #[必须]服务器唯一ID,默认是1,一般取IP最后一段
innodb_file_per_table=1 #innodb分表
|
4、重启两台服务器的mysql
1
|
/etc/init .d /mysql restart
|
5、在主服务器上建立帐户并授权slave
1
2
|
mysql>GRANT REPLICATION SLAVE ON *.* to 'mysync' @ '192.168.0.211' identified by 'q123456' ; #一般不用root帐号
mysql>flush privileges; |
6、登录主服务器的mysql,查询master的状态
1
2
3
4
5
6
7
|
mysql>show master status; +------------------+----------+--------------+------------------+ | File | Position | Binlog_Do_DB | Binlog_Ignore_DB | +------------------+----------+--------------+------------------+ | mater-bin.000004 | 308 | | | +------------------+----------+--------------+------------------+ 1 row in set (0.00 sec)
|
注:执行完此步骤后不要再操作主服务器MYSQL,防止主服务器状态值变化
7、配置从服务器Slave
1
2
3
4
5
6
7
8
|
#注意不要断开,“308”无单引号。 mysql>change master to master_host= '192.168.0.21' ,master_user= 'mysync' ,master_password= 'q123456' ,
master_log_file= 'master-bin.,000004' ,master_log_pos=308;
mysql>flush privileges; #刷新权限;
show variables like '' ; #查看数据库配置信息;
mysql>start slave; #启动从服务器复制功能
mysql> START SLAVE IO_Thread; #可以开启关闭
mysql> START SLAVE SQL_Thread; #可以开启关闭
|
8、检查从服务器复制功能状态:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
|
mysql> show slave status\G *************************** 1. row ***************************
Slave_IO_State: Waiting for master to send event
Master_Host: 192.168.0.21 #主服务器地址
Master_User: myrync #授权帐户名,尽量避免使用root
Master_Port: 3306 #数据库端口,部分版本没有此行
Connect_Retry: 60
Master_Log_File: mysql-bin.000004
Read_Master_Log_Pos: 600 #同步读取二进制日志的位置,大于等于>=Exec_Master_Log_Pos
Relay_Log_File: ddte-relay-bin.000003
Relay_Log_Pos: 251
Relay_Master_Log_File: mysql-bin.000004
Slave_IO_Running: Yes #此状态必须YES
Slave_SQL_Running: Yes #此状态必须YES
......
|
注:Slave_IO及Slave_SQL进程必须正常运行,即YES状态,否则都是错误的状态(如:其中一个NO均属错误)。
以上操作过程,主从服务器配置完成。
9、如果出现Last_IO_Error: Got fatal error 1236 from master when reading data from binary log: 'Could not find first log file name in binary log index file'
在master那边,执行:
1
2
|
mysql>flush logs; mysql>show master status; |
记下File, Position。
在slave端,执行:
1
2
3
|
mysql>CHANGE MASTER TO MASTER_LOG_FILE= 'master-bin.000008' ,MASTER_LOG_POS=107;
mysql>slave start; mysql>show slave status \G |
一切正常。
二、mysql半同步设置
在Master和Slave的mysql命令行运行如下代码:
1
2
3
4
5
6
7
8
9
|
# On Master mysql> INSTALL PLUGIN rpl_semi_sync_master SONAME 'semisync_master.so' ;
mysql> SET GLOBAL rpl_semi_sync_master_enabled = 1; mysql> SET GLOBAL rpl_semi_sync_master_timeout = 1000; # On Slave mysql> INSTALL PLUGIN rpl_semi_sync_slave SONAME 'semisync_slave.so' ;
mysql> SET GLOBAL rpl_semi_sync_slave_enabled = 1; mysql> STOP SLAVE IO_THREAD; START SLAVE IO_THREAD; |
在Master和Slave的my.cnf中编辑:
1
2
3
4
5
6
7
8
|
# On Master [mysqld] rpl_semi_sync_master_enabled=1 rpl_semi_sync_master_timeout=1000 # 1 second
# On Slave [mysqld] rpl_semi_sync_slave_enabled=1 |
也可通过设置全局变量的方式来设置,如下:
1
|
set global rpl_semi_sync_master_enabled=1
|
取消加载插件
1
2
|
mysql> UNINSTALL PLUGIN rpl_semi_sync_master; ============================================== |
查看从服务器上的semi_sync是否开启:
1
|
mysql> SHOW GLOBAL STATUS LIKE 'rpl_semi%' ;
|
查看主服务器上的semi_sync是否开启,slave需要重启一下io_thread,注意clients 变为1 ,证明主从半同步复制连接成功:
1
|
mysql> SHOW GLOBAL STATUS LIKE 'rpl_semi%' ;
|
三、双主同步复制设置
1、在两台服务器上各自建立一个具有复制权限的用户
1
2
3
4
|
#server1 mysql> GRANT REPLICATION SLAVE ON *.* TO 'slave' @ '192.168.1.211' IDENTIFIED BY 'slave' ;
#server2 mysql> GRANT REPLICATION SLAVE ON *.* TO 'slave1' @ '192.168.1.21' IDENTIFIED BY 'slave' ;
|
2、修改配置文件
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
|
# 主服务器上 [mysqld] server- id = 10
log-bin = mysql-bin relay-log = relay-mysql relay-log-index = relay-mysql.index auto-increment-increment = 2 auto-increment-offset = 1 # 从服务器上 [mysqld] server- id = 20
log-bin = mysql-bin relay-log = relay-mysql relay-log-index = relay-mysql.index auto-increment-increment = 2 auto-increment-offset = 2 |
3、如果此时两台服务器均为新建立,且无其它写入操作,各服务器只需记录当前自己二进制日志文件及事件位置,以之作为另外的服务器复制起始位置即可。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
|
#server1 mysql> SHOW MASTER STATUS\G ************************** 1. row *************************** File: mysql-bin.000001
Position: 710
Binlog_Do_DB:
Binlog_Ignore_DB: 1 row in set (0.00 sec)
#server2 mysql> SHOW MASTER STATUS\G mysql> SHOW MASTER STATUS\G *************************** 1. row *************************** File: mysql-bin.000003
Position: 811
Binlog_Do_DB:
Binlog_Ignore_DB: 1 row in set (0.00 sec)
|
4、各服务器接下来指定对另一台服务器为自己的主服务器即可
1
2
3
4
5
|
#server1 mysql> CHANGE MASTER TO ...,MASTER_LOG_FILE= 'mysql-bin.000003' , MASTER_LOG_POS=811;
#server2 mysql> CHANGE MASTER TO ...,MASTER_LOG_FILE= 'mysql-bin.000001' , MASTER_LOG_POS=710;
|
四、基于GTID的mysql复制
MySQL 5.6引入的GTID(Global Transaction IDs)使得其复制功能的配置、监控及管理变得更加易于实现,且更加健壮。
要在MySQL 5.6中使用复制功能,其服务配置段[mysqld]中于少应该定义如下选项:
-
binlog-format:二进制日志的格式,有row、statement和mixed几种类型;
需要注意的是:当设置隔离级别为READ-COMMITED必须设置二进制日志格式为ROW,现在MySQL官方认为STATEMENT这个已经不再适合继续使用;但mixed类型在默认的事务隔离级别下,可能会导致主从数据不一致;
-
log-slave-updates、gtid-mode、enforce-gtid-consistency、report-port和report-host:用于启动GTID及满足附属的其它需求;
-
master-info-repository和relay-log-info-repository:启用此两项,可用于实现在崩溃时保证二进制及从服务器安全的功能;
-
sync-master-info:启用之可确保无信息丢失;
-
slave-paralles-workers:设定从服务器的SQL线程数;0表示关闭多线程复制功能;
-
binlog-checksum、master-verify-checksum和slave-sql-verify-checksum:启用复制有关的所有校验功能;
-
binlog-rows-query-log-events:启用之可用于在二进制日志记录事件相关的信息,可降低故障排除的复杂度;
-
log-bin:启用二进制日志,这是保证复制功能的基本前提;
-
server-id:同一个复制拓扑中的所有服务器的id号必须惟一;
1、配置主从节点的服务配置文件
1.1、配置master节点
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
|
[mysqld] binlog- format =ROW
log-bin=master-bin log-slave-updates= true
gtid-mode=on enforce-gtid-consistency= true
master-info-repository=TABLE relay-log-info-repository=TABLE sync -master-info=1
slave-parallel-workers=2 binlog-checksum=CRC32 master-verify-checksum=1 slave-sql-verify-checksum=1 binlog-rows-query-log_events=1 server- id =1
report-port=3306 port=3306 datadir= /mydata/data
socket= /tmp/mysql .sock
report-host=192.168.1.21 |
1.2、配置slave节点
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
|
[mysqld] binlog- format =ROW
log-slave-updates= true
gtid-mode=on enforce-gtid-consistency= true
master-info-repository=TABLE relay-log-info-repository=TABLE sync -master-info=1
slave-parallel-workers=2 binlog-checksum=CRC32 master-verify-checksum=1 slave-sql-verify-checksum=1 binlog-rows-query-log_events=1 server- id =11
report-port=3306 port=3306 log-bin=mysql-bin.log datadir= /mydata/data
socket= /tmp/mysql .sock
report-host=192.168.1.211 |
2、创建复制用户
1
|
mysql> GRANT REPLICATION SLAVE ON *.* TO slave@192.168.1.211 IDENTIFIED BY 'slave' ;
|
说明:192.168.1.211是从节点服务器;如果想一次性授权更多的节点,可以自行根据需要修改;
3、为备节点提供初始数据集
锁定主表,备份主节点上的数据,将其还原至从节点;如果没有启用GTID,在备份时需要在master上使用show master status命令查看二进制日志文件名称及事件位置,以便后面启动slave节点时使用。
4、启动从节点的复制线程
如果启用了GTID功能,则使用如下命令:
1
2
3
|
mysql> CHANGE MASTER TO MASTER_HOST= '192.168.1.21' , MASTER_USER= 'slave' , MASTER_PASSWORD= 'slave' ,
MASTER_AUTO_POSITION=1 ; |
没启用GTID,需要使用如下命令:
1
2
3
4
5
|
slave> CHANGE MASTER TO MASTER_HOST= '192.168.1.21' ,
-> MASTER_USER= 'slave' ,
-> MASTER_PASSWORD= 'slave' ,
-> MASTER_LOG_FILE= 'master-bin.000003' ,
-> MASTER_LOG_POS=1174; |
http://www.linuxidc.com/Linux/2013-10/90800.htm