Mysql集群部署(主从复制)

基础环境准备

# 获取centos镜像,注:以下镜像为整合了 ansible 的centos镜像,可以解决大量的依赖问题
docker pull ansible/centos7-ansible

容器中安装基础工具

启动容器:

docker run -itd --privileged --name centos-mysql ansible/centos7-ansible /usr/sbin/init

进入容器:

docker exec -it centos-mysql bash
yum install wget 
yum install net-tools
yum install initscripts
yum install openssh-server
yum install libaio
yum install numactl

安装Mysql

cd /usr/local/
# 下载mysql
wget http://mirrors.163.com/mysql/Downloads/MySQL-8.0/mysql-8.0.26-linux-glibc2.12-x86_64.tar.xz
# 解压
tar xvJf mysql-8.0.26-linux-glibc2.12-x86_64.tar.xz
mv mysql-8.0.26-linux-glibc2.12-x86_64 mysql
# 创建data文件
mkdir /usr/local/mysql/data
# 创建用户组与用户并授权
groupadd mysql
useradd -g mysql mysql
chown -R mysql.mysql /usr/local/mysql
# 初始化基本信息
cd /usr/local/mysql/bin/
./mysqld --user=mysql --basedir=/usr/local/mysql --datadir=/usr/local/mysql/data/ --initialize

记住生成的临时用户名和密码,保存下来,之后会用到

编辑配置文件

查看my.cnf 文件位置 ./mysql –help | grep my.cnf

这个实际上就是mysql尝试去读取配置文件的路径顺序,没有找到话,mysql会走默认配置

所以,看下这几处位置是否有配置文件,有的话,编辑该文件,没有的话,直接在第一读取位置,创建配置文件,如: 创建 /etc/my.cnf 配置文件。

/etc/my.cnf:

[client]
default-character-set=utf8
[mysqld]
basedir=/usr/local/mysql
datadir=/usr/local/mysql/data
port=3306
socket=/tmp/mysql.sock
character-set-server=utf8
collation-server=utf8_general_ci
sql_mode=NO_ENGINE_SUBSTITUTION,STRICT_TRANS_TABLES

添加mysqld服务到系统

# cp -a 保留原文件属性
cp -a /usr/local/mysql/support-files/mysql.server /etc/init.d/mysql
# 授予执行权限
chmod +x /etc/init.d/mysql
chkconfig --add mysql

启动mysql

service mysql start

将mysql命令添加到服务

ln -s /usr/local/mysql/bin/mysql /usr/bin/

登录mysql 使用之前随机生成的密码

修改root密码

ALTER USER 'root'@'localhost' IDENTIFIED WITH mysql_native_password BY '123456';    #其中123456是新的密码自己设置
flush privileges; # 使新密码生效

使支持远程连接

use mysql;
update user set host='%' where user='root';
flush privileges;
exit

制作镜像

退出容器,制作mysql镜像

docker stop centos-mysql
docker commit centos-mysql centos-mysql-80

创建Master

docker run -itd -p 3306:3306 --privileged --name mysql-master centos-mysql-80 /usr/sbin/init

进入容器

docker exec -it mysql-master /bin/bash

修改/etc/my.cnf, 增加以下配置

# master
log_bin=master-bin
log_bin_index=master-bin.index
server-id=1
sync-binlog=1
binlog-ignore-db=information_schema
binlog-ignore-db=performance_schema
binlog-ignore-db=sys
gtid_mode = on
enforce_gtid_consistency = 1
log_slave_updates = 1

plugin_load = "rpl_semi_sync_master=semisync_master.so;rpl_semi_sync_slave=semisync_slave.so"
loose_rpl_semi_sync_master_enabled = 1
loose_rpl_semi_sync_slave_enabled = 1
loose_rpl_semi_sync_master_timeout = 5000

重启mysql

service mysql restart

授权

# 登录mysql,配置slave访问master的用户的ip权限,注:identified by 后需要填写你root账户对应的密码
# 创建账户
create user 'root'@'%' identified by  '123456'
# 赋予权限,with grant option这个选项表示该用户可以将自己拥有的权限授权给别人
grant all privileges on *.* to 'root'@'%' with grant option
# 使生效
flush privileges;

创建Slave

docker run -itd -p 3307:3306 --privileged --name mysql-slave-1 centos-mysql-80 /usr/sbin/init

进入容器

docker exec -it mysql-slave-1 /bin/bash

修改/etc/my.cnf, 增加以下配置

# slave
server_id=2
relay_log_index = slave_relay_bin.index
relay_log= slave_relay_bin
innodb_log_file_size= 256M
expire-logs-days = 1
read_only=1
gtid_mode = on
enforce_gtid_consistency = 1
log_slave_updates = 1
binlog-ignore-db=information_schema
binlog-ignore-db=performance_schema
binlog-ignore-db=sys
# 候选时需要设置参数
log-bin = mysql-bin
log-bin-index = mysql-bin.index
plugin_load = "rpl_semi_sync_master=semisync_master.so;rpl_semi_sync_slave=semisync_slave.so"
loose_rpl_semi_sync_master_enabled = 1
loose_rpl_semi_sync_slave_enabled = 1
loose_rpl_semi_sync_master_timeout = 5000

重启mysql

# 删除auto.cnf文件,否则连接master会失败
rm /usr/local/mysql/data/auto.cnf
service mysql restart

设置master相关信息

配置前,我们需要先获取master相关信息,进入mysql-master容器,登录mysql,执行 show master status 查看:

获取mysql-master容器ip地址:

docker inspect --format='{{.NetworkSettings.IPAddress}}' mysql-master

进行从库的master配置

change master to master_host='172.17.0.2', master_port=3306, master_user='root', master_password='123456',master_log_file='master-bin.000001', master_log_pos=550;

start slave;

show slave status \G
# show slave satus 这两项为Yes,则成功
Slave_IO_Running: Yes
Slave_SQL_Running: Yes

使用同样的方式创建salve2,注:需要保证my.inf配置中server_id保持唯一

测试主从复制

master创建数据库 test

mysql-slave-1

mysql-slave-2

至此,mysql主从集群部署完成~

参考链接

https://blog.csdn.net/qq_15350581/article/details/114090794

https://blog.csdn.net/fhdsece/article/details/104920422

2 评论
最新
最旧 最多投票
内联反馈
查看所有评论
滚动至顶部