mysql主从架构部署和配置
1. mysql常见集群架构
主从架构(Master-Slaves)
在实际应用场景中,mysql集群90%是按照这种架构模式部署的。
缺点:
master节点不能停机,停机就不能接收写请求。
slave同步数据时会出现延迟。
数据同步是单向的,当master停机,提升某个slave成为master时,就会和之前的master数据不一致。
双主架构(Master-Master)
两个mysql实例相互同步数据。
主从级联架构(Master-Slaves-Slaves)
解决读压力特别大的问题,缺点是slave延迟更加大了。
双主+级联架构
这样解决了master单点问题。
2. 部署mysql主从架构
2.1. mysql常用命令
# 下载Mysql源安装包
wget http://dev.mysql.com/get/mysql57-community-release-el7-8.noarch.rpm
# yum安装mysql源
yum localinstall mysql57-community-release-el7-8.noarch.rpm -y
# 检查mysql源是否安装成功
yum repolist enabled | grep "mysql.*-community.*"
# yum安装Mysql
yum install mysql-community-server -y
# 启动Mysql服务
systemctl start mysqld
# 并添加开机启动
systemctl enable mysqld systemctl daemon-reload
# 查看Mysql状态
systemctl status mysqld
# 查看默认的mysql密码
vi /var/log/mysqld.log
# 修改mysql的密码
# 登录mysql,输入原始密码: =>g6hj.Nx4e (上面查看的原始密码)
mysql -uroot -p
# 修改mysql的密码
set password for 'root'@'localhost'=password('123456');
# 添加远程登陆的用户权限
GRANT ALL PRIVILEGES ON *.* TO 'root'@'%' IDENTIFIED BY '123456' WITH GRANT OPTION;
# 刷新权限
FLUSH PRIVILEGES;
# 接下来一些常用操作
# 修改mysql字符编码
vi /etc/my.cnf
# 添加
character_set_server=utf8
init_connect='SET NAMES utf8'
# 重启Mysql
systemctl stop mysqld
systemctl start mysqld
# 查看Mysql字符集
show variables like '%character%'
# 卸载
rpm -qa|grep -i mysql
yum remove mysql-community-server -y
rpm -ev mysql-community-libs-5.7.24-1.el7.x86_64 --nodeps
# 删除文件
find / -name mysql
rm -rf /var/lib/mysql
rm -rf /etc/my.cnf
2.2. docker安装mysql
接下来用docker安装两个mysql实例,并配置主从架构。
使用docker命令安装两个mysql实例:
docker run --name mysql3307 -p 3307:3306 --privileged=true -ti -e MYSQL_ROOT_PASSWORD=123456 -e MYSQL_DATABASE=yc_test -e MYSQL_USER=yc -e MYSQL_PASSWORD=123456 -v /data/canyang3/docker-data/mysql3307/conf:/etc/mysql/conf.d -v /data/canyang3/docker-data/mysql3307/data/:/var/lib/mysql -v /data/canyang3/docker-data/mysql3307/logs/:/var/log/mysql -d mysql:5.7
docker run --name mysql3308 -p 3308:3306 --privileged=true -ti -e MYSQL_ROOT_PASSWORD=123456 -e MYSQL_DATABASE=yc_test -e MYSQL_USER=yc -e MYSQL_PASSWORD=123456 -v /data/canyang3/docker-data/mysql3308/conf:/etc/mysql/conf.d -v /data/canyang3/docker-data/mysql3308/data/:/var/lib/mysql -v /data/canyang3/docker-data/mysql3308/logs/:/var/log/mysql -d mysql:5.7
docker命令解读:
docker run
--name mysql3307 # 定义镜像别名
-p 3307:3306 # 映射端口号
--privileged=true # docker镜像获取宿主机root权限
-it # 分配一个伪终端
-e MYSQL_ROOT_PASSWORD=123456 # 设置mysql root密码为123456
-e MYSQL_DATABASE=yc_test # 创建默认数据库
-e MYSQL_USER=yc # 添加mysql用户
-e MYSQL_PASSWORD=123456 # 添加mysql用户密码
-v /data/canyang3/docker-data/mysql3307/conf:/etc/mysql/conf.d # 挂载指定目录到宿主机
-v /data/canyang3/docker-data/mysql3307/data/:/var/lib/mysql
-v /data/canyang3/docker-data/mysql3307/logs/:/var/log/mysql
-d mysql:5.7 # 后台运行容器并返回容器ID
进入docker镜像,查看mysql状态
docker exec -it mysql3307 /bin/bash
service mysql status
2.2. 配置mysql主从关系
创建master mysql的配置,重启镜像 vim /data/canyang3/docker-data/mysql3307/conf/my.cnf
# 添加
[mysqld]
port=3306
character_set_server=utf8
init_connect='SET NAMES utf8'
default-storage-engine=INNODB
symbolic-links=0
lower_case_table_names=1
server-id=10001
log-bin=mysql-bin
auto_increment_increment=2
auto_increment_offset=1
plugin-load="rpl_semi_sync_master=semisync_master.so;rpl_semi_sync_slave=semisync_slave.so"
rpl_semi_sync_master_enabled=1
rpl_semi_sync_master_timeout=10000
创建slave mysql的配置,重启镜像 vim /data/canyang3/docker-data/mysql3308/conf/my.cnf
# 添加
[mysqld]
port=3306
character_set_server=utf8
init_connect='SET NAMES utf8'
default-storage-engine=INNODB
symbolic-links=0
lower_case_table_names=1
server-id=10002
log-bin=mysql-bin
auto_increment_increment=2
auto_increment_offset=2
plugin-load="rpl_semi_sync_master=semisync_master.so;rpl_semi_sync_slave=semisync_slave.so"
rpl_semi_sync_master_enabled=1
rpl_semi_sync_master_timeout=10000
在master库中添加同步数据账号 GRANT REPLICATION SLAVE,FILE,REPLICATION CLIENT ON *.* TO 'repluser'@'%' IDENTIFIED BY '123456';
FLUSH PRIVILEGES;
# 查看二进制日志
show master status;
在slave中设置master信息 change master to master_host='172.31.63.26',master_port=3307,master_user='repluser',master_password='123456',master_log_file='mysql-bin.000001',master_log_pos=3111;
# 开启slave,启动sql和IO线程
start slave;
# 查看slave的状态
show slave status\G
其他命令 # 锁表master
flush table with read lock;
# 备份master
mysqldump -uroot -p123456 --databases consult mall > back.sql;
# 导入slave
mysql -uroot -p123456 < back.sql;
# 解锁master
unlock tables;