五、主从复制案例(半同步复制)
实验环境
Master 服务器:192.168.109.137 mysql5.7 centos7-7
Slave1 服务器:192.168.109.134 mysql5.7 centos7-4
Slave2 服务器:192.168.109.135 mysql5.7 centos7-5
主数据库配置
#在 [mysqld] 区域添加下面内容 vim /etc/my.cnf plugin-load=rpl_semi_sync_master=semisync_master.so #加载mysql半同步复制的插件 rpl_semi_sync_master_enabled=ON #或者设置为"1",即开启半同步复制功能 rpl-semi-sync-master-timeout=1000 #超时时间为1000ms,即1s #重启服务 systemctl restart mysqld
从数据库配置
#写入 vim /etc/my.cnf plugin-load=rpl_semi_sync_slave=semisync_slave.so rpl_semi_sync_slave_enabled=ON #重启服务 systemctl restart mysqld
查看半同步是否在运行
#主数据库执行 show status like 'Rpl_semi_sync_master_status'; show variables like 'rpl_semi_sync_master_timeout'; #从数据库执行(此时可能还是OFF状态,需要在下一步重启IO线程后,从库半同步状态才会为ON) show status like 'Rpl_semi_sync_slave_status'; #重启从数据库上的IO线程 STOP SLAVE IO_THREAD; START SLAVE IO_THREAD;
面试题:半同步复制什么情况下会降权为异步复制?
答:当超时的时候
#在主库查询半同步状态 show status like '%Rpl_semi%'; mysql> show status like '%Rpl_semi%'; +--------------------------------------------+-------+ | Variable_name | Value | +--------------------------------------------+-------+ | Rpl_semi_sync_master_clients | 1 | | Rpl_semi_sync_master_net_avg_wait_time | 0 | | Rpl_semi_sync_master_net_wait_time | 0 | | Rpl_semi_sync_master_net_waits | 0 | | Rpl_semi_sync_master_no_times | 0 | | Rpl_semi_sync_master_no_tx | 0 | | Rpl_semi_sync_master_status | ON | | Rpl_semi_sync_master_timefunc_failures | 0 | | Rpl_semi_sync_master_tx_avg_wait_time | 0 | | Rpl_semi_sync_master_tx_wait_time | 0 | | Rpl_semi_sync_master_tx_waits | 0 | | Rpl_semi_sync_master_wait_pos_backtraverse | 0 | | Rpl_semi_sync_master_wait_sessions | 0 | | Rpl_semi_sync_master_yes_tx | 0 | +--------------------------------------------+-------+ 14 rows in set (0.00 sec) #参数说明: Rpl_semi_sync_master_clients #半同步复制客户端的个数 Rpl_semi_sync_master_net_avg_wait_time #平均等待时间(默认毫秒) Rpl_semi_sync_master_net_wait_time #总共等待时间 Rpl_semi_sync_master_net_waits #等待次数 Rpl_semi_sync_master_no_times #关闭半同步复制的次数 Rpl_semi_sync_master_no_tx #表示没有成功接收slave提交的次数 Rpl_semi_sync_master_status #表示当前是异步模式还是半同步模式,on为半同步 Rpl_semi_sync_master_timefunc_failures #调用时间函数失败的次数 Rpl_semi_sync_master_tx_avg_wait_time #事物的平均传输时间 Rpl_semi_sync_master_tx_wait_time #事物的总共传输时间 Rpl_semi_sync_master_tx_waits #事物等待次数 Rpl_semi_sync_master_wait_pos_backtraverse #可以理解为"后来的先到了,而先来的还没有到的次数" Rpl_semi_sync_master_wait_sessions #当前有多少个session因为slave的回复而造成等待 Rpl_semi_sync_master_yes_tx #成功接受到slave事物回复的次数 当半同步复制发生超时(由rpl_semi_sync_master_timeout参数控制,默认为10000ms,即10s),会暂时关闭半同步复制,转而使用异步复制,也就是会自动降为异步工作。 当 master dump 线程发送完一个事务的所有事件之后,如果在 rpl_semi_sync_master_timeout 内,收到了从库的响应, 则主从又重新恢复为半同步复制。
注:
在一主多从的架构中,如果要开启半同步复制,并不要求所有的从都是半同步复制。
MySQL 5.7极大的提升了半同步复制的性能。
5.6 版本的半同步复制,dump thread 承担了两份不同且又十分频繁的任务:传送binlog 给 slave ,还需要等待 slave 反馈信息,而且这两个任务是串行的,dump thread 必须等待 slave 返回之后才会传送下一个 events 事务。dump thread 已然成为整个半同步提高性能的瓶颈。在高并发业务场景下,这样的机制会影响数据库整体的系统吞吐量(TPS)。
5.7 版本的半同步复制中,独立出一个 ack collector thread ,专门用于主节点接收 slave 的反馈信息。这样 master 上有两个线程独立工作,可以同时发送 binlog 到 slave ,和接收 slave 的反馈。
六、读写分离案例
实验环境
Master 服务器:192.168.109.137 mysql5.7 centos7-7
Slave1 服务器:192.168.109.134 mysql5.7 centos7-4
Slave2 服务器:192.168.109.135 mysql5.7 centos7-5
Amoeba 服务器:192.168.109.131 jdk1.6、Amoeba centos7-1
客户端 服务器:192.168.109.133 mysql centos7-3
Amoeba服务器 centos7-1:192.168.109.131
#Amoeba服务器配置 ##安装 Java 环境## 因为 Amoeba 基于是 jdk1.5 开发的,所以官方推荐使用 jdk1.5 或 1.6 版本,高版本不建议使用。 上传软件包至opt下 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 #添加环境变量 vim /etc/profile export JAVA_HOME=/usr/local/jdk1.6.0_14 export CLASSPATH=.:$JAVA_HOME/lib:$JAVA_HOME/jre/lib export PATH=$JAVA_HOME/bin:$JAVA_HOME/jre/bin:$PATH export AMOEBA_HOME=/usr/local/amoeba export PATH=$PATH:$AMOEBA_HOME/bin #刷新 source /etc/profile #查看jkd版本 java -version
##安装 Amoeba软件## #创建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 访问 grant all on *.* to amoeba@'192.168.109.%' identified by '000000'; (amoeba用户自定义) #再回到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">000000</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">000000</property> --45--修改,设置主服务器的名Master <dbServer name="master" parent="abstractServer"> --48--修改,设置主服务器的地址 <property name="ipAddress">192.168.109.137</property> --52--修改,设置从服务器的名slave1 <dbServer name="slave1" parent="abstractServer"> --55--修改,设置从服务器1的地址 <property name="ipAddress">192.168.109.134</property> --58--复制上面6行粘贴,设置从服务器2的名slave2和地址 <dbServer name="slave2" parent="abstractServer"> <property name="ipAddress">192.168.109.135</property> --65行--修改 <dbServer name="slaves" virtual="true"> --71行--修改 <property name="poolNames">slave1,slave2</property> #后台启动Amoeba软件,按ctrl+c 返回 /usr/local/amoeba/bin/amoeba start& #查看8066端口是否开启,默认端口为TCP 8066 netstat -anpt | grep java
登录名是amoeba,写错了
最后一行写错了,应该是slave1,slave2
客户端配置 centos7-3 192.168.109.133
#yum安装数据库 yum install -y mariadb mariadb-server #开启服务 systemctl start mariadb.service netstat -natp |grep 3306 tcp 0 0 0.0.0.0:3306 0.0.0.0:* LISTEN 58897/mysqld #主节点创建表并插入数据 mysql> create database stevelu; mysql> use stevelu; mysql> create table student(id int,name char(10),age int); mysql> insert into student values(1,'zhangsan',18); mysql> insert into student values(2,'lisi',20);
总结