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;
原文地址:https://blog.csdn.net/cycjok/article/details/140639486
免责声明:本站文章内容转载自网络资源,如本站内容侵犯了原著者的合法权益,可联系本站删除。更多内容请关注自学内容网(zxcms.com)!