ToB企服应用市场:ToB评测及商务社交产业平台
标题:
MySQL 主从复制与读写分离
[打印本页]
作者:
九天猎人
时间:
2024-8-4 15:05
标题:
MySQL 主从复制与读写分离
一、案例概述
在企业应用中,成熟的业务通常数据量都比较大
单台MySQL在安全性、高可用性和高并发方面都无法满意实际的需求
配置多台主从数据库服务器以实现读写方法
二、案例前置知识点
1、MySQL 主从复制原理
MySQL 的复制类型
基于语句的复制
在主服务器上执行的 SQL 语句,在从服务器上执行同样的语句。
MySQL 默认接纳基于语句的复制,服从比较高。
基于行的复制
把改变的内容复制已往,而不是把命令在从服务器上执行一遍。
混淆类型的复制
默认接纳基于语句的复制,一旦发现基于语句无法精确复制时,就会接纳基于行的复制。
MySQL 主从复制的工作过程
2、MySQL读写分离原理
只在主服务器上写,只在从服务器上读
主数据库处理事务性查询,从数据库处理SELECT查询
数据库复制用于将事务性查询的变动同步到集群中的数据库
读写分离方案
基于步调代码内部实现
基于中间署理层实现
MySQL-Proxy
Amoeba
实验报告
资源列表
主机操纵系统IP配置masterCentOS7192.168.72.1312C4Gslave1CentOS7192.168.72.1322C4Gslave2CentOS7192.168.72.1332C4GamoebaCentOS7192.168.72.1342C4GclientCentOS7192.168.72.1302C4G
基础情况
关闭防火墙
systemctl stop firewalld
systemctl disable firewalld
复制代码
关闭内核安全机制
setenforce 0
sed -i "s/^SELINUX=.*/SELINUX=disabled/g" /etc/selinux/config
复制代码
修改主机名
hostnamectl set-hostname master
hostnamectl set-hostname slave1
hostnamectl set-hostname slave2
hostnamectl set-hostname amoeba
hostnamectl set-hostname client
复制代码
一、搭建 MySQL 主从复制
1、安装 MySQL 数据库
# 上传脚本
[root@master ~]# tar zxf auto-install-mysql57-glibc.tar.gz
[root@master ~]# cd auto-install-mysql57-glibc
[root@master auto-install-mysql57-glibc]# ls
auto-install-mysql57-glibc.sh my.cnf mysql-5.7.28-linux-glibc2.12-x86_64.tar.gz
[root@master auto-install-mysql57-glibc]# ./auto-install-mysql57-glibc.sh
set password=password('123');
复制代码
2、配置 master 主服务器
master
# 开启二进制日志
[root@master ~]# vi /etc/my.cnf
[mysqld]
log-bin=master-bin
binlog-format = MIXED
server-id = 1
# 重启 MySQL 服务
[root@master ~]# systemctl restart mysqld
[root@master ~]# ls /usr/local/mysql/data/
auto.cnf client-key.pem ib_logfile1 master.err mysql.sock.lock server-cert.pem
ca-key.pem ib_buffer_pool ibtmp1 master.pid performance_schema server-key.pem
ca.pem ibdata1 master-bin.000001 mysql private_key.pem sys
client-cert.pem ib_logfile0 master-bin.index mysql.sock public_key.pem
# 登录 MySQL 程序,给从服务器授权
mysql> grant replication slave on *.* to 'myslave'@'192.168.72.%' identified by '123456';
Query OK, 0 rows affected, 1 warning (0.02 sec)
# 刷新权限
mysql> flush privileges;
Query OK, 0 rows affected (0.03 sec)
# MySQL 返回了主服务器的二进制日志(binary log)的当前状态
mysql> show master status;
+-------------------+----------+--------------+------------------+-------------------+
| File | Position | Binlog_Do_DB | Binlog_Ignore_DB | Executed_Gtid_Set |
+-------------------+----------+--------------+------------------+-------------------+
| master-bin.000001 | 603 | | | |
+-------------------+----------+--------------+------------------+-------------------+
1 row in set (0.03 sec)
复制代码
3、配置 slave 从服务器
slave1
# 开启二进制日志
[root@slave1 ~]# vi /etc/my.cnf
[mysqld]
log-bin=slave1-bin
binlog-format = MIXED
server-id = 2
# 重启 MySQL 服务
[root@slave1 ~]# systemctl restart mysqld
[root@slave1 ~]# ls /usr/local/mysql/data/
auto.cnf client-key.pem ib_logfile1 mysql.sock.lock server-cert.pem slave1.err
ca-key.pem ib_buffer_pool ibtmp1 performance_schema server-key.pem slave1.pid
ca.pem ibdata1 mysql private_key.pem slave1-bin.000001 sys
client-cert.pem ib_logfile0 mysql.sock public_key.pem slave1-bin.index
# MySQL复制环境中用于配置从服务器(slave)以连接到主服务器(master)并开始复制过程
mysql> change master to master_host='192.168.72.131', # master 主机的IP
-> master_user='myslave', # master 主机设置的用户名
-> master_password='123456', # master 主机设置的密码
-> master_log_file='master-bin.000001',
# master 主机的日志文件
-> master_log_pos=603;
# master 主机的偏移量 当前二进制日志的位置
Query OK, 0 rows affected, 2 warnings (0.04 sec)
mysql> start slave;
Query OK, 0 rows affected (0.01 sec)
# 检查从服务器的复制状态
mysql> show slave status\G;
*************************** 1. row ***************************
...... # 省略部分代码
Slave_IO_Running: Yes
Slave_SQL_Running: Yes
...... # 省略部分代码
1 row in set (0.00 sec)
# 如果出现错误,执行重置重新写
# 关闭
stop slave;
# 重置
reset slave;
复制代码
slave2
# 开启二进制日志
[root@slave2 ~]# vi /etc/my.cnf
[mysqld]
log-bin=slave2-bin
binlog-format = MIXED
server-id = 3
# 重启 MySQL 服务
[root@slave2 ~]# systemctl restart mysqld
[root@slave2 ~]# ls /usr/local/mysql/data/
auto.cnf client-key.pem ib_logfile1 mysql.sock.lock server-cert.pem slave2.err
ca-key.pem ib_buffer_pool ibtmp1 performance_schema server-key.pem slave2.pid
ca.pem ibdata1 mysql private_key.pem slave2-bin.000001 sys
client-cert.pem ib_logfile0 mysql.sock public_key.pem slave2-bin.index
# MySQL复制环境中用于配置从服务器(slave)以连接到主服务器(master)并开始复制过程
mysql> change master to master_host='192.168.72.131', # master 主机的IP
-> master_user='myslave', # master 主机设置的用户名
-> master_password='123456', # master 主机设置的密码
-> master_log_file='master-bin.000001',
# master 主机的日志文件
-> master_log_pos=603;
# master 主机的偏移量 当前二进制日志的位置
Query OK, 0 rows affected, 2 warnings (0.04 sec)
mysql> start slave;
Query OK, 0 rows affected (0.01 sec)
# 检查从服务器的复制状态
mysql> show slave status\G;
*************************** 1. row ***************************
...... # 省略部分代码
Slave_IO_Running: Yes
Slave_SQL_Running: Yes
...... # 省略部分代码
1 row in set (0.00 sec)
# 如果出现错误,执行重置重新写
# 关闭
stop slave;
# 重置
reset slave;
复制代码
4、验证主从复制效果
# 在主、从服务器上登录 MySQL
mysql -uroot -p123
# 在主服务器上新建数据库 kgc
mysql> create database kgc;
Query OK, 1 row affected (0.01 sec)
# 在两台从服务器上分别查看数据库,显示数据库相同,则主从复制成功
mysql> show databases;
+--------------------+
| Database |
+--------------------+
| information_schema |
| kgc |
| mysql |
| performance_schema |
| sys |
+--------------------+
5 rows in set (0.00 sec)
复制代码
二、搭建 MySQL 读写分离
1、在 Amoeba 主机上安装 Java 情况
[root@master ~]# chmod +x jdk-6u14-linux-x64.bin
[root@master ~]# ./jdk-6u14-linux-x64.bin //根据提示按 Enter 键完成即可
[root@master ~]# mv jdk1.6.0_14/ /usr/local/jdk1.6
[root@master ~]# vi /etc/profile
cat >> /etc/profile << 'EOF'
export JAVA_HOME=/usr/local/jdk1.6
export CLASSPATH=$CLASSPATH:$JAVA_HOME/lib:$JAVA_HOME/jre/lib
export PATH=$JAVA_HOME/lib:$JAVA_HOME/jre/bin:$PATH:$HOME/bin
export AMOEBA_HOME=/usr/local/amoeba/
export PATH=$PATH:$AMOEBA_HOME/bin
EOF
# 刷新环境变量
source /etc/profile
# 查看版本号
[root@master ~]# java -version
java version "1.6.0_14"
Java(TM) SE Runtime Environment (build 1.6.0_14-b08)
Java HotSpot(TM) 64-Bit Server VM (build 14.0-b16, mixed mode)
复制代码
2、安装并配置 Amoeba 软件
mkdir /usr/local/amoeba
tar zxf amoeba-mysql-binary-2.2.0.tar.gz -C /usr/local/amoeba
chmod -R 755 /usr/local/amoeba/
# 显示此内容说明 Amoeba 安装成功
[root@amoeba ~]# amoeba
amoeba start|stop
复制代码
3、配置 Amoeba 读写分离,两个 Slave 读负载均衡
SHOW GRANTS; # 查看所有权限
select user from mysql.user; # 查看所有用户
delete from mysql.user where user='test'; # 删除指定test用户
# (1)master、slave1、slave2 中开放权限给 Amoeba 访问
# 在 master 节点操作
# 登录 MySQL 程序,给从服务器授权
grant all on *.* to test@'192.168.72.%' identified by '123.com';
# 刷新权限
flush privileges;
# 创建 test 数据库
create database test;
# 在 amoeba 节点操作
# (2)编辑 amoeba.xml 配置文件
[root@master ~]# cd /usr/local/amoeba/conf
[root@master conf]# vi amoeba.xml
# 在 30 行左右修改 user 和 password
...... # 省略部分代码
<property name="user">amoeba</property>
<property name="password">123456</property>
...... # 省略部分代码
# 在 115 行左右修改 defaultPool、writePool、readPool
...... # 省略部分代码
<property name="defaultPool">master</property>
<property name="writePool">master</property>
<property name="readPool">slaves</property>
...... # 省略部分代码
# (3)编辑 dbServers.xml 配置文件
[root@master conf]# vi dbServers.xml
# 在 26 行左右修改 user 和 password 写在master数据库给权限的用户和密码
...... # 省略部分代码
<!-- mysql user -->
<property name="user">test</property>
<!-- mysql password
-->
<property name="password">123.com</property>
...... # 省略部分代码
# 在 45 行左右修改以下内容
...... # 省略部分代码
<dbServer name="master" parent="abstractServer">
<factoryConfig>
<!-- mysql ip -->
<property name="ipAddress">192.168.72.131</property>
</factoryConfig>
</dbServer>
<dbServer name="slave1" parent="abstractServer">
<factoryConfig>
<!-- mysql ip -->
<property name="ipAddress">192.168.72.132</property>
</factoryConfig>
</dbServer>
<dbServer name="slave2" parent="abstractServer"> # 若无slave2 段,手动添加
<factoryConfig>
<!-- mysql ip -->
<property name="ipAddress">192.168.72.133</property>
</factoryConfig>
</dbServer>
...... # 省略部分代码
# 在 66 行左右修改以下内容
...... # 省略部分代码
<dbServer name="slaves" virtual="true">
<poolConfig class="com.meidusa.amoeba.server.MultipleServerPool">
<!-- Load balancing strategy: 1=ROUNDROBIN , 2=WEIGHTBASED , 3=HA-->
<property name="loadbalance">1</property>
<!-- Separated by commas,such as: server1,server2,server1 -->
<property name="poolNames">slave1,slave2</property>
</poolConfig>
</dbServer>
...... # 省略部分代码
# (4)配置无误后,可以启动 Amoeba 软件,其默认端口为 tcp 8066
[root@amoeba ~]# amoeba start &
[1] 9705
[root@amoeba ~]# netstat -anpt | grep 8066
tcp6 0 0 :::8066 :::* LISTEN 9705/java
复制代码
4、测试
# (1)在 client 主机上安装mariadb
yum -y install mariadb
# (2)登录
# IP地址和端口是 amoeba 的地址和端口
mysql -u amoeba -p123456 -h 192.168.72.134 -P 8066
# (3)在 Master 上创建一个表,同步到各从服务器上,然后关掉各从服务器的 Slave功能,再插入区别语句。
# 在 master节点创建表
use test;
CREATE TABLE `kgc` (
`id` int(10) NOT NULL,
`name` VARCHAR(10) DEFAULT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
# slave节点执行
stop slave;
# master节点执行
insert into kgc values(1,'张三');
# slave1节点执行
insert into kgc values(2,'李四');
# slave2节点执行
insert into kgc values(3,'王五');
# (4)测试读操作
# 第一次查询
MySQL [(none)]> select * from test.kgc;
+----+--------+
| id | name |
+----+--------+
| 3 | 王五 |
+----+--------+
1 row in set (0.03 sec)
# 第二次查询
MySQL [(none)]> select * from test.kgc;
+----+--------+
| id | name |
+----+--------+
| 2 | 李四 |
+----+--------+
1 row in set (0.01 sec)
# 第三次查询
MySQL [(none)]> select * from test.kgc;
+----+--------+
| id | name |
+----+--------+
| 3 | 王五 |
+----+--------+
1 row in set (0.00 sec)
# (5)测试写操作
# 在client主机上插入一条数据
insert into kgc values(4,'张涛');
# 但在 Client 上查询不到,最终只有在 Master 上才能查看到这条语句内容,说明写操作在 Master 服务器上
MySQL [(none)]> select * from test.kgc;
+----+--------+
| id | name |
+----+--------+
| 2 | 李四 |
+----+--------+
1 row in set (0.00 sec)
复制代码
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。
欢迎光临 ToB企服应用市场:ToB评测及商务社交产业平台 (https://dis.qidao123.com/)
Powered by Discuz! X3.4