MySQL数据库主从复制和主从分离

本文详细介绍了MySQL数据库的主从复制原理及配置步骤,并通过实例演示了如何搭建主从复制环境。此外,还讲解了读写分离的基本原理,并提供了具体的实施过程。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1. 数据的安装

数据库安装请看博客地址:https://blog.youkuaiyun.com/weixin_48190892/article/details/108948586

2. MySQL主从复制

2.1 主从复制的原理

主从复制一共有三个进程,从库生成两个线程,一个I/O线程,一个SQL线程

i/o线程去请求主库 的binlog,并将得到的binlog日志写到relay log(中继日志) 文件中

主库会生成一个 log dump 线程,用来给从库 i/o线程传binlog

SQL 线程,会读取relay log文件中的日志,并解析成具体操作,来实现主从的操作一致,而最终数据一致;

2.2 实验过程

准备
一台主服务器,两台从服务器

1.三台服务器同步阿里云服务器

[root@localhost ~]# ntpdate ntp1.aliyun.com  ###同步阿里云时间
21 Oct 15:13:02 ntpdate[21402]: step time server 120.25.115.20 offset -28800.112536 sec

[root@localhost ~]# date -R  ###查看时间
Wed, 21 Oct 2020 15:13:28 +0800

2.编辑mysql主服务器配置

vi /etc/my.cnf   ###编辑主配置文件
server-id = 11   ####id号
log-bin = master-bin   ###日志文件
log-slave-updates = ture   ###同步二进制文件

systemctl restart mysqld.service  ###重新启动mysql

mysql -u root -p  ###进入数据库
mysql> grant replication slave on *.* to 'myslave'@'20.0.0.%' identified by '123456';  ###允许从服务器来同步这个日志
Query OK, 0 rows affected, 1 warning (0.00 sec)
mysql> flush privileges;  ##刷新
Query OK, 0 rows affected (0.00 sec)
mysql> show master status;  ##查看服务器状态
+-------------------+----------+--------------+------------------+-------------------+
| File              | Position | Binlog_Do_DB | Binlog_Ignore_DB | Executed_Gtid_Set |
+-------------------+----------+--------------+------------------+-------------------+
| master-bin.000002 |      154 |              |                  |                   |
+-------------------+----------+--------------+------------------+-------------------+
1 row in set (0.00 sec)

mysql> select host,user from mysql.user;  ###查看信息
+-----------+---------------+
| host      | user          |
+-----------+---------------+
| 20.0.0.%  | myslave       |
| localhost | mysql.session |
| localhost | mysql.sys     |
| localhost | root          |
+-----------+---------------+
4 rows in set (0.00 sec)

3.编辑两个从服务器
从服务器1

vi /etc/my.cnf  
server-id = 22
relay-log = relay-log-bin  ###中继日志
relay-log-index = slave-relay-bin.index  ##定义relay-log的位置和名称

systemctl restart mysqld    ###重启数据库

mysql> change master to master_host='20.0.0.12',master_user='myslave',master_password='123456',master_log_file='master-bin.000001',master_log_pos=599;   ###配置与主服务器同步
Query OK, 0 rows affected, 2 warnings (0.01 sec)

mysql> flush privileges;  ##刷新一下
Query OK, 0 rows affected (0.00 sec)

mysql> start slave;   ###开启从服务器
Query OK, 0 rows affected (0.00 sec)

mysql> show slave status\G   ##查看从服务器状态 G (换行输出)
*************************** 1. row ***************************
               Slave_IO_State: Waiting for master to send event
                  Master_Host: 20.0.0.12
                  Master_User: myslave
                  Master_Port: 3306
                Connect_Retry: 60
              Master_Log_File: master-bin.000002
          Read_Master_Log_Pos: 154
               Relay_Log_File: relay-log-bin.000002
                Relay_Log_Pos: 321
        Relay_Master_Log_File: master-bin.000002
             **Slave_IO_Running: Yes
            Slave_SQL_Running: Yes**

  

从服务器2

vi /etc/my.cnf  
server-id = 33
relay-log = relay-log-bin  ###中继日志
relay-log-index = slave-relay-bin.index  ##定义relay-log的位置和名称

systemctl restart mysqld    ###重启数据库

mysql> change master to master_host='20.0.0.12',master_user='myslave',master_password='123456',master_log_file='master-bin.000002',master_log_pos=154;   ###配置与主服务器同步
Query OK, 0 rows affected, 2 warnings (0.01 sec)

