1. 首页 > MariaDB教程 > 正文

MariaDB教程FG065-MariaDB集群与主从复制实战

内容简介:本文主要介绍MariaDB集群与主从复制的配置与管理,包括集群的基本概念、主从复制的基本概念、复制的类型等内容。通过实际案例讲解主从复制配置、集群配置和复制故障处理,帮助读者掌握MariaDB集群与主从复制的技能。风哥教程参考MariaDB官方文档Replication、Galera Cluster等相关内容。

Part01-基础概念与理论知识

1.1 集群的基本概念

集群(Cluster)是指将多个服务器组合在一起,共同提供服务的技术。MariaDB集群主要包括以下类型:

  • 主从复制集群:一主多从,主库负责写操作,从库负责读操作
  • Galera集群:多主架构,所有节点都可以读写,数据同步复制
  • 主主复制集群:互为主从,双向复制

1.2 主从复制的基本概念

主从复制(Master-Slave Replication)是指将主库的数据复制到从库的过程。主从复制的主要作用包括:

  • 数据备份:从库作为主库的备份
  • 读写分离:主库负责写操作,从库负责读操作,提高系统性能
  • 高可用性:当主库故障时,可以将从库提升为主库

1.3 复制的类型

MariaDB支持以下复制类型:

  • 基于语句的复制(SBR):复制SQL语句
  • 基于行的复制(RBR):复制数据行的变化
  • 混合复制(MBR):结合SBR和RBR的优点
更多视频教程www.fgedu.net.cn

Part02-生产环境规划与建议

2.1 集群规划

集群规划建议:

  • 节点数量:根据业务需求和负载确定节点数量,Galera集群建议至少3个节点
  • 硬件配置:确保所有节点的硬件配置一致,避免性能瓶颈
  • 网络配置:确保节点之间网络连接稳定,带宽足够
  • 存储配置:使用高性能存储,如SSD
  • 备份策略:定期备份集群数据

2.2 主从复制规划

主从复制规划建议:

  • 主库配置:开启二进制日志,设置服务器ID
  • 从库配置:设置服务器ID,配置复制参数
  • 复制用户:创建具有复制权限的用户
  • 复制模式:根据业务需求选择合适的复制模式
  • 监控方案:设置复制监控,及时发现复制延迟

2.3 性能优化建议

性能优化建议:

  • 二进制日志优化:调整binlog_format、binlog_cache_size等参数
  • 复制线程优化:调整slave_parallel_workers、slave_parallel_type等参数
  • 网络优化:使用高速网络,减少网络延迟
  • 存储优化:使用SSD存储,提高I/O性能
  • 监控复制延迟:定期检查复制延迟,及时处理延迟问题
学习交流加群风哥微信: itpux-com

Part03-生产环境项目实施方案

3.1 主从复制配置

更多学习教程公众号风哥教程itpux_com

# 主从复制配置
MariaDB [(none)]> # 1. 主库配置
# 修改my.cnf文件
[mysqld]
server-id = 1
log-bin = /var/lib/mysql/binlog
binlog_format = ROW
# 重启MariaDB服务
systemctl restart mariadb
# 创建复制用户
CREATE USER ‘repl’@’%’ IDENTIFIED BY ‘repl_password’;
GRANT REPLICATION SLAVE ON *.* TO ‘repl’@’%’;
FLUSH PRIVILEGES;
# 查看主库状态
SHOW MASTER STATUS;
# 2. 从库配置
# 修改my.cnf文件
[mysqld]
server-id = 2
relay-log = /var/lib/mysql/relay-bin
read_only = 1
# 重启MariaDB服务
systemctl restart mariadb
# 配置复制连接
CHANGE MASTER TO
MASTER_HOST = ‘master_ip’,
MASTER_USER = ‘repl’,
MASTER_PASSWORD = ‘repl_password’,
MASTER_LOG_FILE = ‘binlog.000001’,
MASTER_LOG_POS = 12345;
# 启动复制
START SLAVE;
# 查看从库状态
SHOW SLAVE STATUS\G;

3.2 集群配置

# Galera集群配置
# 1. 安装Galera Cluster
# 在所有节点上安装Galera Cluster
yum install mariadb-server-galera
# 2. 配置my.cnf文件
[mysqld]
server-id = 1
binlog_format = ROW
default_storage_engine = InnoDB
innodb_autoinc_lock_mode = 2
innodb_flush_log_at_trx_commit = 0
innodb_buffer_pool_size = 1G
[galera]
wsrep_on = ON
wsrep_provider = /usr/lib64/galera/libgalera_smm.so
wsrep_cluster_name = “fgedu_cluster”
wsrep_cluster_address = “gcomm://node1_ip,node2_ip,node3_ip”
wsrep_node_name = “node1”
wsrep_node_address = “node1_ip”
wsrep_sst_method = rsync
# 3. 启动集群
# 在第一个节点上初始化集群
galera_new_cluster
# 在其他节点上启动服务
systemctl start mariadb
# 4. 查看集群状态
SHOW STATUS LIKE ‘wsrep%’;

