Mysql主从复制两种配置方式

来源:互联网 发布:linux 读写文件命令 编辑:程序博客网 时间:2024/04/24 12:11

基于日志点的配置

mysql5.7
Centos6.6

master配置

    在主服务器的my.cnf配置文件中,增加```[mysqld]log-bin=mysql-binsserver-id=130  ```1. log-bin:开启二进制日志,该日志是在事务提交时写日志文件的。默认大小是1G,后面加001,002这样的后缀顺加。 2. server-id,唯一标识主机,mysql主从每个mysql实例配置都不一样就行。这个值默认是0,如果是0,主服务器拒绝任何从服务器的连接。

slave配置

    在从服务器的my.cnf配置文件中,增加```[mysqld]log-bin=mysql-binserver-id=131   ```server-id唯一就行。如果默认为0,则拒绝连接主服务器。

master创建复制用户

```CREATE USER 'repl'@'192.168.152.%' IDENTIFIED BY '123456';GRANT REPLICATION SLAVE ON *.* TO 'repl'@'192.168.152.%';```简单的创建用户,授予REPLICATION SLAVE权限。访问限制,密码,用户名等,根据实际情况自行设定,后面注意保持一致。

获取master日志坐标

```连接mysql,执行SHOW MASTER STATUS;会有类似输出+------------------+----------+--------------+------------------+-------------------+| File             | Position | Binlog_Do_DB | Binlog_Ignore_DB | Executed_Gtid_Set |+------------------+----------+--------------+------------------+-------------------+| mysql-bin.000003 |     1183 |              |                  |                   |+------------------+----------+--------------+------------------+-------------------+记住坐标 mysql-bin.000003    1183```这个会话输出,有可能为空,如果是全新安装,还没有产生二进制日志,你还是先随便执行点修改操作,后面就有了,一般的select是不记录二进制日志的。

备份master上的数据

mysqldump --all-databases --master-data -uroot -p > /tmp/dbdump.db

创建salve复制

```1.上传master是快照备份dbdump.db到slave的/tmp下2.salve的my.cnf配置mysqld块中增加skip-slave-start=trueread_only=ONrelay-log=relay-binrelay-log-index=relay-bin.index说明:skip-slave-start=true,跳过slave线程启动    其他的中断日志配置,就方便复制到其他salve,因为默认是主机名开关的文件。    read_only,我开启的只读模式3.启动slave    此时进入mysql,show processlist;是看不到复制线程的,show slave status \G显示也是空。4.设置master信息mysql> CHANGE MASTER TO-> MASTER_HOST='192.168.152.130',-> MASTER_USER='repl',-> MASTER_PASSWORD='123456',-> MASTER_LOG_FILE='mysql-bin.000003',-> MASTER_LOG_POS=1183;Query OK, 0 rows affected, 2 warnings (0.04 sec)最后的MASTER_LOG_FILE='mysql-bin.000003',MASTER_LOG_POS=1183可以省略,因为后面的倒入数据中如果有CHANGE MASTER TO MASTER_LOG_FILE='mysql-bin.000004', MASTER_LOG_POS=1183; 这样的语句。如果是手工冷备份过来的,则不能省略。为了方便,统一都写上的,哪种情况都合适,省得自己都晕了,就当上面那段话是空气,忘记吧。5.倒入数据到slave    mysql -uroot -p < /tmp/dbdump.db 6.查看slave状态    在slave中执行    mysql> show slave status \G        *************************** 1. row ***************************                       Slave_IO_State:                           Master_Host: 192.168.152.130                          Master_User: repl                          Master_Port: 13306                        Connect_Retry: 60                      Master_Log_File: mysql-bin.000003                  Read_Master_Log_Pos: 1183                       Relay_Log_File: relay-bin.000001                        Relay_Log_Pos: 4                Relay_Master_Log_File: mysql-bin.000003                     Slave_IO_Running: No                    Slave_SQL_Running: No                      Replicate_Do_DB:                   Replicate_Ignore_DB:         ...我们看到    Slave_IO_Running: No    Slave_SQL_Running: No复制线程还没有启动7.手工启动slave复制线程start slave8.再次查看下slave状态show slave status \G*************************** 1. row ***************************               Slave_IO_State: Waiting for master to send event                  Master_Host: 192.168.152.130                  Master_User: repl                  Master_Port: 13306                Connect_Retry: 60              Master_Log_File: mysql-bin.000003          Read_Master_Log_Pos: 1183               Relay_Log_File: relay-bin.000002                Relay_Log_Pos: 320        Relay_Master_Log_File: mysql-bin.000003             Slave_IO_Running: Yes            Slave_SQL_Running: Yes              Replicate_Do_DB: 这回都YES,配置完成,顺便看看进程mysql> show processlist;+----+-------------+-----------+------+---------+------+--------------------------------------------------------+------------------+| Id | User        | Host      | db   | Command | Time | State                                                  | Info             |+----+-------------+-----------+------+---------+------+--------------------------------------------------------+------------------+|  2 | root        | localhost | NULL | Query   |    0 | starting                                               | show processlist ||  5 | system user |           | NULL | Connect |   89 | Waiting for master to send event                       | NULL             ||  6 | system user |           | NULL | Connect |   89 | Slave has read all relay log; waiting for more updates | NULL             |多了两个复制的进程9.最后,把slave的my.cnf中之前增加的skip-slave-start=true去掉,前面加一个#注释掉就行了。最后重启下slave服务,不重启也行。```

