`

mysql主从复制

 
阅读更多
一、主从复制概述
MySQL
支持单向、异步复制,复制过程中一个服务器充当主服务器,而一个或多个其它服务器充当从服务器。
主服务器将更新写入二进制日志文件,并维护文件的一个索引以跟踪日志循环。这些日志可以记录发送到从服务器的更新。当一个从服务器连接主服务器时,它通知主服务器从服务器在日志中读取的最后一次成功更新的位置。
从服务器接收从那时起发生的任何更新,然后封锁并等待主服务器通知新的更新。
单向复制有利于健壮性、速度和系统管理:

主服务器/从服务器设置增加了健壮性。主服务器出现问题时,你可以切换到从服务器作为备份。      
通过在主服务器和从服务器之间切分处理客户查询的负荷,可以得到更好的客户响应时间。
SELECT查询可以发送到从服务器以降低主服务器的查询处理负荷。但修改数据的语句仍然应发送到主服务器,以便主服务器和从服务器保持同步。
如果非更新查询为主,该负载均衡策略很有效,但一般是更新查询。
使用复制的另一个好处是可以使用一个从服务器执行备份,而不会干扰主服务器。在备份过程中主服务器可以继续处理更新。

二、复制原理
MySQL复制基于主服务器在二进制日志中跟踪所有对数据库的更改(更新、删除等等)。因此,要进行复制,必须在主服务器上启用二进制日志每个从服务器从主服务器接收主服务器已经记录到其二进制日志的保存的更新,以便从服务
器可以对其数据拷贝执行相同的更新。

MySQL使用3个线程来执行复制功能(其中1个在主服务器上,另两个在从服务器上。当发出START SLAVE时,从服务器创建一个I/O线程,以连接主服务器并让它发送记录在其二进制日志中的语句。主服务器创建一个线程将二进制日志中的内容发送到从服务器。
该线程可以识别为主服务器上SHOW PROCESSLIST的输出中的Binlog Dump线程。从服务器I/O线程读取主服务器Binlog Dump线程发送的内容并将该数据拷贝到从服务器数据目录中的本地文件中,即中继日志。第3个线程是SQL线程,是从服务器创建用于读取中
继日志并执行日志中包含的更新。
在前面的描述中,每个从服务器有3个线程。有多个从服务器的主服务器创建为每个当前连接的从服务器创建一个线程;每个从服务器有自己的I/O和SQL线程。
默认情况,中继日志使用host_name-relay-bin.nnnnnn形式的文件名,其中host_name是从服务器主机名,nnnnnn是序列号。用连续序列号来创建连续中继日志文件,从000001开始。从服务器跟踪索引文件中目前正使用的中继日志。
默认中继日志索引文件名为ost_name-relay-bin.index。默认情况,在从服务器的数据目录中创建这些文件。可以用--relay-log和--relay-log-index服务器选项覆盖
默认文件名。日志处理:SQL线程执行完中继日志中的所有事件并且不再需要之后,立即自动删除它。没有直接的删除中继日志的机制,因为SQL线程可以负责完成。然而,FLUSH LOGS可以循环中继日志,当SQL线程删除日志时会有影响。
例如,用FLUSH LOGS或mysqladmin flush-logs。我们也可以在mysql的配置文件里配置日志的保存时长。

三、配置实战
1. 主库
vi /etc/my.cnf

[mysqld]
datadir=/mnt/data/moon/db/data_1
socket=/home/moon/db/mysql_1/var/mysql.sock
# Disabling symbolic-links is recommended to prevent assorted security risks
symbolic-links=0
# Settings user and group are ignored when systemd is used.
# If you need to run mysqld under a different user or group,
# customize your systemd unit file for mariadb according to the
# instructions in http://fedoraproject.org/wiki/Systemd

server-id = 1 #主服务器ID,主从集群中必须唯一
port = 5001 #端口号
log_bin = /mnt/data/moon/db/data_1/var/mysql-bin.log #打开日志
binlog-do-db=tradeplatform#要复制的库
binlog_ignore_db=mysql #不复制的库
expire_logs_days=3 #日志保存时长
slave-skip-errors=all #忽略所有错误
binlog_cache_size = 4M
max_binlog_size = 1G
max_binlog_cache_size = 2G
skip-name-resolve # 跳过解析来访问的机器的hostname(解决第一次访问慢)


sync_binlog = 1
event_scheduler=ON #开启事件功能
auto_increment_increment = 2 #自增长key的增加因子
auto_increment_offset = 1 #自增长的开始增长数
log-slave-updates # 为了让slave也能充当master,写relay-log的时候也会写到bin-log 

#master-host = xxxxxxxx
#master-user =xxxxxx
#master-password =xxxxxx
skip-name-resolve # 跳过解析来访问的机器的hostname(解决第一次访问慢)
event_scheduler=ON #开启事件功能
#skip-locking 5.5以后的版本不识别了
skip-external-locking 跳过外部锁定

注意server_id问题
show variables like 'server_id';
set global server_id=41;

2.从库
vi /etc/my.cnf

datadir=/mnt/data/moon/db/data_1
socket=/home/moon/db/mysql_1/var/mysql.sock
# Disabling symbolic-links is recommended to prevent assorted security risks
symbolic-links=0
# Settings user and group are ignored when systemd is used.
# If you need to run mysqld under a different user or group,
# customize your systemd unit file for mariadb according to the
# instructions in http://fedoraproject.org/wiki/Systemd

server-id = 1001 #主服务器ID,主从集群中必须唯一
port = 5001 #端口号
log_bin = /mnt/data/moon/db/data_1/var/mysql-bin.log #打开日志
binlog-do-db=tradeplatform#要复制的库
binlog_ignore_db=mysql #不复制的库
expire_logs_days=3 #日志保存时长
slave-skip-errors=all #忽略所有错误
binlog_cache_size = 4M
max_binlog_size = 1G
max_binlog_cache_size = 2G
skip-name-resolve # 跳过解析来访问的机器的hostname(解决第一次访问慢)


sync_binlog = 1
event_scheduler=ON #开启事件功能
auto_increment_increment = 2 #自增长key的增加因子
auto_increment_offset = 1 #自增长的开始增长数
log-slave-updates # 为了让slave也能充当master,写relay-log的时候也会写到bin-log 

#master-host = 192.168.1.147
#master-user =cmgesync
#master-password =cmgesyncpwd
skip-name-resolve # 跳过解析来访问的机器的hostname(解决第一次访问慢)
event_scheduler=ON #开启事件功能
#skip-locking 5.5以后的版本不识别了
skip-external-locking 跳过外部锁定


sync_binlog = 1
默认情况下,并不是每次写入时都将binlog与硬盘同步。因此如果操作系统或机器(不仅仅是MySQL服务器)崩溃,有可能binlog中最后的语句丢失了。要想防止这种情况,你可以使用sync_binlog全局变量(1是最安全的值,但也是最慢的),
使binlog在每N次binlog写入后与硬盘同步。即使sync_binlog设置为1,出现崩溃时,也有可能表内容和binlog内容之间存在不一致性。


3.设置主从关系
1.在主库上添加帐号
GRANT REPLICATION SLAVE,RELOAD,SUPER ON *.* TO 'reptradeplatform'@'xx.xx.xx.xx' identified by 'XXXXXXXXX';
GRANT REPLICATION SLAVE,RELOAD,SUPER ON *.* TO 'reptradeplatform'@'xx.xx.xx.xx' identified by 'XXXXXXXXX';
GRANT REPLICATION SLAVE,RELOAD,SUPER ON *.* TO 'reptradeplatform'@'xx.xx.xx.xx' identified by 'XXXXXXXXX';
GRANT REPLICATION SLAVE,RELOAD,SUPER ON *.* TO 'reptradeplatform'@'xx.xx.xx.xx' identified by 'XXXXXXXXX';
Mysql> flush REPLICATION 
FLUSH PRIVILEGES;

2.在主库上查出并保存复制要用的日志文件和复制点
mysql> show master status;
+------------------+----------+--------------+------------------+-------------------+

| File | Position | Binlog_Do_DB | Binlog_Ignore_DB | Executed_Gtid_Set |

+------------------+----------+--------------+------------------+-------------------+

| mysql-bin.000003 | 3425 | tradeplatform| mysql | |

+------------------+----------+--------------+------------------+-------------------+
1 row in set (0.00 sec)


3.在主库上生成主库快照
mysql>flush tables with read lock;
[root@localhost ~]# mysqldump -uroot -p cmge > tradeplatform.sql;
mysqldump -uroot -pXXXXXXXXX tradeplatform> tradeplatform.sql;
unlock tables; #解锁


4.在从库中设置主从关系
Mysql >change master to master_host='xx.xx.xx.xx',master_user='reptradeplatform', master_password='XXXXXXXXX',MASTER_LOG_FILE='mysql-bin.000003',MASTER_LOG_POS=3425;
>start slave;
在5.6的版本中,启动主从为:start slave,而之前用slave start也可以。
查看配置是否成功
如下表示成功
mysql> show slave status\G;

*************************** 1. row ***************************
Slave_IO_State: Waiting for master to send event
Master_Host: 10.251.228.29
Master_User: reptradeplatform
Master_Port: 5001
Connect_Retry: 60
Master_Log_File: mysql-bin.000003
Read_Master_Log_Pos: 3425
Relay_Log_File: localhost-relay-bin.000002
Relay_Log_Pos: 3425
Relay_Master_Log_File: mysql-bin.000005
Slave_IO_Running: Yes
Slave_SQL_Running: Yes
Replicate_Do_DB:
Replicate_Ignore_DB:
Replicate_Do_Table:
Replicate_Ignore_Table:
Replicate_Wild_Do_Table:
Replicate_Wild_Ignore_Table:
Last_Errno: 0
分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics