mysql的主从,主主,半同步

主配置文件

[mysqld]

datadir=/data/mydata

log-bin=/data/binlogs/master-bin

socket=/var/lib/mysql/mysql.sock

innodb_file_per_table=on

server-id=1

sync_binlog=on  #在事务提交时,立即把bin-log缓存区中的事件立即刷写到磁盘到的二进制日志区上,保证从服务器尽早同步数据

innodb_flush_log_at_trx_commit=on  #当使用innodb引擎,在事务提交时,把内存中跟事务相关的数据立即写到事务日志中

innodb_support_xa=on   #innodb支持分布式事务

从配置文件

[mysqld]

datadir=/data/mydata

# log-bin=/data/binlogs/bin-log

socket=/var/lib/mysql/mysql.sock

innodb_file_per_table=on

relay-log=/data/binlogs/relay-bin

server-id=7

read_only=on

skip_slave_start=on #第1次启动START SLAVE后,重启从mysql后,默认slave自动启动,应该关闭自动启动

#在主节点授权具有复制权限用户
为了方便,我这里给的权限十分大,生产环境不建议这么搞。一般给予REPLICATION SLAVE,REPLICATION CLIENT
MariaDB [(none)]> GRANT ALL ON *.* to "test"@"10.0.0.%" identified by "test";
MariaDB [(none)]> flush privileges;
#在从服务器上连接到主
MariaDB [(none)]> CHANGE MASTER TO MASTER_HOST=‘10.0.0.41‘,MASTER_USER=‘test‘,MASTER_PASSWORD=‘test‘;
MariaDB [(none)]> START SLAVE;
#上面的方式,是从数据库从0开始同步主的数据,很简单就没有贴实验
#下面是先做完全还原后再从事件某位置同步主数据
[[email protected] ~]# mysqldump --all-databases --flush-logs --master-data=2 --lock-all-tables >all.sql
[[email protected] ~]# less all.sql 
-- CHANGE MASTER TO MASTER_LOG_FILE=‘master-bin.000004‘, MASTER_LOG_POS=245;
[[email protected] ~]# scp all.sql 10.0.0.41:/root/
MariaDB [(none)]> create database helloit;
MariaDB [(none)]> use helloit;
MariaDB [helloit]> CREATE TABLE test (id int);
MariaDB [helloit]> INSERT INTO test VALUES (1),(2),(3);
MariaDB [helloit]> show tables;
+-------------------+
| Tables_in_helloit |
+-------------------+
| test              |
+-------------------+
1 row in set (0.00 sec)

MariaDB [helloit]> select * from test;
+------+
| id   |
+------+
|    1 |
|    2 |
|    3 |
+------+

MariaDB [helloit]> GRANT REPLICATION SLAVE,REPLICATION CLIENT ON *.* TO "test"@"10.0.0.88" IDENTIFIED  BY "test";

#在备节点上
#先导入完全备份的数据
MariaDB [(none)]> source /root/all.sql;

MariaDB [test]> show databases;
+--------------------+
| Database           |
+--------------------+
| information_schema |
| hellodb            |
| mysql              |
| performance_schema |
| test               |
+--------------------+
#并没有 helloit这个
#这时再实行主从同步
MariaDB [test]> CHANGE MASTER TO MASTER_HOST="10.0.0.41",MASTER_USER="test",MASTER_PASSWORD="test",MASTER_LOG_FILE="master-bin.000004",MASTER_LOG_POS=245;
#在从上启动sql和IO线程
MariaDB [test]> START SLAVE;
#验证实验结果
MariaDB [test]> show databases;
+--------------------+
| Database           |
+--------------------+
| information_schema |
| hellodb            |
| helloit            |
| mysql              |
| performance_schema |
| test               |
+--------------------+

