扩展方式: Scale UP, Scale Out
MySQL的扩展:
复制: 每个节点都有相同的数据集
向外扩展
二进制日志
单向
复制的功用:
数据分布
负载均衡读
备份
高可用和故障切换
MySQL升级测试
主从复制线程:
主节点:
dump Thread: 为每个Slave的I/O Thread启动一个dump线程,向从库发送binary log events
从节点:
I/O Thread: 向Master 请求二进制日志事件,并保存于中继日志中,
SQL Thread: 从中继日志中读取日志事件,在本地完成重放
跟复制功能相关的文件:
master.info: 用于保存slave链接至master时的相关信息,例如: 账号,密码, 服务器地址等
relay-log.info: 保存在当前slave节点上,已经复制的当前二进制日志和本地replay log日志的对应关系
主从复制特点:
异步复制
主从数据不一致比较常见
复制架构:
Master/Slave , Master/Master, 环状复制 ,一主多从
从服务器还可以在有从服务器
一丛多主,适用于多个不同数据库
复制需要考虑二进制时间记录格式
STATEMENT(5.0之前) ROW(5.1之后,推荐), MIXED
各种复制模型实战:
主从,主主,半同步复制, 复制过滤器
主从配置过程参考文档:
https://mariadb.com/kb/en/library/setting-up-replication/
https://dev.mysql.com/doc/refman/5.5/en/replication-configuration.html
主节点:
1) [mysqld]
log_bin=mysql-bin
2) 当前节点设置一个全局唯一的ID号
[mysqld]
server_id=#
3) 创建由复制全向的用户账号
GRANT REPLCATION SLAVE ON *.* TO 'repluser'@HOST IDENTIFIED BY 'password';
从节点配置:
1)启动中继日志
[mysqld]
server_id=# 为当前节点设置一个全局惟的ID号
relay_log=relay-log relay log的文件路径,默认值hostname-relay-bin
relay_log_index=relay-log.index默认值hostname-relay-bin.index
2)使用有复制权限的用户账号连接至主服务器,并启动复制线程
mysgl> CHANGE MASTER TO MASTER_HOST='host',MASTER_USER='repluser',MASTER_PASSWORD='replpass',MASTER_LOG_FILE='mysql-binxxxxx',MASTER_LOG_POS=#; mysgl> START SLAVE [IO_THREAD|SQL_THREAD];
实战操作
1. Master 配置
1) 修改配置文件
[mysqld] datadir=/var/lib/mysql socket=/var/lib/mysql/mysql.sock innodb_file_per_table log_bin server_id=1
2) 创建测试数据库(可选),创建复制用户
# 查看 要复制的log日志size 点
MariaDB [(none)]> show binary logs;
+--------------------+-----------+
| Log_name | File_size |
+--------------------+-----------+
| mariadb-bin.000001 | 245 |
+--------------------+-----------+
# 创建数据库测试文件
MariaDB [(none)]> create database test; Query OK, 1 row affected (0.00 sec) MariaDB [(none)]> use test MariaDB [test]> create table students(id int auto_increment primary key,name varchar(30) not NULL UNIQUE key ,gender char(1) DEFAULT'm'); Query OK, 0 rows affected (0.36 sec) MariaDB [test]> insert into students (name) values ('Zhang San'),('Li Si'); Query OK, 2 rows affected (0.00 sec) Records: 2 Duplicates: 0 Warnings: 0 MariaDB [test]> insert into students (name) values ('Wang Wu'),('Zhao Liu'); Query OK, 2 rows affected (0.00 sec) Records: 2 Duplicates: 0 Warnings: 0 # 查看 bin log日志 MariaDB [test]> show binary logs; +--------------------+-----------+ | Log_name | File_size | +--------------------+-----------+ | mariadb-bin.000001 | 1841 | +--------------------+-----------+ 1 row in set (0.00 sec) # 创建复制用户 MariaDB [test]> grant replication slave on *.* to repluser@'192.168.10.%' identified by '123456'; Query OK, 0 rows affected (0.00 sec)
从服务器配置
1) 配置数据库文件
[mysqld] datadir=/var/lib/mysql socket=/var/lib/mysql/mysql.sock innodb_file_per_table server_id=2
2)
MariaDB [(none)]> CHANGE MASTER TO MASTER_HOST='172.16.0.40',MASTER_USER='alave',MASTER_PASSWORD='123456',MASTER_LOG_FILE='mariadb-bin.000001',MASTER_LOG_POS=245; Query OK, 0 rows affected (0.00 sec)
3) 启动同步线程
MariaDB [(none)]> start slave; Query OK, 0 rows affected (0.00 sec)
4) 查看从服务器状态
MariaDB [(none)]> show slave statusG
检查,查看日志信息
# 主服务器执行 MariaDB [test]> show binary logs; +--------------------+-----------+ | Log_name | File_size | +--------------------+-----------+ | mariadb-bin.000001 | 2155 | +--------------------+-----------+ # 从服务器执行 MariaDB [(none)]> show slave statusG *************************** 1. row *************************** Slave_IO_State: Waiting for master to send event Master_Host: 172.16.0.40 Read_Master_Log_Pos: 2155
Seconds_Behind_Master: 0 #主从同步的时间差