3.3 复制监控与管理

# 复制监控与管理
MariaDB [(none)]> # 1. 查看主库状态
SHOW MASTER STATUS;
# 2. 查看从库状态
SHOW SLAVE STATUS\G;
# 3. 检查复制延迟
SHOW SLAVE STATUS\G;
# 查看Seconds_Behind_Master值
# 4. 停止复制
STOP SLAVE;
# 5. 启动复制
START SLAVE;
# 6. 重置复制
RESET SLAVE;
# 7. 监控Galera集群状态
SHOW STATUS LIKE ‘wsrep%’;
# 查看wsrep_cluster_size、wsrep_cluster_status等状态
学习交流加群风哥QQ113257174

Part04-生产案例与实战讲解

4.1 主从复制配置案例

场景描述:配置一主一从的主从复制架构。

# 主从复制配置
# 1. 主库配置
[root@master ~]# vi /etc/my.cnf
[mysqld]
server-id = 1
log-bin = /var/lib/mysql/binlog
binlog_format = ROW
[root@master ~]# systemctl restart mariadb
[root@master ~]# mysql -u root -p
MariaDB [(none)]> CREATE USER ‘repl’@’%’ IDENTIFIED BY ‘repl_password’;
MariaDB [(none)]> GRANT REPLICATION SLAVE ON *.* TO ‘repl’@’%’;
MariaDB [(none)]> FLUSH PRIVILEGES;
MariaDB [(none)]> SHOW MASTER STATUS;
+——————+———-+————–+——————+——————-+
| File | Position | Binlog_Do_DB | Binlog_Ignore_DB | Executed_Gtid_Set |
+——————+———-+————–+——————+——————-+
| binlog.000001 | 1234 | | | |
+——————+———-+————–+——————+——————-+
# 2. 从库配置
[root@slave ~]# vi /etc/my.cnf
[mysqld]
server-id = 2
relay-log = /var/lib/mysql/relay-bin
read_only = 1
[root@slave ~]# systemctl restart mariadb
[root@slave ~]# mysql -u root -p
MariaDB [(none)]> CHANGE MASTER TO
-> MASTER_HOST = ‘192.168.1.100’,
-> MASTER_USER = ‘repl’,
-> MASTER_PASSWORD = ‘repl_password’,
-> MASTER_LOG_FILE = ‘binlog.000001’,
-> MASTER_LOG_POS = 1234;
MariaDB [(none)]> START SLAVE;
MariaDB [(none)]> SHOW SLAVE STATUS\G;
*************************** 1. row ***************************
Slave_IO_State: Waiting for master to send event
Master_Host: 192.168.1.100
Master_User: repl
Master_Port: 3306
Connect_Retry: 60
Master_Log_File: binlog.000001
Read_Master_Log_Pos: 1234
Relay_Log_File: relay-bin.000001
Relay_Log_Pos: 1234
Relay_Master_Log_File: binlog.000001
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: 1234
Relay_Log_Space: 1234
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
Master_UUID: 12345678-1234-1234-1234-1234567890ab
Master_Info_File: /var/lib/mysql/master.info
SQL_Delay: 0
SQL_Remaining_Delay: NULL
Slave_SQL_Running_State: Slave has read all relay log;
waiting for more updates
Master_Retry_Count: 86400
Master_Bind:
Last_IO_Error_Timestamp:
Last_SQL_Error_Timestamp:
Master_SSL_Crl:
Master_SSL_Crlpath:
Retrieved_Gtid_Set:
Executed_Gtid_Set:
Auto_Position: 0
Replicate_Rewrite_DB:
Channel_Name:
Master_TLS_Version:

执行结果:

# 主从复制配置成功
MariaDB [(none)]> SHOW SLAVE STATUS\G;
*************************** 1. row ***************************
Slave_IO_State: Waiting for master to send event
Master_Host: 192.168.1.100
Master_User: repl
Master_Port: 3306
Connect_Retry: 60
Master_Log_File: binlog.000001
Read_Master_Log_Pos: 1234
Relay_Log_File: relay-bin.000001
Relay_Log_Pos: 1234
Relay_Master_Log_File: binlog.000001
Slave_IO_Running: Yes
Slave_SQL_Running: Yes

