主从复制概念
MySQL 主从复制是指数据可以从一个MySQL数据库服务器主节点复制到一个或多个从节点。MySQL 默认采用异步复制方式,这样从节点不用一直访问主服务器来更新自己的数据,数据的更新可以在远程连接上进行,从节点可以复制主数据库中的所有数据库或者特定的数据库,或者特定的表。
主从复制模式
一主一从
一主一从和一主多从是最常见的主从架构,实施起来简单并且有效,不仅可以实现HA,而且还能读写分离,进而提升集群的并发能力。
多主一从
多主一从可以将多个mysql数据库备份到一台存储性能比较好的服务器上。
双主复制
双主复制,也就是互做主从复制,每个master既是master,又是另外一台服务器的slave。这样任何一方所做的变更,都会通过复制应用到另外一方的数据库中。
级联复制
级联复制模式下,部分slave的数据同步不连接主节点,而是连接从节点。因为如果主节点有太多的从节点,就会损耗一部分性能用于replication,那么我们可以让3~5个从节点连接主节点,其它从节点作为二级或者三级与从节点连接,这样不仅可以缓解主节点的压力,并且对数据一致性没有负面影响。
实现步骤
配置主库
编辑主库my.cnf (vi /etc/my.cnf)
[mysqld]
datadir=/usr/local/mysql/data
port = 3306
sql_mode=NO_ENGINE_SUBSTITUTION,STRICT_TRANS_TABLES
symbolic-links=0
max_connections=400
innodb_file_per_table=1
#表名大小写不明感,敏感为
lower_case_table_names=1
user=mysql
character-set-server=utf8
default_authentication_plugin=mysql_native_password
# 开启binlog
log-bin=mysql-bin
# 主从复制的格式(mixed,statement,row,默认格式是statement)
binlog-format=ROW
# 需要保证唯一性 不可与其他从服务器相同 如果为0会拒绝所有从服务器连接
server_id=1
# 二进制日志自动删除/过期的天数。默认值为0,表示不自动删除。
expire_logs_days = 10
# 日志最大大小
max_binlog_size = 100M
# 需要写binlog的数据库
binlog_do_db = firecontrol
# 不需要写binlog的数据库
binlog_ignore_db = mysql
# 跳过主从复制中遇到的所有错误或指定类型的错误,避免slave端复制中断。
# 如:1062错误是指一些主键重复,1032错误是因为主从数据库数据不一致
slave_skip_errors=1062
[client]
default-character-set=utf8
[mysql]
default-character-set=utf8
重启主库mysql (service mysql restart),进入mysql控制台 (mysql -uroot -p)
# 创建一个用户用来给从库复制用
mysql> CREATE USER 'slave'@'%' IDENTIFIED BY '123456';
mysql> GRANT REPLICATION SLAVE, REPLICATION CLIENT ON *.* TO 'slave'@'%';
# 查看主库参数 ,记住 File 和 Position 对应的参数,从库需要配置这些参数
mysql> show master status;
+------------------+----------+--------------+------------------+-------------------+
| File | Position | Binlog_Do_DB | Binlog_Ignore_DB | Executed_Gtid_Set |
+------------------+----------+--------------+------------------+-------------------+
| mysql-bin.000003 | 2336 | firecontrol | mysql | |
+------------------+----------+--------------+------------------+-------------------+
1 row in set (0.00 sec)
配置从库
编辑主库my.cnf (vi /etc/my.cnf)
[mysqld]
datadir=/usr/local/mysql/data
port = 3306
sql_mode=NO_ENGINE_SUBSTITUTION,STRICT_TRANS_TABLES
symbolic-links=0
max_connections=400
innodb_file_per_table=1
#表名大小写不明感,敏感为
lower_case_table_names=1
user=mysql
character-set-server=utf8
default_authentication_plugin=mysql_native_password
# 开启binlog
log-bin=mysql-bin
# 主从复制的格式(mixed,statement,row,默认格式是statement)
binlog-format=ROW
# server_id不要重复
# 需要保证唯一性 不可与其他从服务器相同 如果为0会拒绝所有从服务器连接
server_id=2
# 二进制日志自动删除/过期的天数。默认值为0,表示不自动删除。
expire_logs_days = 10
# 日志最大大小
max_binlog_size = 100M
# 跳过主从复制中遇到的所有错误或指定类型的错误,避免slave端复制中断。
# 如:1062错误是指一些主键重复,1032错误是因为主从数据库数据不一致
slave_skip_errors=1062
[client]
default-character-set=utf8
[mysql]
default-character-set=utf8
重启从库mysql (service mysql restart),进入mysql控制台 (mysql -uroot -p)
# 配置主库,master_log_file 对应上面 File, master_log_pos 对应 Position
mysql> change master to master_host='192.168.1.15', master_user='slave', master_password='123456', master_port=3306, master_log_file='mysql-bin.000003', master_log_pos=2336, master_connect_retry=30;
# 开启主从复制
mysql> start slave;
# 查看主从复制状态,主要看下Slave_IO_Running、Slave_SQL_Running是不是全是yes,否,上面参数配置有问题
mysql> show slave status \G;
*************************** 1. row ***************************
Slave_IO_State: Waiting for master to send event
Master_Host: 192.168.1.15
Master_User: slave
Master_Port: 3306
Connect_Retry: 30
Master_Log_File: mysql-bin.000003
Read_Master_Log_Pos: 3063
Relay_Log_File: localhost-relay-bin.000003
Relay_Log_Pos: 3229
Relay_Master_Log_File: mysql-bin.000003
Slave_IO_Running: Yes
Slave_SQL_Running: Yes
Replicate_Do_DB:
Replicate_Ignore_DB:
Replicate_Do_Table:
Replicate_Ignore_Table:
Replicate_Wild_Do_Table:
验证主从复制
在主库中执行增、删、改语句,看从库数据是不是也改变,收工