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

it2024-08-14  40

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

1. 数据的安装2. MySQL主从复制2.1 主从复制的原理2.2 实验过程 3. 主从分离3.1 基本原理3.2 实验过程

1. 数据的安装

数据库安装请看博客地址:https://blog.csdn.net/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)
最新回复(0)