mysql/mariadb主从复制设置
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。