将实例搭在两个机器上
vim /etc/my.cnf
[mysqld]
server_id=1
# 主库server-id为1,从库不等于1
log_bin=mysql-bin
# 开启binlog日志
mysqldump -uroot -p123456 -A -R -triggers --master-data=2 --single-transaction > /tmp/full.sql
scp /tmp/full.sql [email protected]:/tmp
mysql -uroot -p123456
mysql> grant replication slave on *.* to slave@'192.168.64.%' identified by '123456';
# 创建slave用户
vim /etc/my.cnf
[mysqld]
server_id=5
# 主库server-id为1,从库不等于1
# 从库不需要开二进制日志
systemctl restart mysqld
mysql> source /tmp/full.sql;
mysql> show master status;
# 记录主库binlog及位置点,在主库上看,或者去全备日志里面grep -i ‘change master to’看
mysql -uroot -p123456
mysql> change master to
master_host='192.168.64.129',
master_user='slave',
master_password='123456',
master_log_file='mysql-bin.000001',
master_log_pos=120;
#master_auto_position=1; 自动找位点
mysql> start slave;
mysql> show slave status;
需要保证io线程和sql线程同时为yes才表示主从复制开启成功
如果是mysql装好之后直接克隆过来的,会出现uuid一致的情况
uuidgen命令生成uuid,替换掉原来文件中的uuid即可
处理SQL线程出现的问题
mysql> stop slave;
# 临时停止同步
mysql> set global sql_slave_skip_counter=1;
# 将同步指针向下移动一个(可重复操作)
mysql> start slave;
# 开启同步
vim /etc/my.cnf
# 编辑配置文件
[mysqld]
slave-skip-errors=1032,1062,1007
# 跳过的错误代码
但是以上操作都是有风险存在的
限制其不能修改从库
set gobal read_only=1
# 在命令行临时设置
vim /etc/my.cnf
# 编辑配置文件
[mysqld]
read_only=1
mysql> stop slave;
# 临时停止同步
mysql> CHANGE MASTER TO MASTER_DELAY = 60;
# 设置延时为60秒
mysql> start slave;
mysql> show slave status\G;
SQL_Delay: 60
# 查看状态
mysql> stop slave;
mysql> CHANGE MASTER TO MASTER_DELAY = 0;
mysql> start slave;
从MySQL5.5开始,支持半同步复制。之前版本的MySQL Replication都是异步(asynchronous)的,主库在执行完一些事务后,是不会关注备库的进度的。如果备库不幸落后,而更不幸的是主库此时又出现Crash(例如宕机),这时备库中的数据就是不完整的。简而言之,在主库发生故障的时候,我们无法使用备库来继续提供数据一致的服务了。
半同步复制(Semi synchronous Replication)则一定程度上保证提交的事务已经传给了至少一个备库。
出发点是保证主从数据一致性问题,安全的考虑
mysql -uroot -p123456
mysql> show global variables like 'have_dynamic_loading';
# 查看是否有动态支持
mysql> INSTALL PLUGIN rpl_semi_sync_master SONAME'semisync_master.so';
# 安装自带插件
mysql> SET GLOBAL rpl_semi_sync_master_enabled = 1;
# 启动插件
mysql> SET GLOBAL rpl_semi_sync_master_timeout = 1000;
# 设置超时
vim /etc/my.cnf
[mysqld]
rpl_semi_sync_master_enabled = 1
rpl_semi_sync_master_timeout = 1000
mysql> show global variables like 'repl%';
mysql> show global status like 'rpl_semi%';
# 检查安装
mysql -uroot -p123456
mysql> show global variables like 'have_dynamic_loading';
# 查看是否有动态支持
mysql> INSTALL PLUGIN rpl_semi_sync_master SONAME'semisync_master.so';
# 安装自带插件
mysql> SET GLOBAL rpl_semi_sync_master_enabled = 1;
# 启动插件
mysql> stop slave io_thread;
mysql> start slave io_thread;
# 重启io线程使其生效
vim /etc/my.cnf
[mysqld]
rpl_semi_sync_master_enabled = 1
修改从库的配置文件
vim /etc/my.cnf
[mysqld]
--replication-do-db=test1
systemctl restart mysqld
mysql -uroot -p
mysql> start slave;
mysql> use test1;
mysql> create table t1(id int);
mysql> use test1;
mysql> show tables;
# 同步过来了
mysql> use test2;
mysql> create table th1(id int);
mysql> show databases;
# 查看不到test2表
MHA(Master High Availability)目前在MySQL高可用方面是一个相对成熟的解决方案,它由日本DeNA公司youshimaton(现就职于Facebook公司)开发,是一套优秀的作为MySQL高可用性环境下故障切换和主从提升的高可用软件。在MySQL故障切换过程中,MHA能做到在0-30秒之内自动完成数据库的故障切换操作,并且在进行故障切换的过程中,MHA能在最大程度上保证数据的一致性,以达到真正意义上的高可用。
MHA能够在较短的时间内实现自动故障检测和故障转移,通常在10-30秒以内;在复制框架中,MHA能够很好地解决复制过程中的数据一致性问题,由于不需要再现有的replication中添加额外的服务器,仅需要一个manager节点,而一个manager能管理多套复制,所以能大大地节约服务器的数量;另外,安装简单,无性能损耗,以及不需要修改现有的复制部署也是它的优势之处。
MHA还提供在线主库切换的功能,能够安全地切换当前运行的主库到一个新的主库中(通过将从库提升为主库),大概0.5-2秒内即可完成。
MHA由两部分组成:MHA Manager(管理节点)和MHA Node(数据节点)。MHA Manager可以独立部署在一台独立的机器上管理多个Master-Slave集群,也可以部署再一台SLave上。当Master出现故障时,它可以自动将最新数据的Slave提升为新的Master,然后将所有其他的Slave重新指向新的Master。整个故障转移过程对应用程序是完全透明的
masterha_check_ssh | 检测MHA的ssh-key |
---|---|
masterha_check_repl | 检查主从复制情况 |
masterha_manager | 启动MHA |
masterha_check_status | 检测MHA的运行状态 |
masterha_master_monitor | 检测master是否宕机 |
masterha_master_switch | 手动故障转移 |
masterha_conf_host | 手动添加server信息 |
masterha_secondary_check | 建立TCP连接从远程服务器 |
masterha_stop | 停止MHA |
save_binary_logs | 保存宕机的master的binlog |
---|---|
apply_diff_relay_logs | 识别relay log的差异 |
filter_mysqlbinlog | 防止回滚时间 |
purge_relay_logs | 清楚中继日志 |
wget https://downloads.mysql.com/archives/get/p/23/file/mysql-5.6.40-linux-glibc2.12-x86_64.tar.gz
tar xzvf mysql-5.6.40-linux-glibc2.12-x86_64.tar.gz
useradd mysql -s /sbin/nologin -M
mkdir /application
mv mysql-5.6.40-linux-glibc2.12-x86_64 /application/mysql-5.6.40
ln -s /application/mysql-5.6.40/ /application/mysql # 如果版本发生改变,直接重新创建一个软连接,不用修改原来目录的名字
cd /application/mysql/support-files/
cp my-default.cnf /etc/my.cnf # 后者是linux底下自带的mysql文件
cp:是否覆盖"/etc/my.cnf"? y
cp mysql.server /etc/init.d/mysqld
cd /application/mysql/scripts
yum -y install autoconf
./mysql_install_db --user=mysql --basedir=/application/mysql --datadir=/application/mysql/data/
vim /etc/profile.d/mysql.sh
export PATH="/application/mysql/bin:$PATH"
source /etc/profile
sed -i 's#/usr/local#/application#g' /etc/init.d/mysqld /application/mysqld/bin/mysqld_safe
vim /usr/lib/systemd/system.mysqld.service
[Unit]
Descruption=MySQL Server
Documentation=man:mysqld(8)
Documentation=https://dev.mysql.com/doc/refman/en/using-systemd.html
After=network.target
After=syslog.target
[Install]
WantedBy=multi-user.target
[Service]
User=mysql
Group=Mysql
ExecStart=/application/mysql/bin/mysqld --defaults-file=/etc/my.cnf
LimitNOFILE = 5000
vim /etc/my.cnf
basedir = /application/mysql
datadir = /application/mysql/data
systemctl daemon-reload
systemctl start mysqld
systemctl enable mysqld
mysqladmin -uroot password '123456'
mysql -uroot -p123456
主库操作
vim /etc/my.cnf
[mysqld]
server_id=1
# 主库server-id为1,从库不等于1
log_bin=mysql-bin
# 开启binlog日志
skip-name-resolv
# 跳过域名解析
mysql -uroot -p123456
mysql> grant replication slave on *.* to slave@'192.168.64.%' identified by '123456';
# 创建slave用户
从库操作
vim /etc/my.cnf
[mysqld]
server_id=5
# 主库server-id为1,从库不等于1
log_bin=mysql-bin
# 开启binlog日志,因为可能会成为一个主库
重启 systemctl restart mysqld
第二台从库:
vim /etc/my.cnf
[mysqld]
server_id=10
# 主库server-id为1,从库不等于1
log_bin=mysql-bin
# 开启binlog日志
重启 systemctl restart mysqld
注:在以往如果是基于binlog日志的主从复制,则必须要记住主库的master状态信息。
mysql> show master status;
开启GTID
mysql> show global variables like '%gtid%';
# 没开启之前先看一下GTID的状态
vim /etc/my.cnf
[mysqld]
# 主库从库都需要修改
gtid_mode=ON
log_slave_updates
# 开启slave binlog同步
enforce_gtid_consistency
# 不允许任何违反GTID一致性
# 重启数据库
systemctl restart mysqld
mysql> show global variables like '%gtid%';
# 检查GTID的状态
注:主库从库都需要开启GTID否则在主从复制的时候就会报错
mysql -uroot -p123456
mysql> change master to
master_host='192.168.64.129',
master_user='slave',
master_password='123456',
#master_log_file='mysql-bin.000001',
#master_log_pos=120;
master_auto_position=1; #自动找位点
mysql> start slave;
# 开启slave
mysql> show slave status\G;
# 查看状态
mysql> set global relay_log_purge = 0;
# 禁用自动删除relay log功能
mysql> set global read_only=1;
# 设置只读
vim /etc/my.cnf
[mysqld]
relay_log_purge = 0
环境准备(所有节点)
工具包下载地址
cd && wget https://download.s21i.faiusr.com/23126342/0/0/ABUIABBPGAAg3OHUiAYolpPt7AQ.zip?f=mysql-master-ha.zip&v=1628778716
yum install perl-DBD-MySQL -y
# 安装依赖包
unzip mysql-master-ha.zip
cd mysql-master-ha
# 进入安装包存放目录
ls
rpm -ivh mha4mysql-node-0.56-0.e16.noarch.rpm
# 安装node包
mysql -uroot -p123456
mysql> grant replication slave on *.* to mha@'192.168.64.%' identified by 'mha';
# 添加mha管理账户
mysql> select user,host from mysql.user;
# 查看是否添加成功
mysql> select user,host from mysql.user;
# 主库上创建,从库上会自动复制,(在从库上查看)
ln -s /application/mysql/bin/mysqlbinlog /usr/bin/mysqlbinlog
ln -s /application/mysql/bin/mysql /usr/bin/mysql
# 如果不创建命令软连接,检测mha复制情况的时候会报错
node节点部署完了
yum install -y epel-release
# 使用epel源
yum install -y perl-Config-Tiny epel-release perl-Log-Dispatch perl-Parallel-ForkManger perl-Time-HiRes
# 安装manager依赖包
cd ~/mysql-master-ha && rpm -ivh mha4mysql-manager-0.56-0.e16.noarch.rpm
# 安装manager包
mkdir -p /etc/mha
# 创建配置文件目录
mkdir -p /var/log/mha/app1
# 创建日志目录
vim /etc/mha/app1.conf
[server default]
manager_log=/var/log/mha/app1/manager.log
manager_workdir=/var/log/mha/app1
master_binlog_dir=/application/mysql/data
user=mha
password=mha
ping_interval=2
repl_password=123456
repl_user=salve
ssh_user=root
[server1]
hostname=192.168.64.129
port=3306
[server2]
hostname=192.168.64.133
port=3306
candidate_master=1
check_repl_delay=0
[server3]
hostname=192.168.64.135
port=3306
ssh-keygen -t dsa -P '' -f ~/.ssh/id_dsa > /dev/null 2>&1
ssh-copy-id -i /root/.ssh/id_dsa.pub [email protected]
ssh-copy-id -i /root/.ssh/id_dsa.pub [email protected]
ssh-copy-id -i /root/.ssh/id_dsa.pub [email protected]
# masterha_check_ssh --conf=/etc/mha/app1.cnf
# 测试ssh
# masterha_check_repl --conf=/etc/mha/app1.cnf
# 测试复制
nohup masterha_manager --conf=/etc/mha/app1.cnf --remove_dead_master_conf --ingnore_last_failover < /dev/null > /var/log/mha/app1/manager.log 2>&1 &
# 启动
masterha_check_status --conf=/etc/mha/app1.cnf
# 检测状态
mysql> show slave status;
# 停掉主库
systemctl stop mysqld
#在后面两个从库上分别看slave的状态
mysql> show slave status;