linux学习之Mysql主从同步

主从同步原理:
Master:记录数据更改操作
1、启用binlog日志
2、设置binlog日志格式
3、设置server_id
slave:运行两个线程
1、Slave_IO:复制master主机binlog日志里的SQL到本机的relay_log文件
2、Slave_SQL:执行本机relay_log文件里的SQL语句,重现Master的数据操作

构建环境:
1、确保从库与主库数据相同
2、主服务器要启用binlog日志、有授权用户并查看当前使用的日志
3、从服务器要设置server_id,指定主库信息

相关文件:

文件名 说明
master.info 主库信息
relay-log.info 中继日志信息
主机名-rely-bin.xxxxx 中继日志
主机名-rely-bin.index 索引文件

主库配置选项:

选项 用途
binlog_do_db=name 设置Master对哪些库记日志
binlog_ignore_db=name 设置Master对哪些库不记日志

从库配置选项:

选项 用途
log_slave_updates 记录从库更新,允许链式复制
relay_log=dbsvr2-relay-bin 制定中继日志文件名
replicate_do_db=mysql 仅复制制定库,其他库被忽略,可设置多条
replicate_ignore_db=test 不复制哪些库,其他库将被忽略,jgnore-db与do-db只需用一种

主从同步结构:
单向复制:主–>从
链式复制:主–>从–>从
互为主从:主<–>主
一主多从:从<–主-->从

复制模式:
1、异步复制:主库执行完一次事务后,立即将结果返给客户端,并不关心从库是否接受处理
2、全同步复制:当从库执行完一次事务,且所有从库都执行了该事务后才返回给客户端
3、半同步复制:介于异步复制和全同步复制之间,等待至少一个从库接收到并写到relay-log中才返回给客户端

主从同步配置:
1、配置主服务器
开启binlog日志,指定服务ID与日志格式

[mysqld]
log-bin=日志名      #开启binlog日志
bind-address=0.0.0.0
server_id=id值
binlog-format="mixed"   #指定日志格式

#重启服务
systemctl restart mysqld

2、授权用户,允许从库网段访问(默认对所有库有同步权限)

mysql> grant replication slave on *.* to 'mingzi'@'%' identified by '1234';
#允许mingzi用户从所有网段连接,对所有库有同步权限密码1234

3、查看主库信息

mysql> show master status\G
*************************** 1. row ***************************
File: mysql-bin.000003
Position: 439
Binlog_Do_DB: 
Binlog_Ignore_DB: 
Executed_Gtid_Set: 
1 row in set (0.00 sec)

配置从库
确保从库数据与主库数据一致下进行以下操作

1、指定server_id,不允许重复

vim /etc/my.cnf
[mysql]
server_id=id
#重启服务
systemctl restart mysqld

2、指定从库信息

mysql> change master to 
    -> master_user='mingzi'
    -> ,master_password='1234',
    -> master_host='192.168.4.2' #主机地址,
    -> master_log_file='mysql-bin.000003',   #主机日志文件名
    -> master_log_pos=439; #主机偏移位置
Query OK, 0 rows affected, 2 warnings (0.03 sec)

mysql> start slave; #启动进程

3、检查状态

mysql> show slave status\G
   ……
   Slave_IO_Running: Yes
   Slave_SQL_Running: Yes
   ……

配置主从从结构

1、主库
配置主服务器
开启binlog日志,指定服务ID与日志格式

[mysqld]
log-bin=日志名      #开启binlog日志
bind-address=0.0.0.0
server_id=id值
binlog-format="mixed"   #指定日志格式

授权用户,允许从库网段访问(默认对所有库有同步权限)
mysql> grant replication slave on *.* to '授权用户'@'第一台从库位置' identified by '密码';

2、第一台从库
修改配置文件/etc/my.cnf

vim /etc/my.cnf
[mysqld]
server_id=id号
log_bin=日志名
binlog_format='mixed'
log_slave_updates

重启后进入数据库配置主从关系
授权用户,允许从库网段访问(默认对所有库有同步权限)

mysql> grant replication slave on *.* to '授权用户i'@'第二台从库位置'  identified by '密码';
#允许mingzi用户从所有网段连接,对所有库有同步权限密码1234

