mysql主从复制有三种模式:主从、主主、半同步复制、复制过滤器。


主从配置方式


master节点上的配置:

        启动二进制日志,为当前节点设置全局唯一ID号,创建有复制权限的用户和账号。具体操作如下:

1、打开mysql的配置文件 vi /etc/my.cnf,在[mysqld]断里面添加上如下内容:

[mysqld]
log_bin=master-bin
server_id=1
innodb_file_per_table=ON
skip_name_resolve=ON

2、然后重新启动mysql:

service restart mysqld

使用 show global variables like 'log_bin'; 查看bin log是否开启:

show global variables like 'log_bin';
+---------------+-------+
| Variable_name | Value |
+---------------+-------+
| log_bin       | ON    |
+---------------+-------+

使用 show master status; 命令来查看二进制日志。

show master status;
+-------------------+----------+--------------+------------------+
| File              | Position | Binlog_Do_DB | Binlog_Ignore_DB |
+-------------------+----------+--------------+------------------+
| master-bin.000001 |      245 |              |                  |
+-------------------+----------+--------------+------------------+

使用 show global variables like 'server_id'; 命令查看server_id 是否配置正确。

+---------------+-------+
| Variable_name | Value |
+---------------+-------+
| server_id     | 1     |
+---------------+-------+

3、然后创建拥有复制权限的账号,复制权限主要有两个 replication slave ,replication client。

grant replication slave,replication client on *.* to 'repluser'@'192.168.96.%' identified by 'replpass';
flush privileges;


slave节点上的配置:

        启动中继日志;为当前节点设置全局唯一的ID号;使用有复制权限的用户账号连接至主服务器,并启动复制线程。具体操作如下:

1、打开配置文件 /etc/my.cnf 在 [mysqld] 配置段加上如下配置信息。

relay_log=relay-log
relay_log_index=relay-log.index
server_id=7        #这个ID要和主的不一样,是唯一的
innodb_file_per_table=ON
skip_name_resolve=ON

2、重新启动mysql 使用 show global variables like 'relay_log';  命令查看 relay_log,如下:

show global variables like 'relay_log';
+---------------+-----------+
| Variable_name | Value     |
+---------------+-----------+
| relay_log     | relay-log |
+---------------+-----------+

3、使用有复制权限的用户账号连接至主服务器,并启动复制线程,

change master to MASTER_HOST='192.168.96.134', MASTER_USER='repluser', MASTER_PASSWORD='replpass', MASTER_LOG_FILE='master-bin.000001', MASTER_LOG_POS=245;

开启复制:

start slave;

设置完成后使用 show slave status\G 查看从服务器状态。

               Slave_IO_State: Waiting for master to send event
                  Master_Host: 192.168.140.134
                  Master_User: repluser
                  Master_Port: 3306
                Connect_Retry: 60
              Master_Log_File: master-bin.000001
          Read_Master_Log_Pos: 495
               Relay_Log_File: relay-log.000003
                Relay_Log_Pos: 530
        Relay_Master_Log_File: master-bin.000001
             Slave_IO_Running: Yes
            Slave_SQL_Running: Yes
                ......
          Exec_Master_Log_Pos: 495
              Relay_Log_Space: 818
              Until_Condition: None
                ......


开启主从:

        这时已经设置好了,只要使用命令 start slave; 命令启动即可。可以在主服务器上创建数据库,然后到从服务器上查看数据库是否存在。

在master主机上:

create database test_master character set utf8 collate utf8_bin;

在slave主机上:

show databases;



复制架构中应该的注意的问题:

        1、限制从服务器为只读

        在从服务器上设置 read_only=ON 此限制对拥有SUPER权限的用户均无效。

        如果想阻止所有用户在本机上启动终端并用管理员账户执行 flush tables with read lock; 命令,这样所有写操作都被阻塞了,读操作不会被阻塞,且不会影响中继日志的写操作。


        2、保证主从复制时的事务安全

        (1)在master节点中:

        sync_binlog=ON,当事务提交时将binlog内存缓冲区的数据立即刷写到磁盘上的二进制日志文件中去。

        如果用到InnoDB存储引擎还要开启 innodb_flush_logs_at_trx_commit=ON,当事务提交时,将内存中跟事务相关的数据立即写到事务日志中去。innodb_support_xa=ON,是否让innodb支持分布式日志。


        (2)在slave节点中:

        在每一个slave节点上开启 skip_slave_start=ON 当mysql启动时是否自动启动复制线程,这个选项开启表示不启用,因为主数据库上的错误也可能会被复制过来,所以应该手动去开启而不是自动启动。

        必要时还要开启这些项,可房子主从安全事务方面的一些问题,但会增加主机I/O压力,master主机上开启sync_master_info,slave主机上开启sync_relay_log 和 sync_relay_log_info。