Seconds_Behind_Master: 0

4.2 集群配置案例

场景描述:配置三节点的Galera集群。

# Galera集群配置
# 1. 在所有节点上安装Galera Cluster
[root@node1 ~]# yum install mariadb-server-galera
[root@node2 ~]# yum install mariadb-server-galera
[root@node3 ~]# yum install mariadb-server-galera
# 2. 配置my.cnf文件
# 在node1上
[root@node1 ~]# vi /etc/my.cnf
[mysqld]
server-id = 1
binlog_format = ROW
default_storage_engine = InnoDB
innodb_autoinc_lock_mode = 2
innodb_flush_log_at_trx_commit = 0
innodb_buffer_pool_size = 1G
[galera]
wsrep_on = ON
wsrep_provider = /usr/lib64/galera/libgalera_smm.so
wsrep_cluster_name = “fgedu_cluster”
wsrep_cluster_address = “gcomm://192.168.1.101,192.168.1.102,192.168.1.103”
wsrep_node_name = “node1”
wsrep_node_address = “192.168.1.101”
wsrep_sst_method = rsync
# 在node2上
[root@node2 ~]# vi /etc/my.cnf
[mysqld]
server-id = 2
binlog_format = ROW
default_storage_engine = InnoDB
innodb_autoinc_lock_mode = 2
innodb_flush_log_at_trx_commit = 0
innodb_buffer_pool_size = 1G
[galera]
wsrep_on = ON
wsrep_provider = /usr/lib64/galera/libgalera_smm.so
wsrep_cluster_name = “fgedu_cluster”
wsrep_cluster_address = “gcomm://192.168.1.101,192.168.1.102,192.168.1.103”
wsrep_node_name = “node2”
wsrep_node_address = “192.168.1.102”
wsrep_sst_method = rsync
# 在node3上
[root@node3 ~]# vi /etc/my.cnf
[mysqld]
server-id = 3
binlog_format = ROW
default_storage_engine = InnoDB
innodb_autoinc_lock_mode = 2
innodb_flush_log_at_trx_commit = 0
innodb_buffer_pool_size = 1G
[galera]
wsrep_on = ON
wsrep_provider = /usr/lib64/galera/libgalera_smm.so
wsrep_cluster_name = “fgedu_cluster”
wsrep_cluster_address = “gcomm://192.168.1.101,192.168.1.102,192.168.1.103”
wsrep_node_name = “node3”
wsrep_node_address = “192.168.1.103”
wsrep_sst_method = rsync
# 3. 启动集群
# 在node1上初始化集群
[root@node1 ~]# galera_new_cluster
# 在node2和node3上启动服务
[root@node2 ~]# systemctl start mariadb
[root@node3 ~]# systemctl start mariadb
# 4. 查看集群状态
[root@node1 ~]# mysql -u root -p -e “SHOW STATUS LIKE ‘wsrep%’;

+————————–+————————————–+
| Variable_name | Value |
+————————–+————————————–+
| wsrep_cluster_conf_id | 3 |
| wsrep_cluster_size | 3 |
| wsrep_cluster_state_uuid | 12345678-1234-1234-1234-1234567890ab |
| wsrep_cluster_status | Primary |
| wsrep_local_state_uuid | 12345678-1234-1234-1234-1234567890ab |
| wsrep_local_state | 4 |
| wsrep_local_state_comment| Synced |
| wsrep_incoming_addresses | 192.168.1.101:3306,192.168.1.102:3306,192.168.1.103:3306 |
| wsrep_ready | ON |
+————————–+————————————–+

执行结果:

# Galera集群配置成功
[root@node1 ~]# mysql -u root -p -e “SHOW STATUS LIKE ‘wsrep%’;

+————————–+————————————–+
| Variable_name | Value |
+————————–+————————————–+
| wsrep_cluster_conf_id | 3 |
| wsrep_cluster_size | 3 |
| wsrep_cluster_state_uuid | 12345678-1234-1234-1234-1234567890ab |
| wsrep_cluster_status | Primary |
| wsrep_local_state_uuid | 12345678-1234-1234-1234-1234567890ab |
| wsrep_local_state | 4 |
| wsrep_local_state_comment| Synced |
| wsrep_incoming_addresses | 192.168.1.101:3306,192.168.1.102:3306,192.168.1.103:3306 |
| wsrep_ready | ON |
+————————–+————————————–+

4.3 复制故障处理案例

场景描述:主从复制出现延迟,需要排查和解决。

