目录
1.浅谈mysql
2.mysql主从复制
原因:
原理:
原理:
3.git版主从复制
1、GTID复制:
2、GTID作用
3.原理
4.一主一从
5.一主多从
6.半同步复制
7.组复制
1.浅谈mysql
MySQL是一个关系型数据库管理系统,由瑞典MySQL AB 公司开发,属于 Oracle 旗下产品。MySQL 是最流行的关系型数据库管理系统之一,在 WEB 应用方面,MySQL是最好的 RDBMS (Relational Database Management System,关系数据库管理系统) 应用软件之一。
MySQL是一种关系型数据库管理系统,关系数据库将数据保存在不同的表中,而不是将所有数据放在一个大仓库内,这样就增加了速度并提高了灵活性。
MySQL所使用的 SQL 语言是用于访问数据库的最常用标准化语言。MySQL 软件采用了双授权政策,分为社区版和商业版,由于其体积小、速度快、总体拥有成本低,尤其是开放源码这一特点,一般中小型网站的开发都选择 MySQL 作为网站数据库。
Linux作为操作系统,Apache 或Nginx作为 Web 服务器,MySQL 作为数据库,PHP/Perl/Python作为服务器端脚本解释器。由于这四个软件都是免费或开放源码软件(FLOSS),因此使用这种方式不用花一分钱(除开人工成本)就可以建立起一个稳定、免费的网站系统,被业界称为“LAMP“或“LNMP”组合。
2.mysql主从复制
原因:
在业务复杂的系统中,有这么一个情景,有一句sql语句需要锁表,导致暂时不能使用读的服务,那么就很影响运行中的业务,使用主从复制,让主库负责写,从库负责读,这样,即使主库出现了锁表的情景,通过读从库也可以保证业务的正常运行。
做数据的热备,主库宕机后能够及时替换主库,保证业务可用性。
架构的扩展。业务量越来越大,I/O访问频率过高,单机无法满足,此时做多库的存储,降低磁盘I/O访问的频率,提高单个机器的I/O性能。
原理: 原理:
(1)master服务器将数据的改变记录二进制binlog日志,当master上的数据发生改变时,则将其改变写入二进制日志中;
(2)slave服务器会在一定时间间隔内对master二进制日志进行探测其是否发生改变,如果发生改变,则开始一个I/OThread请求master二进制事件
(3)同时主节点为每个I/O线程启动一个用于向其发送二进制事件dump线程,,并保存至从节点本地的中继日志中,从节点将启动SQL线程从中继日志中读取二进制日志,在本地重放,使得其数据和主节点的保持一致,最后I/OThread和SQLThread将进入睡眠状态,等待下一次被唤醒。
本次使用的是mysql5.7 主机和从机mysql必须相同
sever1中编译好了mysql
将mysq复制到sever2中
scp -r /usr/local/mysql/ server2:/usr/local/ scp /etc/init.d/mysqld server2:/etc/init.d/ scp /etc/my.cnf server2:/etc/init.d/
查看mysq用户id,从机也要建立同同样的
sever2建立mysql用户等
groupadd -g 1000 mysql useradd -u 1000 -g mysql -M -d /data/mysql -s /sbin/nologin mysql mkdir -p /data/mysql [root@server2 ~]# ll -d /data/mysql drwxr-xr-x 2 root root 6 Dec 23 05:14 /data/mysql [root@server2 ~]# chown mysql.mysql /data/mysql/ [root@server2 ~]# ll -d /data/mysql drwxr-xr-x 2 mysql mysql 6 Dec 23 05:14 /data/mysql [root@server2 ~]# vim ~/.bash_profile [root@server2 ~]# cat ~/.bash_profile # .bash_profile # Get the aliases and functions if [ -f ~/.bashrc ]; then . ~/.bashrc fi # User specific environment and startup programs PATH=$PATH:$HOME/bin:/usr/local/mysql/bin export PATH [root@server2 ~]# source ~/.bash_profile
mysql初始化及开启,修改密码
主机master配置,编辑配置文件,重启服务
show master status; 查看master里从机需要的参数
创建用户并授权
CREATE USER 'lhy'@'%' IDENTIFIED BY 'westos'; GRANT REPLICATION SLAVE ON *.* TO 'lhy'@'%';
从机server2测试用户
mysql -h 172.25.7.1 -u lhy -p
原程用lhy用户登陆mysql
然后退出
主机server1中建立数据库westos并导出
导出数据库,发给从机
mysqldump -p westos > westos.sql
scp westos.sql server2:/root
从机配置
先将库导入mysql,建库,导入
[root@server2 mysql]# mysqladmin -p create westos;
Enter password:
[root@server2 mysql]# mysql -p westos < /root/westos.sql
Enter password:
配置文件修改,重启服务
登入数据库建立与master 联系,因为电脑断电,重新查看了下一中的
给从机进行配置,重启服务
进入mysql
change master to master_host='172.25.7.1',master_port=3306,master_user='lhy',master_password='westos',master_log_file='mysql-bin.000001',master_log_pos=1516; start slave; show slave statusG;
io,sqL线程 双yes
测试:
master mysql:
insert into text values('usr3',567);
slave mysql:
3.git版主从复制
1、GTID复制:
(global transaction id 全局事务标识符) MySQL5.6版本开始支持,GTID复制不像传统的复制方式(异步复制、半同步复制)需要找到binlog和POS点,只需知道master的IP、端口、账号、密码即可。开启GTID后,执行change master to master_auto_postion=1即可,它会自动寻找同步
2、GTID作用
1)、Gtid采用了新的复制协议旧协议是,首先从服务器上在一个特定的偏移量位置连接到主服务器上一个给定的二进制日志文件,然后主服务器再从给定的连接点开始发送所有的事件。
2)、新协议有所不同,支持以全局统一事务ID (GTID)为基础的复制。当在主库上提交事务或者被从库应用时,可以定位和追踪每一个事务。GTID复制是全部以事务为基础,使得检查主从一致性变得非常简单。如果所有主库上提交的事务也同样提交到从库上,一致性就得到了保证。
3.原理
①当一个事务在master执行并提交时,产生GTID,一同记录到binlog日志中。
②binlog传输到slave,并存储到slave的relaylog后,读取这个GTID的这个值设置gtid_next变量,即告诉Slave,下一个要执行的GTID值。
③sql线程从relay log中获取GTID,然后对比slave端的binlog是否有该GTID。
④如果有记录,说明该GTID的事务已经执行,slave会忽略。
⑤如果没有记录,slave就会执行该GTID事务,并记录该GTID到自身的binlog,在读取执行事务前会先检查其他session持有该GTID,确保不被重复执行。
⑥在解析过程中会判断是否有主键,如果没有就用二级索引,如果没有就用全部扫描。
4.一主一从
master和slave打开gtid模式
gtid_mode=ON enforce-gtid-consistency=ON 强制打开gitd模式
重启服务
slave 将slave关闭,配置连接参数
change master to master_host='172.25.7.1',master_user='lhy',master_password='westos',master_auto_position=1;
5.一主多从
将数据库复制到server3,让sever数据库可以开启(过程看前面)
通过sever2来连接sever3
server2,编辑配置文件,重启服务
[root@server2 ~]# cat /etc/my.cnf [mysqld] basedir=/usr/local/mysql datadir=/data/mysql socket=/data/mysql/mysql.sock symbolic-links=0 log-error=/data/mysql/mysqld.log pid-file=/data/mysql/mysqld.pid server-id=2 gtid_mode=ON enforce-gtid-consistency=ON log_slave_updates=ON log-bin=mysql-bin [root@server2 ~]# /etc/init.d/mysqld restart
备份westos 在编辑配置文件(配置文件多的只留server-id)之前编辑
mysqldump -p westos > westos.sql
mysql 授权
grant replication slave on *.* to lhy@'%' identified by 'westos'; reset master;
将库备份发送到3
scp westos.sql server3:/root
server3
[root@server3 mysql]# mysqladmin -p create westos
Enter password:
[root@server3 mysql]# mysql -p westos < /root/westos.sql
Enter password:
编辑配置文件
server-id=3 gtid_mode=ON enforce-gtid-consistency=ON
重启服务
mysql设置
stop slave; change master to master_host='172.25.7.2',master_port=3306,master_user='lhy',master_password='westos',master_auto_position=1; start slave; show slave statusG; 端口可以不加
测试
1. insert into text values('usr4',789);
1,2,3
use westos;
select * from westos;
server1
server2,3
6.半同步复制
一主一从
server1
进入mysql
mysql> INSTALL PLUGIN rpl_semi_sync_master SonAME 'semisync_master.so'; 按装master 模块
mysql> SELECt PLUGIN_NAME, PLUGIN_STATUS
-> FROM INFORMATION_SCHEMA.PLUGINS
-> WHERe PLUGIN_NAME LIKE '%semi%';
查询模块状态
mysql> SET GLOBAL rpl_semi_sync_master_enabled = 1;
mysql> show variables like 'rpl%';
查看复制状态
10000M默认等待十秒
server2
安装两个模块
INSTALL PLUGIN rpl_semi_sync_master SonAME 'semisync_master.so';
INSTALL PLUGIN rpl_semi_sync_slave SonAME 'semisync_slave.so';
mysql>SELECt PLUGIN_NAME, PLUGIN_STATUS
-> FROM INFORMATION_SCHEMA.PLUGINS
-> WHERe PLUGIN_NAME LIKE '%semi%';
SET GLOBAL rpl_semi_sync_master_enabled = 1;
SET GLOBAL rpl_semi_sync_slave_enabled =1;
开启相应模块
server安装slave模块,开启
INSTALL PLUGIN rpl_semi_sync_slave SonAME 'semisync_slave.so';
mysql> SELECt PLUGIN_NAME, PLUGIN_STATUS
-> FROM INFORMATION_SCHEMA.PLUGINS
-> WHERe PLUGIN_NAME LIKE '%semi%';SET GLOBAL rpl_semi_sync_slave_enabled =1;
测试
2 3Io线程都关掉
STOP SLAVE IO_THREAD;
1
mysql> insert into text values('usr15',578);
2中开启io 没有同步过来
START SLAVE IO_THREAD;
1中重新插入16
insert into text values('usr16',234);
2.中连同15都同步过来了
扩展 mysql中延迟复制,sql_delay30s
CHANGE MASTER TO MASTER_DELAY = 30;
7.组复制
可以看mysql 官方文档执导
server1停掉mysql 编辑配置文件,初始化启动
初始化前 rm -rf /data/mysql/*
[mysqld] basedir=/usr/local/mysql datadir=/data/mysql socket=/data/mysql/mysql.sock symbolic-links=0 log-error=/data/mysql/mysqld.log pid-file=/data/mysql/mysqld.pid server-id=1 disabled_storage_engines="MyISAM,BLACKHOLE,FEDERATED,ARCHIVE,MEMORY" log-bin=mysql-bin gtid_mode=ON enforce-gtid-consistency=ON master_info_repository=TABLE relay_log_info_repository=TABLE binlog_checksum=NONE log_slave_updates=ON log_bin=binlog binlog_format=ROW plugin_load_add='group_replication.so' transaction_write_set_extraction=XXHASH64 group_replication_group_name="aaaaaaaa-aaaa-aaaa-aaaa-aaaaaaaaaaaa" group_replication_start_on_boot=off group_replication_local_address= "172.25.7.1:33061" group_replication_group_seeds= "172.25.7.1:33061,172.25.7.2:33061,172.25.7.3:33061" group_replication_bootstrap_group=off group_replication_ip_whitelist="172.25.7.0/24,127.0.0.1/8" group_replication_single_primary_mode=off group_replication_enforce_update_everywhere_checks=ON group_replication_allow_local_disjoint_gtids_join=ON
MySQL :: MySQL 5.7 Reference Manual :: 17.2.1.3 User Credentialshttps://dev.mysql.com/doc/refman/5.7/en/group-replication-user-credentials.html在数据库中
alter user root@localhost identified by 'westos'; 修改用户密码 SET SQL_LOG_BIN=0; CREATE USER rpl_user@'%' IDENTIFIED BY 'password'; GRANT REPLICATION SLAVE ON *.* TO rpl_user@'%'; FLUSH PRIVILEGES; 刷新 SET SQL_LOG_BIN=1; CHANGE MASTER TO MASTER_USER='rpl_user', MASTER_PASSWORD='password' FOR CHANNEL 'group_replication_recovery'; SET GLOBAL group_replication_bootstrap_group=ON/off;打开和关掉模块 仅master需要打开 START GROUP_REPLICATION;开启组加入 SELECT * FROM performance_schema.replication_group_members;查看组成员
server2和server3
mysql停止
将1中的配置文件拷贝给3.2
[root@server1 mysql]# scp /etc/my.cnf server2:/etc/my.cnf
root@server2's password:
my.cnf 100% 1012 719.3KB/s 00:00
[root@server1 mysql]# scp /etc/my.cnf server3:/etc/my.cnf
root@server3's password:
my.cnf 100% 1012 845.5KB/s 00:00
[root@server1 mysql]#rm -rf /data/mysql/*
修改配置文件,初始化
配置文件
[mysqld] basedir=/usr/local/mysql datadir=/data/mysql socket=/data/mysql/mysql.sock symbolic-links=0 log-error=/data/mysql/mysqld.log pid-file=/data/mysql/mysqld.pid server-id=3 disabled_storage_engines="MyISAM,BLACKHOLE,FEDERATED,ARCHIVE,MEMORY" log-bin=mysql-bin gtid_mode=ON enforce-gtid-consistency=ON master_info_repository=TABLE relay_log_info_repository=TABLE binlog_checksum=NONE log_slave_updates=ON log_bin=binlog binlog_format=ROW plugin_load_add='group_replication.so' transaction_write_set_extraction=XXHASH64 group_replication_group_name="aaaaaaaa-aaaa-aaaa-aaaa-aaaaaaaaaaaa" group_replication_start_on_boot=off group_replication_local_address= "172.25.7.3:33061" group_replication_group_seeds= "172.25.7.1:33061,172.25.7.2:33061,172.25.7.3:33061" group_replication_bootstrap_group=off group_replication_ip_whitelist="172.25.7.0/24,127.0.0.1/8" group_replication_single_primary_mode=off group_replication_enforce_update_everywhere_checks=ON group_replication_allow_local_disjoint_gtids_join=ON
修改密码,也可以直接用这种,也可以用平常的
alter user root@localhost identified by 'westos';
Mysql配置
SET SQL_LOG_BIN=0; CREATE USER rpl_user@'%' IDENTIFIED BY 'password'; GRANT REPLICATION SLAVE ON *.* TO rpl_user@'%'; FLUSH PRIVILEGES; 刷新 SET SQL_LOG_BIN=1; CHANGE MASTER TO MASTER_USER='rpl_user', MASTER_PASSWORD='password' FOR CHANNEL 'group_replication_recovery'; 开启组加入 START GROUP_REPLICATION;
server1可以打开组加入
2和3相同
两台机器都recovering
还需要调整发现2,3password错了stop 组复制 修改chage 开启
测试
1中建立linux
2,3中,(没有westos,第一次失败 ) 有linux
3中建立表格
create table text(username varchar(16) not null,password varchar(20) not null);
查看2,1
扩展:
group_replication_allow_local_disjoint_gtids_join=1
当数据不同时强制加入



