首页 新闻资讯 MariaDB主从复制及半同步复制

MariaDB主从复制及半同步复制

时间: 来源:网络 编辑:领峰环球

主从复制:从服务器:I/O线程:从master请求二进制日志信息,并保存至中继日志;SQL线程:从relay log中读取日志信息,在本地完成重放; 异步模式:async 1、从服务器落后于主服务器; 2、主从数据不一致; 二进制日志的格式:SET datetime = now() 1、基于行 2、基于语句 3、混合配置过程: 1、master (1) 启用二进制日志; my.cnf----> log_bin=log_bin.log (2) 设置一个在当前集群中惟一的server-id; my.cnf----> server_id=1 (3) 创建一个有复制权限(REPLICATION SLAVE, REPLICATION CLIENT)账号; MariaDB>GRANT REPLICATION SLAVE,REPLICATION CLIENT ON *.* TO 'slave'@'192.168.20.%' identified by 'PASSWORD'; (4)查看Master日志信息,记录,复制时使用 MariaDB>SHOW MASTER STATUS; +----------------+----------+--------------+------------------+ | File | Position | Binlog_Do_DB | Binlog_Ignore_DB | +----------------+----------+--------------+------------------+ | log_bin.000014 | 30155002 | | | +----------------+----------+--------------+------------------+ 2、slave (1) 启用中继日志; my.cnf---->relay_log=relay-bin (2) 设置一个在当前集群中惟一的server-id; my.cnf----> server_id=2 (3) 使用有复制权限用户账号连接至主服务器,并启动复制线程; MariaDB>CHANGE MASTER TO MASTER_HOST='192.168.20.1', MASTER_USER='slave', MASTER_PASSWORD='PASSWORD', MASTER_LOG_FILE='log_bin.0000014', MASTER_LOG_POS=30155002, MASTER_CONNECT_RETRY=5 MariaDB>START SLAVE; (4)查看Slave复制状态 MariaDB>SHOW SLAVE STATUS\G 一主多从,一从一主;服务器程序版本最好相同总结: master: binlog dump slave: IO thread, SQL thread slave: 如果连接至主服务器: CHANGE MASTER TO option [, option] ... option: MASTER_BIND = 'interface_name' | MASTER_HOST = 'host_name' 主服务器地址 | MASTER_USER = 'user_name' 有复制权限的用户名 | MASTER_PASSWORD = 'password' 用户密码 | MASTER_PORT = port_num 主服务器的端口 | MASTER_CONNECT_RETRY = interval 连接重试时间间隔 | MASTER_HEARTBEAT_PERIOD = interval 心跳检测时间间隔 | MASTER_LOG_FILE = 'master_log_name' 主服务器二进制日志文件 | MASTER_LOG_POS = master_log_pos 二进制日志文件中的位置 | RELAY_LOG_FILE = 'relay_log_name' | RELAY_LOG_POS = relay_log_pos | MASTER_SSL = {0|1} | MASTER_SSL_CA = 'ca_file_name' | MASTER_SSL_CAPATH = 'ca_directory_name' | MASTER_SSL_CERT = 'cert_file_name' | MASTER_SSL_KEY = 'key_file_name' | MASTER_SSL_CIPHER = 'cipher_list' | MASTER_SSL_VERIFY_SERVER_CERT = {0|1} | IGNORE_SERVER_IDS = (server_id_list)主主: 互为主从: 1、数据不一致; 2、自动增长id 定义一个节点使用奇数id auto_increment_offset=1 auto_increment_increment=2 定义另一个节点使用偶数id auto_increment_offset=2 auto_increment_increment=2 (1) 各自使用不同的server id (2) 都启用binlog和relay log (3) 定义自动增长的id字段的增长方式 (4) 都授权有复制权限的用户账号 (5) 各自把对方指定为主服务器 GRANT REPLICATION SLAVE,REPLICATION CLIENT ON *.* TO 'slave'@'192.168.20.%' IDENTIFIED BY 'PASSWORD';复制如何开始? 主节点运行很长时间,且已经有一定规模的数据,如何启动复制? 在主节点做一个完全备份,并记录二进制日志文件及位置; 在从节点恢复此完全备份,并在启动复制时从记录的二进制日志文件和位置开始;复制时应该注意的问题: 1、如何限制从服务器只读? 在从服务器启动read_only;但仅对非具有SUPER权限的用户有效; 阻止所有用户 :MariaDB> FLUSH TABLES WITH READ LOCK; 2、如何保证主从复制时的事务安全? 在master节点启用参数: sync_binlog = on 如果用到的为InnoDB存储引擎: innodb_flush_logs_at_trx_commit innodb_support_xa=on 在slave节点: skip_slave_start 主节点: sync_master_info = 1 从节点 sync_relay_log = 1 sync_relay_log_info = 1 3、半同步复制 主节点: MariaDB [(none)]> INSTALL PLUGIN rpl_semi_sync_master SONAME 'semisync_master.so'; Query OK, 0 rows affected (0.05 sec) MariaDB [(none)]> SHOW GLOBAL VARIABLES LIKE '%semi%'; +------------------------------------+-------+ | Variable_name | Value | +------------------------------------+-------+ | rpl_semi_sync_master_enabled | OFF | | rpl_semi_sync_master_timeout | 10000 | | rpl_semi_sync_master_trace_level | 32 | | rpl_semi_sync_master_wait_no_slave | ON | +------------------------------------+-------+ 4 rows in set (0.00 sec) MariaDB [(none)]> SET GLOBAL rpl_semi_sync_master_enabled=1; Query OK, 0 rows affected (0.00 sec) MariaDB [(none)]> SET GLOBAL rpl_semi_sync_master_timeout=2000; Query OK, 0 rows affected (0.00 sec) 从节点: MariaDB [(none)]> INSTALL PLUGIN rpl_semi_sync_slave SONAME 'semisync_slave.so'; Query OK, 0 rows affected (0.05 sec) MariaDB [(none)]> SHOW GLOBAL VARIABLES LIKE '%semi%'; +---------------------------------+-------+ | Variable_name | Value | +---------------------------------+-------+ | rpl_semi_sync_slave_enabled | OFF | | rpl_semi_sync_slave_trace_level | 32 | +---------------------------------+-------+ 2 rows in set (0.00 sec) MariaDB [(none)]> SET GLOBAL rpl_semi_sync_slave_enabled=1; Query OK, 0 rows affected (0.00 sec) 如果从服务器已经启动,还需要重启IO_THREAD;4、复制过滤器 让slave仅复制有限的几个数据库,而非所有; 有两种实现思路: (1) 主服务器仅向二进制日志中记录有特定数据库相关的写操作; 问题:即时点还原将无法全面实现; binlog_do_db= # 数据库白名单 binlog_ignore_db= # 数据库黑名单 (2)从服务器的SQL_THREAD仅在中断日志中读取特定数据相关的语句并应用在本地; 问题:会造成网络带宽和磁盘IO的浪费; Replicate_Do_DB= Replicate_Ignore_DB= Replicate_Do_Table= Replicate_Ignore_Table= Replicate_Wild_Do_Table= Replicate_Wild_Ignore_Table=5、基于SSL的复制 前提:支持SSL (1) 主服务器端配置证书和私钥,并创建一个要求必须使用SSL连接的复制账号(REQUIRE SSL); (2) SLAV端连接master时,使用MASTER_SSL相关的选项来配置证书等信息;6、跟复制功能相关的文件: master.info:用于保存slave连接至master时的相关信息; relay-log.info:保存了当前slave节点上已经复制的当前二进制日志和本地relay log日志对应关系;7、复制的监控和维护 (1) 清理日志:PURGE (2) 复制监控 SHOW MASTER STATUS SHOW BINLOG EVENTS SHOW BINARY LOGS SHOW SLAVE STATUS (3) 如何判断slave是否落后于master Seconds_Behind_Master: 0 (4) 如何确定主从节点数据是否一致? 通过表自身的CHECKSUM检查 使用percona-tools中pt-table-checksum (5) 数据不一致的修复方法: 重复复制;