MariaDB [test]> use helloit;
MariaDB [helloit]> select * from test;
+------+
| id   |
+------+
|    1 |
|    2 |
|    3 |
+------+
MariaDB [helloit]> show master status;
+-------------------+----------+--------------+------------------+
| File              | Position | Binlog_Do_DB | Binlog_Ignore_DB |
+-------------------+----------+--------------+------------------+
| master-bin.000004 |     1115 |              |                  |
+-------------------+----------+--------------+------------------+

#再次在主数据库插入数据
MariaDB [helloit]> INSERT INTO test VALUES (4),(5),(6);
Query OK, 3 rows affected (0.02 sec)
Records: 3  Duplicates: 0  Warnings: 0

MariaDB [helloit]> select * from test;
+------+
| id   |
+------+
|    1 |
|    2 |
|    3 |
|    4 |
|    5 |
|    6 |
+------+
#在从数据库上查看结果
MariaDB [helloit]> select * from test;
+------+
| id   |
+------+
|    1 |
|    2 |
|    3 |
|    4 |
|    5 |
|    6 |
+------+
6 rows in set (0.00 sec)
MariaDB [helloit]> show slave status\G;
*************************** 1. row ***************************
               Slave_IO_State: Waiting for master to send event
                  Master_Host: 10.0.0.41
                  Master_User: test
                  Master_Port: 3306
                Connect_Retry: 60
              Master_Log_File: master-bin.000004
          Read_Master_Log_Pos: 1115
               Relay_Log_File: relay-bin.000002
                Relay_Log_Pos: 1400
        Relay_Master_Log_File: master-bin.000004
             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
                   Last_Error: 
                 Skip_Counter: 0
          Exec_Master_Log_Pos: 1115
              Relay_Log_Space: 1688
              Until_Condition: None
               Until_Log_File: 
                Until_Log_Pos: 0
           Master_SSL_Allowed: No
           Master_SSL_CA_File: 
           Master_SSL_CA_Path: 
              Master_SSL_Cert: 
            Master_SSL_Cipher: 
               Master_SSL_Key: 
        Seconds_Behind_Master: 0
Master_SSL_Verify_Server_Cert: No
                Last_IO_Errno: 0
                Last_IO_Error: 
               Last_SQL_Errno: 0
               Last_SQL_Error: 
  Replicate_Ignore_Server_Ids: 
             Master_Server_Id: 1

注意:

1、从服务器应该为只读模式,在配置文件里设置read_only=on,但是对于超级管理用户无效,需要从终端施加读锁,一直在后台运行:

MariaDB [(none)]> FLUSH TABLES WITH READ LOCK;

2、在主从节点分别设置sync_master_info=on、sync_relay_log=on、sync_relay_log_info=on会降低I/O性能

主主复制

配置步骤:

1、各个节点使用一个唯一的server_id

2、都启动binary log 和relay_log

3、创建拥有复制权限的用户帐号

4、各自定义自动增长键为奇数和偶数

5、均把对方指定为主节点,并启动复制线程

主配置文件

[mysqld]

datadir=/data/mydata

log-bin=/data/binlogs/master-bin

relay_log=/data/relogs/relay-bin

socket=/var/lib/mysql/mysql.sock

innodb_file_per_table=on

server-id=1

auto_increment_offset=1

auto_increment_increment=2

从配置文件

[mysqld]

datadir=/data/mydata

log-bin=/data/binlogs/bin-log

relay-log=/data/relogs/relay-bin

socket=/var/lib/mysql/mysql.sock

innodb_file_per_table=on

server-id=7

auto_increment_offset=2

auto_increment_increment=2