# 复制故障处理
# 1. 检查复制状态
MariaDB [(none)]> SHOW SLAVE STATUS\G;
*************************** 1. row ***************************
Slave_IO_State: Waiting for master to send event
Master_Host: 192.168.1.100
Master_User: repl
Master_Port: 3306
Connect_Retry: 60
Master_Log_File: binlog.000001
Read_Master_Log_Pos: 10000
Relay_Log_File: relay-bin.000001
Relay_Log_Pos: 8000
Relay_Master_Log_File: binlog.000001
Slave_IO_Running: Yes
Slave_SQL_Running: Yes

Seconds_Behind_Master: 300

# 2. 分析延迟原因
# 检查主库负载
[root@master ~]# top
# 检查从库负载
[root@slave ~]# top
# 检查网络延迟
[root@slave ~]# ping 192.168.1.100
# 检查从库IO和SQL线程状态
MariaDB [(none)]> SHOW PROCESSLIST\G;
# 3. 解决复制延迟
# 优化从库配置
[root@slave ~]# vi /etc/my.cnf
[mysqld]
server-id = 2
relay-log = /var/lib/mysql/relay-bin
read_only = 1
slave_parallel_workers = 4
slave_parallel_type = LOGICAL_CLOCK
# 重启从库
[root@slave ~]# systemctl restart mariadb
# 重新启动复制
MariaDB [(none)]> START SLAVE;
# 检查复制状态
MariaDB [(none)]> SHOW SLAVE STATUS\G;

执行结果:

# 复制延迟问题解决
MariaDB [(none)]> SHOW SLAVE STATUS\G;
*************************** 1. row ***************************
Slave_IO_State: Waiting for master to send event
Master_Host: 192.168.1.100
Master_User: repl
Master_Port: 3306
Connect_Retry: 60
Master_Log_File: binlog.000001
Read_Master_Log_Pos: 10000
Relay_Log_File: relay-bin.000001
Relay_Log_Pos: 10000
Relay_Master_Log_File: binlog.000001
Slave_IO_Running: Yes
Slave_SQL_Running: Yes

Seconds_Behind_Master: 0
风哥提示:安全开发是防止SQL注入的第一道防线

Part05-风哥经验总结与分享

5.1 集群与主从复制最佳实践

风哥提示:在配置和管理MariaDB集群与主从复制时,应遵循最佳实践,确保系统的稳定运行。
  • 合理规划架构:根据业务需求选择合适的集群架构
  • 配置正确的参数:根据硬件和业务需求调整配置参数
  • 定期监控:定期检查复制状态和集群健康状态
  • 备份策略:定期备份数据,确保数据安全
  • 故障演练:定期进行故障演练,提高故障处理能力

5.2 复制性能优化技巧

  • 使用并行复制:开启slave_parallel_workers,提高从库复制速度
  • 优化二进制日志:调整binlog_format为ROW,提高复制效率
  • 网络优化:使用高速网络,减少网络延迟
  • 存储优化:使用SSD存储,提高I/O性能
  • 监控复制延迟:定期检查复制延迟,及时处理延迟问题

5.3 常见问题与解决方案

  • 复制延迟:开启并行复制,优化从库配置
  • 复制中断:检查网络连接,重新配置复制
  • 集群分裂:确保网络连接稳定,配置合适的quorum值
  • 数据不一致:定期进行数据校验,使用pt-table-checksum工具
  • 性能问题:优化硬件配置,调整数据库参数
# 集群与主从复制示例
— 主从复制配置
# 主库配置
[mysqld]
server-id = 1
log-bin = /var/lib/mysql/binlog
binlog_format = ROW
# 从库配置
[mysqld]
server-id = 2
relay-log = /var/lib/mysql/relay-bin
read_only = 1
slave_parallel_workers = 4
— Galera集群配置
[mysqld]
server-id = 1
binlog_format = ROW
default_storage_engine = InnoDB
innodb_autoinc_lock_mode = 2
[galera]
wsrep_on = ON
wsrep_provider = /usr/lib64/galera/libgalera_smm.so
wsrep_cluster_name = “fgedu_cluster”
wsrep_cluster_address = “gcomm://node1_ip,node2_ip,node3_ip”
wsrep_node_name = “node1”
wsrep_node_address = “node1_ip”
wsrep_sst_method = rsync

通过以上措施,可以有效配置和管理MariaDB集群与主从复制,确保系统的高可用性和性能。

from MariaDB视频:www.itpux.com

本文由风哥教程整理发布,仅用于学习测试使用,转载注明出处:http://www.fgedu.net.cn/10327.html

联系我们

在线咨询:点击这里给我发消息

微信号:itpux-com

工作日:9:30-18:30,节假日休息