一,mysql主从配置原理
主服务器将数据库的每次操作都记录在二进制文件mysql-bin.xxxxxx中,从服务器通过IO线程使用指定账号登录到主服务器中读取mysql.bin.xxxxxx文件,并将文件内容写入到自己本地的中继日志mysql-relay-bin文件中,然后从服务器的Sql线程会执行mysql-relay-bin中的sql语句,从而实现数据库同步。
二,准备工作
mysql主从配置需要至少2台服务器。在本文章里使用docker来作为环境部署。docker的环境部署这里就不再赘述了。大家可以自行百度下。
1,拉取mysql镜像
docker pull mysql
使用docker images查看拉取的镜像
docker images
2,主库配置
# 创建主库容器
docker run --name mysql-master -p 13306:3306 -e MYSQL_ROOT_PASSWORD=123456 -d mysql
# 进入容器
docker exec -it mysql-master bash
# 使用root账号登录数据库
mysql -uroot -p
# 密码是123456,在容器创建的时候有指定
# 创建数据库用户(用户名:masterdb,密码:123456)
create user 'masterdb' identified with mysql_native_password by '123456';
# 授权
grant all privileges on *.* to 'masterdb';
# 更新权限
flush privileges;
到此可以通过软件连接数据库
接下来要修改主库的配置文件
vi /etc/mysql/my.cnf
发现debian系统没有安装vim,使用apt-get进行vim的安装
apt-get install -y vim
无法安装,提示Unable to locate package vim
需要进行apt-get update
因为默认是国外源,执行更新比较慢,需要换源
# 备份
mv /etc/apt/sources.list /etc/apt/sources.list.bak
# 网上找了很多源,都不能正常更新,就减少了源的地址,最终使用下面2条
echo "deb-src http://mirrors.163.com/debian/ jessie main non-free contrib" >>/etc/apt/sources.list
echo "deb http://mirrors.163.com/debian/ jessie main non-free contrib" >/etc/apt/sources.list
这里提示没有公钥7638D0442B90D010、CBF8D6FD518E17E1
GPG error: http://mirrors.163.com/debian jessie Release: The following signatures couldn't be verified because the public key is not available: NO_PUBKEY 7638D0442B90D010 NO_PUBKEY CBF8D6FD518E17E1
解决方案
# 提示几个公钥缺失就添加几个
apt-key adv --keyserver hkp://keyserver.ubuntu.com:80 --recv 7638D0442B90D010
apt-key adv --keyserver hkp://keyserver.ubuntu.com:80 --recv CBF8D6FD518E17E1
继续执行apt-get install -y vim 后提示缺少依赖
vim : Depends: libtinfo5 but it is not going to be installed
需要安装libtinfo5
apt-get install -y libtinfo5
这里提示包依赖移除、更新
Essential packages were removed and -y was used without --allow-remove-essential
apt-get install -y libtinfo5 --allow-remove-essential
apt-get install -y vim
安装完以后,修改配置文件
vi /etc/mysql/my.cnf
[mysqld]
#master
log-bin=mysql-bin
server-id=100
保存以后退出容器,并重启容器
docker restart mysql-master
到此主库准备完毕
3,从库配置
# 创建从库容器
docker run --name mysql-slave -p 23306:3306 -e MYSQL_ROOT_PASSWORD=123456 -d mysql
# 进入容器
docker exec -it mysql-slave bash
# 使用root账号登录数据库
mysql -uroot -p
# 密码是123456,在容器创建的时候有指定
# 创建数据库用户(用户名:slavedb,密码:123456)
create user 'slavedb' identified with mysql_native_password by '123456';
# 授权
grant all privileges on *.* to 'slavedb';
# 更新权限
flush privileges;
修改从库的配置文件
vi /etc/mysql/my.cnf
[mysqld]
server-id=101
log-bin=mysql-slave-bin
relay_log=edu-mysql-relay-bin
保存后退出容器,并重启容器
docker restart mysql-slave
到此从库准备完毕
三、主从环境配置
进入主库,使用show_master_status 查看状态
# 进入主库容器
docker exec -it mysql-master bash
# 登录数据库
mysql -uroot -p
# 查看主库状态
show master status;
红色箭头的2个参数需要记录下,在从库中使用
退出容器, 查看主从库的ip
docker inspect --format='{{.NetworkSettings.IPAddress}}' mysql-master
docker inspect --format='{{.NetworkSettings.IPAddress}}' mysql-slave
主库ip:172.17.0.2
从库ip:172.17.0.3
进入从库,执行数据同步
# 进入从库容器
docker exec -it mysql-slave bash
# 登录数据库
mysql -uroot -p
# 执行数据同步
change master to master_host='172.17.0.2', master_user='masterdb', master_password='123456', master_port=3306, master_log_file='mysql-bin.000002', master_log_pos= 156, master_connect_retry=30;
参数说明
master_host:主库IP
master_port:主库容器端口号
master_user:用于同步的用户
master_password:用于同步的密码
master_log_file:指定从库从哪个日志文件开始复制数据,在主库使用show master status查看
master_log_pos:指定从库从哪个position开始读,在主库使用show master status查看
master_connect_retry:连接重试时间间隔,默认60秒
使用show slave status 查看主从同步状态
正常情况下,SlaveIORunning 和 SlaveSQLRunning 都是No,这是因为还没有开启主从复制
使用一下命令 开始主从复制,然后再次查询
start slave
SlaveIORunning 和 SlaveSQLRunning 这时候会变成yes, 说明同步成功。 如果失败,需要查看mysql错误日志来进行问题定位和解决。
四、测试主从复制
直接在主库创建一个数据库、创建表、更新数据等操作来测试数据同步。
这里还有个问题,每次docker 重启后,容器的ip都有可能发现改变,所以在创建容器的时候要指定网络和ip
docker network create --subnet=172.18.0.0/16 mysql_network
docker run -it --name mysql_master -p 13306:3306 -e MYSQL_ROOT_PASSWORD=123456 -d --net=mysql_network --ip 172.18.0.11 --hostname=host_mysql_master mysql
docker inspect --format='{{.NetworkSettings.Networks.mysql_network.IPAddress}}' mysql_master