mysql的主从复制和读写分离

mysql的主从复制和读写分离

主从复制

先有主从复制才有读写分离,先有主从复制才有MHA。

主从复制的模式:

1、mysql的默认模式

异步模式:主库在更新完事务之后,会立即把结果返回给从服务器,并不关心从库是否接受到,以及从库是否处理成功。

网络问题可能没有同步,或者其他因素的影响导致同步失败。

异步模式效率高

2、全同步模式:

主库在更新完事务之后,立即把结果返回到从库,所有的从库执行完毕之后,才能继续下一个同步。安全,但是性能受到影响。

3、半同步复制模式

介乎于异步和全同步之间,主库更新完事务之后,也是同步到从库。同步完成之后有一个等待时间

等待时间是一个tcp/ip的往返时间,5毫秒左右。

即在一定程度上保证了效率,也在一定程度上保证了数据的完整性

在这里插入图片描述

主从复制的延迟怎么解决:

1、网络问题,防火墙问题

2、硬件设备问题,cpu,内存和磁盘出了问题

3、配置文件写错了

配置文件当中进行设置的方式提高数据的安全性

数据库的存储引擎要是innodb

双一设置:

全部都在写在/etc/my.cnf

innodb_flush_log_at_trx_commit=1

每次提交都会刷新事务日志,确保事务的持久性。但是会影响性能。

sync_binlon=1

每次提交事务,将二进制日志的内容保存到磁盘,确保日志的持久性。,提高了安全性

性能化设置:

sync_binlog=10

最多提交几次事务会进行磁盘刷新,日志内容保存的到磁盘

innodb_flush_log_at_trx_commit=2

每次更新都保存在内存中,不进行刷新。(不推荐)

innodb_buffer_pool_size

控制innodb缓冲池的大小,增大可以提高数据库的性能,但是占用的是系统内存,配置的时候要注意合理化时间

主从复制如何实现:

实现是基于mysql的二进制日志,根据主库的二进制文件的标志位,实现主和从的同步

主从服务器之间,服务器的时间要同步

架构:

三台服务器

192.168.39.31 mysql8.0 主
192.168.39.32 mysql8.0 从
192.168.39.33 mysql8.0 从
systemctl stop firewalld
mysql1
vim /etc/my.cnf
log-bin=master-bin
binlog_format=MIXED
log-slave-updates=true
mysql -u root -p123456
mysql> CREATE USER 'myslave'@'192.168.39.%' IDENTIFIED WITH mysql_native_password BY '123456';
Query OK, 0 rows affected (0.02 sec)

mysql> GRANT REPLICATION SLAVE ON *.* TO 'myslave'@'192.168.39.%';
Query OK, 0 rows affected (0.00 sec)

mysql> FLUSH PRIVILEGES;
Query OK, 0 rows affected (0.01 sec)

mysql> show master status;

mysql2
vim /etc/my.cnf
server-id = 2
#一主两从的id不能相同
relay-log=relay-log-bin
#从服务器上获取二进制日志的开头,开启从库的二进制日志
#relay-log-index=slave-relay-bin.index
二进制日志的索引文件的名称
relay_log_recovery=1
#配置从服务器在启动时是否执行二进制日志的恢复操作(和主库同步),1表示开始

mysql> CREATE USER 'myslave'@'192.168.39.%' IDENTIFIED WITH mysql_native_password BY '123456';
Query OK, 0 rows affected (0.02 sec)

mysql> GRANT REPLICATION SLAVE ON *.* TO 'myslave'@'192.168.39.%';
Query OK, 0 rows affected (0.00 sec)

mysql> FLUSH PRIVILEGES;
Query OK, 0 rows affected (0.01 sec)

mysql> CHANGE master to master_host='192.168.39.31',master_user='myslave',master_password='123456',master_log_file='master-bin.000001',master_log_pos=855;
Query OK, 0 rows affected, 8 warnings (0.02 sec)

mysql> start slave;
Query OK, 0 rows affected, 1 warning (0.00 sec)

mysql> show slave status\G;
Slave_IO_Running: Yes
Slave_SQL_Running: Yes

mysql3
vim /etc/my.cnf
server-id = 3
#一主两从的id不能相同
relay-log=relay-log-bin
relay-log-index=slave-relay-bin.index
relay_log_recovery=1

mysql> CREATE USER 'myslave'@'192.168.39.%' IDENTIFIED WITH mysql_native_password BY '123456';
Query OK, 0 rows affected (0.02 sec)

mysql> GRANT REPLICATION SLAVE ON *.* TO 'myslave'@'192.168.39.%';
Query OK, 0 rows affected (0.00 sec)

mysql> FLUSH PRIVILEGES;
Query OK, 0 rows affected (0.01 sec)

mysql> CHANGE master to master_host='192.168.39.31',master_user='myslave',master_password='123456',master_log_file='master-bin.000001',master_log_pos=855;
Query OK, 0 rows affected, 8 warnings (0.02 sec)

mysql> start slave;
Query OK, 0 rows affected, 1 warning (0.00 sec)

mysql> show slave status\G;
Slave_IO_Running: Yes
Slave_SQL_Running: Yes

读写分离

主从架构当中,主库只负责写,从库只负责读

