MySQL数据库主从复制和主从分离
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)