1.主从复制
一主一从
server1:主
server2:从
1.下载地址
https://dev.mysql.com/downloads/mysql/5.7.html#downloads
2.安装
yum install -y mysql-community-libs-5.7.24-1.el7.x86_64.rpm \
>mysql-community-common-5.7.24-1.el7.x86_64.rpm \
>mysql-community-libs-5.7.24-1.el7.x86_64.rpm \
>mysql-community-libs-compat-5.7.24-1.el7.x86_64.rpm \
>mysql-community-server-5.7.24-1.el7.x86_64.rpm
3.启动数据库,初始化配置
systemctl start mysqld
#查看密码
grep password /var/log/mysqld.log
#修改密码大小写加特殊字符以及数字,其他默认
mysql_secure_installation -p
4.主库配置
vim /etc/my.cnf
#末尾加入以下参数
server-id=1 # 配置id
log-bin=mysql-bin #启用二进制日志
#重新启动数据库
systemctl restart mysqld
#为复制创建用户
mysql -p
mysql>GRANT REPLICATION SLAVE ON *.* TO 'repl'@'172.25.70.%' IDENTIFIED BY 'Redhat_001';
mysql>show master status;
5.从库配置,这里数据库都是刚安装的,不用同步数据库。否则必须同步数据库,在建立主从复制
mysql -p
mysql>change master to master_host='172.25.70.1',master_user='repl',master_password='Redhat_001',master_log_file='mysql-bin.000002',master_log_pos=1740;
mysql>start slave;
mysql>show slave status\G;
测试
主库建立数据库
mysql> create database Student;
mysql>use Student;
mysql>create table user_tb (username varchar(25) not null,password varchar(25) not null);
mysql> set global read_only=1;
从库查看,通到主库的操作
server2同步server1的二进制日志都保存在中继日志文件,然后由sql,下图所示
工作原理:
从库生成两个线程,一个I/O线程,一个SQL线程;
i/o线程去请求主库 的binlog,并将得到的binlog日志写到relay log(中继日志) 文件中;
主库会生成一个 log dump 线程,用来给从库 i/o线程传binlog;
SQL 线程,会读取relay log文件中的日志,并解析成具体操作,来实现主从的操作一致,而最终数据一致;
#查看二进制日志
mysqlbinlog 日志文件
#开启gtid,主从库都配置如下
vim /etc/my.cnf
加入以下参数
gtid_mode=ON
enforce-gtid-consistency=true
#重启
systemctl restart mysqld
#测试
主库
从库
如下所是通过gtid方式,来复制数据库
在Master与Slave中都加入以下参数,开启gtid,就是每个组操作的ID都是递增,由1开始,更加有利多个节点同步复制管理,当Master主机挂了时,Slave直接执行next ID 就可以了,方便维护管理,以及更快的选出新的Master
#从库加入以下参数
slave-parallel-type=LOGICAL_CLOCK
slave-parallel-workers=16
如果这个Master库并发写入,Slave库的SQL忙不过来,实现事件同步并发,提高worker进程数量,类型是组并行提交,还有DATABASE,实现事件同步并发,提高速率实现并发存储,建议16个
master-info-repository=TABLE
relay-log-info-repository=TABLE
relay-log-recovery=TRUE
将中继日志存储到TABLE中,避免重复读写磁盘,加快速度
mysql>SHOW VARIABLES WHERE variable_name IN ('relay_log_recovery','relay_log_info_repository','master_info_repository');
半同步复制
主库
#导入模块
mysql>INSTALL PLUGIN rpl_semi_sync_master SONAME 'semisync_master.so';
#两种查看启用方式方式
mysql>show plugins;
# 还没有启用
#启动
mysql>set global repl_semi_sync_master_enabled=on;
# 加入配置文件永久生效
rpl_semi_sync_master_enabled=on
从库
#导入模块
mysql>INSTALL PLUGIN rpl_semi_sync_slave SONAME 'semisync_slave.so';
#启用
mysql>set GLOBAL rpl_semi_sync_slave_enabled=on;
stop slave io_thread;
start slave io_thread;
#加入配置文件,永久生效
rpl_semi_sync_slave_enabled=on
#主库查看到客户端数量为1
2.读写分离
在前面基础上加入proxy
server3:mysql-proxy
1.下载地址
https://downloads.mysql.com/archives/proxy/
2.解压安装
tar zxf mysql-proxy-0.8.5-linux-el6-x86-64bit.tar.gz -C /usr/local/
ln -s /usr/local/mysql-proxy-0.8.5-linux-el6-x86-64bit/ /usr/local/mysql-proxy
ln -s /usr/local/mysql-proxy/bin/mysql-proxy /usr/local/bin
3.修改以下参数,方便实验
vim mysql-proxy/share/doc/mysql-proxy/rw-splitting.lua
#实现读写分离的脚本,由lua语言编写
# 修改读写分离最小最大值
min_idle_connections = 1,最小连接数
max_idle_connections = 2,最大连接数
4.编辑配置文件
cd /usr/local/mysql-proxy
mkdir conf/
mkdir logs/
vim conf/mysql-proxy
内容如下:
[mysql-proxy]
user=root
daemon=true
proxy-address=172.25.70.3:3306
proxy-backend-addresses=172.25.70.1:3306
proxy-read-only-backend-addresses=172..25.70.2:3306
proxy-lua-script=/usr/local/mysql-proxy/share/doc/mysql-proxy/rw-splitting.lua
log-file=/usr/local/mysql-proxy/logs/mysql-proxy.log
log-level=debug
keepalive=true
#使用帮助命令可以查看参数信息
/usr/local/mysql-proxy/bin/mysql-proxy --help
5.运行测试
/usr/local/mysql-proxy/bin/mysql-proxy --plugins=proxy --defaults-file=/usr/local/mysql-proxy/conf/mysql-proxy.conf
chmod 660 mysql-proxy
# 查看网络端口状态,如下启动端口为3306
yum install -y net-tools
#在server1:master库创建数据库用户
#远程登陆测试,这里我们连接的是调度器server3的ip
# 多次访问后,在proxy中查看端口占用发现默认情况下读写都是master:server1,当达到条件后开始分离,多了指向slave:server2的连接