指定从库信息

mysql> change master to 
    -> master_user='授权用户'
    -> ,master_password='密码',
    -> master_host='192.168.4.2' #主机地址,
    -> master_log_file='mysql-bin.000003',   #主机日志文件名
    -> master_log_pos=439; #主机偏移位置
Query OK, 0 rows affected, 2 warnings (0.03 sec)

mysql> start slave; #启动进程

3、配置第二台从库
修改配置文件

vim /etc/my.cnf
[mysqld]
server_id=id号

指定从库信息

mysql> change master to 
    -> master_user='授权用户'
    -> ,master_password='密码',
    -> master_host='192.168.4.2' #主机地址,
    -> master_log_file='mysql-bin.000003',   #主机日志文件名
    -> master_log_pos=439; #主机偏移位置
Query OK, 0 rows affected, 2 warnings (0.03 sec)

mysql> start slave; #启动进程

半同步复制配置

1、查看是否允许动态加载模块

mysql> mysql> show variables lik_dynamic_loading';
+----------------------+-------+
| Variable_name        | Value |
+----------------------+-------+
| have_dynamic_loading | YES   |    #默认允许
+----------------------+-------+
1 row in set (0.00 sec)

2、加载插件
主库:

mysql> install plugin rpl_semi_sync_master  soname 'semisync_master.so';
Query OK, 0 rows affected (0.11 sec)
mysql> select plugin_name,plugin_status from information_schema.plugins where plugin_name like '%semi%';
+----------------------+---------------+
| plugin_name          | plugin_status |
+----------------------+---------------+
| rpl_semi_sync_master | ACTIVE        |
+----------------------+---------------+
1 row in set (0.00 sec)

从库:

mysql> install plugin rpl_semi_sync_slave soname 'semisync_slave.so';
Query OK, 0 rows affected (0.02 sec)
mysql> select plugin_name,plugin_status from information_schema.plugins where plugin_name like '%semi%';
+----------------------+---------------+
| plugin_name          | plugin_status |
+----------------------+---------------+
| rpl_semi_sync_slave  | ACTIVE        |
+----------------------+---------------+
1 row in set (0.00 sec

插件安装完,但半同步复制还是关闭状态。
3、启用半同步复制
主库:

mysql> set global rpl_semi_sync_master_enabled=1;
Query OK, 0 rows affected (0.00 sec)
mysql> show variables like 'rpl_semi_sync_%_enabled';  #查看状态
+------------------------------+-------+
| Variable_name                | Value |
+------------------------------+-------+
| rpl_semi_sync_master_enabled | ON    |
+------------------------------+-------+
1 row in set (0.00 sec)

从库`

mysql> set global rpl_semi_sync_slave_enabled=1;
Query OK, 0 rows affected (0.00 sec)
mysql> show variables like 'rpl_semi_sync_%_enabled';    #查看状态
+-----------------------------+-------+
| Variable_name               | Value |
+-----------------------------+-------+
| rpl_semi_sync_slave_enabled | ON    |
+-----------------------------+-------+
1 row in set (0.01 sec)

此时,临时半同步复制配置完成,数据库关闭后失效
4、永久配置半同步状态
需要将修改主配置文件/etc/my.cnf
主库:

plugin-load=rpl_semi_sync_master=semisync_master.so
rpl_semi_sync_master_enabled=1

从库:

plugin-load=rpl_semi_sync_slave=semisync_slave.so
rpl_semi_sync_slave_enabled=1

5、在高可用架构下,master和slave需同时启动

plugin-load=rpl_semi_sync_master=semisync_master.so
rpl_semi_sync_master_enabled=1
plugin-load=rpl_semi_sync_slave=semisync_slave.so
rpl_semi_sync_slave_enabled=1

mysql> show variables like 'rpl_semi_sync_%_enabled';
+------------------------------+-------+
| Variable_name                | Value |
+------------------------------+-------+
| rpl_semi_sync_master_enabled | ON    |
| rpl_semi_sync_slave_enabled  | ON    |
+------------------------------+-------+
2 rows in set (0.00 sec)

你可能感兴趣的:(学习日记)