mysql> flush privileges;  ##刷新一下
Query OK, 0 rows affected (0.00 sec

mysql> flush privileges;  ##刷新一下
Query OK, 0 rows affected (0.00 sec)

mysql> start slave;   ###开启从服务器
Query OK, 0 rows affected (0.00 sec)

mysql> show slave status\G   ##查看从服务器状态 G (换行输出)
*************************** 1. row ***************************
               Slave_IO_State: Waiting for master to send event
                  Master_Host: 20.0.0.12
                  Master_User: myslave
                  Master_Port: 3306
                Connect_Retry: 60
              Master_Log_File: master-bin.000002
          Read_Master_Log_Pos: 154
               Relay_Log_File: relay-log-bin.000002
                Relay_Log_Pos: 321
        Relay_Master_Log_File: master-bin.000002
             **Slave_IO_Running: Yes
            Slave_SQL_Running: Yes**

4.测试
在主服务器中创建一个数据库,看看其他两个从服务器是否同步

主服务器
mysql> create database kkk;
Query OK, 1 row affected (0.00 sec)
从服务器1
mysql> show databases;
+--------------------+
| Database           |
+--------------------+
| information_schema |
| baqn               |
| kkk                |
| mysql              |
| performance_schema |
| sys                |
+--------------------+
6 rows in set (0.01 sec)

从服务器2
mysql> show databases;
+--------------------+
| Database           |
+--------------------+
| information_schema |
| baqn               |
| kkk                |
| mysql              |
| performance_schema |
| sys                |
| test_db            |
+--------------------+
7 rows in set (0.01 sec)

3. 主从分离

3.1 基本原理

读写分离的基本原理就是让主数据库处理事务性增、改、删操作(INSERT、UPDATE、DELETE)操作,而从数据库处理SELECT查询操作。数据库复制被用来把事务性操作导致的变更同步到其他从数据库。以SQL为例,主库负责写数据、读数据。读库仅负责读数据。每次有写库操作,同步更新到读库。写库就一个,读库可以有多个,采用日志同步的方式实现主库和多个读库的数据同步

3.2 实验过程

[root@localhost opt]# chmod 755 jdk-6u14-linux-x64.bin   ##给执行权限
[root@localhost opt]# ./jdk-6u14-linux-x64.bin   ##执行
yes
按enter

[root@localhost opt]# mv jdk1.6.0_14/ /usr/local/jdk1.6    ###移动
[root@localhost opt]# vi /etc/profile  ###编辑环境变量
export JAVA_HOME=/usr/local/jdk1.6             ###指定java的工作目录
export CLASSPATH=$CLASSPATH:$JAVA_HOME/lib:$JAVA_HOME/jre/lib  ###jre就是java的虚拟机,里面会有默认的类(
比如class),lib就是类库
export PATH=$JAVA_HOME/lib:$JAVA_HOME/jre/bin/:$PATH:$HOME/bin
export AMOEBA_HOME=/usr/local/amoeba          ###amoeba工作目录
export PATH=$PATH:$AMOEBA_HOME/bin     ####系统都能识别
[root@localhost opt]# source /etc/profile    ##刷新
[root@localhost opt]# mkdir /usr/local/amoeba  
[root@localhost opt]# tar zxvf amoeba-mysql-binary-2.2.0.tar.gz -C /usr/local/amoeba/
[root@localhost opt]# chmod -R 755 /usr/local/amoeba/  ##给权限
[root@localhost opt]# /usr/local/amoeba/bin/amoeba  ##查看amoeba是否安装好   
amoeba start|stop

在三台服务器添加权限给amoeba访问

mysql> grant all on *.* to test@'20.0.0.%' identified by '123.com';   ###授权
Query OK, 0 rows affected, 1 warning (0.00 sec)  

编辑amoeba服务器

cd /usr/local/amoeba/conf
[root@localhost conf]# vi amoeba.xml 


30                                         <property name="user">amoeba</property>     ###用户改成amoeba
31 
32                                         <property name="password">123456</property>    ###设置amoeba密码
!


115                 <property name="defaultPool">master</property>  ##默认池子
116 
117                 
118                 <property name="writePool">master</property>  ##写的池子
119                 <property name="readPool">slaves</property>   ##读的池子
vi conf/dbServers.xml
23                         <property name="schema">mysql</property>  
24 
25                         <!-- mysql user -->
26                         <property name="user">test</property>  ##授权用户
27 
28                         <!--  mysql password
29                         <property name="password">123.com</property>  ##授权密码


45         <dbServer name="master"  parent="abstractServer">
46                 <factoryConfig>
47                         <!-- mysql ip -->
48                         <property name="ipAddress">20.0.0.12</property>
49                 </factoryConfig>
50         </dbServer>
51 
52
53         <dbServer name="slave1"  parent="abstractServer">
54                 <factoryConfig>
55                         <!-- mysql ip -->
56                         <property name="ipAddress">20.0.0.28</property>
57                 </factoryConfig>
58         </dbServer>
59         
60 
61         
62         <dbServer name="slave2"  parent="abstractServer">
63                 <factoryConfig>
64                         <!-- mysql ip -->
65                         <property name="ipAddress">20.0.0.29</property>
66                 </factoryConfig>
67 
66         <dbServer name="slaves" virtual="true">
67                 <poolConfig class="com.meidusa.amoeba.server.MultipleServerPool">
68                         <!-- Load balancing strategy: 1=ROUNDROBIN , 2=WEIGHTBASED , 3=HA-->
69                         <property name="loadbalance">1</property>
70 
71                         <!-- Separated by commas,such as: server1,server2,server1 -->
72                         <property name="poolNames">slave1,slave2</property>

编辑客户端

[root@localhost amoeba]# yum -y install mariadb*
systemctl start mariadb        ###启动一下mariadb服务 
 mysql_secure_installation     ###简单自定义部署一下
 

在这里插入图片描述

mysql -uamoeba -p -h 127.0.0.1 -P8066   ###本地ip地址127.0.0.1,8066是端口
然后输入密码123456,就成功进去了

测试
在主服务器中创建test数据库
在客户机数据库看一下

[root@localhost ~]# mysql -u amoeba -p123456 -h 127.0.0.1  -P8066
MySQL [(none)]> show databases;
+--------------------+
| Database           |
+--------------------+
| information_schema |
| bdqn               |
| db_test            |
| mysql              |
| performance_schema |
| sys                |
| test               |                       #####发现数据库test
+--------------------+
7 rows in set (0.01 sec)
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值