各自创建授权帐号
主1
MariaDB [(none)]> GRANT REPLICATION SLAVE,REPLICATION CLIENT ON *.* TO "test"@"10.0.0.88" IDENTIFIED  BY "test";
MariaDB [(none)]> flush privileges;
MariaDB [(none)]> show master status;
+-------------------+----------+--------------+------------------+
| File              | Position | Binlog_Do_DB | Binlog_Ignore_DB |
+-------------------+----------+--------------+------------------+
| master-bin.000001 |      671 |              |                  |
+-------------------+----------+--------------+------------------+
主2
MariaDB [(none)]> GRANT REPLICATION SLAVE,REPLICATION CLIENT ON *.* TO "test"@"10.0.0.41" IDENTIFIED  BY "test";
MariaDB [(none)]> flush privileges;
MariaDB [(none)]> show master status;
+----------------+----------+--------------+------------------+
| File           | Position | Binlog_Do_DB | Binlog_Ignore_DB |
+----------------+----------+--------------+------------------+
| bin-log.000003 |      671 |              |                  |
+----------------+----------+--------------+------------------+
#在主1上连主2
MariaDB [(none)]> CHANGE MASTER TO MASTER_HOST="10.0.0.88",MASTER_USER="test",MASTER_PASSWORD="test",MASTER_LOG_FILE="bin-log.000003",MASTER_LOG_POS=671;
#在主2上连主1
MariaDB [(none)]> CHANGE MASTER TO MASTER_HOST="10.0.0.41",MASTER_USER="test",MASTER_PASSWORD="test",MASTER_LOG_FILE="master-bin.000001",MASTER_LOG_POS=671;
#分别启动从模式
start slave
#在主1上插入一些数据
MariaDB [(none)]> source /root/hellodb.sql
MariaDB [hellodb]> show databases;
+--------------------+
| Database           |
+--------------------+
| information_schema |
| hellodb            |
| mysql              |
| performance_schema |
| test               |
+--------------------+
5 rows in set (0.02 sec)
#在主2上查看是否同步
MariaDB [(none)]> show databases;
+--------------------+
| Database           |
+--------------------+
| information_schema |
| hellodb            |
| mysql              |
| performance_schema |
| test               |
+--------------------+
5 rows in set (0.00 sec)
#在主2上创建一个数据库
MariaDB [(none)]> show databases;
+--------------------+
| Database           |
+--------------------+
| information_schema |
| IT                 |
| hellodb            |
| mysql              |
| performance_schema |
| test               |
+--------------------+
6 rows in set (0.00 sec)
#在主1上查看
MariaDB [hellodb]> show databases;
+--------------------+
| Database           |
+--------------------+
| information_schema |
| IT                 |
| hellodb            |
| mysql              |
| performance_schema |
| test               |
+--------------------+
6 rows in set (0.02 sec)
已经双主同步
#主1上的二进制日志和中继日志
[[email protected] data]# ls /data/binlogs/
master-bin.000001  master-bin.index
[[email protected] data]# ls binlogs/
master-bin.000001  master-bin.index
[[email protected] data]# ls relogs/
relay-bin.000001  relay-bin.000002  relay-bin.index
#主2上的二进制日志和中继日志
[[email protected] data]# ls binlogs/
bin-log.000001  bin-log.000002  bin-log.000003  bin-log.index
[[email protected] data]# ls relogs/
relay-bin.000001  relay-bin.000002  relay-bin.index

半同步

#主配置文件

[mysqld]

datadir=/data/mydata

log-bin=/data/binlogs/master-bin

socket=/var/lib/mysql/mysql.sock

innodb_file_per_table=on

server-id=1

#从配置文件

[mysqld]

datadir=/data/mydata

#log-bin=/data/binlogs/bin-log

relay-log=/data/relogs/relay-bin

socket=/var/lib/mysql/mysql.sock

innodb_file_per_table=on

server-id=7

