• mariadb主从原理
• 实战:mariadb主从配置
• 实战:mariadb主主配置
mariadb 主从复制
mariadb主从复制概述:
复制解决的基本问题是让一台服务器的数据和另外的服务器保持同步。
一台主服务器可以连接多台从服务器,并且从服务器也可以反过来作主服务器。
主服务器和从服务器可以位于不同的网络拓扑中,还能对整台服务器、特定的数据库,甚至特定的表进行复制。
1.2 . 主从复制解决的问题
Mariadb复制技术有以下一些特点:
(1) 数据分布 (Data distribution )
(2) 负载平衡(load balancing)
(3) 备份(Backups)
(4) 高可用性和故障转移 High availability and failover
1.3 主从复制如何工作
整体上来说,复制有3个步骤:
(1) master将改变记录到二进制日志(binary log)中(这些记录叫做二进制日志事件,binary logevents);
(2) slave将master的binary log events拷贝到它的中继日志(relay log);
(3) slave重做中继日志中的事件,修改salve上的数据。
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 slavethread(SQL线程)处理该过程的最后一步。SQL线程从中继日志读取事件,并重新执行其中的事件而更新slave的数据,使其与master中的数据一致。
模式: C/S 模式
端口:3306
实战:实战mariadb主从配备
xuegod63 主mariadb服务器配置
安装数据库:
[root@xuegod63~]# yum install mariadb-server -y
[root@xuegod63~]# systemctl start mariadb
创建要同步的数据库:
[root@xuegod63 ~]# mysql -h127.0.0.1 -u root -p #连接数据库
或:
[root@xuegod63~]#mysql
mariadb> create database cd;
mariadb> use cd;
mariadb>create table test1 (id int); 字段名 数据类型
mariadb>show tables;
desc test1; 打印表结构
停止mariadb主服务
[root@xuegod63 ~]# 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 toprevent assorted security risks
symbolic-links=0 #在原配置文件中,添加以下内容:
log-bin=mariadblog
server-id=1
binlog-do-db=cd
注释:
log-bin=mariadblog #启用二进制日志,默认存在/var/lib/mariadb 下面
server-id=1 #本机数据库ID 唯一标示。
binlog-do-db=cd #可以被从服务器复制的库。二进制需要同步的数据库名
重新启动
[root@xuegod63 ~]# systemctlstart mariadb
授权
mariadb> grant replication slave on *.*to slave@192.168.1.202 identified by "123456";
在从xuegod64上测试登录:
[root@xuegod64 ~]# mysql -h 192.168.1.201-u slave -p123456
复制前保证主从两个数据库数据一致:
把主的原始数据传给从:
例:导出所有数据库:
[root@xuegod63 ~]#mysqldump -u root -p -A > all1.sql
参数:-A, --all-databases Dumpall the databases.
[root@xuegod63 /]# vim all.sql #查看sql语句,导入数据时,会自动创建对应的数据库
数据库复制到xuegod64上:
方法1:scp all1.sql192.168.1.202:/root
在mariadb从服务器xuegod64上导入:
[root@xuegod64 ~]# yum install mariadb-server-y 安装
[root@xuegod64 ~]# systemctl start mariadb
[root@xuegod64 ~]# mysql -uroot -p < all1.sql #导入数据库,和主服务器保持一致
Enter password:
[root@xuegod64 ~]# mysql
mariadb> showdatabases;
mariadb> use cd;
mariadb> show tables;
停服务
修改从服务器配置文件:
[root@xuegod64 ~]# vim /etc/my.cnf
[mariadbd]
datadir=/var/lib/mariadb
socket=/var/lib/mariadb/mariadb.sock
# Disabling symbolic-links is recommended toprevent 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 goneaway
No connection. Trying to reconnect...
Connection id: 2
Current database: cd
+-----------------+----------+--------------+------------------+
| File | Position | Binlog_Do_DB |Binlog_Ignore_DB |
+-----------------+----------+--------------+------------------+
| mariadblog.000001 | 106 | cd | |
从库执行
MariaDB [(none)]> changemaster to master_host='192.168.1.201',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)]> showslave status \G #查看从服务器状态
***************************1. row ***************************
Slave_IO_State: Waiting formaster to send event
Master_Host: 192.168.1.201
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进程
测试:数据同步
xuegod63写数据:
mariadb> use cd;
Database changed
mariadb> show tables;
+--------------+
| Tables_in_cd |
+--------------+
| test1 |
+--------------+
1 row in set (0.00 sec)
mariadb> insert into test1 values(1);
xuegod64读数据:
mariadb> use cd;
Reading table information for completionof table and column names
You can turn off this feature to get aquicker startup with -A
Database changed
mariadb> select * from test1;
+------+
| id |
+------+
| 1 |
+------+
在主库查看binlog日志
> show binlog events;
排错:
同步之前如果怀疑主从数据不同步可以采取:上面冷备份远程拷贝法或者在从服务器上命行同步方法。
总结:
1、 主从同步的原理
2、 主从同步的配置
3、 测试主从同步是否成功
实战2:mariadb 主主 双向主从复制
实战3:mariadb 主从读写分离
• mariadb主从原理
• 实战:mariadb主从配置
• 实战:mariadb主主配置
mariadb 主从复制
mariadb主从复制概述:
复制解决的基本问题是让一台服务器的数据和另外的服务器保持同步。
一台主服务器可以连接多台从服务器,并且从服务器也可以反过来作主服务器。
主服务器和从服务器可以位于不同的网络拓扑中,还能对整台服务器、特定的数据库,甚至特定的表进行复制。
1.2 . 主从复制解决的问题
Mariadb复制技术有以下一些特点:
(1) 数据分布 (Data distribution )
(2) 负载平衡(load balancing)
(3) 备份(Backups)
(4) 高可用性和故障转移 High availability and failover
1.3 主从复制如何工作
整体上来说,复制有3个步骤:
(1) master将改变记录到二进制日志(binary log)中(这些记录叫做二进制日志事件,binary logevents);
(2) slave将master的binary log events拷贝到它的中继日志(relay log);
(3) slave重做中继日志中的事件,修改salve上的数据。
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 slavethread(SQL线程)处理该过程的最后一步。SQL线程从中继日志读取事件,并重新执行其中的事件而更新slave的数据,使其与master中的数据一致。
模式: C/S 模式
端口:3306
实战:实战mariadb主从配备
xuegod63 主mariadb服务器配置
安装数据库:
[root@xuegod63~]# yum install mariadb-server -y
[root@xuegod63~]# systemctl start mariadb
创建要同步的数据库:
[root@xuegod63 ~]# mysql -h127.0.0.1 -u root -p #连接数据库
或:
[root@xuegod63~]#mysql
mariadb> create database cd;
mariadb> use cd;
mariadb>create table test1 (id int); 字段名 数据类型
mariadb>show tables;
desc test1; 打印表结构
停止mariadb主服务
[root@xuegod63 ~]# 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 toprevent assorted security risks
symbolic-links=0 #在原配置文件中,添加以下内容:
log-bin=mariadblog
server-id=1
binlog-do-db=cd
注释:
log-bin=mariadblog #启用二进制日志,默认存在/var/lib/mariadb 下面
server-id=1 #本机数据库ID 唯一标示。
binlog-do-db=cd #可以被从服务器复制的库。二进制需要同步的数据库名
重新启动
[root@xuegod63 ~]# systemctlstart mariadb
授权
mariadb> grant replication slave on *.*to slave@192.168.1.202 identified by "123456";
在从xuegod64上测试登录:
[root@xuegod64 ~]# mysql -h 192.168.1.201-u slave -p123456
复制前保证主从两个数据库数据一致:
把主的原始数据传给从:
例:导出所有数据库:
[root@xuegod63 ~]#mysqldump -u root -p -A > all1.sql
参数:-A, --all-databases Dumpall the databases.
[root@xuegod63 /]# vim all.sql #查看sql语句,导入数据时,会自动创建对应的数据库
数据库复制到xuegod64上:
方法1:scp all1.sql192.168.1.202:/root
在mariadb从服务器xuegod64上导入:
[root@xuegod64 ~]# yum install mariadb-server-y 安装
[root@xuegod64 ~]# systemctl start mariadb
[root@xuegod64 ~]# mysql -uroot -p < all1.sql #导入数据库,和主服务器保持一致
Enter password:
[root@xuegod64 ~]# mysql
mariadb> showdatabases;
mariadb> use cd;
mariadb> show tables;
停服务
修改从服务器配置文件:
[root@xuegod64 ~]# vim /etc/my.cnf
[mariadbd]
datadir=/var/lib/mariadb
socket=/var/lib/mariadb/mariadb.sock
# Disabling symbolic-links is recommended toprevent 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 goneaway
No connection. Trying to reconnect...
Connection id: 2
Current database: cd
+-----------------+----------+--------------+------------------+
| File | Position | Binlog_Do_DB |Binlog_Ignore_DB |
+-----------------+----------+--------------+------------------+
| mariadblog.000001 | 106 | cd | |
从库执行
MariaDB [(none)]> changemaster to master_host='192.168.1.201',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)]> showslave status \G #查看从服务器状态
***************************1. row ***************************
Slave_IO_State: Waiting formaster to send event
Master_Host: 192.168.1.201
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进程
测试:数据同步
xuegod63写数据:
mariadb> use cd;
Database changed
mariadb> show tables;
+--------------+
| Tables_in_cd |
+--------------+
| test1 |
+--------------+
1 row in set (0.00 sec)
mariadb> insert into test1 values(1);
xuegod64读数据:
mariadb> use cd;
Reading table information for completionof table and column names
You can turn off this feature to get aquicker startup with -A
Database changed
mariadb> select * from test1;
+------+
| id |
+------+
| 1 |
+------+
在主库查看binlog日志
> show binlog events;
排错:
同步之前如果怀疑主从数据不同步可以采取:上面冷备份远程拷贝法或者在从服务器上命行同步方法。
总结:
1、 主从同步的原理
2、 主从同步的配置
3、 测试主从同步是否成功
实战2:mariadb 主主 双向主从复制
实战3:mariadb 主从读写分离