在这里插入图片描述

读写分离的方式:

1、代码 开发人员纯靠代码完成,涉及数据库的二次开发,性能好,不需要额外的硬件设备

2、中间层代理 代理服务器。在客户端和主从架构之间有一个代理服务器。代理服务器收到客户端的请求之后,通过客户端的sql语句来进行判断,读转发到从,写转发到主

Amoeba:读写分离最常见的客户端代理软件。java代码开发的一个软件。

192.168.39.31 mysql8.0 主
192.168.39.32 mysql8.0 从
192.168.39.33 mysql8.0 从
192.168.39.40 代理 jdk,amoeba
192.168.39.50 mariadb-server mariadb
在主从复制的基础上操作
----------------------搭建 MySQL读写分离--------------------------------
----Amoeba服务器配置----
##安装 Java 环境##
因为 Amoeba 基于是 jdk1.5 开发的,所以官方推荐使用 jdk1.5 或 1.6 版本,高版本不建议使用。
cd /opt/
cp jdk-6u14-linux-x64.bin /usr/local/
cd /usr/local/
chmod +x jdk-6u14-linux-x64.bin
./jdk-6u14-linux-x64.bin
//按yes,按enter

mv jdk1.6.0_14/ /usr/local/jdk1.6

vim /etc/profile
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

source /etc/profile
java -version

##安装 Amoeba软件##
mkdir /usr/local/amoeba
tar zxvf amoeba-mysql-binary-2.2.0.tar.gz -C /usr/local/amoeba/
chmod -R 755 /usr/local/amoeba/
/usr/local/amoeba/bin/amoeba
//如显示amoeba start|stop说明安装成功

##配置 Amoeba读写分离,两个 Slave 读负载均衡##
#先在Master、Slave1、Slave2 的mysql上开放权限给 Amoeba 访问

CREATE USER 'amoeba'@'192.168.39.%' IDENTIFIED WITH mysql_native_password BY '123456';

GRANT REPLICATION SLAVE ON *.* TO 'amoeba'@'192.168.233.%';

GRANT ALL PRIVILEGES ON *.* TO 'amoeba'@'192.168.233.%';

flush privileges;

#在slave1和slave2中,不需要创建用户,因为主从复制已经创建了用户,在从服务器上只需要给权限就好了

#再回到amoeba服务器配置amoeba服务:
cd /usr/local/amoeba/conf/

cp amoeba.xml amoeba.xml.bak
vim amoeba.xml									#修改amoeba配置文件
--30行--
<property name="user">amoeba</property>

--32行-- 
<property name="password">123456</property>

--115行--
<property name="defaultPool">master</property>

--117-去掉注释-
<property name="writePool">master</property>
<property name="readPool">slaves</property>

cp dbServers.xml dbServers.xml.bak
vim dbServers.xml								#修改数据库配置文件
--23行--注释掉  作用:默认进入test库 以防mysql中没有test库时,会报错
<!-- <property name="schema">test</property> -->

--26--修改
<property name="user">amoeba</property>

--28-30--去掉注释
<property name="password">123456</property>

--45--修改,设置主服务器的名Master
<dbServer name="master"  parent="abstractServer">

--48--修改,设置主服务器的地址
<property name="ipAddress">192.168.233.21</property>

--52--修改,设置从服务器的名slave1
<dbServer name="slave1"  parent="abstractServer">

--55--修改,设置从服务器1的地址
<property name="ipAddress">192.168.233.22</property>

--58--复制上面6行粘贴,设置从服务器2的名slave2和地址
<dbServer name="slave2"  parent="abstractServer">
<property name="ipAddress">192.168.233.23</property>

--65行--修改
<dbServer name="slaves" virtual="true">

--71行--修改
<property name="poolNames">slave1,slave2</property>


/usr/local/amoeba/bin/amoeba start &					#启动Amoeba软件,按ctrl+c 返回
netstat -anpt | grep java							#查看8066端口是否开启,默认端口为TCP 8066


----测试读写分离 ----
yum install -y mariadb-server mariadb
systemctl start mariadb.service

#在主从服务器上开启查询日志
general_log=ON
general_log_file=/usr/local/mysql/data/mysql_general.log

在客户端服务器上测试:
mysql -u amoeba -p123456 -h 192.168.233.10 -P8066		
//通过amoeba服务器代理访问mysql ,在通过客户端连接mysql后写入的数据只有主服务会记录,然后同步给从--从服务器

在主服务器上:
use db_test;
create table test (id int(10),name varchar(10),address varchar(20));

在两台从服务器上:
stop slave;											#关闭同步
use db_test;
//在slave1上:
insert into test values('1','zhangsan','this_is_slave1');

//在slave2上:
insert into test values('2','lisi','this_is_slave2');

//在主服务器上:
insert into test values('3','wangwu','this_is_master');

//在客户端服务器上:
use db_test;
select * from test;		//客户端会分别向slave1和slave2读取数据,显示的只有在两个从服务器上添加的数据,没有在主服务器上添加的数据

insert into test values('4','qianqi','this_is_client');		//只有主服务器上有此数据

//在两个从服务器上执行 start slave; 即可实现同步在主服务器上添加的数据
start slave;

  • 4
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值