#主上创建具有复制权限的帐号
MariaDB [(none)]> GRANT REPLICATION SLAVE,REPLICATION CLIENT ON *.* TO "test"@"10.0.0.88" IDENTIFIED  BY "test";
#在从上连接主数据库
MariaDB [(none)]> CHANGE MASTER TO MASTER_HOST="10.0.0.41",MASTER_USER="test",MASTER_PASSWORD="test",MASTER_LOG_FILE="master-bin.000003",MASTER_LOG_POS=413;
MariaDB [(none)]> start slave;
#检查主从能同步后,关闭主从状态,加入半同步插件
MariaDB [(none)]> stop slave;
#在主节点上安装主的半同步插件
MariaDB [(none)]> INSTALL PLUGIN rpl_semi_sync_master SONAME ‘semisync_master.so‘;
MariaDB [(none)]> SET GLOBAL rpl_semi_sync_master_enabled=1;
MariaDB [(none)]> show global variables like "%semi%";
+------------------------------------+-------+
| Variable_name                      | Value |
+------------------------------------+-------+
| rpl_semi_sync_master_enabled       | ON    |
| rpl_semi_sync_master_timeout       | 10000 |
| rpl_semi_sync_master_trace_level   | 32    |
| rpl_semi_sync_master_wait_no_slave | ON    |
+------------------------------------+-------+

#在从节点上安装从的半同步插件
MariaDB [(none)]> INSTALL PLUGIN rpl_semi_sync_slave SONAME ‘semisync_slave.so‘;
Query OK, 0 rows affected (0.00 sec)

MariaDB [(none)]> SET GLOBAL rpl_semi_sync_slave_enabled=1;
Query OK, 0 rows affected (0.00 sec)

MariaDB [(none)]> show global variables like "%semi%";
+---------------------------------+-------+
| Variable_name                   | Value |
+---------------------------------+-------+
| rpl_semi_sync_slave_enabled     | ON    |
| rpl_semi_sync_slave_trace_level | 32    |
+---------------------------------+-------+
2 rows in set (0.00 sec)
MariaDB [(none)]> start slave;
#在主上查看是否有从节点加入
MariaDB [(none)]> SHOW GLOBAL STATUS LIKE ‘%semi%‘;
+--------------------------------------------+-------+
| Variable_name                              | Value |
+--------------------------------------------+-------+
| Rpl_semi_sync_master_clients               | 1     |
| Rpl_semi_sync_master_net_avg_wait_time     | 0     |
| Rpl_semi_sync_master_net_wait_time         | 0     |
| Rpl_semi_sync_master_net_waits             | 0     |
| Rpl_semi_sync_master_no_times              | 0     |
| Rpl_semi_sync_master_no_tx                 | 0     |
| Rpl_semi_sync_master_status                | ON    |
| Rpl_semi_sync_master_timefunc_failures     | 0     |
| Rpl_semi_sync_master_tx_avg_wait_time      | 0     |
| Rpl_semi_sync_master_tx_wait_time          | 0     |
| Rpl_semi_sync_master_tx_waits              | 0     |
| Rpl_semi_sync_master_wait_pos_backtraverse | 0     |
| Rpl_semi_sync_master_wait_sessions         | 0     |
| Rpl_semi_sync_master_yes_tx                | 0     |
+--------------------------------------------+-------+
#已经有一个备用节点加入
#在主上创建新数据,测试效果
MariaDB [(none)]> CREATE DATABASE MBA;
MariaDB [(none)]> SHOW GLOBAL STATUS LIKE ‘%semi%‘;
+--------------------------------------------+-------+
| Variable_name                              | Value |
+--------------------------------------------+-------+
| Rpl_semi_sync_master_clients               | 1     |
| Rpl_semi_sync_master_net_avg_wait_time     | 17434 |
| Rpl_semi_sync_master_net_wait_time         | 17434 |
| Rpl_semi_sync_master_net_waits             | 1     |
| Rpl_semi_sync_master_no_times              | 0     |
| Rpl_semi_sync_master_no_tx                 | 0     |
| Rpl_semi_sync_master_status                | ON    |
| Rpl_semi_sync_master_timefunc_failures     | 0     |
| Rpl_semi_sync_master_tx_avg_wait_time      | 18407 |
| Rpl_semi_sync_master_tx_wait_time          | 18407 |
| Rpl_semi_sync_master_tx_waits              | 1     |
| Rpl_semi_sync_master_wait_pos_backtraverse | 0     |
| Rpl_semi_sync_master_wait_sessions         | 0     |
| Rpl_semi_sync_master_yes_tx                | 1     |
+--------------------------------------------+-------+
#完成半同步过程需要1.8s左右。

