lm1端:
1)进入/usr/local,编辑 vim /etc/my.cnf 文件,加入以下内容:
log-bin=mysql-bin ##指定二进制日志的名称,还有激活的含义
server-id=1
2)/etc/init.d/mysqld start ##启动数据库脚本
mysql -p
输入密码
show databases;
show master status;
quit
3)cd /usr/local/mysql/data
ls
mysqlbinlog +前面查看显示出来的日志名称 ##此时显示出来的数据是乱码
file mysql-bin.000001 ##可以看到该文件是二进制类型的
4) mysql -p
grant REPLICATION SLAVE ON *.* TO ‘repl’@’%’ IDENTIFIED BY ‘westos’; ##*.*表示所有用户的所有表 repl是用户名 %表示所有主机,除了localhost ,注意该用户只是用于复制,没有什么其他权限 ##该指令实现了创建用户和授权一步到位
show master status; ##此时postion的号会发生改变,因为数据库发生了变更,所以该号也会发生变更
quit
5)cd /usr/local/ ##此处和下面是再设置一个数据库从库,server1上的是数据库的主库
scp -r mysql/ lm2:/usr/local/ ##将数据库目录传到server2上
cd /etc/
scp my.cnf lm2:/etc
cd /etc/init.d
scp mysqld lm2:/etc/init.d
6)在lm2上,编辑主配置文件
log-bin=mysql-bin ##删除该语句
server-id=2 ##修改为2
cd /usr/local/mysql/data
rm -fr *
cd
vim .bash_profile
添加 :/usr/local/mysql/bin
source .bash_profile
groupadd -g 1001 mysql ##1001是根据server1上mysql用户的gid来确定的
useradd -u 1001 -g mysql -M -d /usr/local/mysql/ -s /sbin/nologin mysql
mysqld --initialize --user=mysql ##初始化 ,会生成一个密码
/etc/init.d/mysqld start
mysql_secure_installation ##安全初始化,可参考前面
7)mysql -pwestos ##进入mysql
CHANGE MASTER TO MASTER HOST=‘172.25.12.1’,MASTER_USER=‘repl’,MASTER_PASSWORD=‘westos’,MASTER_LOG_FILE=‘二进制日志的名字,可以再server1上,进入数据库后,输入show master status;查看’,MASTER_LOG_POS= 这里写show master status;里面看到的postion的数字 ;
start slave;
show slave status\G; ##只要查看到slave上有两个授权,一个是io,一个sql都显示的是yes,表示主从已经建立完毕 ;若io处出现no可能是因为用户认证有问题或是防火墙的问题,若sql处出现问题可能是因为数据不一致导致的
8)在lm1上 进入数据库 ,create database lm; ##j建立一个库
在lm2上,输入 show databases; ##此时就可以看到server2的数据库上也建立了一个库,也就是实现了同步
show slave status\G; ##查看里面有一个参数是 Seconds_Behind_Master 如果该值为0,表示主从之间没有延迟,该值越大表示延迟的时间越长,该值不精准有偏差
9)再开启一个lm3 ,再添加一个节点,以上的内容是在数据库为空的情况下创建主从同步数据库,以下的内容是当主数据库中有数据时,创建主从数据库
lm1上:
/etc/init.d/mysqld stop
cd /usr/local
scp -r mysql/ lm3:/usr/local/ ##将数据库目录传到server2上
cd /etc/
scp my.cnf lm3:/etc
cd /etc/init.d
scp mysqld lm3:/etc/init.d
/etc/init.d/mysqld start
在lm3上:
编辑主配置文件 vim /etc/my.cnf
log-bin=mysql-bin ##删除该语句
server-id=3 ##修改为3,按顺序依次递增
cd /usr/local/mysql/data
rm -fr *
cd
vim .bash_profile
添加 :/usr/local/mysql/bin
source .bash_profile
groupadd -g 1001 mysql
useradd -u 1001 -g mysql -M -d /usr/local/mysql/ -s /sbin/nologin mysql ##添加用户
mysqld --initialize --user=mysql ##初始化 ,会生成一个密码
/etc/init.d/mysqld start
mysql_secure_installation ##安全初始化,可参考前面
mysql -p
输入密码 ,##此时就可以进入数据库
10)
在lm1上:
mysql -p
show master status; ##此时可以看到日志文件和之前的不同,日志被重写了
在lm2上:
mysql -p
show slave status\G; ##此时查看参数Master_Log_File 参数,可以看到该salve数据库的二进制文件已经自动同步了master的二进制日志文件
在lm1上:
use lm
create table user_tb (
username varchar(25) not null,
password varchar(50) not null);
desc user_tb; ##查看一下表的结构
insert into user_tb values (‘user1’,‘123’);
insert into user_tb values (‘user2’,‘456’);
select * from user_tb;
在lm2上:
use lm
select * from user_tb; ##可以直接查看到数据
在lm3上:
已经mysql -p登陆了
show databases; ##可以看到没有任何东西
在lm1上:
show master status; ##因为前面作出了改变,所以postion的值再次发生了变化,但是二进制日志文件名没有改变 ,此时实际上00001的日志文件在最开始,而且有一个postion,在该日志文件上有创建库的数据;后面日志文件发生变化,变成了00002日志文件,postion也发生了改变,然后在此时创建了表以及表里面的数据,该日志文件上有这些表的相关数据。
此时要想让lm3同步lm1的数据,需要做如下操作:
lm1上:
cd
mysqldump -pwestos lm > dump.db ##dump.db名称可自定义
cat dump.db ##此时是可以看到数据库中的信息的包括表结构,数据等
scp dump.db lm3: ##将该文件复制到lm3的家目录下
在lm3上:
##注意当使用mysqldump备份时,存在一条drop语句,如果该表存在,就年直接将该表删除,在重新创建然后将数据添加进入。如果你本身的目的是想合并这个表,那么是不能使用这种方式的
cd
mysqladmin -pwestos create lm ##先把库创建出来
mysql -pwestos lm < dump.db ##给lm这个库里面导入dump.db 即可
mysql -p
select * from lm.user_tb; ##此时就可以看到数据
11)注意,当有一个主,两个从时,复制有两种方法 a–>b–>c(a是b的主,b是c的主,好处是a的压力会小一点) 或 a–>b a–>c
当使用第一种方式时,需要在lm2的主配置文件vim /etc/my.cnf里面加 log-bin=mysql-bin ,再加一个参数 log-slave-updates ,该参数表示当slave在重做sql语句时,需要把自己的变更写入二进制日志中。也就是说当lm2从lm1上将二进制文件复制过来,存在relay里面,现在sql重做后的日志,一定要存在lm2的二进制文件中,这样3过来复制时,就可以复制到1重写的内容。主从复制的逻辑一定时从复制主的二进制日志文件
/etc/init.d/mysqld stop
/etc/init.d/mysqld start
cd /usr/local/mysql/data
ls ##可以看到出现了二进制日志文件,在没有修改配置文件之前是不存在的,每次重写数据库都会再新建一个二进制日志文件,然后再将二进制文件的信息写到一个索引文件中;lm2会将lm1的日志文件复制到 relay文件中,同样的relay文件也有索引文件,用于存在二进制日志的信息
mysql -p
show slave status\G; ##此处必须要看到两个yes
grant REPLICATION SLAVE ON *.* TO ‘repl’@’%’ IDENTIFIED BY ‘westos’; ##此时再2上创建授权用户,向当时在1上为2创建授权用户一样
在lm3:
做完授权后,可以进入lm3 输入mysql -h 172.25.12.2 -u repl -p ## 输入密码,此时可以进入数据库即可,表示用户可以使用,这里测试完成后必须退出
mysql -p
CHANGE MASTER TO MASTER_HOST=‘172.25.10.2’,MASTER_USER=‘repl’,MASTER_PASSWORD=‘westos’,MASTER_LOG_FILE=‘二进制日志的名字,可以再server2上,进入数据库后,输入show master status;查看’,MASTER_LOG_POS= 这里写show master status;里面看到的postion的数字 ;
start slave;
show slave status\G; ##两个yes即可
12)测试:
此时在lm1上:
mysql -p
use lm
insert into user_tb values (‘user3’,‘789’);
在lm3上:
登陆后,输入: select * from lm.user_tb; ##如果出现user3,说明主从复制做成功了
注意:上面的方法是一种老式方法,是有缺陷的,当主挂了后,会选延迟最小的作为新的主,那么怎么设置change等问题就会迎面而来。
所以现在比较常用的方法是gtid ,全局传输id,该id是单调递增的,因为原本的postion号没有规律也不好判断,日志文件名也无从得知,运维难度会很高;有了这个id后,所有的slave,只需要知道它前面的那个gtid即可,比如master现在是80。挂了后,按号接管就可以了,此时就不需要看postion和日志文件名了
5.7版本的数据库默认就是gtid的方式
1)在server1上编辑主配置文件vim /etc/my.cnf,加入以下参数:
gtid_mode=ON
enforce-gtid-consistency=ON ##表示强制采用gtid的模式
2) /etc/init.d/mysqld restart
##注意:这里在2和3上也作和1同样的操作
3)当做完上面操作后,slave和,master的连接是已经断开了
所以,需要
在lm2上和lm3上(lm3的change的ip注意修改成2/此处还是写1吧,使用一下一主两从架构):
mysql -p
show slave status\G;
##此时之所以还是两个yes是因为,默认就是gtid的模式,本开如果断开的,就需要做以下操作:
stop slave;
CHANGE MASTER TO MASTER_HOST=‘172.25.10.1’,MASTER_USER=‘repl’,MASTER_PASSWORD=‘westos’,MASTER_AUTO_POSITION=1; ##之前其他的参数不要了,换成自动的即可
start slave;
show slave status\G; ##看到yes即可
4)在server1上测试:
use lm
insert user_tb values (‘user4’,‘123’);
在lm2和lm3查看即可
select * from lm.user_tb
##此时如果lm1挂了,lm2接管master,只需要在3上修改change的ip,改称2的即可
lm1:
lm2端:
lm3端:
测试:
在lm1端插入数据,lm2\3皆可查到
lm2端:
lm1端:
插入的时候正常执行无反应
需要保证每个主机都同步
lm1:
set global rpl_semi_sync_master_wait_for_slave_count=2;
有延迟
lm2端查看不到新的插入,但lm3端可查看到:
热启用:
lm2:
START SLAVE IO_THREAD;
show processlist;
lm3端:
主配置文件
vim /etc/my.cnf
然后重启服务,进入数据库
/etc/init.d/mysqld restart
测试:
lm1端:
lm2/3端:
组复制:
lm2,3;
/etc/init.d/mysqld stop ##关闭服务
cd /usr/local/mysql/data
rm -rf * ##删除数据
vim /etc/my.cnf ##编辑主配置文件
mysql -p
alter user root@localhost identified by ‘westos’;
SET GLOBAL group_replication_bootstrap_group=ON;
START GROUP_REPLICATION;
SET GLOBAL group_replication_bootstrap_group=OFF;
上面是在lm3上完成之后的结果
同样的操作在lm2上完成之后:
开启虚拟机四
lm4:
rpm -ivh mysql-router-community-8.0.21-1.el7.x86_64.rpm
cd /etc/mysqlrouter/
vim mysqlrouter.conf
[routing:ro]
bind_address=0.0.0.0
bind_port=7001
destinations=172.25.10.1:3306,172.25.10.2:3306,172.25.10.3:3306
routing_strategy=round-robin
[routing:rw]
bind_address=0.0.0.0
bind_port=7002
destinations=172.25.10.1:3306,172.25.10.2:3306,172.25.10.3:3306
routing_strategy=first-available
lm1端:
真实主机:
mysql -h 172.25.10.4 -P 7001 -u user1 -p
select * from test.t1;
lm1,2,3:
yum install lsof -y
lsof -i :3306 #查看此服务由哪个主机提供
第一次在lm1端:
当在真实主机第二次登陆时:
在lm2端:
当在真实主机第三次登录时
在lm3端:
mysql -h 172.25.10.4 -P 7001 -u user2 -p
use test
insert into t1 values (2,‘lxq’);
select * from test.t1; ##user2不可以使用此权限
lm3:
STOP GROUP_REPLICATION;
lm2:
SELECT * FROM performance_schema.replication_group_members;
真实主机:
数据库高可用
节点有限:9个
MHA高可用(老,稳定,与mysql主从复制相似)
MHA集群架构
(二进制日志,重点)
数据库专属集群套件
无中心化,架构重量级,不够轻量,太过复杂
一主两从 架构还原
manage节点对所有节点免密
节点间也需要免密
检测必须通过
lm4端:
lm1端:
/etc/init.d/mysqld stop
cd /usr/local/mysql/data/
rm -rf *
vim /etc/my.cnf
mysqld --initialize --user=mysql
/etc/init.d/mysqld start
赋予权限:
lm2,3:
/etc/init.d/mysqld stop
mysql -p
alter user root@localhost identified by ‘westos’;
change master to master_host=‘172.25.10.1’,master_user=‘repl’,master_password=‘westos’,master_auto_position=1;
start slave;
show slave status\G;
yum install mha4mysql-node-0.58-0.el7.centos.noarch.rpm -y
lm4:
systemctl stop mysqlrouter.service
lm1/2/3/4主机之间两两进行认证
ssh-keygen
ssh-copy-id lm1
ssh-copy-id lm2
ssh-copy-id lm3
scp -r .ssh/ lm2:
scp -r .ssh/ lm3:
scp -r .ssh/ lm1:
[server default]
user=root
password=westos
ssh_user=root
repl_user=repl
repl_password=westos
master_binlog_dir=/usr/local/mysql/data
remote_workdir=/tmp
secondary_check_script=masterha_secondary_check -s 172.25.10.3 -s 172.25.10.250
ping_interval=3
master_ip_online_change_script=/script/masterha/master_ip_online_change
manager_workdir=/etc/masterha/app1
manager_log=/etc/masterha/app1/manager.log
[server1]
hostname=172.25.10.1
candidate_master=1
[server2]
hostname=172.25.10.2
candidate_master=1
[server3]
hostname=172.25.10.3
no_master=1
# master_ip_failover_script= /script/masterha/master_ip_failover
# shutdown_script= /script/masterha/power_manager
# report_script= /script/masterha/send_report
# master_ip_online_change_script= /script/masterha/master_ip_online_change
免密检测:
lm1端:
健康检测: