一. MariaDB 简介
MariaDB 数据库的主从复制方案, 是其自带的功能, 并且主从复制并不是复制磁盘上的数据库文件, 而是通过 binlog 日志复制到需要同步的从服务器上.
MariaDB 数据库支持单向, 双向, 链式级联等不同业务场景的复制. 在复制的过程中, 一台服务器充当主服务器(Master), 接收来自用户的内容更新, 而一个或多个其他的服务器充当从服务器(slave), 接收来自 Master 上 binlog 文件的日志内容, 解析出 SQL, 重新更新到 Slave, 使得主从服务器数据达到一致.
主从复制的逻辑有以下几种:
1)一主一从, 单向主从同步模式, 只能在 Master 端写入数据;
2)一主多从,
3)双主复制逻辑架构, 此架构可以在 Master1 或 Master2 进行数据写入, 或者两端同时写入(特殊设置);
在生产环境中, MySQL 主从复制都是异步的复制方式, 即不是严格的实时复制, 但是给用户的体验都是实时的. MySQL 主从复制集群功能使得 MySQL 数据库支持大规模高并发读写成为可能, 且有效的保护了服务器宕机的数据备份.
二. 应用场景
利用复制功能当 Master 服务器出现问题时, 我们可以人工的切换到从服务器继续提供服务, 此时服务器的数据和宕机时的数据几乎完全一致. 复制功能也可用作数据备份, 但是如果人为的执行 drop,delete 等语句删除, 那么从库的备份功能也就失效了.
三. 主从机制实现原理
(1)master 将改变记录到二进制日志 (binary log) 中(这些记录叫做二进制日志事件, binary log events);
(2)slave 将 master 的 binary log events 拷贝到它的中继日志(relay log);
(3)slave 重做中继日志中的事件, 将改变反映它自己的数据;
四. 主从实验步骤
主库配置
1. 查看数据库状态
systemctl status mariadb
2. 停止 mariadb
systemctl stop mariadb
3. 修改配置文件
- vi /etc/my.cnf
- # 修改内容如下:
- # server-id 服务的唯一标识(主从之间都必须不同);
- # log-bin 启动二进制日志名称为 MySQL-bin
- [mysqld]
- server-id=1
- log-bin=apollo-MySQL-bin
4. 重启 mariadb
systemctl start mariadb
5. 新建用于主从同步的用户 apollo
- [root@localhost etc]# MySQL -uroot -p
- MariaDB [MySQL]> create user 'apollo'@'%' identified by 'apollo123';
- Query OK, 0 rows affected (0.00 sec)
6. 如果提示密码太简单不符合策略加在前面加这句, 否则可以忽略.
MySQL> set global validate_password_policy=0;
7. 给从库账号授权
- MariaDB [MySQL]> grant replication slave on *.* to 'apollo'@'%';
- Query OK, 0 rows affected (0.00 sec)
8. 检查主库创建的复制账号
- MariaDB [(none)]> select user,host,password from MySQL.user;
- +--------+-----------------------+-------------------------------------------+
- | user | host | password |
- +--------+-----------------------+-------------------------------------------+
- | root | localhost | *81F5E21E35407D884A6CD4A731AEBFB6AF209E1B |
- | root | localhost.localdomain | *81F5E21E35407D884A6CD4A731AEBFB6AF209E1B |
- | root | 127.0.0.1 | *81F5E21E35407D884A6CD4A731AEBFB6AF209E1B |
- | root | ::1 | *81F5E21E35407D884A6CD4A731AEBFB6AF209E1B |
- | apollo | % | *F4C3606BB4D20E38BDAC60DD383666A1F3D72A67 |
- +--------+-----------------------+-------------------------------------------+
- 6 rows in set (0.00 sec)
9. 检查授权账号的权限
- MariaDB [(none)]> show grants for apollo@'%';
- +-----------------------------------------------------------------------------------------------------------------+
- | Grants for apollo@% |
- +-----------------------------------------------------------------------------------------------------------------+
- | GRANT REPLICATION SLAVE ON *.* TO 'apollo'@'%' IDENTIFIED BY PASSWORD '*91310B9B3DD9D3B34E510A8C8BEE1096516C0C94' |
- +-----------------------------------------------------------------------------------------------------------------+
- 1 row in set (0.00 sec)
10. 实现对主数据库锁表只读, 防止数据写入, 数据复制失败.
- MariaDB [MySQL]> flush table with read lock;
- Query OK, 0 rows affected (0.02 sec)
11. 检查主库的状态
- MariaDB [(none)]> show master status;
- +--------------------+----------+--------------+------------------+
- | File | Position | Binlog_Do_DB | Binlog_Ignore_DB |
- +--------------------+----------+--------------+------------------+
- | a-MySQL-bin.000001 | 615 | | |
- +--------------------+----------+--------------+------------------+
- 1 row in set (0.01 sec)
- # File 是二进制日志文件名,
- # Position 是日志开始的位置, 后面从库会用到.
12. 锁表后, 一定要单独再打开一个 SSH 窗口, 导出数据库的所有数据.
[root@localhost ~]# mysqldump -uroot -p --all-databases> /opt/root.sql
13. 确保数据导出后, 没有数据插入, 完毕再查看主库状态.
- MariaDB [(none)]> show master status;
- +--------------------+----------+--------------+------------------+
- | File | Position | Binlog_Do_DB | Binlog_Ignore_DB |
- +--------------------+----------+--------------+------------------+
- | a-MySQL-bin.000001 | 615 | | |
- +--------------------+----------+--------------+------------------+
- 1 row in set (0.00 sec)
14. 将备份导出的数据 scp 至 Slave 数据库
- [root@localhost ~]# scp /opt/zdk.sql root@192.168.13.183:/opt/
- The authenticity of host '192.168.13.183 (192.168.13.183)' can't be established.
- ECDSA key fingerprint is SHA256:inppMYl6FXIzV/XOV6TTlSUmP4TY96mz6sujwtTY7nk.
- ECDSA key fingerprint is MD5:69:b7:4c:cc:18:86:94:be:d9:63:4d:4c:cb:62:fa:67.
- # 输入 yes
- Are you sure you want to continue connecting (yes/no)? yes
- Warning: Permanently added '192.168.13.183' (ECDSA) to the list of known hosts.
- # 输入数据库密码
- root@192.168.13.183's password:
- zdk.sql 100% 467KB 5.0MB/s 00:00
从库设置(192.168.13.183)
1. 此时去从库的 MySQL 上, 登录, 导入主库的数据, 保持数据一致性.
- MySQL -uroot -p
- source /opt/root.sql
- # 这一步完成后, 再登录数据库, 如出现密码不正确, 请输入主库数据库密码.
2. 查看数据库状态
systemctl status mariadb
3. 停止 mariadb
systemctl stop mariadb
4. 从库的配置, 写入 my.cnf, 从库的身份信息
- vi /etc/my.cnf
- [mysqld]
- server-id=10
5. 检查一下主库和从库的参数信息
主库:
- MariaDB [(none)]> show variables like 'server_id';
- +---------------+-------+
- | Variable_name | Value |
- +---------------+-------+
- | server_id | 1 |
- +---------------+-------+
- 1 row in set (0.00 sec)
- MariaDB [(none)]> show variables like 'log_bin';
- +---------------+-------+
- | Variable_name | Value |
- +---------------+-------+
- | log_bin | ON |
- +---------------+-------+
- 1 row in set (0.00 sec)
从库:
- MariaDB [(none)]> show variables like 'server_id';
- +---------------+-------+
- | Variable_name | Value |
- +---------------+-------+
- | server_id | 10 |
- +---------------+-------+
- 1 row in set (0.00 sec)
- MariaDB [(none)]> show variables like 'log_bin';
- +---------------+-------+
- | Variable_name | Value |
- +---------------+-------+
- | log_bin | OFF |
- +---------------+-------+
- 1 row in set (0.01 sec)
6. 通过一条命令, 开启主从同步
- # 主库 IP 地址:'192.168.13.189'
- # 如果以下信息不知道, 可以通过命令 show master status;
- change master to master_host='192.168.13.189',
- master_user='apollo',
- master_password='apollo123',
- master_log_file='a-mysql-bin.000001',
- master_log_pos=615;
- MariaDB [(none)]> change master to master_host='192.168.13.189',
- -> master_user='apollo',
- -> master_password='apollo123',
- -> master_log_file='a-mysql-bin.000001',
- -> master_log_pos=615;
- Query OK, 0 rows affected (0.05 sec)
7. 查看主从同步的状态
show slave status\G;
8. 开启从库的 slave 同步
start slave;
9. 再次查看主从同步的状态
- show slave status\G;
- # 查看两条参数, 确保主从正常
- Slave_IO_Running: Yes
- Slave_SQL_Running: Yes
10. 解锁主库, 恢复可写
- MariaDB [(none)]> unlock tables;
- Query OK, 0 rows affected (0.00 sec)
11. 主库创建一个数据库 db2
- # 这个是在主库里面执行的哦
- MariaDB [(none)]> create database db2;
- Query OK, 1 row affected (0.00 sec)
12. 去从库里面查看数据库中是否有 db2
- MariaDB [(none)]> show databases;
- +--------------------+
- | Database |
- +--------------------+
- | db1 |
- | db2 |
- | information_schema |
- | MySQL |
- | performance_schema |
- +--------------------+
- 5 rows in set (0.00 sec)
五. 总结
暂时没啥好总结的, 就先按照上面的步骤进行吧! 如有问题, 后续更正!
来源: http://www.bubuko.com/infodetail-2932381.html