复制过滤器

让从节点仅复制指定数据库,或指定数据库的指定表

有2种方式:

1、主服务器仅向二进制日志中记录与特定数据库(特定表)相关的事件,不建议使用,因为无法实现时间还原

2、从服务器SQL_THREAD在replay中继日志中的事件时,仅读取与特定数据库(特定表)相关的事件并应用于本地

在从服务器配置参数过滤,只复制MBA之个库

从数据库配置文件

[mysqld]

datadir=/data/mydata

#log-bin=/data/binlogs/bin-log

relay-log=/data/relogs/relay-bin

socket=/var/lib/mysql/mysql.sock

innodb_file_per_table=on

server-id=7

replicate_do_db=MBA  #只允许复制MBA

注:可用参数

replicate_do_db=   #白名单,只复制某个数据库

replicate_ignore_db=   #黑名单

replicate_do_table=   #表的白名单

replicate_ignore_table=  #表的黑名单

replicate_wild_do_table=  #表的通配表达,白名单

replicate_wild_ignore_table=

在主上插入数据
MariaDB [MBA]> CREATE TABLE hello (id int);
MariaDB [MBA]> INSERT INTO hello VALUES (1),(2),(3);
Query OK, 3 rows affected (0.02 sec)
Records: 3  Duplicates: 0  Warnings: 0

MariaDB [MBA]> select * from hello;
+------+
| id   |
+------+
|    1 |
|    2 |
|    3 |
+------+
在从上查看
MariaDB [MBA]> show tables;
+---------------+
| Tables_in_MBA |
+---------------+
| hello         |
+---------------+
1 row in set (0.00 sec)

MariaDB [MBA]> select * from hello;
+------+
| id   |
+------+
|    1 |
|    2 |
|    3 |
+------+
在主上插入其他库数据
MariaDB [MBA]> create database it;
Query OK, 1 row affected (0.00 sec)

MariaDB [MBA]> show databases;
+--------------------+
| Database           |
+--------------------+
| information_schema |
| MBA                |
| it                 |
| mysql              |
| performance_schema |
| test               |
+--------------------+
在从数据库上查看
MariaDB [MBA]> show databases;
+--------------------+
| Database           |
+--------------------+
| information_schema |
| MBA                |
| mysql              |
| performance_schema |
| test               |
+--------------------+
并没有it这个新创建的数据库
时间: 2024-08-08 01:08:48

mysql的主从,主主,半同步的相关文章

mysql的主从、主主及半同步复制

mysql复制 Mysql内建的复制功能是构建大型,高性能应用程序的基础.将Mysql的数据分布到多个系统上去,这种分布的机制,是通过将Mysql的某一台主机的数据复制到其它主机(slaves)上,并重新执行一遍来实现的.复制过程中一个服务器充当主服务器,而一个或多个其它服务器充当从服务器.主服务器将更新写入二进制日志文件,并维护文件的一个索引以跟踪日志循环.这些日志可以记录发送到从服务器的更新.当一个从服务器连接主服务器时,它通知主服务器从服务器在日志中读取的最后一次成功更新的位置.从服务器接

mysql主从和mysql主主和半同步复制

一.准备(主从都需要配置):     yum -y install mysql mysql-server #安装mysql   yum -y install ntpdate #安装时间同步   echo '*/1 * * * * /usr/sbin/ntpdate ntp1.aliyun.com &>/dev/null' >>/var/spool/cron/root #配置网络时间同步   service mysqld start #启动服务   chkconfig --add 