二基于GTID(要求mysql版本5.6及以上)

GTID基本概念

1、全局事务标识:global transaction identifiers。
2、GTID是一个事务一一对应,并且全局唯一ID。
3、一个GTID在一个服务器上只执行一次,避免重复执行导致数据混乱或者主从不一致。
4、GTID用来代替传统复制方法,不再使用MASTER_LOG_FILE+MASTER_LOG_POS开启复制。而是使用MASTER_AUTO_POSTION=1的方式开始复制。
5、MySQL-5.6.5开始支持的,MySQL-5.6.10后开始完善。
6、在传统的slave端,binlog是不用开启的,但是在GTID中slave端的binlog是必须开启的,目的是记录执行过的GTID(强制)。

GTID工作原理

1、当一个事务在主库端执行并提交时,产生GTID,一同记录到binlog日志中。
2、binlog传输到slave,并存储到slave的relaylog后,读取这个GTID的这个值设置gtid_next变量,即告诉Slave,下一个要执行的GTID值。
3、sql线程从relay log中获取GTID,然后对比slave端的binlog是否有该GTID。
4、如果有记录,说明该GTID的事务已经执行,slave会忽略。
5、如果没有记录,slave就会执行该GTID事务,并记录该GTID到自身的binlog,
在读取执行事务前会先检查其他session持有该GTID,确保不被重复执行。
6、在解析过程中会判断是否有主键,如果没有就用二级索引,如果没有就用全部扫描。

配置GTID

对于GTID的配置,主要修改配置文件中与GTID特性相关的几个重要参数(建议使用mysql-5.6.5以上版本),如下:1、主:[mysqld]#GTID:server_id=135                #服务器idgtid_mode=on                 #开启gtid模式enforce_gtid_consistency=on  #强制gtid一致性,开启后对于特定create table不被支持#binloglog_bin=master-binloglog-slave-updates=1    binlog_format=row            #强烈建议,其他格式可能造成数据不一致#relay logskip_slave_start=1            2、从:[mysqld]#GTID:gtid_mode=onenforce_gtid_consistency=onserver_id=143#binloglog-bin=slave-binloglog-slave-updates=1binlog_format=row      #强烈建议,其他格式可能造成数据不一致#relay logskip_slave_start=1

配置基于GTID的复制

1、新配置的mysql服务器对于新配置的mysql服务器,按本文第五点描述配置参数文件后,在slave端执行以下操作(root@localhost) [(none)]> CHANGE MASTER TO      ->  MASTER_HOST='192.168.1.135',        ->  MASTER_USER='repl',        ->  MASTER_PASSWORD='xxx',        ->  MASTER_PORT=3306,        ->  MASTER_AUTO_POSITION = 1;Query OK, 0 rows affected, 2 warnings (0.01 sec)(root@localhost) [(none)]> start slave;Query OK, 0 rows affected (0.01 sec)(root@localhost) [(none)]> show slave status \G ###可以看到复制工作已经开始且正常*************************** 1. row ***************************               Slave_IO_State: Waiting for master to send event                  Master_Host: 192.168.1.135                  Master_User: repl                  Master_Port: 3306                Connect_Retry: 60              Master_Log_File: master-binlog.000001          Read_Master_Log_Pos: 151               Relay_Log_File: slave-relay-log.000002                Relay_Log_Pos: 369        Relay_Master_Log_File: master-binlog.000001             Slave_IO_Running: Yes            Slave_SQL_Running: Yes2、已运行经典复制mysql服务器转向GTID复制a、按本文第五点描述配置参数文件;b、所有服务器设置global.read_only参数,等待主从服务器同步完毕;        mysql> SET @@global.read_only = ON; c、依次重启主从服务器;d、使用change master 更新主从配置;        mysql> CHANGE MASTER TO        > MASTER_HOST = host,        > MASTER_PORT = port,        > MASTER_USER = user,        > MASTER_PASSWORD = password,        > MASTER_AUTO_POSITION = 1;e、从库开启复制        mysql> START SLAVE;f、验证主从复制     

测试

```master上:create database foodsafe;create table t1 (id int,name varchar(200),createtime timestamp,key(id));insert into t1 values (1,'aa',now());insert into t1 values (3,'bb',now());select * from t1;slave上:use foodsafe;select * from t1;观察两边结果是否一致。```

添加新的slave

跟添加第一台slave基本一致,改下server-id,不冲突。自己试验下吧。