mysql:工作原理
从库生成两个线程,一个I/O线程,一个SQL线程;
i/o线程去请求主库 的binlog,并将得到的binlog日志写到relay log(中继日志) 文件中;
主库会生成一个 log dump 线程,用来给从库 i/o线程传binlog;
SQL 线程,会读取relay log文件中的日志,并解析成具体操作,来实现主从的操作一致,而最终数据一致
mysql主从复制用途
实时灾备,用于故障切换
读写分离,提供查询服务
备份,避免影响业务
主从部署必要条件:
主库开启binlog日志(设置log-bin参数)
主从server-id不同
从库服务器能连通主库
Mysql支持的复制类型:
1、 基于语句的复制:在主服务器上执行的sql语句,在从服务器上会执行同样的语句。Mysql默认采用基于语句的复制,效率比较高,但是有时不能实现精准复制。
2、 基于行的复制:把改变的内容复制过去,而不是把命令在从服务器上执行一遍。
3、 混合类型的复制:默认采用基于语句的复制,一旦发现基于语句的复制不能精准复制时,就会采用基于行的复制。
部署mysql主从:
两台centos7
首先关闭防火墙、关闭 seliunx
systemctl stop firewalld
senetforce 0
yum 安装mariadb
yum -y install mariadb mariadb-server
[root@kafka02 ~]# vim /etc/my.cnf #主配置文件配置二进制文件
server-id=1 #主的ID
log-bin=mysql-bin # 二进制的配置
binlog-ignore-db=information_schema
binlog-ignore-db=performance_schema #这三个库不需要同步过去,不然密码该成一样的了
binlog-ignore-db=mysql
重启mysql
systemctl restart mariadb
进入mariadb
mysql
创建远程用户
MariaDB [(none)]> grant all on *.* to 'tom'@'%' identified by '123';
Query OK, 0 rows affected (0.01 sec)
刷新数据库
MariaDB [(none)]> flush privileges;
Query OK, 0 rows affected (0.00 sec)
查询二进制位置和文件
MariaDB [(none)]> show master status;
±-----------------±---------±-------------±--------------------------------------------+
| File | Position | Binlog_Do_DB | Binlog_Ignore_DB |
±-----------------±---------±-------------±--------------------------------------------+
| mysql-bin.000005 | 444 | | information_schema,performance_schema,mysql |
±-----------------±---------±-------------±--------------------------------------------+
1 row in set (0.00 sec)
退出数据库
exit
配置从数据库
yum -y install mariadb mariadb-server
[root@kafka02 ~]# vim /etc/my.cnf #从配置文件配置中继日志文件
server-id=2 # 从的ID 一定要不能和主的ID重复
relay-log=relay-log #中继日志配置
重启mysql
systemctl restart mariadb
进入mariadb
mysql
连接主数据库
MariaDB [(none)]> change master to \
master_host='192.168.253.231' \ #主数据库的ip
master_user='tom' \ #主数据库新建的远程用户
master_password='123' \ # 用户的密码
master_log_file='mysql-bin.000003' \ #二进制文件
master_log_pos=444; #文件的位置 (记住位置不用加上引号)开启从slave start;
查询是否同步
MariaDB [(none)]> show slave status\G;
*************************** 1. row ***************************
Slave_IO_State: Waiting for master to send event
Master_Host: 192.168.253.231
Master_User: tom
Master_Port: 3306
Connect_Retry: 60
Master_Log_File: mysql-bin.000005
Read_Master_Log_Pos: 444
Relay_Log_File: relay-log.000011
Relay_Log_Pos: 728
Relay_Master_Log_File: mysql-bin.000005
Slave_IO_Running: Yes
Slave_SQL_Running: YesIO和SQL为双Yes 说明同步成功
部署读写分离(amoeba )
安装jdk
rpm -ivh jdk-8u20-linux-x64.rpm #安装jdk
vi /etc/profile #配置jdk环境变量
export JAVA_HOME=/usr/java/jdk1.8.0_20/
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 #查询jdk版本
安装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/
/usr/local/amoeba/bin/amoeba
amoeba start|stop //显示这个表示amoeba安装成功。
配置amoeba读写分离
在master、slave1、slave2、、、、中开放权限给amoeba访问:
mysql> grant all on *.* to test@'172.18.49.%' identified by '123';
修改amoeba的配置文件:
cp amoeba.xml amoeba.xml.bak
vim /usr/local/amoeba/conf/amoeba.xml
修改连接amoeba代理服务器的有用户名和密码。
修改默认的地址池名字,写和读的名字:注意:删掉注释符。
对应主机名
编辑修改dbservers.xml配置文件(对后端mysql服务器的配置)。
cp dbServers.xml dbServers.xml.bak #备份
vi dbServers.xml
#填写新建的远程用户
指定主从数据库地址:
都是对应得主机名
vi dbServers.xml
之后启动amoeba:
/usr/local/amoeba/bin/amoeba start&
netstat -anpt | grep :8066
登陆amoeba 验证是否代理成功:
部署监控mysql状态脚本
首先要切割出来双Yes和延时时间不能超过120,然后在判断。
yum -y install mailx
vim check_mysql_status.sh
#!/bin/bash
check(){ #定义一个函数
arr=(`mysql -e "show slave status\G"|egrep "Running|Behind"|awk -F ':' '{print $2}'`) #定义数组,把双Yes和延时时间放到数组里面。
#echo ${arr[@]} if [ ${arr[0]} == "Yes" -a ${arr[1]} == "Yes" -a ${arr[2]} != "NULL" ]; then # 判断 echo "mysql status is ok" # 没有断开 就okelsemail -s "mysql status" xxxxxxxxxx@qq.com </tmp/result.txt #若是断开就发邮件告警 可以发 qq163 邮件 echo "mysql is not ok! 正在发送邮件..."fi
}while true #循环
do
check
sleep 5 # 五秒发一次邮件
done给脚本附件权限
chmod +x check_mysql_status.shmysql正常 执行脚本
#!/bin/bash
check(){ #定义一个函数
arr=(`mysql -e "show slave status\G"|egrep "Running|Behind"|awk -F ':' '{print $2}'`) #定义数组,把双Yes和延时时间放到数组里面。
#echo ${arr[@]} if [ ${arr[0]} == "Yes" -a ${arr[1]} == "Yes" -a ${arr[2]} != "NULL" ]; then # 判断 echo "mysql status is ok" # 没有断开 就okelsemail -s "mysql status" xxxxxxxxxx@qq.com </tmp/result.txt #若是断开就发邮件告警 可以发 qq163 邮件 echo "mysql is not ok! 正在发送邮件..."fi
}while true #循环
do
check
sleep 5 # 五秒发一次邮件
done给脚本附件权限
chmod +x check_mysql_status.sh
mysql正常 执行脚本
./ check_mysql_status.sh
mysql status is ok
mysql主从断开 执行脚本./ check_mysql_status.sh mysql is not ok! 正在发送邮件...
粉丝福利