MySQL运维进阶-MySQL双主(master-master)+半同步(Semisync Repl

MySQL --> MariaDB --> Percona-Server MySQL: oracle ,commutity : 社区版 5.5 5.6 5.7 8.0MariaDB:5.5 10.xPercona:Percona-ServerInnoDB --> XtraDBXtrabackuppercona-tools: 存储引擎:引擎:也称为表类型,表级别概念,不建议在同一个库中的表上使用不同的ENGINE:CREATE TABLE ... ENGINE STORAGE_ENGINE

第四阶段 (七)MySQL REPLICATION(主从复制、半同步复制、复制过滤)

Linux运维 第四阶段 (七)MySQL REPLICATION(主从复制.半同步复制.复制过滤) 一.MySQL Replication相关概念: 1.复制的作用:辅助实现备份:高可用HA:异地容灾:分摊负载(scaleout):rw-spliting(mysql proxy工作在应用层). 2.master有多个CPU允许事务并行执行,但往二进制日志文件只能一条条写:slave比master要慢:master-slave默认异步方式传送. 3.半同步:仅负责最近一台slave同步成功,其它

mysql的主从,主主,半同步,SSL复制

本实验的目的是实现两台主机上的MySQL数据复制,以及基于SSL的复制. *要注意的两点问题所在: 1,版本问题:复制双方的版本最好一致,若不同,从节点的版本必须高于主节点的版本 2,复制起点问题:(1),从0开始,使用于均为新建服务器.(2),中间开始,就需要完全备份主服务上的数据,并将数据恢复至从服务器: 从服务器从备份时主服务器二进制日志所在位置开始复制. 实验环境: node1:MASTER MariaDB 172.16.18.1 node2:SALVE    MariaDB 172.1

MySQL数据的主从复制、半同步复制和主主复制详解

一.MySQL复制概述 ⑴.MySQL数据的复制的基本介绍 目前MySQL数据库已经占去数据库市场上很大的份额,其一是由于MySQL数据的开源性和高性能,当然还有重要的一条就是免费~不过不知道还能免费多久,不容乐观的未来,但是我们还是要能熟练掌握MySQL数据的架构和安全备份等功能,毕竟现在它还算是开源界的老大吧! MySQL数据库支持同步复制.单向.异步复制,在复制的过程中一个服务器充当主服务,而一个或多个服务器充当从服务器.主服务器将更新写入二进制日志文件,并维护文件的一个索引以跟踪日志循环

Mysql数据库主从及主主复制配置演示

From : http://www.cnblogs.com/tae44/p/4682810.html 实验系统:CentOS 6.6_x86_64 实验前提:提前准备好编译环境,防火墙和selinux都关闭 实验说明:本实验共有2台主机,IP分配如拓扑 实验软件:mariadb-10.0.20 实验拓扑: 一.安装mysql 1.编译安装mariadb: tar xf mariadb-10.0.20-linux-x86_64.tar.gz -C /usr/local/ cd /usr/local

MySQL数据库主从(主主)配置

一.系统环境: centos7.4 (centos 1708) mysql 5.7 master主机的IP地址为192.168.159.50 slave主机的IP地址为192.168.159.51 Master主机的同步用户名和密码:slave/[email protected] slave主机的同步用户名和密码:master/[email protected] 二.修改MySQL数据库配置文件 1.master主机 vi /etc/my.cnf 加入以下内容 server-id = 1 ---

【可靠性】Mysql 5.7 降低了半同步复制-数据丢失的风险

如果你的生产线开启了半同步复制,那么对数据的一致性会要求较高,但在MySQL5.5/5.6里,会存在数据不一致的风险.有这么一个场景,客户端提交了一个事务,master把binlog发送给slave,在发送的期间,网络出现波动,此时Binlog Dump线程发送就会卡住,要等待slave把binlog写到本地的relay-log里,然后给master一个反馈,等待的时间以rpl_semi_sync_master_timeout参数为准,默认为10秒.在这等待的10秒钟里,在其他会话里,查看刚才的