主从复制的方式
MySQL 5.6
开始主从复制有两种方式:基于日志(binlog
)和 基于 GTID
(全局事务标示符)。
本文只涉及基于日志 binlog
的 主从配置。
主从复制的流程
MySQL
同步操作通过 3
个线程实现,其基本步骤如下:
- 主服务器 将数据的更新记录到 二进制日志(
Binary log
)中,用于记录二进制日志事件,这一步由 主库线程 完成; - 从库 将 主库 的 二进制日志 复制到本地的 中继日志(
Relay log
),这一步由 从库I/O
线程 完成; - 从库 读取 中继日志 中的 事件,将其重放到数据中,这一步由 从库
SQL
线程 完成。
基于Docker的MySQL主从集群搭建
环境
keepalive(mysql) vip:192.168.64.100
keepalive(mysql) master:192.168.64.133
keepalive(mysql) slave:192.168.64.132
#配置开始前,先关闭双方的firewalld服务以及selinux!
分别在master和slave服务器中创建mysql的映射目录:
$ mkdir -p /root/mysql/data /root/mysql/logs /root/mysql/conf
配置文件
在master服务器中创建配置
my.cnf
配置文件内容如下:[mysqld] log-bin=mysql-bin #开启二进制日志 server-id=1 #设置server-id,唯一值,标识主机 default-storage-engine = INNODB character-set-server = utf8 collation-server = utf8_general_ci max_connections = 1024 # 最大连接数量 max_allowed_packet = 64M lower_case_table_names = 1 # 关闭大小写敏感 innodb_buffer_pool_size = 256M join_buffer_size = 256M read_rnd_buffer_size = 16M sort_buffer_size = 16M
在slave服务器中创建配置
my.cnf
配置文件内容如下:[mysqld] server-id=2 default-storage-engine = INNODB character-set-server = utf8 collation-server = utf8_general_ci max_connections = 1024 # 最大连接数量 max_allowed_packet = 64M lower_case_table_names = 1 # 关闭大小写敏感 innodb_buffer_pool_size = 256M join_buffer_size = 256M read_rnd_buffer_size = 16M sort_buffer_size = 16M
执行完以上命令后,master
和slave
服务器的工作目录下应有以下文件和目录:
/root/mysql
├── conf
│ └── my.cnf
├── data
├── logs
启动
在master服务器中启动master节点
$ docker run -p 3306:3306 --name mysql-master -v /root/mysql/conf:/etc/mysql/conf.d -v /root/mysql/logs:/logs -v /root/mysql/data:/var/lib/mysql -e MYSQL_ROOT_PASSWORD=root -d mysql:5.7
在slave服务器中启动slave节点:
$ docker run -p 3306:3306 --name mysql-slave -v /root/mysql/conf:/etc/mysql/conf.d -v /root/mysql/logs:/logs -v /root/mysql/data:/var/lib/mysql -e MYSQL_ROOT_PASSWORD=root -d mysql:5.7
在master节点建立rep账号
执行以下命令,进入master
容器,并执行mysql
命令,连接master数据库。(默认密码已通过环境变量配置为root
)
$ docker exec -it master mysql -u root -p
连接数据库后,首先创建一个用于同步的账号rep
, 密码为123456
。slave
节点的ip为192.168.64.132
:
#创建用户(IP为可访问该master的IP,任意IP就写'%')
mysql> create user 'rep'@'192.168.64.132' identified by '123456';
#分配权限(IP为可访问该 master的IP,任意IP就写'%')
mysql> grant replication slave on *.* to 'rep'@'192.168.64.132';
#刷新权限
mysql> flush privileges;
创建完rep
账户后,顺便执行show master status
命令,记录下查询到的信息。后面配置slave
时将会使用到。
mysql> show master status;
+------------------+----------+--------------+------------------+-------------------+
| File | Position | Binlog_Do_DB | Binlog_Ignore_DB | Executed_Gtid_Set |
+------------------+----------+--------------+------------------+-------------------+
| mysql-bin.000001 | 1389 | | mysql | |
+------------------+----------+--------------+------------------+-------------------+
1 row in set (0.00 sec)
配置slave
在slava
节点执行以下命令,进入slave
容器,并执行mysql
命令,连接slave数据库。(默认密码已通过环境变量配置为root
)
$ docker exec -it slave mysql -u root -p
接着执行以下sql语句,配置slave的master:
mysql> CHANGE MASTER TO
MASTER_HOST='192.168.64.133',
MASTER_USER='rep',
MASTER_PASSWORD='123456',
MASTER_LOG_FILE='mysql-bin.000001',
MASTER_LOG_POS=439
注意,以上信息,请根据之前查询到的master status来配置。
接着,激活slave:
mysql> start slave;
最后,查询slave状态:
mysql> SHOW SLAVE STATUS;
当Slave_IO_Running
和Slave_SQL_Running
都为YES
的时候就表示主从同步设置成功了。
至此,我们的Mysql 主从集群已经启动完成。
Keepalived
介绍
Keekpalived工作原理:通过vrrp协议实现
master在工作状态会不断群发一个广播包(内涵优先参数)
其他路由收到收到广播后会和自己的优先参数作对比,如果优先参数小于自己则什么都不执行,如果优先参数大于自己则开启争抢机制
如果启动了争抢机制,他就会群发自己的优先参数,最终优先参数最小的称为master路由.
keepalived搭建
#安装keepalived
$ yum -y install keepalived
#修改主keepalived配置文件
$ vim /etc/keepalived/keepalived.conf
#启动keepalived
$ systemctl start keepalived
# keepalived日志
$ tail -f -n 100 /var/log/messages
#配置开始前,先关闭双方的firewalld服务以及selinux!
keepalived配置文件说明
! Configuration File for keepalived
global_defs { #全局定义部分
notification_email { #设置警报邮箱
tomchil@qq.com #邮箱
}
notification_email_from tomchil@qq.com #设置发件人地址
smtp_server 127.0.0.1 #设置smtp server地址
smtp_connect_timeout 30 #设置smtp超时连接时间 以上参数可以不配置
router_id LVS_DEVEL #是Keepalived服务器的路由标识在一个局域网内,这个标识(router_id)是唯一的
}
// 定义自动核对mysql的脚本
vrrp_script check_mysql {
script "/root/mysql/check_mysql.sh"
interval 22
weight 2
}
vrrp_instance VI_1 { #VRRP实例定义区块名字是VI_1
state MASTER #表示当前实例VI_1的角色状态这个状态只能有MASTER和BACKUP两种状态,并且需要大写这些字符MASTER为正式工作的状态,BACKUP为备用的状态
interface ens33
virtual_router_id 51 #虚拟路由ID标识,这个标识最好是一个数字,在一个keepalived.conf配置中是唯一的, MASTER和BACKUP配置中相同实例的virtual_router_id必须是一致的.
priority 100 #priority为优先级 越大越优先
advert_int 1 #为同步通知间隔。MASTER与BACKUP之间通信检查的时间间隔,单位为秒,默认为1.
authentication { #authentication为权限认证配置不要改动,同一vrrp实例的MASTER与BACKUP使用相同的密码才能正常通信。
auth_type PASS
auth_pass 1111
}
virtual_ipaddress { #设置虚拟IP地址
192.168.64.100
}
track_script {
//指定核对的脚本,check_mysql是上述自定义的
check_mysql
}
}
#以下为虚拟服务器定义部分
virtual_server 192.168.64.100 3306 { #设置虚拟服务器,指定虚拟IP和端口
delay_loop 6 #健康检查时间为6秒
lb_algo rr #设置负载调度算法 rr算法
lb_kind NAT #设置负载均衡机制 #有NAT,TUN和DR三种模式可选
nat_mask 255.255.255.0 #非NAT模式注释掉此行 注释用!号
persistence_timeout 50 #连接保留时间,50秒无响应则重新分配节点
protocol TCP #指定转发协议为TCP
real_server 192.168.64.133 3306 { #RS节点1
weight 1 #权重
notify_down /etc/keepalived/bin/shutdown.sh //检测到mysql服务down后执行的脚本
TCP_CHECK { #节点健康检查
connect_timeout 8 #延迟超时时间
nb_get_retry 3 #重试次数
delay_before_retry 3 #延迟重试次数
connect_port 3306 #利用80端口检查
}
}
}
keepalived启动成功后,VIP节点可以通过查看IP地址,可以看到配置的虚拟节点
Keepalived和MySQL主从组成高可用服务
按如上操作,安装好MySQL和keepalived
修改master节点的keepalived.conf
! Configuration File for keepalived global_defs { router_id mysql-1 } vrrp_script check_mysql { script "/root/mysql/check_mysql.sh" interval 22 weight 2 } vrrp_instance VI_1 { state MASTER interface ens33 virtual_router_id 51 priority 100 advert_int 1 authentication { auth_type PASS auth_pass 1111 } virtual_ipaddress { 192.168.64.100 } track_script { check_mysql } } virtual_server 192.168.64.100 3306 { delay_loop 6 lb_algo rr lb_kind NAT persistence_timeout 50 protocol TCP real_server 192.168.64.133 3306 { weight 3 notify_down /root/mysql/shutdown.sh TCP_CHECK { connect_timeout 3 nb_get_retry 3 delay_before_retry 3 connect_port 3306 } } }
修改slave的keepalived.conf
! Configuration File for keepalived global_defs { router_id mysql-2 } vrrp_instance VI_1 { state BACKUP interface ens33 virtual_router_id 51 priority 50 advert_int 1 authentication { auth_type PASS auth_pass 1111 } virtual_ipaddress { 192.168.64.100 } } virtual_server 192.168.64.100 3306 { delay_loop 6 lb_algo rr lb_kind NAT persistence_timeout 50 protocol TCP real_server 192.168.64.132 3306 { weight 3 notify_down /root/mysql/shutdown.sh TCP_CHECK { connect_timeout 3 nb_get_retry 3 delay_before_retry 3 connect_port 3306 } } }
4.在master和slave节点编写检测服务down后所要执行的脚本(添加/root/mysql/shutdown.sh)
#!/bin/bash pkill keepalived
给shutdown.sh执行权限
$ chomod +x shutdown.sh
5.分别启动master和slave节点的mysql,以及keepalived
最后编辑:hugh 更新时间:2024-11-15 11:25