复制解决的基本问题是让一台服务器的数据和另外的服务器保持同步。
一台主服务器可以连接多台从服务器,并且从服务器也可以反过来作主服务器。
主服务器和从服务器可以位于不同的网络拓扑中,还能对整台服务器、特定的数据库,甚至特定的表进行复制。
Mariadb复制技术有以下一些特点:
(1) 数据分布 (Data distribution )
(2) 负载平衡(load balancing)
(3) 备份(Backups)
(4)高可用性和故障转移 High availability and failover
mariadb主从复制中:
第一步:master记录二进制日志。在每个事务更新数据完成之前,master在二日志记录这些改变。Mariadb将事务写入二进制日志,即使事务中的语句都是交叉执行的。在事件写入二进制日志完成后,master通知存储引擎提交事务。
第二步:slave将master的binary log拷贝到它自己的中继日志。首先,slave开始一个工作线程——I/O线程。I/O线程在master上打开一个普通的连接,然后开始binlog dump process。Binlog dump process从master的二进制日志中读取事件,如果已经执行完master产生的所有文件,它会睡眠并等待master产生新的事件。I/O线程将这些事件写入中继日志。
第三步:SQL slave thread(SQL线程)处理该过程的最后一步。SQL线程从中继日志读取事件,并重新执行其中的事件而更新slave的数据,使其与master中的数据一致。
模式: C/S 模式
端口:3306
腾讯云配置:
主库:CenterOS7.5-64位 1核1G 系统盘:50GB 高性能云硬盘 内网IP:172.17.32.15
从库:CenterOS7.5-64位 1核1G 系统盘:50GB 高性能云硬盘 内网IP:172.17.32.13
( 主库)mariadb服务器配置
安装数据库:
[root@主库 ~]# yum install mariadb-server -y
[root@主库 ~]# systemctl start mariadb
创建要同步的数据库:
[root@主库 ~]# mysql -h 127.0.0.1 -u root -p #连接数据库
或:
[root@主库 ~]#mysql
mariadb> create database db1;
mariadb> use db1;
mariadb> create table test1 (id int,name char); 字段名 数据类型
mariadb> show tables;
desc test1; 打印表结构
停止mariadb主服务
[root@主库 ~]# systemctl stop mariadb
配置mariadb主要同步的数据库名字并开启对应的二进制日志
#vim /etc/my.cnf # my.cnf 是mariadb 主配置文件
[mysqld]
datadir=/var/lib/mysql
socket=/var/lib/mysql/mysql.sock
# Disabling symbolic-links is recommended to prevent assorted security risks
symbolic-links=0 #在原配置文件中,添加以下内容(一定要写在mysqld标签后面一行,否则不生效):
log-bin=mariadblog
server-id=1
binlog-do-db=db1 #这个不写的话,默认同步所有的库
注释:
log-bin=mariadblog #启用二进制日志,默认存在/var/lib/mariadb 下面
server-id=1 #本机数据库ID 唯一标示。
binlog-do-db=db1 #可以被从服务器复制的库。二进制需要同步的数据库名
重新启动
[root@主库 ~]# systemctl start mariadb
授权
mariadb> grant replication slave on *.* to slave@172.17.32.13 identified by "123456";
在从从库上测试登录:
[root@从库 ~]# mysql -h 172.17.32.15 -u slave -p123456
复制前保证主从两个数据库数据一致:
把主的原始数据传给从:
例:导出所有数据库:
[root@主库 ~]#mysqldump -u root -p -A > all1.sql
参数:-A, --all-databases Dump all the databases.
[root@主库 /]# vim all.sql #查看sql语句,导入数据时,会自动创建对应的数据库
数据库复制到从库上:
方法1:scp all1.sql 172.17.32.13:/root
在mariadb从服务器从库上导入:
[root@从库 ~]# yum install mariadb-server -y 安装
[root@从库 ~]# systemctl start mariadb
[root@从库 ~]# mysql -u root -p < all1.sql #导入数据库,和主服务器保持一致
Enter password: #没有密码,直接回车
[root@从库 ~]# mysql
mariadb> show databases;
mariadb> use db1;
mariadb> show tables;
停服务
修改从服务器配置文件:
[root@从库 ~]# vim /etc/my.cnf
[mariadbd]
datadir=/var/lib/mariadb
socket=/var/lib/mariadb/mariadb.sock
# Disabling symbolic-links is recommended to prevent assorted security risks
symbolic-links=0
#在配置文件中写入以下内容
server-id=2 #从服务器ID号,不要和主ID相同 ,如果设置多个从服务器,每个从服务器必须有一个唯一的server-id值,
#必须与主服务器的以及其它从服务器的不相同。可以认为server-id值类似于IP地址:这些ID值能唯一识别复制服务器群集中的每个服务器实例。
启动服务
从服务器配置到主机的用户名和密码
主服务器上查看状态:
mariadb> show master status;
ERROR 2006 (HY000): Mariadb server has gone away
No connection. Trying to reconnect...
Connection id: 2
Current database: db1
+-----------------+----------+--------------+------------------+
| File | Position | Binlog_Do_DB | Binlog_Ignore_DB |
+-----------------+----------+--------------+------------------+
| mariadblog.000001 | 245 | db1 | |
从库执行
MariaDB [(none)]> change master to master_host='172.17.32.15', master_user='slave', master_password='123456', master_port=3306, master_log_file='mariadblog.000001', master_log_pos=396, master_connect_retry=10;
MariaDB [(none)]> start slave; #启动从服务
MariaDB [(none)]> show slave status \G #查看从服务器状态
*************************** 1. row ***************************
Slave_IO_State: Waiting for master to send event
Master_Host: 172.17.32.15
Master_User: slave
Master_Port: 3306
Connect_Retry: 10
Master_Log_File: mariadblog.000001
Read_Master_Log_Pos: 396
Relay_Log_File: mariadb-relay-bin.000002
Relay_Log_Pos: 530
Relay_Master_Log_File: mariadblog.000001
Slave_IO_Running: Yes
Slave_SQL_Running: Yes
Slave_IO_Running: Yes #可以看到这两个Yes,说明从服务器安装成功。
Slave_SQL_Running: Yes
Slave_IO_Running :一个负责与主机的io通信
Slave_SQL_Running:负责自己的slave mariadb进程
测试:数据同步
主库写数据:
mariadb> use db1;
Database changed
mariadb> show tables;
+--------------+
| Tables_in_db1 |
+--------------+
| test1 |
+--------------+
1 row in set (0.00 sec)
mariadb> insert into test1 values(1);
从库读数据:
mariadb> use db1;
Reading table information for completion of table and column names
You can turn off this feature to get a quicker startup with -A
Database changed
mariadb> select * from test1;
在主库查看binlog日志
> show binlog events;
排错:
同步之前如果怀疑主从数据不同步可以采取:上面冷备份远程拷贝法或者在从服务器上命行同步方法。
总结:
1、 主从同步的原理
2、 主从同步的配置
3、 测试主从同步是否成功
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。