MySQL主从复制(异步模式)

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了MySQL主从复制(异步模式)相关的知识,希望对你有一定的参考价值。

mysql主从复制有异步模式、半同步模式、GTID模式以及多源复制模式,MySQL默认模式是异步模式。所谓异步模式,只MySQL 主服务器上I/O thread 线程将二进制日志写入binlog文件之后就返回客户端结果,不会考虑二进制日志是否完整传输到从服务器以及是否完整存放到从服务器上的relay日志中,这种模式一旦主服务(器)宕机,数据就会发生丢失。

环境:

技术分享图片
1 [[email protected] ~]# cat /etc/redhat-release
2 CentOS Linux release 7.2.1511 (Core)
3 [[email protected] ~]# uname -a
4 Linux localhost.localdomain 3.10.0-327.el7.x86_64 #1 SMP Thu Nov 19 22:10:57 UTC 2015 x86_64 x86_64 x86_64 GNU/Linux
5 [[email protected] ~]# 
View Code

MySQL版本:

mysql-5.7.22-linux-glibc2.12-x86_64.tar

主从复制IP规划:

主:192.168.112.2220

从:192.168.112.221

部署步骤:

tar xf  mysql-5.7.22-linux-glibc2.12-x86_64.tar.gz
mkdir -p /application
mv mysql-5.7.22-linux-glibc2.12-x86_64 /application/
ln -s /application/mysql-5.7.22-linux-glibc2.12-x86_64 /application/mysql
groupadd mysql
useradd mysql -g mysql -s /sbin/nologin
mkdir -p /application/data
chown -R mysql.mysql /application/mysql
chown -R mysql.mysql /application/mysql/*
chown -R mysql.mysql /application/data

安装常用依赖库:

[[email protected] ~]# yum install cmake gcc gcc-c++ libaio-devel automake autoconf bison libtool ncurses-devel libgcrypt-devel libev-devel perl-Digest-MD5 perl-DBI  perl-DBD-MySQL

 

编写配置文件my.cnf:

  1 [client]
  2 port = 3306
  3 socket = /tmp/mysql.sock
  4 
  5 [mysql]
  6 prompt="\[email protected] \R:\m:\s [\d]> "
  7 no-auto-rehash
  8 
  9 [mysqld]
 10 user = mysql
 11 port = 3306
 12 basedir = /application/mysql
 13 datadir = /application/data/mysql/
 14 socket = /tmp/mysql.sock
 15 character-set-server = utf8mb4
 16 skip_name_resolve = 1
 17 open_files_limit = 65535
 18 back_log = 1024
 19 max_connections = 512
 20 max_connect_errors = 100000
 21 table_open_cache = 1024
 22 table_definition_cache = 1024
 23 thread_stack = 512K
 24 external-locking = FALSE
 25 max_allowed_packet = 32M
 26 sort_buffer_size = 4M
 27 join_buffer_size = 4M
 28 thread_cache_size = 0
 29 query_cache_size = 0
 30 query_cache_type = 0
 31 interactive_timeout = 600
 32 wait_timeout = 600
 33 tmp_table_size = 32M
 34 slow_query_log =1
 35 slow_query_log_file = /application/data/mysql/slow.log
 36 log-error = /application/data/mysql/error.log
 37 long_query_time = 0.5
 38 server-id = 33060220
 39 log-bin = /application/data/mysql/mysql-binlog
 40 sync_binlog = 1
 41 binlog_cache_size = 4M
 42 max_binlog_cache_size = 1G
 43 max_binlog_size = 1G
 44 expire_logs_days = 7
 45 master_info_repository = TABLE
 46 relay_log_info_repository = TABLE
 47 #gtid_mode = on
 48 enforce_gtid_consistency = 1
 49 log_slave_updates
 50 binlog_format = row
 51 relay_log_recovery = 1
 52 relay-log-purge = 1
 53 key_buffer_size = 32M
 54 read_buffer_size = 8M
 55 read_rnd_buffer_size = 4M
 56 bulk_insert_buffer_size = 64M
 57 
 58 lock_wait_timeout = 3600
 59 explicit_defaults_for_timestamp = 1
 60 innodb_thread_concurrency = 0
 61 innodb_sync_spin_loops = 100
 62 innodb_spin_wait_delay = 30
 63 transaction_isolation = REPEATABLE-READ
 64 innodb_buffer_pool_size = 1024M
 65 innodb_buffer_pool_instances = 8
 66 innodb_buffer_pool_load_at_startup = 1
 67 innodb_buffer_pool_dump_at_shutdown = 1
 68 innodb_data_file_path = ibdata1:1G:autoextend
 69 innodb_flush_log_at_trx_commit = 1
 70 innodb_log_buffer_size = 32M
 71 innodb_log_file_size = 2G
 72 innodb_log_files_in_group = 2
 73 innodb_io_capacity_max = 2000
 74 innodb_io_capacity_max = 4000
 75 innodb_flush_neighbors = 0
 76 innodb_write_io_threads = 8
 77 innodb_read_io_threads = 8
 78 innodb_purge_threads = 4
 79 innodb_page_cleaners = 4
 80 innodb_open_files = 65535
 81 innodb_max_dirty_pages_pct = 50
 82 innodb_flush_method = O_DIRECT
 83 innodb_lru_scan_depth = 4000
 84 innodb_checksum_algorithm = crc32
 85 innodb_lock_wait_timeout = 10
 86 innodb_rollback_on_timeout = 1
 87 innodb_print_all_deadlocks = 1
 88 innodb_file_per_table = 1
 89 innodb_online_alter_log_max_size = 4G
 90 internal_tmp_disk_storage_engine = InnoDB
 91 innodb_stats_on_metadata = 0
 92 innodb_status_file = 1
 93 innodb_status_output = 0
 94 innodb_status_output_locks = 0
 95 
 96 #performance_schema
 97 
 98 performance_schema = 1
 99 performance_schema_instrument = %=on
100 
101 #innodb monitor
102 innodb_monitor_enable="module_innodb"
103 innodb_monitor_enable="module_server"
104 innodb_monitor_enable="module_dml"
105 innodb_monitor_enable="module_ddl"
106 innodb_monitor_enable="module_trx"
107 innodb_monitor_enable="module_os"
108 innodb_monitor_enable="module_purge"
109 innodb_monitor_enable="module_log"
110 innodb_monitor_enable="module_lock"
111 innodb_monitor_enable="module_buffer"
112 innodb_monitor_enable="module_index"
113 innodb_monitor_enable="module_ibuf_system"
114 innodb_monitor_enable="module_buffer_page"
115 innodb_monitor_enable="module_adaptive_hash"
116 
117 [mysqldump]
118 quick
119 max_allowed_packet = 32M

初始化数据操作:

[[email protected] ~]# mysqld --defaults-file=/etc/my.cnf --basedir=/application/mysql --datadir=/application/data/ --user=mysql --initialize

 

启动数据库:

[[email protected] ~]# /application/mysql/bin/mysqld_safe --defaults-file=/etc/my.cnf --user=mysql &

 

创建用于主从复制的用户及账户:

[email protected] 14:47:  [(none)]> create user rep@192.168.112.% identified by rep123;
Query OK, 0 rows affected (0.08 sec)

[email protected] 14:51:  [(none)]> grant replication slave on *.* to rep@192.168.112.%;
Query OK, 0 rows affected (0.01 sec)

[email protected] 14:52:  [(none)]> flush privileges;
Query OK, 0 rows affected (0.03 sec) [email protected]
14:52: [(none)]>

导出数据库:

mysqldump --single-transaction -uroot -hlocalhost [email protected]123 --master-data=2 -A >all.sql
[[email protected] ~]# netstat -lnupt|grep 3306
tcp6       0      0 :::3306                 :::*                    LISTEN      5819/mysqld         
[[email protected] ~]#

说明:--single-transaction  如果备份的数据库存储引擎是InnoDB,该参数可以保证数据的一致性,配合RR隔离级别一起使用,当发起事务时,读取一个数据的快照直到备份结束时,都不会读取到本事务开始之后提交的任何数据,--master-data=2,让备份出来的文件中记录备份这一时刻的binlog文件与position号,即记录备份时的binlog文件名和偏移位置

至此,主从复制在主服务器上操作完成,后面在从服务器上操作:

同样部署MySQL服务,然后登陆MySQL,导入all.sql文件,再运行:

CHANGE MASTER TO
MASTER_HOST=192.168.112.220,
MASTER_USER=rep,
MASTER_PASSWORD=rep123,
MASTER_PORT=3306,
MASTER_LOG_FILE=mysql-binlog.000003,
MASTER_LOG_POS=863;

开启主从复制状态:

[email protected] 14:55:  [(none)]> start slave;

查看主从复制状态:

技术分享图片
 1 [email protected] 14:56:  [(none)]> show slave status\G;
 2 *************************** 1. row ***************************
 3                Slave_IO_State: Waiting for master to send event
 4                   Master_Host: 192.168.112.220
 5                   Master_User: bak
 6                   Master_Port: 3306
 7                 Connect_Retry: 60
 8               Master_Log_File: mysql-binlog.000003
 9           Read_Master_Log_Pos: 2274
10                Relay_Log_File: localhost-relay-bin.000002
11                 Relay_Log_Pos: 1734
12         Relay_Master_Log_File: mysql-binlog.000003
13              Slave_IO_Running: Yes
14             Slave_SQL_Running: Yes
15               Replicate_Do_DB: 
16           Replicate_Ignore_DB: 
17            Replicate_Do_Table: 
18        Replicate_Ignore_Table: 
19       Replicate_Wild_Do_Table: 
20   Replicate_Wild_Ignore_Table: 
21                    Last_Errno: 0
22                    Last_Error: 
23                  Skip_Counter: 0
24           Exec_Master_Log_Pos: 2274
25               Relay_Log_Space: 1945
26               Until_Condition: None
27                Until_Log_File: 
28                 Until_Log_Pos: 0
29            Master_SSL_Allowed: No
30            Master_SSL_CA_File: 
31            Master_SSL_CA_Path: 
32               Master_SSL_Cert: 
33             Master_SSL_Cipher: 
34                Master_SSL_Key: 
35         Seconds_Behind_Master: 0
36 Master_SSL_Verify_Server_Cert: No
37                 Last_IO_Errno: 0
38                 Last_IO_Error: 
39                Last_SQL_Errno: 0
40                Last_SQL_Error: 
41   Replicate_Ignore_Server_Ids: 
42              Master_Server_Id: 33060220
43                   Master_UUID: cda19536-5749-11e8-8c7a-000c29268dcd
44              Master_Info_File: mysql.slave_master_info
45                     SQL_Delay: 0
46           SQL_Remaining_Delay: NULL
47       Slave_SQL_Running_State: Slave has read all relay log; waiting for more updates
48            Master_Retry_Count: 86400
49                   Master_Bind: 
50       Last_IO_Error_Timestamp: 
51      Last_SQL_Error_Timestamp: 
52                Master_SSL_Crl: 
53            Master_SSL_Crlpath: 
54            Retrieved_Gtid_Set: 
55             Executed_Gtid_Set: 
56                 Auto_Position: 0
57          Replicate_Rewrite_DB: 
58                  Channel_Name: 
59            Master_TLS_Version: 
60 1 row in set (0.00 sec)
61 
62 ERROR: 
63 No query specified
64 
65 [email protected] 14:56:  [(none)]> 
View Code

至此主从复制搭建完成






以上是关于MySQL主从复制(异步模式)的主要内容,如果未能解决你的问题,请参考以下文章

Mysql半同步复制模式说明 - 运维小结

MySQL 半同步复制模式说明及配置示例 - 运维小结

mysql数据库主从同步复制原理

MySQL的主从复制&主从同步

数据库主从

mysql主从库